3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.5 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2014 |
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 * This class stores logic for managing CiviCRM extensions.
32 * @copyright CiviCRM LLC (c) 2004-2014
36 class CRM_Extension_Manager_Payment
extends CRM_Extension_Manager_Base
{
39 @var CRM_Extension_Mapper
44 * @param CRM_Extension_Mapper $mapper
46 public function __construct(CRM_Extension_Mapper
$mapper) {
47 parent
::__construct(TRUE);
48 $this->mapper
= $mapper;
54 public function onPreInstall(CRM_Extension_Info
$info) {
55 $paymentProcessorTypes = $this->_getAllPaymentProcessorTypes('class_name');
57 if (array_key_exists($info->key
, $paymentProcessorTypes)) {
58 CRM_Core_Error
::fatal('This payment processor type is already installed.');
61 $ppByName = $this->_getAllPaymentProcessorTypes('name');
62 if (array_key_exists($info->name
, $ppByName)) {
63 CRM_Core_Error
::fatal('This payment processor type already exists.');
66 $dao = new CRM_Financial_DAO_PaymentProcessorType();
69 $dao->class_name
= trim($info->key
);
70 $dao->title
= trim($info->name
) . ' (' . trim($info->key
) . ')';
71 $dao->name
= trim($info->name
);
72 $dao->description
= trim($info->description
);
74 $dao->user_name_label
= trim($info->typeInfo
['userNameLabel']);
75 $dao->password_label
= trim($info->typeInfo
['passwordLabel']);
76 $dao->signature_label
= trim($info->typeInfo
['signatureLabel']);
77 $dao->subject_label
= trim($info->typeInfo
['subjectLabel']);
78 $dao->url_site_default
= trim($info->typeInfo
['urlSiteDefault']);
79 $dao->url_api_default
= trim($info->typeInfo
['urlApiDefault']);
80 $dao->url_recur_default
= trim($info->typeInfo
['urlRecurDefault']);
81 $dao->url_site_test_default
= trim($info->typeInfo
['urlSiteTestDefault']);
82 $dao->url_api_test_default
= trim($info->typeInfo
['urlApiTestDefault']);
83 $dao->url_recur_test_default
= trim($info->typeInfo
['urlRecurTestDefault']);
84 $dao->url_button_default
= trim($info->typeInfo
['urlButtonDefault']);
85 $dao->url_button_test_default
= trim($info->typeInfo
['urlButtonTestDefault']);
87 switch (trim($info->typeInfo
['billingMode'])) {
89 $dao->billing_mode
= CRM_Core_Payment
::BILLING_MODE_FORM
;
93 $dao->billing_mode
= CRM_Core_Payment
::BILLING_MODE_BUTTON
;
97 $dao->billing_mode
= CRM_Core_Payment
::BILLING_MODE_NOTIFY
;
101 CRM_Core_Error
::fatal('Billing mode in info file has wrong value.');
104 $dao->is_recur
= trim($info->typeInfo
['isRecur']);
105 $dao->payment_type
= trim($info->typeInfo
['paymentType']);
113 public function onPostInstall(CRM_Extension_Info
$info) {
114 $this->_runPaymentHook($info, 'install');
120 public function onPreUninstall(CRM_Extension_Info
$info) {
121 $paymentProcessorTypes = $this->_getAllPaymentProcessorTypes('class_name');
122 if (!array_key_exists($info->key
, $paymentProcessorTypes)) {
123 CRM_Core_Error
::fatal('This payment processor type is not registered.');
126 $dao = new CRM_Financial_DAO_PaymentProcessor();
127 $dao->payment_processor_type_id
= $paymentProcessorTypes[$info->key
];
129 while ($dao->fetch()) {
130 throw new CRM_Extension_Exception_DependencyException('payment');
133 $this->_runPaymentHook($info, 'uninstall');
134 return CRM_Financial_BAO_PaymentProcessorType
::del($paymentProcessorTypes[$info->key
]);
140 public function onPreDisable(CRM_Extension_Info
$info) {
141 // HMM? // if ($this->type == 'payment' && $this->status != 'missing') {
142 $this->_runPaymentHook($info, 'disable');
144 $paymentProcessorTypes = $this->_getAllPaymentProcessorTypes('class_name');
145 CRM_Financial_BAO_PaymentProcessorType
::setIsActive($paymentProcessorTypes[$info->key
], 0);
151 public function onPreEnable(CRM_Extension_Info
$info) {
152 $paymentProcessorTypes = $this->_getAllPaymentProcessorTypes('class_name');
153 CRM_Financial_BAO_PaymentProcessorType
::setIsActive($paymentProcessorTypes[$info->key
], 1);
159 public function onPostEnable(CRM_Extension_Info
$info) {
160 // HMM? // if ($this->type == 'payment' && $this->status != 'missing') {
161 $this->_runPaymentHook($info, 'enable');
165 * @param string $attr the attribute used to key the array
166 * @return array ($$attr => $id)
168 private function _getAllPaymentProcessorTypes($attr) {
170 $dao = new CRM_Financial_DAO_PaymentProcessorType();
172 while ($dao->fetch()) {
173 $ppt[$dao->$attr] = $dao->id
;
179 * Function to run hooks in the payment processor class
180 * Load requested payment processor and call the method specified.
182 * @param CRM_Extension_Info $info
183 * @param string $method - the method to call in the payment processor class
187 private function _runPaymentHook(CRM_Extension_Info
$info, $method) {
188 // Not concerned about performance at this stage, as these are seldomly performed tasks
189 // (payment processor enable/disable/install/uninstall). May wish to implement some
190 // kind of registry/caching system if more hooks are added.
193 $paymentClass = $this->mapper
->keyToClass($info->key
, 'payment');
194 $file = $this->mapper
->classToPath($paymentClass);
195 if (! file_exists($file)) {
196 CRM_Core_Session
::setStatus(ts('Failed to load file (%3) for payment processor (%1) while running "%2"', array(1 => $info->key
, 2 => $method, 3 => $file)), '', 'error');
201 } catch (CRM_Extension_Exception
$e) {
202 CRM_Core_Session
::setStatus(ts('Failed to determine file path for payment processor (%1) while running "%2"', array(1 => $info->key
, 2 => $method)), '', 'error');
206 // See if we have any instances of this PP defined ..
207 if ($processor_id = CRM_Core_DAO
::singleValueQuery("
209 FROM civicrm_extension ext
210 INNER JOIN civicrm_payment_processor_type ppt
211 ON ext.name = ppt.name
212 INNER JOIN civicrm_payment_processor pp
213 ON ppt.id = pp.payment_processor_type_id
214 WHERE ext.type = 'payment'
215 AND ext.full_name = %1
218 1 => array($info->key
, 'String'),
221 // If so, load params in the usual way ..
222 $paymentProcessor = CRM_Financial_BAO_PaymentProcessor
::getPayment($processor_id, NULL);
225 // Otherwise, do the best we can to construct some ..
226 $dao = CRM_Core_DAO
::executeQuery("
228 FROM civicrm_extension ext
229 INNER JOIN civicrm_payment_processor_type ppt
230 ON ppt.name = ext.name
232 AND ext.type = 'payment'
235 1 => array($info->name
, 'String'),
238 if ($dao->fetch()) $paymentProcessor = array(
240 'name' => $dao->title
,
241 'payment_processor_type_id' => $dao->id
,
242 'user_name' => 'nothing',
243 'password' => 'nothing',
245 'url_site' => $dao->url_site_default
,
246 'url_api' => $dao->url_api_default
,
247 'url_recur' => $dao->url_recur_default
,
248 'url_button' => $dao->url_button_default
,
250 'class_name' => $dao->class_name
,
251 'is_recur' => $dao->is_recur
,
252 'billing_mode' => $dao->billing_mode
,
253 'payment_type' => $dao->payment_type
,
255 else CRM_Core_Error
::fatal("Unable to find payment processor in " . __CLASS__
. '::' . __METHOD__
);
258 // In the case of uninstall, check for instances of PP first.
259 // Don't run hook if any are found.
260 if ($method == 'uninstall' && $paymentProcessor['id'] > 0) {
271 $processorInstance = $paymentClass::singleton(NULL, $paymentProcessor);
273 // Does PP implement this method, and can we call it?
274 if (method_exists($processorInstance, $method) && is_callable(array(
275 $processorInstance, $method))) {
276 // If so, call it ...
277 $processorInstance->$method();
282 CRM_Core_Session
::setStatus(ts( "Unrecognized payment hook (%1) in %2::%3",
283 array(1 => $method, 2 => __CLASS__
, 3 => __METHOD__
) ),