Merge pull request #18807 from jvos/postProcess-MessageTemplates
[civicrm-core.git] / ext / contributioncancelactions / contributioncancelactions.php
1 <?php
2
3 require_once 'contributioncancelactions.civix.php';
4 // phpcs:disable
5 use CRM_Contributioncancelactions_ExtensionUtil as E;
6 // phpcs:enable
7 use Civi\Api4\LineItem;
8 use Civi\Api4\Participant;
9
10 /**
11 * Implements hook_civicrm_preProcess().
12 *
13 * This enacts the following
14 * - find and cancel any related pending memberships
15 * - (not yet implemented) find and cancel any related pending participant records
16 * - (not yet implemented) find any related pledge payment records. Remove the contribution id.
17 *
18 * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_post
19 */
20 function contributioncancelactions_civicrm_post($op, $objectName, $objectId, $objectRef) {
21 if ($op === 'edit' && $objectName === 'Contribution') {
22 if ('Cancelled' === CRM_Core_PseudoConstant::getName('CRM_Contribute_BAO_Contribution', 'contribution_status_id', $objectRef->contribution_status_id)) {
23 contributioncancelactions_cancel_related_pending_memberships((int) $objectId);
24 contributioncancelactions_cancel_related_pending_participant_records((int) $objectId);
25 }
26 }
27 }
28
29 /**
30 * Find and cancel any pending participant records.
31 *
32 * @param int $contributionID
33 * @throws CiviCRM_API3_Exception
34 */
35 function contributioncancelactions_cancel_related_pending_participant_records($contributionID): void {
36 $pendingStatuses = CRM_Event_PseudoConstant::participantStatus(NULL, "class = 'Pending'");
37 $waitingStatuses = CRM_Event_PseudoConstant::participantStatus(NULL, "class = 'Waiting'");
38 $cancellableParticipantRecords = civicrm_api3('ParticipantPayment', 'get', [
39 'contribution_id' => $contributionID,
40 'participant_id.status_id' => ['IN' => array_merge(array_keys($pendingStatuses), array_keys($waitingStatuses))],
41 ])['values'];
42 if (empty($cancellableParticipantRecords)) {
43 return;
44 }
45 Participant::update(FALSE)
46 ->addWhere('id', 'IN', array_keys($cancellableParticipantRecords))
47 ->setValues(['status_id:name' => 'Cancelled'])
48 ->execute();
49 }
50
51 /**
52 * Find and cancel any pending memberships.
53 *
54 * @param int $contributionID
55 * @throws API_Exception
56 * @throws CiviCRM_API3_Exception
57 */
58 function contributioncancelactions_cancel_related_pending_memberships($contributionID): void {
59 $connectedMemberships = (array) LineItem::get(FALSE)->setWhere([
60 ['contribution_id', '=', $contributionID],
61 ['entity_table', '=', 'civicrm_membership'],
62 ])->execute()->indexBy('entity_id');
63
64 if (empty($connectedMemberships)) {
65 return;
66 }
67 // @todo we don't have v4 membership api yet so v3 for now.
68 $connectedMemberships = array_keys(civicrm_api3('Membership', 'get', [
69 'status_id' => 'Pending',
70 'id' => ['IN' => array_keys($connectedMemberships)],
71 ])['values']);
72 if (empty($connectedMemberships)) {
73 return;
74 }
75 foreach ($connectedMemberships as $membershipID) {
76 civicrm_api3('Membership', 'create', ['status_id' => 'Cancelled', 'id' => $membershipID, 'is_override' => 1]);
77 }
78 }