From 31e9eccd956785a61dc322623d6e975cbbd14308 Mon Sep 17 00:00:00 2001
From: Matthew Wire <mjw@mjwconsult.co.uk>
Date: Tue, 2 May 2023 18:04:58 +0100
Subject: [PATCH] Remove old IPN code

---
 CRM/Core/Payment/StripeIPN.php | 230 ---------------------------------
 1 file changed, 230 deletions(-)

diff --git a/CRM/Core/Payment/StripeIPN.php b/CRM/Core/Payment/StripeIPN.php
index 1a75601f..22c5e157 100644
--- a/CRM/Core/Payment/StripeIPN.php
+++ b/CRM/Core/Payment/StripeIPN.php
@@ -475,234 +475,4 @@ class CRM_Core_Payment_StripeIPN {
     return $return;
   }
 
-  /**
-   * Create the next contribution for a recurring contribution
-   * This happens when Stripe generates a new invoice and notifies us (normally by invoice.finalized but
-   * invoice.payment_succeeded sometimes arrives first).
-   *
-   * @throws \CiviCRM_API3_Exception
-   * @throws \Civi\Payment\Exception\PaymentProcessorException
-   */
-  public function createNextContributionForRecur() {
-    // We have a recurring contribution but no contribution so we'll repeattransaction
-    // Stripe has generated a new invoice (next payment in a subscription) so we
-    //   create a new contribution in CiviCRM
-    $params = [
-      'contribution_recur_id' => $this->contribution_recur_id,
-      'contribution_status_id' => CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Pending'),
-      'receive_date' => $this->receive_date,
-      'order_reference' => $this->invoice_id,
-      'trxn_id' => $this->charge_id,
-      'total_amount' => $this->amount,
-      'fee_amount' => $this->fee,
-    ];
-    $this->repeatContribution($params);
-    // Don't touch the contributionRecur as it's updated automatically by Contribution.repeattransaction
-  }
-
-  /**
-   * Gather and set info as class properties.
-   *
-   * Given the data passed to us via the Stripe Event, try to determine
-   * as much as we can about this event and set that information as
-   * properties to be used later.
-   *
-   * @return bool TRUE if we were able to find a contribution (via getContribution)
-   * @throws \CRM_Core_Exception
-   */
-  public function setInfo() {
-    if (!$this->getCustomer()) {
-      if ((bool)\Civi::settings()->get('stripe_ipndebug')) {
-        $message = $this->getPaymentProcessor()->getPaymentProcessorLabel() . ': ' . $this->getEventID() . ': Missing customer_id';
-        Civi::log()->debug($message);
-      }
-  //    return FALSE;
-    }
-
-    $this->receive_date = $this->retrieve('receive_date', 'String', FALSE);
-    $this->amount = $this->retrieve('amount', 'String', FALSE);
-
-    if (($this->getData()->object->object !== 'charge') && (!empty($this->charge_id))) {
-      $charge = $this->getPaymentProcessor()->stripeClient->charges->retrieve($this->charge_id);
-      $balanceTransactionID = CRM_Stripe_Api::getObjectParam('balance_transaction', $charge);
-    }
-    else {
-      $balanceTransactionID = CRM_Stripe_Api::getObjectParam('balance_transaction', $this->getData()->object);
-    }
-    try {
-      $balanceTransaction = $this->getPaymentProcessor()->stripeClient->balanceTransactions->retrieve($balanceTransactionID);
-      $this->fee = $this->getPaymentProcessor()->getFeeFromBalanceTransaction($balanceTransaction, $this->retrieve('currency', 'String', FALSE));
-    }
-    catch (Exception $e) {
-      throw new \Civi\Payment\Exception\PaymentProcessorException("Error retrieving balanceTransaction {$balanceTransactionID}. " . $e->getMessage());
-    }
-
-    // Get the CiviCRM recurring contribution that matches the Stripe subscription (if we have one).
-    $this->getSubscriptionDetails();
-    // Get the CiviCRM contribution that matches the Stripe metadata we have from the event
-    return $this->getContribution();
-  }
-
-  /**
-   * Get the recurring contribution from the Stripe event parameters (subscription_id)
-   *   and set subscription_id, contribution_recur_id vars.
-   *
-   * @return bool
-   * @throws \CRM_Core_Exception
-   */
-  public function getSubscriptionDetails() {
-    if (!$this->subscription_id) {
-      return FALSE;
-    }
-
-    // Get the recurring contribution record associated with the Stripe subscription.
-    $contributionRecur = ContributionRecur::get(FALSE)
-      ->addWhere('processor_id', '=', $this->subscription_id)
-      ->addWhere('is_test', 'IN', [TRUE, FALSE])
-      ->execute()
-      ->first();
-    if (empty($contributionRecur)) {
-      if ((bool)\Civi::settings()->get('stripe_ipndebug')) {
-        $message = $this->getPaymentProcessor()->getPaymentProcessorLabel() . ': ' . $this->getEventID() . ': Cannot find recurring contribution for subscription ID: ' . $this->subscription_id;
-        Civi::log()->debug($message);
-      }
-      return FALSE;
-    }
-    $this->contribution_recur_id = $contributionRecur['id'];
-    $this->contributionRecur = $contributionRecur;
-    return TRUE;
-  }
-
-  /**
-   * A) A one-off contribution will have trxn_id == stripe.charge_id
-   * B) A contribution linked to a recur (stripe subscription):
-   *   1. May have the trxn_id == stripe.subscription_id if the invoice was not generated at the time the contribution
-   * was created
-   *     (Eg. the recur was setup with a future recurring start date).
-   *     This will be updated to trxn_id == stripe.invoice_id when a suitable IPN is received
-   *     @todo: Which IPN events will update this?
-   *   2. May have the trxn_id == stripe.invoice_id if the invoice was generated at the time the contribution was
-   *   created OR the contribution has been updated by the IPN when the invoice was generated.
-   *
-   * @return bool
-   * @throws \Civi\Payment\Exception\PaymentProcessorException
-   */
-  private function getContribution() {
-    $paymentParams = [
-      'contribution_test' => $this->getPaymentProcessor()->getIsTestMode(),
-    ];
-
-    // A) One-off contribution
-    if (!empty($this->charge_id)) {
-      $paymentParams['trxn_id'] = $this->charge_id;
-      $contribution = civicrm_api3('Mjwpayment', 'get_contribution', $paymentParams);
-    }
-
-    // B2) Contribution linked to subscription and we have invoice_id
-    // @todo there is a case where $contribution is not defined (i.e. if charge_id is empty)
-    if (!$contribution['count']) {
-      unset($paymentParams['trxn_id']);
-      if (!empty($this->invoice_id)) {
-        $paymentParams['order_reference'] = $this->invoice_id;
-        $contribution = civicrm_api3('Mjwpayment', 'get_contribution', $paymentParams);
-      }
-    }
-
-    // B1) Contribution linked to subscription and we have subscription_id
-    // @todo there is a case where $contribution is not defined (i.e. if charge_id, invoice_id are empty)
-    if (!$contribution['count']) {
-      unset($paymentParams['trxn_id']);
-      if (!empty($this->subscription_id)) {
-        $paymentParams['order_reference'] = $this->subscription_id;
-        $contribution = civicrm_api3('Mjwpayment', 'get_contribution', $paymentParams);
-      }
-    }
-
-    // @todo there is a case where $contribution is not defined (i.e. if charge_id, invoice_id, subscription_id are empty)
-    if (!$contribution['count']) {
-      if ((bool)\Civi::settings()->get('stripe_ipndebug')) {
-        $message = $this->getPaymentProcessor()->getPaymentProcessorLabel() . 'No matching contributions for event ' . $this->getEventID();
-        Civi::log()->debug($message);
-      }
-      $result = [];
-      CRM_Mjwshared_Hook::webhookEventNotMatched('stripe', $this, 'contribution_not_found', $result);
-      if (empty($result['contribution'])) {
-        return FALSE;
-      }
-      $this->contribution = $result['contribution'];
-    }
-    else {
-      $this->contribution = $contribution['values'][$contribution['id']];
-    }
-
-    return TRUE;
-  }
-
-  /**
-   * Get the Stripe customer details and match to the StripeCustomer record in CiviCRM
-   * This gives us $this->contactID
-   *
-   * @return bool
-   * @throws \Civi\Payment\Exception\PaymentProcessorException
-   */
-  private function getCustomer() {
-    $this->customer_id = CRM_Stripe_Api::getObjectParam('customer_id', $this->getData()->object);
-    if (empty($this->customer_id)) {
-      $this->exception('Missing customer_id!');
-    }
-    try {
-      $customer = civicrm_api3('StripeCustomer', 'getsingle', [
-        'customer_id' => $this->customer_id,
-      ]);
-      $this->contactID = $customer['contact_id'];
-      if ($this->getPaymentProcessor()->getID() !== (int) $customer['processor_id']) {
-        $this->exception("Customer ({$this->customer_id}) and payment processor ID don't match (expected: {$customer['processor_id']}, actual: {$this->getPaymentProcessor()->getID()})");
-      }
-    }
-    catch (Exception $e) {
-      // Customer not found in CiviCRM
-      if ((bool)\Civi::settings()->get('stripe_ipndebug') && !$this->contribution) {
-        $message = $this->getPaymentProcessor()->getPaymentProcessorLabel() . 'Stripe Customer not found in CiviCRM for event ' . $this->getEventID();
-        Civi::log()->debug($message);
-      }
-      CRM_Mjwshared_Hook::webhookEventNotMatched('stripe', $this, 'customer_not_found');
-      return FALSE;
-    }
-    return TRUE;
-  }
-
-  /**
-   * This allows us to end a subscription once:
-   *   a) We've reached the end date / number of installments
-   *   b) The recurring contribution is marked as completed
-   *
-   * @throws \CiviCRM_API3_Exception
-   */
-  private function handleInstallmentsForSubscription() {
-    if ((!$this->contribution_recur_id) || (!$this->subscription_id)) {
-      return;
-    }
-
-    $contributionRecur = civicrm_api3('ContributionRecur', 'getsingle', [
-      'id' => $this->contribution_recur_id,
-    ]);
-
-    if (empty($contributionRecur['end_date'])) {
-      return;
-    }
-
-    // There is no easy way of retrieving a count of all invoices for a subscription so we ignore the "installments"
-    //   parameter for now and rely on checking end_date (which was calculated based on number of installments...)
-    // if (empty($contributionRecur['installments'])) { return; }
-
-    $stripeSubscription = $this->getPaymentProcessor()->stripeClient->subscriptions->retrieve($this->subscription_id);
-    // If we've passed the end date cancel the subscription
-    if (($stripeSubscription->current_period_end >= strtotime($contributionRecur['end_date']))
-      || ($contributionRecur['contribution_status_id']
-        == CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_ContributionRecur', 'contribution_status_id', 'Completed'))) {
-      $this->getPaymentProcessor()->stripeClient->subscriptions->update($this->subscription_id, ['cancel_at_period_end' => TRUE]);
-      $this->updateRecurCompleted(['id' => $this->contribution_recur_id]);
-    }
-  }
-
 }
-- 
GitLab