use Civi\Api4\Activity;
use Civi\Api4\ContributionPage;
use Civi\Api4\ContributionRecur;
-use Civi\Api4\Participant;
use Civi\Api4\PaymentProcessor;
/**
unset($params['revenue_recognition_date']);
}
+ // Get Line Items if we don't have them already.
+ if (empty($params['line_item'])) {
+ if (isset($params['id'])) {
+ CRM_Price_BAO_LineItem::getLineItemArray($params, [$params['id']]);
+ }
+ else {
+ CRM_Price_BAO_LineItem::getLineItemArray($params);
+ }
+ }
+
if (!isset($params['tax_amount']) && $setPrevContribution && (isset($params['total_amount']) ||
isset($params['financial_type_id']))) {
$params = CRM_Contribute_BAO_Contribution::checkTaxAmount($params);
CRM_Contribute_BAO_ContributionRecur::updateOnNewPayment(
(!empty($params['contribution_recur_id']) ? $params['contribution_recur_id'] : $params['prevContribution']->contribution_recur_id),
$contributionStatus,
- $params['receive_date'] ?? NULL
+ $params['receive_date'] ?? 'now'
);
}
* @throws \CiviCRM_API3_Exception
*/
public static function calculateMissingAmountParams(&$params, $contributionID) {
- if (!$contributionID && !isset($params['fee_amount'])) {
+ if (!$contributionID && (!isset($params['fee_amount']) || $params['fee_amount'] === '')) {
if (isset($params['total_amount']) && isset($params['net_amount'])) {
$params['fee_amount'] = $params['total_amount'] - $params['net_amount'];
}
protected static function cancel($memberships, $contributionId, $membershipStatuses, $participant, $oldStatus, $pledgePayment, $pledgeID, $pledgePaymentIDs, $contributionStatusId) {
// @fixme https://lab.civicrm.org/dev/core/issues/927 Cancelling membership etc is not desirable for all use-cases and we should be able to disable it
$participantStatuses = CRM_Event_PseudoConstant::participantStatus();
- if (is_array($memberships)) {
- foreach ($memberships as $membership) {
- $update = TRUE;
- //Update Membership status if there is no other completed contribution associated with the membership.
- $relatedContributions = CRM_Member_BAO_Membership::getMembershipContributionId($membership->id, TRUE);
- foreach ($relatedContributions as $contriId) {
- if ($contriId == $contributionId) {
- continue;
- }
- $statusId = CRM_Core_DAO::getFieldValue('CRM_Contribute_BAO_Contribution', $contriId, 'contribution_status_id');
- if (CRM_Core_PseudoConstant::getName('CRM_Contribute_BAO_Contribution', 'contribution_status_id', $statusId) === 'Completed') {
- $update = FALSE;
- }
- }
- if ($membership && $update) {
- $newStatus = array_search('Cancelled', $membershipStatuses);
-
- // Create activity
- $allStatus = CRM_Member_BAO_Membership::buildOptions('status_id', 'get');
- $activityParam = [
- 'subject' => "Status changed from {$allStatus[$membership->status_id]} to {$allStatus[$newStatus]}",
- 'source_contact_id' => CRM_Core_Session::singleton()->get('userID'),
- 'target_contact_id' => $membership->contact_id,
- 'source_record_id' => $membership->id,
- 'activity_type_id' => 'Change Membership Status',
- 'status_id' => 'Completed',
- 'priority_id' => 'Normal',
- 'activity_date_time' => 'now',
- ];
-
- $membership->status_id = $newStatus;
- $membership->is_override = TRUE;
- $membership->status_override_end_date = 'null';
- $membership->save();
- civicrm_api3('activity', 'create', $activityParam);
- }
- }
- }
-
if ($participant) {
$updatedStatusId = array_search('Cancelled', $participantStatuses);
CRM_Event_BAO_Participant::updateParticipantStatus($participant->id, $oldStatus, $updatedStatusId, TRUE);
* $results no of deleted Contribution on success, false otherwise
*/
public static function deleteContribution($id) {
- CRM_Utils_Hook::pre('delete', 'Contribution', $id, CRM_Core_DAO::$_nullArray);
+ CRM_Utils_Hook::pre('delete', 'Contribution', $id);
$transaction = new CRM_Core_Transaction();
// if we already processed contribution object pass previous status id.
$previousContriStatusId = $params['previous_contribution_status_id'] ?? NULL;
- $updateResult = [];
-
$contributionStatuses = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name');
// we process only ( Completed, Cancelled, or Failed ) contributions.
'status_id'
);
}
- // we might want to process contribution object.
- $processContribution = FALSE;
if ($contributionStatusId == array_search('Cancelled', $contributionStatuses)) {
// Call interim cancel function - with a goal to cleaning up the signature on it and switching to a tested api Contribution.cancel function.
self::cancel($memberships, $contributionId, $membershipStatuses, $participant, $oldStatus, $pledgePayment, $pledgeID, $pledgePaymentIDs, $contributionStatusId);
}
}
- // process contribution object.
- if ($processContribution) {
- $contributionParams = [];
- $fields = [
- 'contact_id',
- 'total_amount',
- 'receive_date',
- 'is_test',
- 'campaign_id',
- 'payment_instrument_id',
- 'trxn_id',
- 'invoice_id',
- 'financial_type_id',
- 'contribution_status_id',
- 'non_deductible_amount',
- 'receipt_date',
- 'check_number',
- ];
- foreach ($fields as $field) {
- if (empty($params[$field])) {
- continue;
- }
- $contributionParams[$field] = $params[$field];
- }
-
- $contributionParams['id'] = $contributionId;
- $contribution = CRM_Contribute_BAO_Contribution::create($contributionParams);
- }
-
}
/**
// or loadable from the recurring contribution.
$contributionParams['campaign_id'] = $templateContribution['campaign_id'];
}
- $contributionParams['source'] = $contributionParams['source'] ?: ts('Recurring contribution');
+ $contributionParams['source'] = $contributionParams['source'] ?? ts('Recurring contribution');
//CRM-18805 -- Contribution page not recorded on recurring transactions, Recurring contribution payments
//do not create CC or BCC emails or profile notifications.
//not really sure what params might be passed in but lets merge em into values
$values = array_merge($this->_gatherMessageValues($input, $values, $ids), $values);
$values['is_email_receipt'] = !$returnMessageText;
- foreach (['receipt_date', 'cc_receipt', 'bcc_receipt', 'receipt_from_name', 'receipt_from_email', 'receipt_text'] as $fld) {
+ foreach (['receipt_date', 'cc_receipt', 'bcc_receipt', 'receipt_from_name', 'receipt_from_email', 'receipt_text', 'pay_later_receipt'] as $fld) {
if (!empty($input[$fld])) {
$values[$fld] = $input[$fld];
}
elseif (!empty($params['payment_instrument_id'])) {
$params['to_financial_account_id'] = CRM_Financial_BAO_FinancialTypeAccount::getInstrumentFinancialAccount($params['payment_instrument_id']);
}
+ // dev/financial#160 - If this is a contribution update, also check for an existing payment_instrument_id.
+ elseif ($isUpdate && $params['prevContribution']->payment_instrument_id) {
+ $params['to_financial_account_id'] = CRM_Financial_BAO_FinancialTypeAccount::getInstrumentFinancialAccount((int) $params['prevContribution']->payment_instrument_id);
+ }
else {
$relationTypeId = key(CRM_Core_PseudoConstant::accountOptionValues('financial_account_type', NULL, " AND v.name LIKE 'Asset' "));
$queryParams = [1 => [$relationTypeId, 'Integer']];
// Assign tax Amount on update of contribution
if (!empty($params['prevContribution']->tax_amount)) {
$params['tax_amount'] = 'null';
- CRM_Price_BAO_LineItem::getLineItemArray($params, [$params['id']]);
foreach ($params['line_item'] as $setID => $priceField) {
foreach ($priceField as $priceFieldID => $priceFieldValue) {
$params['line_item'][$setID][$priceFieldID]['tax_amount'] = $params['tax_amount'];
$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
- if (isset($params['id'])) {
- CRM_Price_BAO_LineItem::getLineItemArray($params, [$params['id']]);
- }
- else {
- CRM_Price_BAO_LineItem::getLineItemArray($params);
- }
foreach ($params['line_item'] as $setID => $priceField) {
foreach ($priceField as $priceFieldID => $priceFieldValue) {
$params['line_item'][$setID][$priceFieldID]['tax_amount'] = $params['tax_amount'];
$contributionParams = array_merge([
'contribution_status_id' => $completedContributionStatusID,
- 'source' => self::getRecurringContributionDescription($contribution, $participantID),
], array_intersect_key($input, array_fill_keys($inputContributionWhiteList, 1)
));
return $ids;
}
- /**
- * Get the description (source field) for the recurring contribution.
- *
- * @param CRM_Contribute_BAO_Contribution $contribution
- * @param int|null $participantID
- *
- * @return string
- * @throws \CiviCRM_API3_Exception
- * @throws \API_Exception
- */
- protected static function getRecurringContributionDescription($contribution, $participantID) {
- if (!empty($contribution->source)) {
- return $contribution->source;
- }
- elseif (!empty($contribution->contribution_page_id) && is_numeric($contribution->contribution_page_id)) {
- $contributionPageTitle = civicrm_api3('ContributionPage', 'getvalue', [
- 'id' => $contribution->contribution_page_id,
- 'return' => 'title',
- ]);
- return ts('Online Contribution') . ': ' . $contributionPageTitle;
- }
- elseif ($participantID) {
- $eventTitle = Participant::get(FALSE)
- ->addSelect('event.title')
- ->addWhere('id', '=', (int) $participantID)
- ->execute()->first()['event.title'];
- return ts('Online Event Registration') . ': ' . $eventTitle;
- }
- elseif (!empty($contribution->contribution_recur_id)) {
- return 'recurring contribution';
- }
- return '';
- }
-
/**
* Function use to store line item proportionally in in entity financial trxn table
*
}
elseif (empty($lineItemDetails['line_total'])) {
// follow legacy code path
- Civi::log()
- ->warning('Deprecated bit of code, please log a ticket explaining how you got here!', ['civi.tag' => 'deprecated']);
+ CRM_Core_Error::deprecatedWarning('Deprecated bit of code, please log a ticket explaining how you got here!');
return $params['total_amount'];
}
else {