441 lines
18 KiB
PHP
441 lines
18 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @file pages/user/UserHandler.php
|
|
*
|
|
* Copyright (c) 2014-2021 Simon Fraser University
|
|
* Copyright (c) 2003-2021 John Willinsky
|
|
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
|
*
|
|
* @class UserHandler
|
|
*
|
|
* @ingroup pages_user
|
|
*
|
|
* @brief Handle requests for user functions.
|
|
*/
|
|
|
|
namespace APP\pages\user;
|
|
|
|
use APP\core\Application;
|
|
use APP\facades\Repo;
|
|
use APP\journal\Journal;
|
|
use APP\payment\ojs\OJSPaymentManager;
|
|
use APP\subscription\form\UserIndividualSubscriptionForm;
|
|
use APP\subscription\form\UserInstitutionalSubscriptionForm;
|
|
use APP\subscription\IndividualSubscriptionDAO;
|
|
use APP\subscription\InstitutionalSubscriptionDAO;
|
|
use APP\subscription\Subscription;
|
|
use APP\subscription\SubscriptionTypeDAO;
|
|
use APP\template\TemplateManager;
|
|
use PKP\db\DAORegistry;
|
|
use PKP\pages\user\PKPUserHandler;
|
|
|
|
class UserHandler extends PKPUserHandler
|
|
{
|
|
/**
|
|
* Display subscriptions page
|
|
*
|
|
* @param array $args
|
|
* @param \APP\core\Request $request
|
|
*/
|
|
public function subscriptions($args, $request)
|
|
{
|
|
$this->validate(null, $request);
|
|
|
|
$journal = $request->getJournal();
|
|
$user = $request->getUser();
|
|
$templateMgr = TemplateManager::getManager($request);
|
|
if (!$journal || !$user || $journal->getData('publishingMode') != Journal::PUBLISHING_MODE_SUBSCRIPTION) {
|
|
$request->redirect(null, 'index');
|
|
}
|
|
|
|
$subscriptionTypeDao = DAORegistry::getDAO('SubscriptionTypeDAO'); /** @var SubscriptionTypeDAO $subscriptionTypeDao */
|
|
$individualSubscriptionTypesExist = $subscriptionTypeDao->subscriptionTypesExistByInstitutional($journal->getId(), false);
|
|
$institutionalSubscriptionTypesExist = $subscriptionTypeDao->subscriptionTypesExistByInstitutional($journal->getId(), true);
|
|
if (!$individualSubscriptionTypesExist && !$institutionalSubscriptionTypesExist) {
|
|
$request->redirect(null, 'index');
|
|
}
|
|
|
|
// Subscriptions contact and additional information
|
|
// Get subscriptions and options for current journal
|
|
if ($individualSubscriptionTypesExist) {
|
|
$subscriptionDao = DAORegistry::getDAO('IndividualSubscriptionDAO'); /** @var IndividualSubscriptionDAO $subscriptionDao */
|
|
$userIndividualSubscription = $subscriptionDao->getByUserIdForJournal($user->getId(), $journal->getId());
|
|
$templateMgr->assign('userIndividualSubscription', $userIndividualSubscription);
|
|
}
|
|
|
|
if ($institutionalSubscriptionTypesExist) {
|
|
/** @var InstitutionalSubscriptionDAO $subscriptionDao */
|
|
$subscriptionDao = DAORegistry::getDAO('InstitutionalSubscriptionDAO');
|
|
$userInstitutionalSubscriptions = $subscriptionDao->getByUserIdForJournal($user->getId(), $journal->getId())->toArray();
|
|
$templateMgr->assign('userInstitutionalSubscriptions', $userInstitutionalSubscriptions);
|
|
$institutions = [];
|
|
foreach ($userInstitutionalSubscriptions as $userInstitutionalSubscription) {
|
|
$institution = Repo::institution()->get($userInstitutionalSubscription->getInstitutionId());
|
|
$institutions[$userInstitutionalSubscription->getId()] = $institution;
|
|
}
|
|
$templateMgr->assign('institutions', $institutions);
|
|
}
|
|
|
|
$paymentManager = Application::getPaymentManager($journal);
|
|
|
|
$this->setupTemplate($request);
|
|
|
|
$templateMgr->assign([
|
|
'subscriptionName' => $journal->getData('subscriptionName'),
|
|
'subscriptionEmail' => $journal->getData('subscriptionEmail'),
|
|
'subscriptionPhone' => $journal->getData('subscriptionPhone'),
|
|
'subscriptionMailingAddress' => $journal->getData('subscriptionMailingAddress'),
|
|
'subscriptionAdditionalInformation' => $journal->getLocalizedData('subscriptionAdditionalInformation'),
|
|
'journalTitle' => $journal->getLocalizedName(),
|
|
'journalPath' => $journal->getPath(),
|
|
'individualSubscriptionTypesExist' => $individualSubscriptionTypesExist,
|
|
'institutionalSubscriptionTypesExist' => $institutionalSubscriptionTypesExist,
|
|
'paymentsEnabled' => $paymentManager->isConfigured(),
|
|
]);
|
|
$templateMgr->display('frontend/pages/userSubscriptions.tpl');
|
|
}
|
|
|
|
/**
|
|
* Determine if the journal's setup has been sufficiently completed.
|
|
*
|
|
* @param object $journal
|
|
*
|
|
* @return bool True iff setup is incomplete
|
|
*/
|
|
public function _checkIncompleteSetup($journal)
|
|
{
|
|
if ($journal->getLocalizedAcronym() == '' || $journal->getData('contactEmail') == '' ||
|
|
$journal->getData('contactName') == '' || $journal->getLocalizedData('abbreviation') == '') {
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
//
|
|
// Payments
|
|
//
|
|
/**
|
|
* Purchase a subscription.
|
|
*
|
|
* @param array $args
|
|
* @param \APP\core\Request $request
|
|
*/
|
|
public function purchaseSubscription($args, $request)
|
|
{
|
|
$this->validate(null, $request);
|
|
$journal = $request->getContext();
|
|
if (empty($args) || !$journal || $journal->getData('publishingMode') != Journal::PUBLISHING_MODE_SUBSCRIPTION) {
|
|
$request->redirect(null, 'index');
|
|
}
|
|
|
|
$paymentManager = Application::getPaymentManager($journal);
|
|
$acceptSubscriptionPayments = $paymentManager->isConfigured();
|
|
if (!$acceptSubscriptionPayments) {
|
|
$request->redirect(null, 'index');
|
|
}
|
|
|
|
$this->setupTemplate($request);
|
|
$user = $request->getUser();
|
|
|
|
$institutional = array_shift($args);
|
|
if (!empty($args)) {
|
|
$subscriptionId = (int) array_shift($args);
|
|
}
|
|
|
|
if ($institutional == 'institutional') {
|
|
$institutional = true;
|
|
$subscriptionDao = DAORegistry::getDAO('InstitutionalSubscriptionDAO'); /** @var InstitutionalSubscriptionDAO $subscriptionDao */
|
|
} else {
|
|
$institutional = false;
|
|
$subscriptionDao = DAORegistry::getDAO('IndividualSubscriptionDAO'); /** @var IndividualSubscriptionDAO $subscriptionDao */
|
|
}
|
|
|
|
if (isset($subscriptionId)) {
|
|
// Ensure subscription to be updated is for this user
|
|
if (!$subscriptionDao->subscriptionExistsByUser($subscriptionId, $user->getId())) {
|
|
$request->redirect(null, 'index');
|
|
}
|
|
|
|
// Ensure subscription can be updated
|
|
$subscription = $subscriptionDao->getById($subscriptionId);
|
|
$subscriptionStatus = $subscription->getStatus();
|
|
$validStatus = [
|
|
Subscription::SUBSCRIPTION_STATUS_ACTIVE,
|
|
Subscription::SUBSCRIPTION_STATUS_AWAITING_ONLINE_PAYMENT,
|
|
Subscription::SUBSCRIPTION_STATUS_AWAITING_MANUAL_PAYMENT
|
|
];
|
|
|
|
if (!in_array($subscriptionStatus, $validStatus)) {
|
|
$request->redirect(null, 'index');
|
|
}
|
|
|
|
if ($institutional) {
|
|
$subscriptionForm = new UserInstitutionalSubscriptionForm($request, $user->getId(), $subscriptionId);
|
|
} else {
|
|
$subscriptionForm = new UserIndividualSubscriptionForm($request, $user->getId(), $subscriptionId);
|
|
}
|
|
} else {
|
|
if ($institutional) {
|
|
$subscriptionForm = new UserInstitutionalSubscriptionForm($request, $user->getId());
|
|
} else {
|
|
// Ensure user does not already have an individual subscription
|
|
if ($subscriptionDao->subscriptionExistsByUserForJournal($user->getId(), $journal->getId())) {
|
|
$request->redirect(null, 'index');
|
|
}
|
|
$subscriptionForm = new UserIndividualSubscriptionForm($request, $user->getId());
|
|
}
|
|
}
|
|
|
|
$subscriptionForm->initData();
|
|
$subscriptionForm->display();
|
|
}
|
|
|
|
/**
|
|
* Pay for a subscription purchase.
|
|
*
|
|
* @param array $args
|
|
* @param \APP\core\Request $request
|
|
*/
|
|
public function payPurchaseSubscription($args, $request)
|
|
{
|
|
$this->validate(null, $request);
|
|
|
|
if (empty($args)) {
|
|
$request->redirect(null, 'index');
|
|
}
|
|
|
|
$journal = $request->getContext();
|
|
if (!$journal) {
|
|
$request->redirect(null, 'index');
|
|
}
|
|
if ($journal->getData('publishingMode') != Journal::PUBLISHING_MODE_SUBSCRIPTION) {
|
|
$request->redirect(null, 'index');
|
|
}
|
|
|
|
$paymentManager = Application::getPaymentManager($journal);
|
|
$acceptSubscriptionPayments = $paymentManager->isConfigured();
|
|
if (!$acceptSubscriptionPayments) {
|
|
$request->redirect(null, 'index');
|
|
}
|
|
|
|
$this->setupTemplate($request);
|
|
$user = $request->getUser();
|
|
|
|
$institutional = array_shift($args);
|
|
if (!empty($args)) {
|
|
$subscriptionId = (int) array_shift($args);
|
|
}
|
|
|
|
if ($institutional == 'institutional') {
|
|
$institutional = true;
|
|
$subscriptionDao = DAORegistry::getDAO('InstitutionalSubscriptionDAO'); /** @var InstitutionalSubscriptionDAO $subscriptionDao */
|
|
} else {
|
|
$institutional = false;
|
|
$subscriptionDao = DAORegistry::getDAO('IndividualSubscriptionDAO'); /** @var IndividualSubscriptionDAO $subscriptionDao */
|
|
}
|
|
|
|
if (isset($subscriptionId)) {
|
|
// Ensure subscription to be updated is for this user
|
|
if (!$subscriptionDao->subscriptionExistsByUser($subscriptionId, $user->getId())) {
|
|
$request->redirect(null, 'index');
|
|
}
|
|
|
|
// Ensure subscription can be updated
|
|
$subscription = $subscriptionDao->getById($subscriptionId);
|
|
$subscriptionStatus = $subscription->getStatus();
|
|
$validStatus = [
|
|
Subscription::SUBSCRIPTION_STATUS_ACTIVE,
|
|
Subscription::SUBSCRIPTION_STATUS_AWAITING_ONLINE_PAYMENT,
|
|
Subscription::SUBSCRIPTION_STATUS_AWAITING_MANUAL_PAYMENT
|
|
];
|
|
|
|
if (!in_array($subscriptionStatus, $validStatus)) {
|
|
$request->redirect(null, 'index');
|
|
}
|
|
|
|
if ($institutional) {
|
|
$subscriptionForm = new UserInstitutionalSubscriptionForm($request, $user->getId(), $subscriptionId);
|
|
} else {
|
|
$subscriptionForm = new UserIndividualSubscriptionForm($request, $user->getId(), $subscriptionId);
|
|
}
|
|
} else {
|
|
if ($institutional) {
|
|
$subscriptionForm = new UserInstitutionalSubscriptionForm($request, $user->getId());
|
|
} else {
|
|
// Ensure user does not already have an individual subscription
|
|
if ($subscriptionDao->subscriptionExistsByUserForJournal($user->getId(), $journal->getId())) {
|
|
$request->redirect(null, 'index');
|
|
}
|
|
$subscriptionForm = new UserIndividualSubscriptionForm($request, $user->getId());
|
|
}
|
|
}
|
|
|
|
$subscriptionForm->readInputData();
|
|
|
|
// Check for any special cases before trying to save
|
|
if ($request->getUserVar('addIpRange')) {
|
|
$editData = true;
|
|
$ipRanges = $subscriptionForm->getData('ipRanges');
|
|
$ipRanges[] = '';
|
|
$subscriptionForm->setData('ipRanges', $ipRanges);
|
|
} elseif (($delIpRange = $request->getUserVar('delIpRange')) && count($delIpRange) == 1) {
|
|
$editData = true;
|
|
[$delIpRange] = array_keys($delIpRange);
|
|
$delIpRange = (int) $delIpRange;
|
|
$ipRanges = $subscriptionForm->getData('ipRanges');
|
|
array_splice($ipRanges, $delIpRange, 1);
|
|
$subscriptionForm->setData('ipRanges', $ipRanges);
|
|
}
|
|
|
|
if (isset($editData)) {
|
|
$subscriptionForm->display();
|
|
} else {
|
|
if ($subscriptionForm->validate()) {
|
|
$subscriptionForm->execute();
|
|
} else {
|
|
$subscriptionForm->display();
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Complete the purchase subscription process.
|
|
*
|
|
* @param array $args
|
|
* @param \APP\core\Request $request
|
|
*/
|
|
public function completePurchaseSubscription($args, $request)
|
|
{
|
|
$this->validate(null, $request);
|
|
$journal = $request->getContext();
|
|
if (!$journal || count($args) != 2 || $journal->getData('publishingMode') != Journal::PUBLISHING_MODE_SUBSCRIPTION) {
|
|
$request->redirect(null, 'index');
|
|
}
|
|
|
|
$paymentManager = Application::getPaymentManager($journal);
|
|
$acceptSubscriptionPayments = $paymentManager->isConfigured();
|
|
if (!$acceptSubscriptionPayments) {
|
|
$request->redirect(null, 'index');
|
|
}
|
|
|
|
$this->setupTemplate($request);
|
|
$user = $request->getUser();
|
|
$institutional = array_shift($args);
|
|
$subscriptionId = (int) array_shift($args);
|
|
|
|
if ($institutional == 'institutional') {
|
|
$subscriptionDao = DAORegistry::getDAO('InstitutionalSubscriptionDAO'); /** @var InstitutionalSubscriptionDAO $subscriptionDao */
|
|
} else {
|
|
$subscriptionDao = DAORegistry::getDAO('IndividualSubscriptionDAO'); /** @var IndividualSubscriptionDAO $subscriptionDao */
|
|
}
|
|
|
|
if (!$subscriptionDao->subscriptionExistsByUser($subscriptionId, $user->getId())) {
|
|
$request->redirect(null, 'index');
|
|
}
|
|
|
|
$subscription = $subscriptionDao->getById($subscriptionId);
|
|
$subscriptionStatus = $subscription->getStatus();
|
|
$validStatus = [Subscription::SUBSCRIPTION_STATUS_ACTIVE, Subscription::SUBSCRIPTION_STATUS_AWAITING_ONLINE_PAYMENT];
|
|
|
|
if (!in_array($subscriptionStatus, $validStatus)) {
|
|
$request->redirect(null, 'index');
|
|
}
|
|
|
|
$subscriptionTypeDao = DAORegistry::getDAO('SubscriptionTypeDAO'); /** @var SubscriptionTypeDAO $subscriptionTypeDao */
|
|
$subscriptionType = $subscriptionTypeDao->getById($subscription->getTypeId());
|
|
|
|
$queuedPayment = $paymentManager->createQueuedPayment($request, OJSPaymentManager::PAYMENT_TYPE_PURCHASE_SUBSCRIPTION, $user->getId(), $subscriptionId, $subscriptionType->getCost(), $subscriptionType->getCurrencyCodeAlpha());
|
|
$paymentManager->queuePayment($queuedPayment);
|
|
|
|
$paymentForm = $paymentManager->getPaymentForm($queuedPayment);
|
|
$paymentForm->display($request);
|
|
}
|
|
|
|
/**
|
|
* Pay the "renew subscription" fee.
|
|
*
|
|
* @param array $args
|
|
* @param \APP\core\Request $request
|
|
*/
|
|
public function payRenewSubscription($args, $request)
|
|
{
|
|
$this->validate(null, $request);
|
|
$journal = $request->getContext();
|
|
if (count($args) != 2 || !$journal || $journal->getData('publishingMode') != Journal::PUBLISHING_MODE_SUBSCRIPTION) {
|
|
$request->redirect(null, 'index');
|
|
}
|
|
|
|
$paymentManager = Application::getPaymentManager($journal);
|
|
$acceptSubscriptionPayments = $paymentManager->isConfigured();
|
|
if (!$acceptSubscriptionPayments) {
|
|
$request->redirect(null, 'index');
|
|
}
|
|
|
|
$this->setupTemplate($request);
|
|
$user = $request->getUser();
|
|
$institutional = array_shift($args);
|
|
$subscriptionId = (int) array_shift($args);
|
|
|
|
if ($institutional == 'institutional') {
|
|
$subscriptionDao = DAORegistry::getDAO('InstitutionalSubscriptionDAO'); /** @var InstitutionalSubscriptionDAO $subscriptionDao */
|
|
} else {
|
|
$subscriptionDao = DAORegistry::getDAO('IndividualSubscriptionDAO'); /** @var IndividualSubscriptionDAO $subscriptionDao */
|
|
}
|
|
|
|
if (!$subscriptionDao->subscriptionExistsByUser($subscriptionId, $user->getId())) {
|
|
$request->redirect(null, 'index');
|
|
}
|
|
|
|
$subscription = $subscriptionDao->getById($subscriptionId);
|
|
|
|
if ($subscription->isNonExpiring()) {
|
|
$request->redirect(null, 'index');
|
|
}
|
|
|
|
$subscriptionStatus = $subscription->getStatus();
|
|
$validStatus = [
|
|
Subscription::SUBSCRIPTION_STATUS_ACTIVE,
|
|
Subscription::SUBSCRIPTION_STATUS_AWAITING_ONLINE_PAYMENT,
|
|
Subscription::SUBSCRIPTION_STATUS_AWAITING_MANUAL_PAYMENT
|
|
];
|
|
|
|
if (!in_array($subscriptionStatus, $validStatus)) {
|
|
$request->redirect(null, 'index');
|
|
}
|
|
|
|
$subscriptionTypeDao = DAORegistry::getDAO('SubscriptionTypeDAO'); /** @var SubscriptionTypeDAO $subscriptionTypeDao */
|
|
$subscriptionType = $subscriptionTypeDao->getById($subscription->getTypeId());
|
|
|
|
$queuedPayment = $paymentManager->createQueuedPayment($request, OJSPaymentManager::PAYMENT_TYPE_RENEW_SUBSCRIPTION, $user->getId(), $subscriptionId, $subscriptionType->getCost(), $subscriptionType->getCurrencyCodeAlpha());
|
|
$paymentManager->queuePayment($queuedPayment);
|
|
|
|
$paymentForm = $paymentManager->getPaymentForm($queuedPayment);
|
|
$paymentForm->display($request);
|
|
}
|
|
|
|
/**
|
|
* Pay for a membership.
|
|
*
|
|
* @param array $args
|
|
* @param \APP\core\Request $request
|
|
*/
|
|
public function payMembership($args, $request)
|
|
{
|
|
$this->validate(null, $request);
|
|
$this->setupTemplate($request);
|
|
$journal = $request->getContext();
|
|
$user = $request->getUser();
|
|
|
|
$paymentManager = Application::getPaymentManager($journal);
|
|
|
|
$queuedPayment = $paymentManager->createQueuedPayment($request, OJSPaymentManager::PAYMENT_TYPE_MEMBERSHIP, $user->getId(), null, $journal->getData('membershipFee'));
|
|
$paymentManager->queuePayment($queuedPayment);
|
|
|
|
$paymentForm = $paymentManager->getPaymentForm($queuedPayment);
|
|
$paymentForm->display($request);
|
|
}
|
|
}
|