From: eileen Date: Fri, 3 May 2019 23:20:35 +0000 (+1200) Subject: dev/core#927 Extract contribution.cancel function X-Git-Url: https://vcs.fsf.org/?a=commitdiff_plain;h=1ee67fa2813416635415a9d6f8664755932b27e1;p=civicrm-core.git dev/core#927 Extract contribution.cancel function --- diff --git a/CRM/Contribute/BAO/Contribution.php b/CRM/Contribute/BAO/Contribution.php index 02cee6dd71..7bbf1e4638 100644 --- a/CRM/Contribute/BAO/Contribution.php +++ b/CRM/Contribute/BAO/Contribution.php @@ -970,6 +970,92 @@ class CRM_Contribute_BAO_Contribution extends CRM_Contribute_DAO_Contribution { ])['values']; } + /** + * Cancel contribution. + * + * This function should only be called from transitioncomponents - it is an interim step in refactoring. + * + * @param $processContributionObject + * @param $memberships + * @param $contributionId + * @param $membershipStatuses + * @param $updateResult + * @param $participant + * @param $oldStatus + * @param $pledgePayment + * @param $pledgeID + * @param $pledgePaymentIDs + * @param $contributionStatusId + * @return array + */ + protected static function cancel($processContributionObject, $memberships, $contributionId, $membershipStatuses, $updateResult, $participant, $oldStatus, $pledgePayment, $pledgeID, $pledgePaymentIDs, $contributionStatusId) { + $processContribution = FALSE; + $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); + + $updateResult['updatedComponents']['CiviMember'] = $membership->status_id; + if ($processContributionObject) { + $processContribution = TRUE; + } + } + } + } + + if ($participant) { + $updatedStatusId = array_search('Cancelled', $participantStatuses); + CRM_Event_BAO_Participant::updateParticipantStatus($participant->id, $oldStatus, $updatedStatusId, TRUE); + + $updateResult['updatedComponents']['CiviEvent'] = $updatedStatusId; + if ($processContributionObject) { + $processContribution = TRUE; + } + } + + if ($pledgePayment) { + CRM_Pledge_BAO_PledgePayment::updatePledgePaymentStatus($pledgeID, $pledgePaymentIDs, $contributionStatusId); + + $updateResult['updatedComponents']['CiviPledge'] = $contributionStatusId; + if ($processContributionObject) { + $processContribution = TRUE; + } + } + return [$updateResult, $processContribution]; + } + /** * @inheritDoc */ @@ -1757,9 +1843,9 @@ LEFT JOIN civicrm_contribution contribution ON ( componentPayment.contribution_ $participant = &$objects['participant']; $pledgePayment = &$objects['pledge_payment']; $contribution = &$objects['contribution']; - + $pledgeID = $oldStatus = NULL; + $pledgePaymentIDs = []; if ($pledgePayment) { - $pledgePaymentIDs = array(); foreach ($pledgePayment as $key => $object) { $pledgePaymentIDs[] = $object->id; } @@ -1778,68 +1864,8 @@ LEFT JOIN civicrm_contribution contribution ON ( componentPayment.contribution_ // we might want to process contribution object. $processContribution = FALSE; if ($contributionStatusId == array_search('Cancelled', $contributionStatuses)) { - 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 = array( - '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); - - $updateResult['updatedComponents']['CiviMember'] = $membership->status_id; - if ($processContributionObject) { - $processContribution = TRUE; - } - } - } - } - - if ($participant) { - $updatedStatusId = array_search('Cancelled', $participantStatuses); - CRM_Event_BAO_Participant::updateParticipantStatus($participant->id, $oldStatus, $updatedStatusId, TRUE); - - $updateResult['updatedComponents']['CiviEvent'] = $updatedStatusId; - if ($processContributionObject) { - $processContribution = TRUE; - } - } - - if ($pledgePayment) { - CRM_Pledge_BAO_PledgePayment::updatePledgePaymentStatus($pledgeID, $pledgePaymentIDs, $contributionStatusId); - - $updateResult['updatedComponents']['CiviPledge'] = $contributionStatusId; - if ($processContributionObject) { - $processContribution = TRUE; - } - } + // Call interim cancel function - with a goal to cleaning up the signature on it and switching to a tested api Contribution.cancel function. + list($updateResult, $processContribution) = self::cancel($processContributionObject, $memberships, $contributionId, $membershipStatuses, $updateResult, $participant, $oldStatus, $pledgePayment, $pledgeID, $pledgePaymentIDs, $contributionStatusId); } elseif ($contributionStatusId == array_search('Failed', $contributionStatuses)) { if (is_array($memberships)) {