3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.6 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2015 |
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 +--------------------------------------------------------------------+
31 * @copyright CiviCRM LLC (c) 2004-2015
32 * $Id: PaymentProcessor.php 9702 2007-05-29 23:57:16Z lobo $
37 * This class generates form components for Payment Processor
40 class CRM_Admin_Form_PaymentProcessor
extends CRM_Admin_Form
{
41 protected $_id = NULL;
43 protected $_testID = NULL;
45 protected $_fields = NULL;
49 public function preProcess() {
50 if (!CRM_Core_Permission
::check('administer payment processors')) {
51 CRM_Core_Error
::statusBounce('The \'administer payment processors\' permission is required to add or edit a payment processor.');
55 CRM_Utils_System
::setTitle(ts('Settings - Payment Processor'));
57 // get the payment processor meta information
60 $this->_ppType
= CRM_Utils_Request
::retrieve('pp', 'String', $this, FALSE, NULL);
61 if (!$this->_ppType
) {
62 $this->_ppType
= CRM_Core_DAO
::getFieldValue('CRM_Financial_DAO_PaymentProcessor',
64 'payment_processor_type_id'
67 $this->set('pp', $this->_ppType
);
70 $this->_ppType
= CRM_Utils_Request
::retrieve('pp', 'String', $this, TRUE, NULL);
73 $this->assign('ppType', $this->_ppType
);
74 $ppTypeName = CRM_Core_DAO
::getFieldValue('CRM_Financial_DAO_PaymentProcessorType',
78 $this->assign('ppTypeName', $ppTypeName);
80 $this->_ppDAO
= new CRM_Financial_DAO_PaymentProcessorType();
81 $this->_ppDAO
->id
= $this->_ppType
;
83 if (!$this->_ppDAO
->find(TRUE)) {
84 CRM_Core_Error
::fatal(ts('Could not find payment processor meta information'));
88 $refreshURL = CRM_Utils_System
::url('civicrm/admin/paymentProcessor',
89 "reset=1&action=update&id={$this->_id}",
94 $refreshURL = CRM_Utils_System
::url('civicrm/admin/paymentProcessor',
101 $destination = CRM_Utils_Request
::retrieve('civicrmDestination', 'String', $this);
103 $destination = urlencode($destination);
104 $refreshURL .= "&civicrmDestination=$destination";
107 $this->assign('refreshURL', $refreshURL);
109 $this->assign('is_recur', $this->_ppDAO
->is_recur
);
111 $this->_fields
= array(
113 'name' => 'user_name',
114 'label' => $this->_ppDAO
->user_name_label
,
117 'name' => 'password',
118 'label' => $this->_ppDAO
->password_label
,
121 'name' => 'signature',
122 'label' => $this->_ppDAO
->signature_label
,
126 'label' => $this->_ppDAO
->subject_label
,
129 'name' => 'url_site',
130 'label' => ts('Site URL'),
132 'msg' => ts('Enter a valid URL'),
136 if ($this->_ppDAO
->is_recur
) {
137 $this->_fields
[] = array(
138 'name' => 'url_recur',
139 'label' => ts('Recurring Payments URL'),
141 'msg' => ts('Enter a valid URL'),
145 if (!empty($this->_ppDAO
->url_button_default
)) {
146 $this->_fields
[] = array(
147 'name' => 'url_button',
148 'label' => ts('Button URL'),
150 'msg' => ts('Enter a valid URL'),
154 if (!empty($this->_ppDAO
->url_api_default
)) {
155 $this->_fields
[] = array(
157 'label' => ts('API URL'),
159 'msg' => ts('Enter a valid URL'),
165 * Build the form object.
171 public function buildQuickForm($check = FALSE) {
172 parent
::buildQuickForm();
174 if ($this->_action
& CRM_Core_Action
::DELETE
) {
178 $attributes = CRM_Core_DAO
::getAttribute('CRM_Financial_DAO_PaymentProcessor');
180 $this->add('text', 'name', ts('Name'),
181 $attributes['name'], TRUE
184 $this->addRule('name', ts('Name already exists in Database.'), 'objectExists', array(
185 'CRM_Financial_DAO_PaymentProcessor',
189 $this->add('text', 'description', ts('Description'),
190 $attributes['description']
193 $types = CRM_Core_PseudoConstant
::paymentProcessorType();
194 $this->add('select', 'payment_processor_type_id', ts('Payment Processor Type'), $types, TRUE,
195 array('onchange' => "reload(true)")
198 // Financial Account of account type asset CRM-11515
199 $accountType = CRM_Core_PseudoConstant
::accountOptionValues('financial_account_type', NULL, " AND v.name = 'Asset' ");
200 $financialAccount = CRM_Contribute_PseudoConstant
::financialAccount(NULL, key($accountType));
201 if ($fcount = count($financialAccount)) {
202 $this->assign('financialAccount', $fcount);
204 $this->add('select', 'financial_account_id', ts('Financial Account'),
205 array('' => ts('- select -')) +
$financialAccount,
208 // is this processor active ?
209 $this->add('checkbox', 'is_active', ts('Is this Payment Processor active?'));
210 $this->add('checkbox', 'is_default', ts('Is this Payment Processor the default?'));
212 foreach ($this->_fields
as $field) {
213 if (empty($field['label'])) {
217 $this->add('text', $field['name'],
218 $field['label'], $attributes[$field['name']]
220 $this->add('text', "test_{$field['name']}",
221 $field['label'], $attributes[$field['name']]
223 if (!empty($field['rule'])) {
224 $this->addRule($field['name'], $field['msg'], $field['rule']);
225 $this->addRule("test_{$field['name']}", $field['msg'], $field['rule']);
229 $this->addFormRule(array('CRM_Admin_Form_PaymentProcessor', 'formRule'));
237 public static function formRule($fields) {
239 // make sure that at least one of live or test is present
240 // and we have at least name and url_site
241 // would be good to make this processor specific
244 if (!(self
::checkSection($fields, $errors) ||
245 self
::checkSection($fields, $errors, 'test')
248 $errors['_qf_default'] = ts('You must have at least the test or live section filled');
251 if (!empty($errors)) {
255 return empty($errors) ?
TRUE : $errors;
261 * @param null $section
265 public static function checkSection(&$fields, &$errors, $section = NULL) {
266 $names = array('user_name');
270 foreach ($names as $name) {
272 $name = "{$section}_$name";
274 if (!empty($fields[$name])) {
284 $errors['_qf_default'] = ts('You must have at least the user_name specified');
293 public function setDefaultValues() {
295 if ($this->_ppType
) {
296 $defaults['payment_processor_type_id'] = $this->_ppType
;
299 $defaults['is_active'] = $defaults['is_default'] = 1;
300 $defaults['url_site'] = $this->_ppDAO
->url_site_default
;
301 $defaults['url_api'] = $this->_ppDAO
->url_api_default
;
302 $defaults['url_recur'] = $this->_ppDAO
->url_recur_default
;
303 $defaults['url_button'] = $this->_ppDAO
->url_button_default
;
304 $defaults['test_url_site'] = $this->_ppDAO
->url_site_test_default
;
305 $defaults['test_url_api'] = $this->_ppDAO
->url_api_test_default
;
306 $defaults['test_url_recur'] = $this->_ppDAO
->url_recur_test_default
;
307 $defaults['test_url_button'] = $this->_ppDAO
->url_button_test_default
;
310 $domainID = CRM_Core_Config
::domainID();
312 $dao = new CRM_Financial_DAO_PaymentProcessor();
313 $dao->id
= $this->_id
;
314 $dao->domain_id
= $domainID;
315 if (!$dao->find(TRUE)) {
319 CRM_Core_DAO
::storeValues($dao, $defaults);
322 $testDAO = new CRM_Financial_DAO_PaymentProcessor();
323 $testDAO->name
= $dao->name
;
324 $testDAO->is_test
= 1;
325 $testDAO->domain_id
= $domainID;
326 if ($testDAO->find(TRUE)) {
327 $this->_testID
= $testDAO->id
;
329 foreach ($this->_fields
as $field) {
330 $testName = "test_{$field['name']}";
331 $defaults[$testName] = $testDAO->{$field['name']};
334 $defaults['financial_account_id'] = CRM_Financial_BAO_FinancialTypeAccount
::getFinancialAccount($dao->id
, 'civicrm_payment_processor', 'financial_account_id');
340 * Process the form submission.
345 public function postProcess() {
346 CRM_Utils_System
::flushCache('CRM_Financial_DAO_PaymentProcessor');
348 if ($this->_action
& CRM_Core_Action
::DELETE
) {
349 CRM_Financial_BAO_PaymentProcessor
::del($this->_id
);
350 CRM_Core_Session
::setStatus("", ts('Payment Processor Deleted.'), "success");
354 $values = $this->controller
->exportValues($this->_name
);
355 $domainID = CRM_Core_Config
::domainID();
357 if (!empty($values['is_default'])) {
358 $query = "UPDATE civicrm_payment_processor SET is_default = 0 WHERE domain_id = $domainID";
359 CRM_Core_DAO
::executeQuery($query, CRM_Core_DAO
::$_nullArray);
362 $this->updatePaymentProcessor($values, $domainID, FALSE);
363 $this->updatePaymentProcessor($values, $domainID, TRUE);
364 CRM_Core_Session
::setStatus(ts('Payment processor %1 has been saved.', array(1 => "<em>{$values['name']}</em>")), ts('Saved'), 'success');
368 * Save a payment processor.
371 * @param int $domainID
376 public function updatePaymentProcessor(&$values, $domainID, $test) {
377 $dao = new CRM_Financial_DAO_PaymentProcessor();
379 $dao->id
= $test ?
$this->_testID
: $this->_id
;
380 $dao->domain_id
= $domainID;
381 $dao->is_test
= $test;
382 $dao->is_default
= CRM_Utils_Array
::value('is_default', $values, 0);
384 $dao->is_active
= CRM_Utils_Array
::value('is_active', $values, 0);
386 $dao->name
= $values['name'];
387 $dao->description
= $values['description'];
388 $dao->payment_processor_type_id
= $values['payment_processor_type_id'];
390 foreach ($this->_fields
as $field) {
391 $fieldName = $test ?
"test_{$field['name']}" : $field['name'];
392 $dao->{$field['name']} = trim(CRM_Utils_Array
::value($fieldName, $values));
393 if (empty($dao->{$field['name']})) {
394 $dao->{$field['name']} = 'null';
398 // also copy meta fields from the info DAO
399 $dao->is_recur
= $this->_ppDAO
->is_recur
;
400 $dao->billing_mode
= $this->_ppDAO
->billing_mode
;
401 $dao->class_name
= $this->_ppDAO
->class_name
;
402 $dao->payment_type
= $this->_ppDAO
->payment_type
;
408 $relationTypeId = key(CRM_Core_PseudoConstant
::accountOptionValues('account_relationship', NULL, " AND v.name LIKE 'Asset Account is' "));
410 'entity_table' => 'civicrm_payment_processor',
411 'entity_id' => $dao->id
,
412 'account_relationship' => $relationTypeId,
413 'financial_account_id' => $values['financial_account_id'],
415 CRM_Financial_BAO_FinancialTypeAccount
::add($params);