Merge pull request #10439 from jitendrapurohit/CRM-20657
[civicrm-core.git] / tests / phpunit / api / v3 / ParticipantPaymentTest.php
1 <?php
2 /**
3 * +--------------------------------------------------------------------+
4 * | CiviCRM version 4.7 |
5 * +--------------------------------------------------------------------+
6 * | Copyright CiviCRM LLC (c) 2004-2017 |
7 * +--------------------------------------------------------------------+
8 * | This file is a part of CiviCRM. |
9 * | |
10 * | CiviCRM is free software; you can copy, modify, and distribute it |
11 * | under the terms of the GNU Affero General Public License |
12 * | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
13 * | |
14 * | CiviCRM is distributed in the hope that it will be useful, but |
15 * | WITHOUT ANY WARRANTY; without even the implied warranty of |
16 * | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
17 * | See the GNU Affero General Public License for more details. |
18 * | |
19 * | You should have received a copy of the GNU Affero General Public |
20 * | License and the CiviCRM Licensing Exception along |
21 * | with this program; if not, contact CiviCRM LLC |
22 * | at info[AT]civicrm[DOT]org. If you have questions about the |
23 * | GNU Affero General Public License or the licensing of CiviCRM, |
24 * | see the CiviCRM license FAQ at http://civicrm.org/licensing |
25 * +--------------------------------------------------------------------+
26 */
27
28 /**
29 * Test APIv3 civicrm_participant_* functions
30 *
31 * @package CiviCRM_APIv3
32 * @subpackage API_Event
33 * @group headless
34 */
35 class api_v3_ParticipantPaymentTest extends CiviUnitTestCase {
36
37 protected $_apiversion = 3;
38 protected $_contactID;
39 protected $_createdParticipants;
40 protected $_participantID;
41 protected $_eventID;
42 protected $_participantPaymentID;
43 protected $_financialTypeId;
44
45 /**
46 * Set up for tests.
47 */
48 public function setUp() {
49 parent::setUp();
50 $this->useTransaction(TRUE);
51 $event = $this->eventCreate(NULL);
52 $this->_eventID = $event['id'];
53 $this->_contactID = $this->individualCreate();
54 $this->_createdParticipants = array();
55 $this->_individualId = $this->individualCreate();
56 $this->_financialTypeId = 1;
57
58 $this->_participantID = $this->participantCreate(array(
59 'contactID' => $this->_contactID,
60 'eventID' => $this->_eventID,
61 ));
62 $this->_contactID2 = $this->individualCreate();
63 $this->_participantID2 = $this->participantCreate(array(
64 'contactID' => $this->_contactID2,
65 'eventID' => $this->_eventID,
66 ));
67 $this->_participantID3 = $this->participantCreate(array(
68 'contactID' => $this->_contactID2,
69 'eventID' => $this->_eventID,
70 ));
71
72 $this->_contactID3 = $this->individualCreate();
73 $this->_participantID4 = $this->participantCreate(array(
74 'contactID' => $this->_contactID3,
75 'eventID' => $this->_eventID,
76 ));
77 }
78
79 /**
80 * Test civicrm_participant_payment_create with wrong params type.
81 */
82 public function testPaymentCreateWrongParamsType() {
83 $params = 'a string';
84 $this->callAPIFailure('participant_payment', 'create', $params);
85 }
86
87 /**
88 * Test civicrm_participant_payment_create with empty params.
89 */
90 public function testPaymentCreateEmptyParams() {
91 $params = array();
92 $this->callAPIFailure('participant_payment', 'create', $params);
93 }
94
95 /**
96 * Check without contribution_id.
97 */
98 public function testPaymentCreateMissingContributionId() {
99 //Without Payment EntityID
100 $params = array(
101 'participant_id' => $this->_participantID,
102 );
103 $this->callAPIFailure('participant_payment', 'create', $params);
104 }
105
106 /**
107 * Check with valid array.
108 */
109 public function testPaymentCreate() {
110 //Create Contribution & get contribution ID
111 $contributionID = $this->contributionCreate(array('contact_id' => $this->_contactID));
112
113 //Create Participant Payment record With Values
114 $params = array(
115 'participant_id' => $this->_participantID,
116 'contribution_id' => $contributionID,
117 );
118
119 $result = $this->callAPIAndDocument('participant_payment', 'create', $params, __FUNCTION__, __FILE__);
120 $this->assertTrue(array_key_exists('id', $result));
121
122 //delete created contribution
123 $this->contributionDelete($contributionID);
124 }
125
126
127 ///////////////// civicrm_participant_payment_create methods
128
129 /**
130 * Test civicrm_participant payment create with wrong params type.
131 */
132 public function testPaymentUpdateWrongParamsType() {
133 $params = 'a string';
134 $result = $this->callAPIFailure('participant_payment', 'create', $params);
135 $this->assertEquals('Input variable `params` is not an array', $result['error_message']);
136 }
137
138 /**
139 * Check with empty array.
140 */
141 public function testPaymentUpdateEmpty() {
142 $this->callAPIFailure('participant_payment', 'create', array());
143 }
144
145 /**
146 * Check with missing participant_id.
147 */
148 public function testPaymentUpdateMissingParticipantId() {
149 $params = array(
150 'contribution_id' => '3',
151 );
152 $this->callAPIFailure('participant_payment', 'create', $params);
153 }
154
155 /**
156 * Check with missing contribution_id.
157 */
158 public function testPaymentUpdateMissingContributionId() {
159 $params = array(
160 'participant_id' => $this->_participantID,
161 );
162 $participantPayment = $this->callAPIFailure('participant_payment', 'create', $params);
163 }
164
165 /**
166 * Check financial records for offline Participants.
167 */
168 public function testPaymentOffline() {
169
170 // create contribution w/o fee
171 $contributionID = $this->contributionCreate(array(
172 'contact_id' => $this->_contactID,
173 'financial_type_id' => $this->_financialTypeId,
174 'payment_instrument_id' => 4,
175 'fee_amount' => 0,
176 'net_amount' => 100,
177 ));
178
179 $this->_participantPaymentID = $this->participantPaymentCreate($this->_participantID, $contributionID);
180 $params = array(
181 'id' => $this->_participantPaymentID,
182 'participant_id' => $this->_participantID,
183 'contribution_id' => $contributionID,
184 );
185
186 // Update Payment
187 $participantPayment = $this->callAPISuccess('participant_payment', 'create', $params);
188 $this->assertEquals($participantPayment['id'], $this->_participantPaymentID);
189 $this->assertTrue(array_key_exists('id', $participantPayment));
190 // check Financial records
191 $this->_checkFinancialRecords($params, 'offline');
192 $params = array(
193 'id' => $this->_participantPaymentID,
194 );
195 $deletePayment = $this->callAPISuccess('participant_payment', 'delete', $params);
196 }
197
198 /**
199 * Check financial records for online Participant.
200 */
201 public function testPaymentOnline() {
202
203 $pageParams['processor_id'] = $this->processorCreate();
204 $contributionPage = $this->contributionPageCreate($pageParams);
205 $contributionParams = array(
206 'contact_id' => $this->_contactID,
207 'contribution_page_id' => $contributionPage['id'],
208 'payment_processor' => $pageParams['processor_id'],
209 'financial_type_id' => 1,
210 );
211 $contributionID = $this->contributionCreate($contributionParams);
212
213 $this->_participantPaymentID = $this->participantPaymentCreate($this->_participantID, $contributionID);
214 $params = array(
215 'id' => $this->_participantPaymentID,
216 'participant_id' => $this->_participantID,
217 'contribution_id' => $contributionID,
218 );
219
220 // Update Payment
221 $participantPayment = $this->callAPISuccess('participant_payment', 'create', $params);
222 $this->assertEquals($participantPayment['id'], $this->_participantPaymentID);
223 $this->assertTrue(array_key_exists('id', $participantPayment));
224 // check Financial records
225 $this->_checkFinancialRecords($params, 'online');
226 $params = array(
227 'id' => $this->_participantPaymentID,
228 );
229 $this->callAPISuccess('participant_payment', 'delete', $params);
230 }
231
232 /**
233 * Check financial records for online Participant pay later scenario.
234 */
235 public function testPaymentPayLaterOnline() {
236 $pageParams['processor_id'] = $this->processorCreate();
237 $pageParams['is_pay_later'] = 1;
238 $contributionPage = $this->contributionPageCreate($pageParams);
239 $contributionParams = array(
240 'contact_id' => $this->_contactID,
241 'contribution_page_id' => $contributionPage['id'],
242 'contribution_status_id' => 2,
243 'is_pay_later' => 1,
244 'financial_type_id' => 1,
245 );
246 $contributionID = $this->contributionCreate($contributionParams);
247
248 $this->_participantPaymentID = $this->participantPaymentCreate($this->_participantID, $contributionID);
249 $params = array(
250 'id' => $this->_participantPaymentID,
251 'participant_id' => $this->_participantID,
252 'contribution_id' => $contributionID,
253 );
254
255 // Update Payment
256 $participantPayment = $this->callAPISuccess('participant_payment', 'create', $params);
257 // check Financial Records
258 $this->_checkFinancialRecords($params, 'payLater');
259 $this->assertEquals($participantPayment['id'], $this->_participantPaymentID);
260 $this->assertTrue(array_key_exists('id', $participantPayment));
261 $params = array(
262 'id' => $this->_participantPaymentID,
263 );
264 $this->callAPISuccess('participant_payment', 'delete', $params);
265 }
266
267
268 /**
269 * Test civicrm_participant_payment_delete with wrong params type.
270 */
271 public function testPaymentDeleteWrongParamsType() {
272 $params = 'a string';
273 $this->callAPIFailure('participant_payment', 'delete', $params);
274 }
275
276 /**
277 * Check with empty array.
278 */
279 public function testPaymentDeleteWithEmptyParams() {
280 $params = array();
281 $deletePayment = $this->callAPIFailure('participant_payment', 'delete', $params);
282 $this->assertEquals('Mandatory key(s) missing from params array: id', $deletePayment['error_message']);
283 }
284
285 /**
286 * Check with wrong id.
287 */
288 public function testPaymentDeleteWithWrongID() {
289 $params = array(
290 'id' => 0,
291 );
292 $deletePayment = $this->callAPIFailure('participant_payment', 'delete', $params);
293 $this->assertEquals($deletePayment['error_message'], 'Error while deleting participantPayment');
294 }
295
296 /**
297 * Check with valid array.
298 */
299 public function testPaymentDelete() {
300 $contributionID = $this->contributionCreate(array(
301 'contact_id' => $this->_contactID,
302 ));
303
304 $this->_participantPaymentID = $this->participantPaymentCreate($this->_participantID, $contributionID);
305
306 $params = array(
307 'id' => $this->_participantPaymentID,
308 );
309 $this->callAPIAndDocument('participant_payment', 'delete', $params, __FUNCTION__, __FILE__);
310 }
311
312 /**
313 * Test civicrm_participantPayment_get - success expected.
314 */
315 public function testGet() {
316 $contributionID = $this->contributionCreate(array('contact_id' => $this->_contactID3));
317 $this->participantPaymentCreate($this->_participantID4, $contributionID);
318
319 //Create Participant Payment record With Values
320 $params = array(
321 'participant_id' => $this->_participantID4,
322 'contribution_id' => $contributionID,
323 );
324
325 $result = $this->callAPIAndDocument('participant_payment', 'get', $params, __FUNCTION__, __FILE__);
326 $this->assertEquals($result['values'][$result['id']]['participant_id'], $this->_participantID4, 'Check Participant Id');
327 $this->assertEquals($result['values'][$result['id']]['contribution_id'], $contributionID, 'Check Contribution Id');
328 }
329
330 /**
331 * @param array $params
332 * @param $context
333 */
334 public function _checkFinancialRecords($params, $context) {
335 $entityParams = array(
336 'entity_id' => $params['id'],
337 'entity_table' => 'civicrm_contribution',
338 );
339 $trxn = current(CRM_Financial_BAO_FinancialItem::retrieveEntityFinancialTrxn($entityParams));
340 $trxnParams = array(
341 'id' => $trxn['financial_trxn_id'],
342 );
343
344 switch ($context) {
345 case 'online':
346 $compareParams = array(
347 'to_financial_account_id' => 12,
348 'total_amount' => 100,
349 'status_id' => 1,
350 );
351 break;
352
353 case 'offline':
354 $compareParams = array(
355 'to_financial_account_id' => 6,
356 'total_amount' => 100,
357 'status_id' => 1,
358 );
359 break;
360
361 case 'payLater':
362 $compareParams = array(
363 'to_financial_account_id' => 7,
364 'total_amount' => 100,
365 'status_id' => 2,
366 );
367 break;
368 }
369
370 $this->assertDBCompareValues('CRM_Financial_DAO_FinancialTrxn', $trxnParams, $compareParams);
371 $entityParams = array(
372 'financial_trxn_id' => $trxn['financial_trxn_id'],
373 'entity_table' => 'civicrm_financial_item',
374 );
375 $entityTrxn = current(CRM_Financial_BAO_FinancialItem::retrieveEntityFinancialTrxn($entityParams));
376 $fitemParams = array(
377 'id' => $entityTrxn['entity_id'],
378 );
379 if ($context == 'offline' || $context == 'online') {
380 $compareParams = array(
381 'amount' => 100,
382 'status_id' => 1,
383 'financial_account_id' => 1,
384 );
385 }
386 elseif ($context == 'payLater') {
387 $compareParams = array(
388 'amount' => 100,
389 'status_id' => 3,
390 'financial_account_id' => 1,
391 );
392 }
393 $this->assertDBCompareValues('CRM_Financial_DAO_FinancialItem', $fitemParams, $compareParams);
394 }
395
396 /**
397 * test getParticipantIds() function
398 */
399 public function testGetParticipantIds() {
400 $contributionID = $this->contributionCreate(array('contact_id' => $this->_contactID));
401 $expectedParticipants = array($this->_participantID, $this->_participantID2);
402
403 //Create Participant Payment record With Values
404 foreach ($expectedParticipants as $pid) {
405 $params = array(
406 'participant_id' => $pid,
407 'contribution_id' => $contributionID,
408 );
409 $this->callAPISuccess('participant_payment', 'create', $params);
410 }
411 //Check if all participants are listed.
412 $participants = CRM_Event_BAO_Participant::getParticipantIds($contributionID);
413 $this->checkArrayEquals($expectedParticipants, $participants);
414 //delete created contribution
415 $this->contributionDelete($contributionID);
416 }
417
418 }