Merge pull request #17539 from eileenmcnaughton/fatal2
[civicrm-core.git] / CRM / Core / Payment / Dummy.php
CommitLineData
6a488035
TO
1<?php
2/*
3 * Copyright (C) 2007
4 * Licensed to CiviCRM under the Academic Free License version 3.0.
5 *
6 * Written and contributed by Ideal Solution, LLC (http://www.idealso.com)
7 *
8 */
9
10/**
11 *
12 * @package CRM
13 * @author Marshal Newrock <marshal@idealso.com>
6a488035
TO
14 */
15
65f1a9a1 16use Civi\Payment\Exception\PaymentProcessorException;
3bfefe56 17use Civi\Payment\PropertyBag;
65f1a9a1 18
c866eb5f
TO
19/**
20 * Dummy payment processor
6a488035
TO
21 */
22class CRM_Core_Payment_Dummy extends CRM_Core_Payment {
3bfefe56 23 protected $_mode;
6a488035 24
be2fb01f
CW
25 protected $_params = [];
26 protected $_doDirectPaymentResult = [];
f8fe0df6 27
28 /**
eca28728
EM
29 * Set result from do Direct Payment for test purposes.
30 *
f8fe0df6 31 * @param array $doDirectPaymentResult
eca28728 32 * Result to be returned from test.
f8fe0df6 33 */
34 public function setDoDirectPaymentResult($doDirectPaymentResult) {
35 $this->_doDirectPaymentResult = $doDirectPaymentResult;
9d0f10b7 36 if (empty($this->_doDirectPaymentResult['trxn_id'])) {
be2fb01f 37 $this->_doDirectPaymentResult['trxn_id'] = [];
9d0f10b7
EM
38 }
39 else {
40 $this->_doDirectPaymentResult['trxn_id'] = (array) $doDirectPaymentResult['trxn_id'];
41 }
f8fe0df6 42 }
6a488035 43
6a488035 44 /**
fe482240 45 * Constructor.
6a488035 46 *
6a0b768e
TO
47 * @param string $mode
48 * The mode of operation: live or test.
6a488035 49 *
3bfefe56 50 * @param array $paymentProcessor
6a488035 51 */
00be9182 52 public function __construct($mode, &$paymentProcessor) {
6a488035
TO
53 $this->_mode = $mode;
54 $this->_paymentProcessor = $paymentProcessor;
6a488035
TO
55 }
56
6a488035 57 /**
fe482240 58 * Submit a payment using Advanced Integration Method.
6a488035 59 *
6a0b768e
TO
60 * @param array $params
61 * Assoc array of input parameters for this transaction.
6a488035 62 *
a6c01b45
CW
63 * @return array
64 * the result in a nice formatted array (or an error object)
65f1a9a1 65 * @throws \Civi\Payment\Exception\PaymentProcessorException
6a488035 66 */
00be9182 67 public function doDirectPayment(&$params) {
3bfefe56 68 $propertyBag = PropertyBag::cast($params);
6a488035
TO
69 // Invoke hook_civicrm_paymentProcessor
70 // In Dummy's case, there is no translation of parameters into
71 // the back-end's canonical set of parameters. But if a processor
72 // does this, it needs to invoke this hook after it has done translation,
73 // but before it actually starts talking to its proprietary back-end.
3bfefe56 74 if ($propertyBag->getIsRecur()) {
75 $throwAnENoticeIfNotSetAsTheseAreRequired = $propertyBag->getRecurFrequencyInterval() . $propertyBag->getRecurFrequencyUnit();
3a1f9fd3 76 }
6a488035 77 // no translation in Dummy processor
6a488035
TO
78 CRM_Utils_Hook::alterPaymentProcessorParams($this,
79 $params,
3bfefe56 80 $propertyBag
6a488035 81 );
7758bd2b
EM
82 // This means we can test failing transactions by setting a past year in expiry. A full expiry check would
83 // be more complete.
5a89b539 84 if (!empty($params['credit_card_exp_date']['Y']) && date('Y') >
7758bd2b 85 CRM_Core_Payment_Form::getCreditCardExpirationYear($params)) {
90530b87 86 throw new PaymentProcessorException(ts('Invalid expiry date'));
7758bd2b 87 }
f8fe0df6 88 //end of hook invocation
89 if (!empty($this->_doDirectPaymentResult)) {
9d0f10b7 90 $result = $this->_doDirectPaymentResult;
65f1a9a1 91 if (CRM_Utils_Array::value('payment_status_id', $result) === 'failed') {
92 throw new PaymentProcessorException($result['message'] ?? 'failed');
93 }
9d0f10b7
EM
94 $result['trxn_id'] = array_shift($this->_doDirectPaymentResult['trxn_id']);
95 return $result;
f8fe0df6 96 }
3bfefe56 97 if ($this->_mode === 'test') {
353ffa53 98 $query = "SELECT MAX(trxn_id) FROM civicrm_contribution WHERE trxn_id LIKE 'test\\_%'";
be2fb01f 99 $p = [];
3bfefe56 100 $trxn_id = (string) CRM_Core_DAO::singleValueQuery($query, $p);
353ffa53 101 $trxn_id = str_replace('test_', '', $trxn_id);
3bfefe56 102 $trxn_id = (int) $trxn_id + 1;
24dc4331 103 $params['trxn_id'] = 'test_' . $trxn_id . '_' . uniqid();
6a488035
TO
104 }
105 else {
353ffa53 106 $query = "SELECT MAX(trxn_id) FROM civicrm_contribution WHERE trxn_id LIKE 'live_%'";
be2fb01f 107 $p = [];
3bfefe56 108 $trxn_id = (string) CRM_Core_DAO::singleValueQuery($query, $p);
353ffa53 109 $trxn_id = str_replace('live_', '', $trxn_id);
3bfefe56 110 $trxn_id = (int) $trxn_id + 1;
24dc4331 111 $params['trxn_id'] = 'live_' . $trxn_id . '_' . uniqid();
6a488035 112 }
3bfefe56 113 $params['gross_amount'] = $propertyBag->getAmount();
3a2251cf
DG
114 // Add a fee_amount so we can make sure fees are handled properly in underlying classes.
115 $params['fee_amount'] = 1.50;
3209a807 116 $params['description'] = $this->getPaymentDescription($params);
3a2251cf 117
6a488035
TO
118 return $params;
119 }
120
6c786a9b 121 /**
6bc775cf
MD
122 * Does this payment processor support refund?
123 *
124 * @return bool
125 */
126 public function supportsRefund() {
127 return TRUE;
128 }
129
b59a905f 130 /**
3bfefe56 131 * Supports altering future start dates.
132 *
b59a905f
SL
133 * @return bool
134 */
135 public function supportsFutureRecurStartDate() {
136 return TRUE;
137 }
138
6bc775cf
MD
139 /**
140 * Submit a refund payment
141 *
142 * @throws \Civi\Payment\Exception\PaymentProcessorException
143 *
144 * @param array $params
145 * Assoc array of input parameters for this transaction.
146 */
147 public function doRefund(&$params) {}
148
6a488035 149 /**
fe482240 150 * This function checks to see if we have the right config values.
6a488035 151 *
a6c01b45
CW
152 * @return string
153 * the error message if any
6a488035 154 */
00be9182 155 public function checkConfig() {
6a488035
TO
156 return NULL;
157 }
96025800 158
10df056e 159 /**
160 * Get an array of the fields that can be edited on the recurring contribution.
161 *
162 * Some payment processors support editing the amount and other scheduling details of recurring payments, especially
163 * those which use tokens. Others are fixed. This function allows the processor to return an array of the fields that
164 * can be updated from the contribution recur edit screen.
165 *
166 * The fields are likely to be a subset of these
167 * - 'amount',
168 * - 'installments',
169 * - 'frequency_interval',
170 * - 'frequency_unit',
171 * - 'cycle_day',
172 * - 'next_sched_contribution_date',
173 * - 'end_date',
174 * - 'failure_retry_day',
175 *
176 * The form does not restrict which fields from the contribution_recur table can be added (although if the html_type
177 * metadata is not defined in the xml for the field it will cause an error.
178 *
179 * Open question - would it make sense to return membership_id in this - which is sometimes editable and is on that
180 * form (UpdateSubscription).
181 *
182 * @return array
183 */
184 public function getEditableRecurringScheduleFields() {
be2fb01f 185 return ['amount', 'next_sched_contribution_date'];
10df056e 186 }
187
f926d56f 188 /**
3bfefe56 189 * Does this processor support cancelling recurring contributions through code.
f926d56f 190 *
3bfefe56 191 * If the processor returns true it must be possible to take action from within CiviCRM
192 * that will result in no further payments being processed. In the case of token processors (e.g
193 * IATS, eWay) updating the contribution_recur table is probably sufficient.
194 *
195 * @return bool
f926d56f 196 */
3bfefe56 197 protected function supportsCancelRecurring() {
f926d56f
MWMC
198 return TRUE;
199 }
200
3bfefe56 201 /**
202 * Cancel a recurring subscription.
203 *
204 * Payment processor classes should override this rather than implementing cancelSubscription.
205 *
206 * A PaymentProcessorException should be thrown if the update of the contribution_recur
207 * record should not proceed (in many cases this function does nothing
208 * as the payment processor does not need to take any action & this should silently
209 * proceed. Note the form layer will only call this after calling
210 * $processor->supports('cancelRecurring');
211 *
212 * @param \Civi\Payment\PropertyBag $propertyBag
213 *
214 * @return array
215 *
216 * @throws \Civi\Payment\Exception\PaymentProcessorException
217 */
218 public function doCancelRecurring(PropertyBag $propertyBag) {
219 return ['message' => ts('Recurring contribution cancelled')];
220 }
221
6a488035 222}