3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.7 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2018 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
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. |
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. |
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 +--------------------------------------------------------------------+
29 * Test APIv3 civicrm_contribute_* functions
31 * @package CiviCRM_APIv3
32 * @subpackage API_Contribution
34 class api_v3_FinancialTypeACLTest
extends CiviUnitTestCase
{
36 use CRMTraits_Financial_FinancialACLTrait
;
39 * Assume empty database with just civicrm_data.
41 protected $_individualId;
42 protected $_contribution;
43 protected $_financialTypeId = 1;
44 protected $_apiversion;
45 protected $_entity = 'Contribution';
48 protected $_ids = array();
49 protected $_pageParams = array();
52 * Parameters to create payment processor.
56 protected $_processorParams = array();
59 * ID of created event.
68 public function setUp() {
71 $this->_apiversion
= 3;
72 $this->_individualId
= $this->individualCreate();
73 $this->_params
= array(
74 'contact_id' => $this->_individualId
,
75 'receive_date' => '20120511',
76 'total_amount' => 100.00,
77 'financial_type_id' => $this->_financialTypeId
,
78 'non_deductible_amount' => 10.00,
80 'net_amount' => 95.00,
82 'contribution_status_id' => 1,
84 $this->_processorParams
= array(
87 'payment_processor_type_id' => 10,
88 'financial_account_id' => 12,
91 'url_site' => 'http://dummy.com',
92 'url_recur' => 'http://dummy.com',
95 $this->_pageParams
= array(
96 'title' => 'Test Contribution Page',
97 'financial_type_id' => 1,
99 'financial_account_id' => 1,
100 'payment_processor' => $this->processorCreate(),
102 'is_allow_other_amount' => 1,
104 'max_amount' => 1000,
109 * Clean up after each test.
111 public function tearDown() {
112 $this->quickCleanUpFinancialEntities();
113 $this->quickCleanup(array('civicrm_uf_match'));
114 $this->disableFinancialACLs();
120 public function testCreateACLContribution() {
121 $this->enableFinancialACLs();
123 'contact_id' => $this->_individualId
,
124 'receive_date' => '2010-01-20',
125 'total_amount' => 100.00,
126 'financial_type_id' => $this->_financialTypeId
,
127 'non_deductible_amount' => 10.00,
128 'fee_amount' => 5.00,
129 'net_amount' => 95.00,
131 'invoice_id' => 78910,
133 'contribution_status_id' => 1,
134 'check_permissions' => TRUE,
137 $this->setPermissions([
139 'access CiviContribute',
140 'edit contributions',
142 $result = $this->callAPIFailure('contribution', 'create', $p);
143 $this->assertEquals('You do not have permission to create this contribution', $result['error_message']);
144 $this->addFinancialAclPermissions([['add', 'Donation']]);
146 $contribution = $this->callAPISuccess('contribution', 'create', $p);
149 'contribution_id' => $contribution['id'],
152 $this->setPermissions([
154 'access CiviContribute',
155 'edit contributions',
156 'view contributions of type Donation',
157 'delete contributions of type Donation',
160 $contribution = $this->callAPISuccess('contribution', 'get', $params);
162 $this->assertEquals(1, $contribution['count']);
163 $this->assertEquals($contribution['values'][$contribution['id']]['contact_id'], $this->_individualId
);
164 $this->assertEquals($contribution['values'][$contribution['id']]['financial_type_id'], 1);
165 $this->assertEquals($contribution['values'][$contribution['id']]['total_amount'], 100.00);
166 $this->assertEquals($contribution['values'][$contribution['id']]['non_deductible_amount'], 10.00);
167 $this->assertEquals($contribution['values'][$contribution['id']]['fee_amount'], 5.00);
168 $this->assertEquals($contribution['values'][$contribution['id']]['net_amount'], 95.00);
169 $this->assertEquals($contribution['values'][$contribution['id']]['trxn_id'], 23456);
170 $this->assertEquals($contribution['values'][$contribution['id']]['invoice_id'], 78910);
171 $this->assertEquals($contribution['values'][$contribution['id']]['contribution_source'], 'SSF');
172 $this->assertEquals($contribution['values'][$contribution['id']]['contribution_status'], 'Completed');
173 $this->callAPISuccess('Contribution', 'Delete', array(
174 'id' => $contribution['id'],
179 * Test that acl contributions can be retrieved.
181 public function testGetACLContribution() {
182 $this->enableFinancialACLs();
184 $this->setPermissions([
186 'access CiviContribute',
188 'add contributions of type Donation',
190 $contribution = $this->callAPISuccess('Contribution', 'create', $this->_params
);
193 'id' => $contribution['id'],
194 'check_permissions' => TRUE,
196 $contribution = $this->callAPISuccess('contribution', 'get', $params);
197 $this->assertEquals($contribution['count'], 0);
199 $this->addFinancialAclPermissions([['view', 'Donation']]);
200 $contribution = $this->callAPISuccess('contribution', 'get', $params);
202 $this->assertEquals($contribution['count'], 1);
206 * Test checks that passing in line items suppresses the create mechanism.
208 public function testCreateACLContributionChainedLineItems() {
209 $this->enableFinancialACLs();
211 'contact_id' => $this->_individualId
,
212 'receive_date' => '20120511',
213 'total_amount' => 100.00,
214 'financial_type_id' => $this->_financialTypeId
,
215 'payment_instrument_id' => 1,
216 'non_deductible_amount' => 10.00,
217 'fee_amount' => 50.00,
218 'net_amount' => 90.00,
220 'contribution_status_id' => 1,
221 'check_permissions' => TRUE,
222 'api.line_item.create' => array(
224 'price_field_id' => 1,
226 'line_total' => '20',
227 'unit_price' => '10',
228 'financial_type_id' => 1,
231 'price_field_id' => 1,
233 'line_total' => '80',
234 'unit_price' => '80',
235 'financial_type_id' => 2,
240 $this->setPermissions([
242 'access CiviContribute',
243 'edit contributions',
244 'delete in CiviContribute',
245 'add contributions of type Donation',
246 'delete contributions of type Donation',
248 $this->callAPIFailure('contribution', 'create', $params, 'Error in call to LineItem_create : You do not have permission to create this line item');
250 // Check that the entire contribution has rolled back.
251 $contribution = $this->callAPISuccess('contribution', 'get', array());
252 $this->assertEquals(0, $contribution['count']);
254 $this->addFinancialAclPermissions([
255 ['add', 'Member Dues'],
256 ['view', 'Donation'],
257 ['view', 'Member Dues'],
258 ['delete', 'Member Dues'],
260 $contribution = $this->callAPISuccess('contribution', 'create', $params);
262 $lineItemParams = array(
263 'contribution_id' => $contribution['id'],
264 'entity_table' => 'civicrm_contribution',
266 $lineItems = $this->callAPISuccess('LineItem', 'get', $lineItemParams);
267 $this->assertEquals(3, $lineItems['count']);
268 $this->assertEquals(100.00, $lineItems['values'][3]['line_total']);
269 $this->assertEquals(20, $lineItems['values'][4]['line_total']);
270 $this->assertEquals(80, $lineItems['values'][5]['line_total']);
271 $this->assertEquals(1, $lineItems['values'][3]['financial_type_id']);
272 $this->assertEquals(1, $lineItems['values'][4]['financial_type_id']);
273 $this->assertEquals(2, $lineItems['values'][5]['financial_type_id']);
275 $this->callAPISuccess('Contribution', 'Delete', array(
276 'id' => $contribution['id'],
281 * Test that acl contributions can be edited.
283 public function testEditACLContribution() {
284 $this->enableFinancialACLs();
285 $contribution = $this->callAPISuccess('Contribution', 'create', $this->_params
);
288 'id' => $contribution['id'],
289 'check_permissions' => TRUE,
290 'total_amount' => 200.00,
293 $this->setPermissions([
295 'access CiviContribute',
296 'edit contributions',
297 'view contributions of type Donation',
299 $this->callAPIFailure('Contribution', 'create', $params);
301 $this->addFinancialAclPermissions([['edit', 'Donation']]);
302 $contribution = $this->callAPISuccess('Contribution', 'create', $params);
304 $this->assertEquals($contribution['values'][$contribution['id']]['total_amount'], 200.00);
308 * Test that acl contributions can be deleted.
310 public function testDeleteACLContribution() {
311 $this->enableFinancialACLs();
313 $this->setPermissions([
315 'access CiviContribute',
317 'add contributions of type Donation',
319 $contribution = $this->callAPISuccess('Contribution', 'create', $this->_params
);
322 'contribution_id' => $contribution['id'],
323 'check_permissions' => TRUE,
325 $this->addPermissions(['delete in CiviContribute']);
326 $this->callAPIFailure('Contribution', 'delete', $params);
328 $this->addFinancialAclPermissions([['delete', 'Donation']]);
329 $contribution = $this->callAPISuccess('Contribution', 'delete', $params);
331 $this->assertEquals($contribution['count'], 1);