/** * Redeem a gift subscription for a user. * @param $gift Gift * @return int Status code indicating whether gift subscription could be redeemed */ function _redeemGiftSubscription(&$gift) { $journalId = $gift->getAssocId(); $userId = $gift->getRecipientUserId(); $giftSubscriptionTypeId = $gift->getGiftAssocId(); // Ensure subscription type exists and is for an individual subscription $subscriptionTypeDao = DAORegistry::getDAO('SubscriptionTypeDAO'); $giftSubscriptionType =& $subscriptionTypeDao->getSubscriptionType($giftSubscriptionTypeId); if ($giftSubscriptionType) { if ($giftSubscriptionType->getInstitutional()) { // Subscription type is not for individuals return GIFT_REDEEM_STATUS_ERROR_SUBSCRIPTION_TYPE_INVALID; } } else { // Subscription type no longer exists return GIFT_REDEEM_STATUS_ERROR_SUBSCRIPTION_TYPE_INVALID; } $individualSubscriptionDao = DAORegistry::getDAO('IndividualSubscriptionDAO'); $giftNonExpiring = $giftSubscriptionType->getNonExpiring(); $insert = false; // Retrieve user's subscription if they already have one if ($individualSubscriptionDao->subscriptionExistsByUserForJournal($userId, $journalId)) { $subscription =& $individualSubscriptionDao->getSubscriptionByUserForJournal($userId, $journalId); // Ensure user's existing subscription is not non-expiring if ($subscription->isNonExpiring()) { return GIFT_REDEEM_STATUS_ERROR_SUBSCRIPTION_NON_EXPIRING; } } else { // Otherwise, create a new individual subscription for user import('classes.subscription.IndividualSubscription'); $subscription = new IndividualSubscription(); $subscription->setJournalId($journalId); $subscription->setUserId($userId); $subscription->setMembership(null); $subscription->setReferenceNumber(null); $subscription->setNotes(null); $insert = true; } // Update subscription status and type $subscription->setStatus(SUBSCRIPTION_STATUS_ACTIVE); $subscription->setTypeId($giftSubscriptionTypeId); // Update subscription dates if ($giftNonExpiring) { $subscription->setDateStart(null); $subscription->setDateEnd(null); } else { // Set subscription start/end dates based on gift redemption date and duration of subscription type $time = time(); $duration = $giftSubscriptionType->getDuration(); $subscription->setDateStart(mktime(23, 59, 59, date("m", $time), date("d", $time), date("Y", $time))); $subscription->setDateEnd(mktime(23, 59, 59, date("m", $time) + $duration, date("d", $time), date("Y", $time))); } if ($insert) { $individualSubscriptionDao->insertSubscription($subscription); } else { $individualSubscriptionDao->updateSubscription($subscription); } return GIFT_REDEEM_STATUS_SUCCESS; }
/** * Create/update individual subscription. */ function execute() { $journal = $this->request->getJournal(); $journalId = $journal->getId(); $typeId = $this->getData('typeId'); $subscriptionTypeDao = DAORegistry::getDAO('SubscriptionTypeDAO'); $nonExpiring = $subscriptionTypeDao->getSubscriptionTypeNonExpiring($typeId); $today = date('Y-m-d'); $insert = false; if (!isset($this->subscription)) { import('classes.subscription.IndividualSubscription'); $subscription = new IndividualSubscription(); $subscription->setJournalId($journalId); $subscription->setUserId($this->userId); $subscription->setReferenceNumber(null); $subscription->setNotes(null); $insert = true; } else { $subscription =& $this->subscription; } import('classes.payment.ojs.OJSPaymentManager'); $paymentManager = new OJSPaymentManager($this->request); $paymentPlugin =& $paymentManager->getPaymentPlugin(); if ($paymentPlugin->getName() == 'ManualPayment') { $subscription->setStatus(SUBSCRIPTION_STATUS_AWAITING_MANUAL_PAYMENT); } else { $subscription->setStatus(SUBSCRIPTION_STATUS_AWAITING_ONLINE_PAYMENT); } $subscription->setTypeId($typeId); $subscription->setMembership($this->getData('membership') ? $this->getData('membership') : null); $subscription->setDateStart($nonExpiring ? null : $today); $subscription->setDateEnd($nonExpiring ? null : $today); $individualSubscriptionDao = DAORegistry::getDAO('IndividualSubscriptionDAO'); if ($insert) { $individualSubscriptionDao->insertSubscription($subscription); } else { $individualSubscriptionDao->updateSubscription($subscription); } $subscriptionTypeDao = DAORegistry::getDAO('SubscriptionTypeDAO'); $subscriptionType =& $subscriptionTypeDao->getSubscriptionType($this->getData('typeId')); $queuedPayment =& $paymentManager->createQueuedPayment($journalId, PAYMENT_TYPE_PURCHASE_SUBSCRIPTION, $this->userId, $subscription->getId(), $subscriptionType->getCost(), $subscriptionType->getCurrencyCodeAlpha()); $queuedPaymentId = $paymentManager->queuePayment($queuedPayment); $paymentManager->displayPaymentForm($queuedPaymentId, $queuedPayment); }