Open Journal Systems  3.3.0
OJSPaymentManager.inc.php
1 <?php
2 
18 import('lib.pkp.classes.payment.QueuedPayment');
19 import('lib.pkp.classes.payment.PaymentManager');
20 
21 define('PAYMENT_TYPE_MEMBERSHIP', 0x000000001);
22 define('PAYMENT_TYPE_RENEW_SUBSCRIPTION', 0x000000002);
23 define('PAYMENT_TYPE_PURCHASE_ARTICLE', 0x000000003);
24 define('PAYMENT_TYPE_DONATION', 0x000000004);
25 define('PAYMENT_TYPE_SUBMISSION', 0x000000005);
26 define('PAYMENT_TYPE_FASTTRACK', 0x000000006);
27 define('PAYMENT_TYPE_PUBLICATION', 0x000000007);
28 define('PAYMENT_TYPE_PURCHASE_SUBSCRIPTION', 0x000000008);
29 define('PAYMENT_TYPE_PURCHASE_ISSUE', 0x000000009);
30 
36  function isConfigured() {
37  return parent::isConfigured() && $this->_context->getData('paymentsEnabled');
38  }
39 
50  function createQueuedPayment($request, $type, $userId, $assocId, $amount, $currencyCode = null) {
51  if (is_null($currencyCode)) $currencyCode = $this->_context->getData('currency');
52  $payment = new QueuedPayment($amount, $currencyCode, $userId, $assocId);
53  $payment->setContextId($this->_context->getId());
54  $payment->setType($type);
55  $router = $request->getRouter();
56  $dispatcher = $router->getDispatcher();
57 
58  switch ($type) {
59  case PAYMENT_TYPE_PURCHASE_ARTICLE:
60  $payment->setRequestUrl($dispatcher->url($request, ROUTE_PAGE, null, 'article', 'view', $assocId));
61  break;
62  case PAYMENT_TYPE_PURCHASE_ISSUE:
63  $payment->setRequestUrl($dispatcher->url($request, ROUTE_PAGE, null, 'issue', 'view', $assocId));
64  break;
65  case PAYMENT_TYPE_PURCHASE_SUBSCRIPTION:
66  $payment->setRequestUrl($dispatcher->url($request, ROUTE_PAGE, null, 'issue', 'current'));
67  break;
68  case PAYMENT_TYPE_RENEW_SUBSCRIPTION:
69  $payment->setRequestUrl($dispatcher->url($request, ROUTE_PAGE, null, 'user', 'subscriptions'));
70  break;
71  case PAYMENT_TYPE_PUBLICATION:
72  $submissionDao = DAORegistry::getDAO('SubmissionDAO'); /* @var $submissionDao SubmissionDAO */
73  $submission = $submissionDao->getById($assocId);
74  if ($submission->getSubmissionProgress()!=0) {
75  $payment->setRequestUrl($dispatcher->url($request, ROUTE_PAGE, null, 'submission', 'wizard', $submission->getSubmissionProgress(), array('submissionId' => $assocId)));
76  } else {
77  $payment->setRequestUrl($dispatcher->url($request, ROUTE_PAGE, null, 'authorDashboard', 'submission', $submission->getId()));
78  }
79  break;
80  case PAYMENT_TYPE_MEMBERSHIP: // Deprecated
81  case PAYMENT_TYPE_DONATION: // Deprecated
82  case PAYMENT_TYPE_FASTTRACK: // Deprecated
83  case PAYMENT_TYPE_SUBMISSION: // Deprecated
84  default:
85  // Invalid payment type
86  error_log('Invalid payment type "' . $type . '"');
87  assert(false);
88  break;
89  }
90 
91  return $payment;
92  }
93 
101  function createCompletedPayment($queuedPayment, $payMethod, $userId = null) {
102  import('lib.pkp.classes.payment.CompletedPayment');
103  $payment = new CompletedPayment();
104  $payment->setContextId($queuedPayment->getContextId());
105  $payment->setType($queuedPayment->getType());
106  $payment->setAmount($queuedPayment->getAmount());
107  $payment->setCurrencyCode($queuedPayment->getCurrencyCode());
108 
109  if ($userId) $payment->setUserId($userId);
110  else $payment->setUserId($queuedPayment->getUserId());
111 
112  $payment->setAssocId($queuedPayment->getAssocId());
113  $payment->setPayMethodPluginName($payMethod);
114 
115  return $payment;
116  }
117 
122  function publicationEnabled() {
123  return $this->isConfigured() && $this->_context->getData('publicationFee') > 0;
124  }
125 
130  function membershipEnabled() {
131  return $this->isConfigured() && $this->_context->getData('membershipFee') > 0;
132  }
133 
139  return $this->isConfigured() && $this->_context->getData('purchaseArticleFee') > 0;
140  }
141 
146  function purchaseIssueEnabled() {
147  return $this->isConfigured() && $this->_context->getData('purchaseIssueFee') > 0;
148  }
149 
154  function onlyPdfEnabled() {
155  return $this->isConfigured() && $this->_context->getData('restrictOnlyPdf');
156  }
157 
162  function getPaymentPlugin() {
163  $paymentMethodPluginName = $this->_context->getData('paymentPluginName');
164  $paymentMethodPlugin = null;
165  if (!empty($paymentMethodPluginName)) {
166  $plugins = PluginRegistry::loadCategory('paymethod');
167  if (isset($plugins[$paymentMethodPluginName])) $paymentMethodPlugin = $plugins[$paymentMethodPluginName];
168  }
169  return $paymentMethodPlugin;
170  }
171 
179  function fulfillQueuedPayment($request, $queuedPayment, $payMethodPluginName = null) {
180  $returner = false;
181  $journal = $request->getContext();
182  if ($queuedPayment) switch ($queuedPayment->getType()) {
183  case PAYMENT_TYPE_MEMBERSHIP:
184  $userDao = DAORegistry::getDAO('UserDAO'); /* @var $userDao UserDAO */
185  $user = $userDao->getById($queuedPayment->getUserId());
186  $dateEnd = $user->getSetting('dateEndMembership', 0);
187  if (!$dateEnd) $dateEnd = 0;
188 
189  // if the membership is expired, extend it to today + 1 year
190  $time = time();
191  if ($dateEnd < $time ) $dateEnd = $time;
192 
193  $dateEnd = mktime(23, 59, 59, date("m", $dateEnd), date("d", $dateEnd), date("Y", $dateEnd)+1);
194  $user->updateSetting('dateEndMembership', $dateEnd, 'date', 0);
195  $returner = true;
196  break;
197  case PAYMENT_TYPE_PURCHASE_SUBSCRIPTION:
198  $subscriptionId = $queuedPayment->getAssocId();
199  $institutionalSubscriptionDao = DAORegistry::getDAO('InstitutionalSubscriptionDAO'); /* @var $institutionalSubscriptionDao InstitutionalSubscriptionDAO */
200  $individualSubscriptionDao = DAORegistry::getDAO('IndividualSubscriptionDAO'); /* @var $individualSubscriptionDao IndividualSubscriptionDAO */
201  if ($institutionalSubscriptionDao->subscriptionExists($subscriptionId)) {
202  $subscription = $institutionalSubscriptionDao->getById($subscriptionId);
203  $institutional = true;
204  } else {
205  $subscription = $individualSubscriptionDao->getById($subscriptionId);
206  $institutional = false;
207  }
208  if (!$subscription || $subscription->getUserId() != $queuedPayment->getUserId() || $subscription->getJournalId() != $queuedPayment->getContextId()) {
209  fatalError('Subscription integrity checks fail!');
210  return false;
211  }
212  // Update subscription end date now that payment is completed
213  if ($institutional) {
214  // Still requires approval from JM/SM since includes domain and IP ranges
215  import('classes.subscription.InstitutionalSubscription');
216  $subscription->setStatus(SUBSCRIPTION_STATUS_NEEDS_APPROVAL);
217  if ($subscription->isNonExpiring()) {
218  $institutionalSubscriptionDao->updateObject($subscription);
219  } else {
220  $institutionalSubscriptionDao->renewSubscription($subscription);
221  }
222 
223  // Notify JM/SM of completed online purchase
224  if ($journal->getData('enableSubscriptionOnlinePaymentNotificationPurchaseInstitutional')) {
225  import('classes.subscription.SubscriptionAction');
226  SubscriptionAction::sendOnlinePaymentNotificationEmail($request, $subscription, 'SUBSCRIPTION_PURCHASE_INSTL');
227  }
228  } else {
229  import('classes.subscription.IndividualSubscription');
230  $subscription->setStatus(SUBSCRIPTION_STATUS_ACTIVE);
231  if ($subscription->isNonExpiring()) {
232  $individualSubscriptionDao->updateObject($subscription);
233  } else {
234  $individualSubscriptionDao->renewSubscription($subscription);
235  }
236  // Notify JM/SM of completed online purchase
237  if ($journal->getData('enableSubscriptionOnlinePaymentNotificationPurchaseIndividual')) {
238  import('classes.subscription.SubscriptionAction');
239  SubscriptionAction::sendOnlinePaymentNotificationEmail($request, $subscription, 'SUBSCRIPTION_PURCHASE_INDL');
240  }
241  }
242  $returner = true;
243  break;
244  case PAYMENT_TYPE_RENEW_SUBSCRIPTION:
245  $subscriptionId = $queuedPayment->getAssocId();
246  $institutionalSubscriptionDao = DAORegistry::getDAO('InstitutionalSubscriptionDAO'); /* @var $institutionalSubscriptionDao InstitutionalSubscriptionDAO */
247  $individualSubscriptionDao = DAORegistry::getDAO('IndividualSubscriptionDAO'); /* @var $individualSubscriptionDao IndividualSubscriptionDAO */
248  if ($institutionalSubscriptionDao->subscriptionExists($subscriptionId)) {
249  $subscription = $institutionalSubscriptionDao->getById($subscriptionId);
250  $institutional = true;
251  } else {
252  $subscription = $individualSubscriptionDao->getById($subscriptionId);
253  $institutional = false;
254  }
255  if (!$subscription || $subscription->getUserId() != $queuedPayment->getUserId() || $subscription->getJournalId() != $queuedPayment->getContextId()) {
256  return false;
257  }
258  if ($institutional) {
259  $institutionalSubscriptionDao->renewSubscription($subscription);
260 
261  // Notify JM/SM of completed online purchase
262  if ($journal->getData('enableSubscriptionOnlinePaymentNotificationRenewInstitutional')) {
263  import('classes.subscription.SubscriptionAction');
264  SubscriptionAction::sendOnlinePaymentNotificationEmail($request, $subscription, 'SUBSCRIPTION_RENEW_INSTL');
265  }
266  } else {
267  $individualSubscriptionDao->renewSubscription($subscription);
268 
269  // Notify JM/SM of completed online purchase
270  if ($journal->getData('enableSubscriptionOnlinePaymentNotificationRenewIndividual')) {
271  import('classes.subscription.SubscriptionAction');
272  SubscriptionAction::sendOnlinePaymentNotificationEmail($request, $subscription, 'SUBSCRIPTION_RENEW_INDL');
273  }
274  }
275  $returner = true;
276  break;
277  case PAYMENT_TYPE_DONATION:
278  assert(false); // Deprecated
279  $returner = true;
280  break;
281  case PAYMENT_TYPE_PURCHASE_ARTICLE:
282  case PAYMENT_TYPE_PURCHASE_ISSUE:
283  case PAYMENT_TYPE_SUBMISSION:
284  case PAYMENT_TYPE_PUBLICATION:
285  $returner = true;
286  break;
287  default:
288  // Invalid payment type
289  assert(false);
290  }
291  $completedPaymentDao = DAORegistry::getDAO('OJSCompletedPaymentDAO'); /* @var $completedPaymentDao OJSCompletedPaymentDAO */
292  $completedPayment = $this->createCompletedPayment($queuedPayment, $payMethodPluginName, $request->getUser()->getId());
293  $completedPaymentDao->insertObject($completedPayment);
294 
295  $queuedPaymentDao = DAORegistry::getDAO('QueuedPaymentDAO'); /* @var $queuedPaymentDao QueuedPaymentDAO */
296  $queuedPaymentDao->deleteById($queuedPayment->getId());
297 
298  return $returner;
299  }
300 
305  function getPaymentName($payment) {
306  switch ($payment->getType()) {
307  case PAYMENT_TYPE_PURCHASE_SUBSCRIPTION:
308  case PAYMENT_TYPE_RENEW_SUBSCRIPTION:
309  $institutionalSubscriptionDao = DAORegistry::getDAO('InstitutionalSubscriptionDAO'); /* @var $institutionalSubscriptionDao InstitutionalSubscriptionDAO */
310 
311  if ($institutionalSubscriptionDao->subscriptionExists($payment->getAssocId())) {
312  $subscription = $institutionalSubscriptionDao->getById($payment->getAssocId());
313  } else {
314  $individualSubscriptionDao = DAORegistry::getDAO('IndividualSubscriptionDAO'); /* @var $individualSubscriptionDao IndividualSubscriptionDAO */
315  $subscription = $individualSubscriptionDao->getById($payment->getAssocId());
316  }
317  if (!$subscription) return __('payment.type.subscription');
318 
319  $subscriptionTypeDao = DAORegistry::getDAO('SubscriptionTypeDAO'); /* @var $subscriptionTypeDao SubscriptionTypeDAO */
320  $subscriptionType = $subscriptionTypeDao->getById($subscription->getTypeId());
321 
322  return __('payment.type.subscription') . ' (' . $subscriptionType->getLocalizedName() . ')';
323  case PAYMENT_TYPE_DONATION:
324  // DEPRECATED: This is only for display of OJS 2.x data.
325  return __('payment.type.donation');
326  case PAYMENT_TYPE_MEMBERSHIP:
327  return __('payment.type.membership');
328  case PAYMENT_TYPE_PURCHASE_ARTICLE:
329  return __('payment.type.purchaseArticle');
330  case PAYMENT_TYPE_PURCHASE_ISSUE:
331  return __('payment.type.purchaseIssue');
332  case PAYMENT_TYPE_SUBMISSION:
333  // DEPRECATED: This is only for display of OJS 2.x data.
334  return __('payment.type.submission');
335  case PAYMENT_TYPE_FASTTRACK:
336  // DEPRECATED: This is only for display of OJS 2.x data.
337  return __('payment.type.fastTrack');
338  case PAYMENT_TYPE_PUBLICATION:
339  return __('payment.type.publication');
340  default:
341  // Invalid payment type
342  assert(false);
343  }
344  }
345 }
346 
347 
QueuedPayment
Queued (unfulfilled) payment data structure.
Definition: QueuedPayment.inc.php:20
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
OJSPaymentManager\onlyPdfEnabled
onlyPdfEnabled()
Definition: OJSPaymentManager.inc.php:154
OJSPaymentManager\isConfigured
isConfigured()
Definition: OJSPaymentManager.inc.php:36
OJSPaymentManager\purchaseIssueEnabled
purchaseIssueEnabled()
Definition: OJSPaymentManager.inc.php:146
OJSPaymentManager\membershipEnabled
membershipEnabled()
Definition: OJSPaymentManager.inc.php:130
PluginRegistry\loadCategory
static loadCategory($category, $enabledOnly=false, $mainContextId=null)
Definition: PluginRegistry.inc.php:103
PaymentManager
Provides payment management functions.
Definition: PaymentManager.inc.php:18
CompletedPayment
Class describing a completed payment.
Definition: CompletedPayment.inc.php:19
OJSPaymentManager\purchaseArticleEnabled
purchaseArticleEnabled()
Definition: OJSPaymentManager.inc.php:138
OJSPaymentManager\getPaymentPlugin
getPaymentPlugin()
Definition: OJSPaymentManager.inc.php:162
SubscriptionAction\sendOnlinePaymentNotificationEmail
sendOnlinePaymentNotificationEmail($request, $subscription, $mailTemplateKey)
Definition: SubscriptionAction.inc.php:23
OJSPaymentManager\fulfillQueuedPayment
fulfillQueuedPayment($request, $queuedPayment, $payMethodPluginName=null)
Definition: OJSPaymentManager.inc.php:179
OJSPaymentManager\createCompletedPayment
createCompletedPayment($queuedPayment, $payMethod, $userId=null)
Definition: OJSPaymentManager.inc.php:101
OJSPaymentManager
Provides payment management functions.
Definition: OJSPaymentManager.inc.php:31
OJSPaymentManager\createQueuedPayment
createQueuedPayment($request, $type, $userId, $assocId, $amount, $currencyCode=null)
Definition: OJSPaymentManager.inc.php:50
OJSPaymentManager\publicationEnabled
publicationEnabled()
Definition: OJSPaymentManager.inc.php:122
fatalError
if(!function_exists('import')) fatalError($reason)
Definition: functions.inc.php:32
OJSPaymentManager\getPaymentName
getPaymentName($payment)
Definition: OJSPaymentManager.inc.php:305