first commit

This commit is contained in:
CHIEFSOFT\ameye
2024-06-08 17:09:23 -04:00
commit df3a033196
17887 changed files with 8637778 additions and 0 deletions
@@ -0,0 +1,117 @@
<?php
/**
* @file controllers/grid/subscriptions/IndividualSubscriptionForm.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 IndividualSubscriptionForm
*
* @ingroup subscription
*
* @brief Form class for individual subscription create/edits.
*/
namespace APP\controllers\grid\subscriptions;
use APP\core\Application;
use APP\core\Request;
use APP\notification\NotificationManager;
use APP\subscription\form\SubscriptionForm;
use APP\subscription\IndividualSubscription;
use APP\subscription\IndividualSubscriptionDAO;
use APP\subscription\SubscriptionTypeDAO;
use Exception;
use Illuminate\Support\Facades\Mail;
use PKP\db\DAORegistry;
use PKP\notification\PKPNotification;
class IndividualSubscriptionForm extends SubscriptionForm
{
/**
* Constructor
*
* @param Request $request
* @param int $subscriptionId leave as default for new subscription
*/
public function __construct($request, $subscriptionId = null)
{
parent::__construct('payments/individualSubscriptionForm.tpl', $subscriptionId);
$subscriptionId = isset($subscriptionId) ? (int) $subscriptionId : null;
$journal = $request->getJournal();
$journalId = $journal->getId();
if (isset($subscriptionId)) {
$subscriptionDao = DAORegistry::getDAO('IndividualSubscriptionDAO'); /** @var IndividualSubscriptionDAO $subscriptionDao */
if ($subscriptionDao->subscriptionExists($subscriptionId)) {
$this->subscription = $subscriptionDao->getById($subscriptionId);
}
}
$subscriptionTypeDao = DAORegistry::getDAO('SubscriptionTypeDAO'); /** @var SubscriptionTypeDAO $subscriptionTypeDao */
$subscriptionTypeIterator = $subscriptionTypeDao->getByInstitutional($journalId, false);
$this->subscriptionTypes = [];
while ($subscriptionType = $subscriptionTypeIterator->next()) {
$this->subscriptionTypes[$subscriptionType->getId()] = $subscriptionType->getSummaryString();
}
if (count($this->subscriptionTypes) == 0) {
$this->addError('typeId', __('manager.subscriptions.form.typeRequired'));
$this->addErrorField('typeId');
}
// Ensure subscription type is valid
$this->addCheck(new \PKP\form\validation\FormValidatorCustom($this, 'typeId', 'required', 'manager.subscriptions.form.typeIdValid', function ($typeId) use ($journalId) {
$subscriptionTypeDao = DAORegistry::getDAO('SubscriptionTypeDAO'); /** @var SubscriptionTypeDAO $subscriptionTypeDao */
return $subscriptionTypeDao->subscriptionTypeExistsByTypeId($typeId, $journalId) && !$subscriptionTypeDao->getSubscriptionTypeInstitutional($typeId);
}));
// Ensure that user does not already have a subscription for this journal
if (!isset($subscriptionId)) {
$this->addCheck(new \PKP\form\validation\FormValidatorCustom($this, 'userId', 'required', 'manager.subscriptions.form.subscriptionExists', [DAORegistry::getDAO('IndividualSubscriptionDAO'), 'subscriptionExistsByUserForJournal'], [$journalId], true));
} else {
$this->addCheck(new \PKP\form\validation\FormValidatorCustom($this, 'userId', 'required', 'manager.subscriptions.form.subscriptionExists', function ($userId) use ($journalId, $subscriptionId) {
$subscriptionDao = DAORegistry::getDAO('IndividualSubscriptionDAO'); /** @var IndividualSubscriptionDAO $subscriptionDao */
$checkSubscription = $subscriptionDao->getByUserIdForJournal($userId, $journalId);
return (!$checkSubscription || $checkSubscription->getId() == $subscriptionId) ? true : false;
}));
}
}
/**
* @copydoc Form::execute()
*/
public function execute(...$functionArgs)
{
$insert = false;
if (!isset($this->subscription)) {
$this->subscription = new IndividualSubscription();
$insert = true;
}
parent::execute(...$functionArgs);
$individualSubscriptionDao = DAORegistry::getDAO('IndividualSubscriptionDAO'); /** @var IndividualSubscriptionDAO $individualSubscriptionDao */
if ($insert) {
$individualSubscriptionDao->insertObject($this->subscription);
} else {
$individualSubscriptionDao->updateObject($this->subscription);
}
// Send notification email
if ($this->getData('notifyEmail')) {
$mailable = $this->_prepareNotificationEmail();
try {
Mail::send($mailable);
} catch (Exception $e) {
$notificationMgr = new NotificationManager();
$request = Application::get()->getRequest();
$notificationMgr->createTrivialNotification($request->getUser()->getId(), PKPNotification::NOTIFICATION_TYPE_ERROR, ['contents' => __('email.compose.error')]);
error_log($e->getMessage());
}
}
}
}
@@ -0,0 +1,228 @@
<?php
/**
* @file controllers/grid/subscriptions/IndividualSubscriptionsGridHandler.php
*
* Copyright (c) 2014-2021 Simon Fraser University
* Copyright (c) 2000-2021 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @class IndividualSubscriptionsGridHandler
*
* @ingroup controllers_grid_subscriptions
*
* @brief Handle subscription grid requests.
*/
namespace APP\controllers\grid\subscriptions;
use APP\core\Request;
use APP\facades\Repo;
use APP\notification\NotificationManager;
use APP\subscription\IndividualSubscriptionDAO;
use APP\subscription\SubscriptionDAO;
use PKP\controllers\grid\GridColumn;
use PKP\core\JSONMessage;
use PKP\db\DAO;
use PKP\db\DAORegistry;
use PKP\identity\Identity;
use PKP\notification\PKPNotification;
class IndividualSubscriptionsGridHandler extends SubscriptionsGridHandler
{
/**
* @copydoc SubscriptionsGridHandler::initialize()
*
* @param null|mixed $args
*/
public function initialize($request, $args = null)
{
parent::initialize($request, $args);
// Basic grid configuration.
$this->setTitle('subscriptionManager.individualSubscriptions');
//
// Grid columns.
//
$cellProvider = new SubscriptionsGridCellProvider();
$this->addColumn(
new GridColumn(
'name',
'common.name',
null,
null,
$cellProvider
)
);
$this->addColumn(
new GridColumn(
'email',
'user.email',
null,
null,
$cellProvider
)
);
$this->addColumn(
new GridColumn(
'subscriptionType',
'manager.subscriptions.subscriptionType',
null,
null,
$cellProvider
)
);
$this->addColumn(
new GridColumn(
'status',
'manager.subscriptions.form.status',
null,
null,
$cellProvider
)
);
$this->addColumn(
new GridColumn(
'dateStart',
'manager.subscriptions.dateStart',
null,
null,
$cellProvider
)
);
$this->addColumn(
new GridColumn(
'dateEnd',
'manager.subscriptions.dateEnd',
null,
null,
$cellProvider
)
);
$this->addColumn(
new GridColumn(
'referenceNumber',
'manager.subscriptions.referenceNumber',
null,
null,
$cellProvider
)
);
}
//
// Implement methods from GridHandler.
//
/**
* @copydoc GridHandler::renderFilter()
*/
public function renderFilter($request, $filterData = [])
{
$userDao = Repo::user()->dao;
return parent::renderFilter($request, array_merge_recursive(
$filterData,
[
'fieldOptions' => [
Identity::IDENTITY_SETTING_GIVENNAME => 'user.givenName',
Identity::IDENTITY_SETTING_FAMILYNAME => 'user.familyName',
$userDao::USER_FIELD_USERNAME => 'user.username',
$userDao::USER_FIELD_EMAIL => 'user.email',
SubscriptionDAO::SUBSCRIPTION_MEMBERSHIP => 'user.subscriptions.form.membership',
SubscriptionDAO::SUBSCRIPTION_REFERENCE_NUMBER => 'manager.subscriptions.form.referenceNumber',
SubscriptionDAO::SUBSCRIPTION_NOTES => 'manager.subscriptions.form.notes',
],
'matchOptions' => [
'contains' => 'form.contains',
'is' => 'form.is'
]
]
));
}
/**
* @copydoc GridHandler::loadData()
*/
protected function loadData($request, $filter)
{
// Get the context.
$journal = $request->getContext();
$subscriptionDao = DAORegistry::getDAO('IndividualSubscriptionDAO'); /** @var IndividualSubscriptionDAO $subscriptionDao */
$rangeInfo = $this->getGridRangeInfo($request, $this->getId());
return $subscriptionDao->getByJournalId($journal->getId(), null, $filter['searchField'], $filter['searchMatch'], $filter['search'] ? $filter['search'] : null, null, null, null, $rangeInfo);
}
//
// Public grid actions.
//
/**
* Edit an existing subscription.
*
* @param array $args
* @param Request $request
*
* @return JSONMessage JSON object
*/
public function editSubscription($args, $request)
{
// Form handling.
$subscriptionForm = new IndividualSubscriptionForm($request, $request->getUserVar('rowId'));
$subscriptionForm->initData();
return new JSONMessage(true, $subscriptionForm->fetch($request));
}
/**
* Update an existing subscription.
*
* @param array $args
* @param Request $request
*
* @return JSONMessage JSON object
*/
public function updateSubscription($args, $request)
{
$subscriptionId = $request->getUserVar('subscriptionId');
// Form handling.
$subscriptionForm = new IndividualSubscriptionForm($request, $subscriptionId);
$subscriptionForm->readInputData();
if ($subscriptionForm->validate()) {
$subscriptionForm->execute();
$notificationManager = new NotificationManager();
$notificationManager->createTrivialNotification($request->getUser()->getId(), PKPNotification::NOTIFICATION_TYPE_SUCCESS);
// Prepare the grid row data.
return DAO::getDataChangedEvent($subscriptionId);
} else {
return new JSONMessage(true, $subscriptionForm->fetch($request));
}
}
/**
* Delete a subscription.
*
* @param array $args
* @param Request $request
*
* @return JSONMessage JSON object
*/
public function deleteSubscription($args, $request)
{
if (!$request->checkCSRF()) {
return new JSONMessage(false);
}
$context = $request->getContext();
$user = $request->getUser();
// Identify the subscription ID.
$subscriptionId = $request->getUserVar('rowId');
$subscriptionDao = DAORegistry::getDAO('IndividualSubscriptionDAO'); /** @var IndividualSubscriptionDAO $subscriptionDao */
$subscriptionDao->deleteById($subscriptionId, $context->getId());
return DAO::getDataChangedEvent();
}
}
@@ -0,0 +1,225 @@
<?php
/**
* @file controllers/grid/subscriptions/InstitutionalSubscriptionForm.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 InstitutionalSubscriptionForm
*
* @ingroup subscription
*
* @brief Form class for institutional subscription create/edits.
*/
namespace APP\controllers\grid\subscriptions;
use APP\core\Application;
use APP\core\Request;
use APP\facades\Repo;
use APP\notification\NotificationManager;
use APP\subscription\form\SubscriptionForm;
use APP\subscription\InstitutionalSubscription;
use APP\subscription\InstitutionalSubscriptionDAO;
use APP\subscription\SubscriptionType;
use APP\subscription\SubscriptionTypeDAO;
use APP\template\TemplateManager;
use Exception;
use Illuminate\Support\Facades\Mail;
use PKP\db\DAORegistry;
use PKP\notification\PKPNotification;
class InstitutionalSubscriptionForm extends SubscriptionForm
{
/** @var array of the journal institutions [institutionId => name] */
public array $institutions;
/**
* Constructor
*
* @param Request $request
* @param int $subscriptionId leave as default for new subscription
*/
public function __construct($request, $subscriptionId = null)
{
parent::__construct('payments/institutionalSubscriptionForm.tpl', $subscriptionId);
$subscriptionId = isset($subscriptionId) ? (int) $subscriptionId : null;
$journal = $request->getJournal();
$journalId = $journal->getId();
$subscriptionInstitutionId = null;
if (isset($subscriptionId)) {
/** @var InstitutionalSubscriptionDAO */
$subscriptionDao = DAORegistry::getDAO('InstitutionalSubscriptionDAO');
if ($subscriptionDao->subscriptionExists($subscriptionId)) {
$this->subscription = $subscriptionDao->getById($subscriptionId);
$subscriptionInstitutionId = $this->subscription->getInstitutionId();
}
}
$subscriptionTypeDao = DAORegistry::getDAO('SubscriptionTypeDAO'); /** @var SubscriptionTypeDAO $subscriptionTypeDao */
$subscriptionTypeIterator = $subscriptionTypeDao->getByInstitutional($journalId, true);
$this->subscriptionTypes = [];
while ($subscriptionType = $subscriptionTypeIterator->next()) {
$this->subscriptionTypes[$subscriptionType->getId()] = $subscriptionType->getSummaryString();
}
if (count($this->subscriptionTypes) == 0) {
$this->addError('typeId', __('manager.subscriptions.form.typeRequired'));
$this->addErrorField('typeId');
}
$institutions = Repo::institution()->getCollector()
->filterByContextIds([$journalId])
->getMany();
$this->institutions = [];
foreach ($institutions as $institution) {
$this->institutions[$institution->getId()] = $institution->getLocalizedName();
}
if (isset($subscriptionInstitutionId) && !array_key_exists($subscriptionInstitutionId, $this->institutions)) {
// The institution is soft deleted, add it to the institutions list
$subscriptionInstitution = Repo::institution()->get($subscriptionInstitutionId);
$this->institutions[$subscriptionInstitutionId] = $subscriptionInstitution->getLocalizedName();
}
if (!count($this->institutions)) {
$this->addError('institutionId', __('manager.subscriptions.form.institutionRequired'));
$this->addErrorField('institutionId');
}
// Ensure subscription type is valid
$this->addCheck(new \PKP\form\validation\FormValidatorCustom($this, 'typeId', 'required', 'manager.subscriptions.form.typeIdValid', function ($typeId) use ($journalId) {
$subscriptionTypeDao = DAORegistry::getDAO('SubscriptionTypeDAO'); /** @var SubscriptionTypeDAO $subscriptionTypeDao */
return $subscriptionTypeDao->subscriptionTypeExistsByTypeId($typeId, $journalId) && $subscriptionTypeDao->getSubscriptionTypeInstitutional($typeId);
}));
// Ensure institution ID exists
$this->addCheck(new \PKP\form\validation\FormValidatorCustom($this, 'institutionId', 'required', 'manager.subscriptions.form.institutionIdValid', function ($institutionId) use ($journalId, $subscriptionInstitutionId) {
return ($institutionId == $subscriptionInstitutionId) || Repo::institution()->exists($institutionId, $journalId);
}));
// If provided, domain is valid
$this->addCheck(new \PKP\form\validation\FormValidatorRegExp($this, 'domain', 'optional', 'manager.subscriptions.form.domainValid', '/^' .
'[A-Z0-9]+([\-_\.][A-Z0-9]+)*' .
'\.' .
'[A-Z]{2,4}' .
'$/i'));
}
/**
* @copydoc Form::fetch
*
* @param null|string $template
*/
public function fetch($request, $template = null, $display = false)
{
$templateMgr = TemplateManager::getManager($request);
$templateMgr->assign([
'institutions' => $this->institutions,
]);
return parent::fetch($request, $template, $display);
}
/**
* Initialize form data from current subscription.
*/
public function initData()
{
parent::initData();
if (isset($this->subscription)) {
/** @var InstitutionalSubscription */
$subscription = $this->subscription;
$this->_data = array_merge(
$this->_data,
[
'institutionMailingAddress' => $subscription->getInstitutionMailingAddress(),
'domain' => $subscription->getDomain(),
'institutionId' => $subscription->getInstitutionId(),
]
);
}
}
/**
* Assign form data to user-submitted data.
*/
public function readInputData()
{
parent::readInputData();
$this->readUserVars(['institutionMailingAddress', 'domain', 'institutionId']);
}
/**
* @copydoc Form::validate()
*/
public function validate($callHooks = true)
{
if (!parent::validate()) {
return false;
}
$subscriptionTypeDao = DAORegistry::getDAO('SubscriptionTypeDAO'); /** @var SubscriptionTypeDAO $subscriptionTypeDao */
$subscriptionType = $subscriptionTypeDao->getById($this->getData('typeId'));
$institution = Repo::institution()->get($this->getData('institutionId'));
$ipRanges = $institution->getIPRanges();
$domain = $this->getData('domain');
// If online or print + online, domain or at least one IP range has to be provided
if ($subscriptionType->getFormat() != SubscriptionType::SUBSCRIPTION_TYPE_FORMAT_PRINT) {
if (empty($domain) && empty($ipRanges)) {
$this->addError('domain', __('manager.subscriptions.form.domainIPRangeRequired'));
$this->addErrorField('domain');
return false;
}
}
return true;
}
/**
* @copydoc Form::execute()
*/
public function execute(...$functionArgs)
{
$insert = false;
if (!isset($this->subscription)) {
$this->subscription = new InstitutionalSubscription();
$insert = true;
}
/** @var InstitutionalSubscription */
$subscription = $this->subscription;
parent::execute(...$functionArgs);
$subscription->setInstitutionId($this->getData('institutionId'));
$subscription->setInstitutionMailingAddress($this->getData('institutionMailingAddress'));
$subscription->setDomain($this->getData('domain'));
/** @var InstitutionalSubscriptionDAO $institutionalSubscriptionDao */
$institutionalSubscriptionDao = DAORegistry::getDAO('InstitutionalSubscriptionDAO');
if ($insert) {
$institutionalSubscriptionDao->insertObject($this->subscription);
} else {
$institutionalSubscriptionDao->updateObject($this->subscription);
}
// Send notification email
if ($this->getData('notifyEmail')) {
$mailable = $this->_prepareNotificationEmail();
try {
Mail::send($mailable);
} catch (Exception $e) {
$notificationMgr = new NotificationManager();
$request = Application::get()->getRequest();
$notificationMgr->createTrivialNotification($request->getUser()->getId(), PKPNotification::NOTIFICATION_TYPE_ERROR, ['contents' => __('email.compose.error')]);
error_log($e->getMessage());
}
}
}
}
@@ -0,0 +1,221 @@
<?php
/**
* @file controllers/grid/subscriptions/InstitutionalSubscriptionsGridHandler.php
*
* Copyright (c) 2014-2021 Simon Fraser University
* Copyright (c) 2000-2021 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @class InstitutionalSubscriptionsGridHandler
*
* @ingroup controllers_grid_subscriptions
*
* @brief Handle subscription grid requests.
*/
namespace APP\controllers\grid\subscriptions;
use APP\core\Request;
use APP\facades\Repo;
use APP\notification\NotificationManager;
use APP\subscription\InstitutionalSubscriptionDAO;
use APP\subscription\SubscriptionDAO;
use PKP\controllers\grid\GridColumn;
use PKP\core\JSONMessage;
use PKP\db\DAO;
use PKP\db\DAORegistry;
use PKP\identity\Identity;
use PKP\notification\PKPNotification;
class InstitutionalSubscriptionsGridHandler extends SubscriptionsGridHandler
{
/**
* @copydoc SubscriptionsGridHandler::initialize()
*
* @param null|mixed $args
*/
public function initialize($request, $args = null)
{
parent::initialize($request, $args);
// Basic grid configuration.
$this->setTitle('subscriptionManager.institutionalSubscriptions');
//
// Grid columns.
//
$cellProvider = new SubscriptionsGridCellProvider();
$this->addColumn(
new GridColumn(
'name',
'common.name',
null,
null,
$cellProvider
)
);
$this->addColumn(
new GridColumn(
'subscriptionType',
'manager.subscriptions.subscriptionType',
null,
null,
$cellProvider
)
);
$this->addColumn(
new GridColumn(
'status',
'manager.subscriptions.form.status',
null,
null,
$cellProvider
)
);
$this->addColumn(
new GridColumn(
'dateStart',
'manager.subscriptions.dateStart',
null,
null,
$cellProvider
)
);
$this->addColumn(
new GridColumn(
'dateEnd',
'manager.subscriptions.dateEnd',
null,
null,
$cellProvider
)
);
$this->addColumn(
new GridColumn(
'referenceNumber',
'manager.subscriptions.referenceNumber',
null,
null,
$cellProvider
)
);
}
//
// Implement methods from GridHandler.
//
/**
* @copydoc GridHandler::renderFilter()
*/
public function renderFilter($request, $filterData = [])
{
$userDao = Repo::user()->dao;
$filterData = array_merge($filterData, [
'fieldOptions' => [
Identity::IDENTITY_SETTING_GIVENNAME => 'user.givenName',
Identity::IDENTITY_SETTING_FAMILYNAME => 'user.familyName',
$userDao::USER_FIELD_USERNAME => 'user.username',
$userDao::USER_FIELD_EMAIL => 'user.email',
SubscriptionDAO::SUBSCRIPTION_MEMBERSHIP => 'user.subscriptions.form.membership',
SubscriptionDAO::SUBSCRIPTION_REFERENCE_NUMBER => 'manager.subscriptions.form.referenceNumber',
SubscriptionDAO::SUBSCRIPTION_NOTES => 'manager.subscriptions.form.notes',
InstitutionalSubscriptionDAO::SUBSCRIPTION_INSTITUTION_NAME => 'manager.subscriptions.form.institutionName',
InstitutionalSubscriptionDAO::SUBSCRIPTION_DOMAIN => 'manager.subscriptions.form.domain',
InstitutionalSubscriptionDAO::SUBSCRIPTION_IP_RANGE => 'manager.subscriptions.form.ipRange',
],
'matchOptions' => [
'contains' => 'form.contains',
'is' => 'form.is'
],
]);
return parent::renderFilter($request, $filterData);
}
/**
* @copydoc GridHandler::loadData()
*/
protected function loadData($request, $filter)
{
// Get the context.
$journal = $request->getContext();
$subscriptionDao = DAORegistry::getDAO('InstitutionalSubscriptionDAO'); /** @var InstitutionalSubscriptionDAO $subscriptionDao */
$rangeInfo = $this->getGridRangeInfo($request, $this->getId());
return $subscriptionDao->getByJournalId($journal->getId(), null, $filter['searchField'], $filter['searchMatch'], $filter['search'] ? $filter['search'] : null, null, null, null, $rangeInfo);
}
//
// Public grid actions.
//
/**
* Edit an existing subscription.
*
* @param array $args
* @param Request $request
*
* @return JSONMessage JSON object
*/
public function editSubscription($args, $request)
{
// Form handling.
$subscriptionForm = new InstitutionalSubscriptionForm($request, $request->getUserVar('rowId'));
$subscriptionForm->initData();
return new JSONMessage(true, $subscriptionForm->fetch($request));
}
/**
* Update an existing subscription.
*
* @param array $args
* @param Request $request
*
* @return JSONMessage JSON object
*/
public function updateSubscription($args, $request)
{
$subscriptionId = (int) $request->getUserVar('subscriptionId');
// Form handling.
$subscriptionForm = new InstitutionalSubscriptionForm($request, $subscriptionId);
$subscriptionForm->readInputData();
if ($subscriptionForm->validate()) {
$subscriptionForm->execute();
$notificationManager = new NotificationManager();
$notificationManager->createTrivialNotification($request->getUser()->getId(), PKPNotification::NOTIFICATION_TYPE_SUCCESS);
// Prepare the grid row data.
return DAO::getDataChangedEvent($subscriptionId);
} else {
return new JSONMessage(true, $subscriptionForm->fetch($request));
}
}
/**
* Delete a subscription.
*
* @param array $args
* @param Request $request
*
* @return JSONMessage JSON object
*/
public function deleteSubscription($args, $request)
{
if (!$request->checkCSRF()) {
return new JSONMessage(false);
}
$context = $request->getContext();
$user = $request->getUser();
// Identify the subscription ID.
$subscriptionId = $request->getUserVar('rowId');
$subscriptionDao = DAORegistry::getDAO('InstitutionalSubscriptionDAO'); /** @var InstitutionalSubscriptionDAO $subscriptionDao */
$subscriptionDao->deleteById($subscriptionId, $context->getId());
return DAO::getDataChangedEvent();
}
}
@@ -0,0 +1,72 @@
<?php
/**
* @file controllers/grid/subscriptions/PaymentsGridCellProvider.php
*
* Copyright (c) 2014-2021 Simon Fraser University
* Copyright (c) 2000-2021 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @class PaymentsGridCellProvider
*
* @ingroup controllers_grid_subscriptions
*
* @brief Class for a cell provider to display information about payments
*/
namespace APP\controllers\grid\subscriptions;
use APP\core\Application;
use APP\core\Request;
use APP\facades\Repo;
use PKP\controllers\grid\GridCellProvider;
use PKP\controllers\grid\GridColumn;
class PaymentsGridCellProvider extends GridCellProvider
{
/** @var Request */
public $_request;
/**
* Constructor.
*
* @param Request $request
*/
public function __construct($request)
{
$this->_request = $request;
parent::__construct();
}
//
// Template methods from GridCellProvider
//
/**
* Extracts variables for a given column from a data element
* so that they may be assigned to template before rendering.
*
* @param \PKP\controllers\grid\GridRow $row
* @param GridColumn $column
*
* @return array
*/
public function getTemplateVarsFromRowColumn($row, $column)
{
$payment = $row->getData();
switch ($column->getId()) {
case 'name':
$user = Repo::user()->get($payment->getUserId(), true);
return ['label' => $user ? $user->getFullName() : __('common.user.nonexistent')]; // If no $user, returns "[Nonexistent user]" to avoid null user
case 'type':
$paymentManager = Application::getPaymentManager($this->_request->getJournal());
return ['label' => $paymentManager->getPaymentName($payment)];
case 'amount':
return ['label' => $payment->getAmount() . ' ' . $payment->getCurrencyCode()];
case 'timestamp':
return ['label' => $payment->getTimestamp()];
}
assert(false);
}
}
@@ -0,0 +1,143 @@
<?php
/**
* @file controllers/grid/subscriptions/PaymentsGridHandler.php
*
* Copyright (c) 2014-2021 Simon Fraser University
* Copyright (c) 2000-2021 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @class PaymentsGridHandler
*
* @ingroup controllers_grid_subscriptions
*
* @brief Handle payment grid requests.
*/
namespace APP\controllers\grid\subscriptions;
use APP\core\Request;
use APP\payment\ojs\OJSCompletedPaymentDAO;
use PKP\controllers\grid\feature\PagingFeature;
use PKP\controllers\grid\GridColumn;
use PKP\controllers\grid\GridHandler;
use PKP\db\DAORegistry;
use PKP\security\authorization\ContextAccessPolicy;
use PKP\security\Role;
class PaymentsGridHandler extends GridHandler
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->addRoleAssignment(
[Role::ROLE_ID_MANAGER, Role::ROLE_ID_SITE_ADMIN, Role::ROLE_ID_SUBSCRIPTION_MANAGER],
['fetchGrid', 'fetchRow', 'viewPayment']
);
}
//
// Implement template methods from PKPHandler.
//
/**
* @copydoc PKPHandler::authorize()
*/
public function authorize($request, &$args, $roleAssignments)
{
$this->addPolicy(new ContextAccessPolicy($request, $roleAssignments));
return parent::authorize($request, $args, $roleAssignments);
}
/**
* @copydoc GridHandler::initialize()
*
* @param null|mixed $args
*/
public function initialize($request, $args = null)
{
parent::initialize($request, $args);
// Grid actions.
$router = $request->getRouter();
//
// Grid columns.
//
$cellProvider = new PaymentsGridCellProvider($request);
$this->addColumn(
new GridColumn(
'name',
'common.user',
null,
null,
$cellProvider
)
);
$this->addColumn(
new GridColumn(
'type',
'manager.payment.paymentType',
null,
null,
$cellProvider
)
);
$this->addColumn(
new GridColumn(
'amount',
'manager.payment.amount',
null,
null,
$cellProvider
)
);
$this->addColumn(
new GridColumn(
'timestamp',
'manager.payment.timestamp',
null,
null,
$cellProvider
)
);
}
/**
* @copydoc GridHandler::initFeatures()
*/
public function initFeatures($request, $args)
{
return [new PagingFeature()];
}
/**
* @copydoc GridHandler::loadData()
*/
protected function loadData($request, $filter)
{
$paymentDao = DAORegistry::getDAO('OJSCompletedPaymentDAO'); /** @var OJSCompletedPaymentDAO $paymentDao */
$rangeInfo = $this->getGridRangeInfo($request, $this->getId());
return $paymentDao->getByContextId($request->getContext()->getId(), $rangeInfo);
}
//
// Public grid actions.
//
/**
* View a payment.
*
* @param array $args
* @param Request $request
*/
public function viewPayment($args, $request)
{
// FIXME
}
}
@@ -0,0 +1,195 @@
<?php
/**
* @file controllers/grid/subscriptions/SubscriptionTypeForm.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 SubscriptionTypeForm
*
* @ingroup manager_form
*
* @brief Form for journal managers to create/edit subscription types.
*/
namespace APP\controllers\grid\subscriptions;
use APP\core\Application;
use APP\subscription\SubscriptionType;
use APP\subscription\SubscriptionTypeDAO;
use APP\template\TemplateManager;
use PKP\db\DAORegistry;
use PKP\facades\Locale;
use PKP\form\Form;
class SubscriptionTypeForm extends Form
{
/** @var int $typeId the ID of the subscription type being edited */
public $typeId;
/** @var array $validFormats keys are valid subscription type formats */
public $validFormats;
/** @var array $validCurrencies keys are valid subscription type currencies */
public $validCurrencies;
/** @var int $journalId Journal ID */
public $journalId;
/**
* Constructor
*
* @param int $journalId Journal ID
* @param int $typeId leave as default for new subscription type
* @param null|mixed $typeId
*/
public function __construct($journalId, $typeId = null)
{
$this->journalId = $journalId;
$this->validFormats = [
SubscriptionType::SUBSCRIPTION_TYPE_FORMAT_ONLINE => __('subscriptionTypes.format.online'),
SubscriptionType::SUBSCRIPTION_TYPE_FORMAT_PRINT => __('subscriptionTypes.format.print'),
SubscriptionType::SUBSCRIPTION_TYPE_FORMAT_PRINT_ONLINE => __('subscriptionTypes.format.printOnline')
];
$this->validCurrencies = [];
foreach (Locale::getCurrencies() as $currency) {
$this->validCurrencies[$currency->getLetterCode()] = $currency->getLocalName() . ' (' . $currency->getLetterCode() . ')';
}
asort($this->validCurrencies);
$this->typeId = isset($typeId) ? (int) $typeId : null;
parent::__construct('payments/subscriptionTypeForm.tpl');
// Type name is provided
$this->addCheck(new \PKP\form\validation\FormValidatorLocale($this, 'name', 'required', 'manager.subscriptionTypes.form.typeNameRequired'));
// Cost is provided and is numeric and positive
$this->addCheck(new \PKP\form\validation\FormValidator($this, 'cost', 'required', 'manager.subscriptionTypes.form.costRequired'));
$this->addCheck(new \PKP\form\validation\FormValidatorCustom($this, 'cost', 'required', 'manager.subscriptionTypes.form.costNumeric', fn ($cost) => is_numeric($cost) && $cost >= 0));
// Currency is provided and is valid value
$this->addCheck(new \PKP\form\validation\FormValidator($this, 'currency', 'required', 'manager.subscriptionTypes.form.currencyRequired'));
$this->addCheck(new \PKP\form\validation\FormValidatorInSet($this, 'currency', 'required', 'manager.subscriptionTypes.form.currencyValid', array_keys($this->validCurrencies)));
// Format is provided and is valid value
$this->addCheck(new \PKP\form\validation\FormValidator($this, 'format', 'required', 'manager.subscriptionTypes.form.formatRequired'));
$this->addCheck(new \PKP\form\validation\FormValidatorInSet($this, 'format', 'required', 'manager.subscriptionTypes.form.formatValid', array_keys($this->validFormats)));
// Institutional flag is valid value
$this->addCheck(new \PKP\form\validation\FormValidatorInSet($this, 'institutional', 'optional', 'manager.subscriptionTypes.form.institutionalValid', ['0', '1']));
$this->addCheck(new \PKP\form\validation\FormValidatorPost($this));
$this->addCheck(new \PKP\form\validation\FormValidatorCSRF($this));
}
/**
* Get a list of localized field names for this form
*
* @return array
*/
public function getLocaleFieldNames()
{
$subscriptionTypeDao = DAORegistry::getDAO('SubscriptionTypeDAO'); /** @var SubscriptionTypeDAO $subscriptionTypeDao */
return $subscriptionTypeDao->getLocaleFieldNames();
}
/**
* @copydoc Form::fetch()
*
* @param null|mixed $template
*/
public function fetch($request, $template = null, $display = false)
{
$templateMgr = TemplateManager::getManager($request);
$templateMgr->assign([
'typeId' => $this->typeId,
'validCurrencies' => $this->validCurrencies,
'validFormats' => $this->validFormats,
]);
return parent::fetch($request, $template, $display);
}
/**
* Initialize form data from current subscription type.
*/
public function initData()
{
if (isset($this->typeId)) {
$subscriptionTypeDao = DAORegistry::getDAO('SubscriptionTypeDAO'); /** @var SubscriptionTypeDAO $subscriptionTypeDao */
$subscriptionType = $subscriptionTypeDao->getById($this->typeId, $this->journalId);
if ($subscriptionType != null) {
$this->_data = [
'name' => $subscriptionType->getName(null), // Localized
'description' => $subscriptionType->getDescription(null), // Localized
'cost' => $subscriptionType->getCost(),
'currency' => $subscriptionType->getCurrencyCodeAlpha(),
'duration' => $subscriptionType->getDuration(),
'format' => $subscriptionType->getFormat(),
'institutional' => $subscriptionType->getInstitutional(),
'membership' => $subscriptionType->getMembership(),
'disable_public_display' => $subscriptionType->getDisablePublicDisplay()
];
} else {
$this->typeId = null;
}
}
}
/**
* Assign form data to user-submitted data.
*/
public function readInputData()
{
$this->readUserVars(['name', 'description', 'cost', 'currency', 'duration', 'format', 'institutional', 'membership', 'disable_public_display']);
$this->addCheck(new \PKP\form\validation\FormValidatorCustom($this, 'duration', 'optional', 'manager.subscriptionTypes.form.durationNumeric', fn ($duration) => is_numeric($duration) && $duration >= 0));
}
/**
* @copydoc Form::execute()
*/
public function execute(...$functionArgs)
{
$subscriptionTypeDao = DAORegistry::getDAO('SubscriptionTypeDAO'); /** @var SubscriptionTypeDAO $subscriptionTypeDao */
if (isset($this->typeId)) {
$subscriptionType = $subscriptionTypeDao->getById($this->typeId, $this->journalId);
}
if (!isset($subscriptionType)) {
$subscriptionType = $subscriptionTypeDao->newDataObject();
$subscriptionType->setInstitutional($this->getData('institutional') == null ? 0 : $this->getData('institutional'));
}
$request = Application::get()->getRequest();
$journal = $request->getJournal();
$subscriptionType->setJournalId($journal->getId());
$subscriptionType->setName($this->getData('name'), null); // Localized
$subscriptionType->setDescription($this->getData('description'), null); // Localized
$subscriptionType->setCost(round($this->getData('cost'), 2));
$subscriptionType->setCurrencyCodeAlpha($this->getData('currency'));
$subscriptionType->setDuration(($duration = $this->getData('duration')) ? (int) $duration : null);
$subscriptionType->setFormat($this->getData('format'));
$subscriptionType->setMembership((int) $this->getData('membership'));
$subscriptionType->setDisablePublicDisplay((int) $this->getData('disable_public_display'));
parent::execute(...$functionArgs);
// Update or insert subscription type
if ($subscriptionType->getId() != null) {
$subscriptionTypeDao->updateObject($subscriptionType);
} else {
$subscriptionType->setSequence(REALLY_BIG_NUMBER);
$subscriptionTypeDao->insertObject($subscriptionType);
// Re-order the subscription types so the new one is at the end of the list.
$subscriptionTypeDao->resequenceSubscriptionTypes($subscriptionType->getJournalId());
}
}
}
@@ -0,0 +1,53 @@
<?php
/**
* @file controllers/grid/subscriptions/SubscriptionTypesGridCellProvider.php
*
* Copyright (c) 2014-2021 Simon Fraser University
* Copyright (c) 2000-2021 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @class SubscriptionTypesGridCellProvider
*
* @ingroup controllers_grid_subscriptions
*
* @brief Class for a cell provider to display information about individual subscriptions
*/
namespace APP\controllers\grid\subscriptions;
use PKP\controllers\grid\GridCellProvider;
use PKP\controllers\grid\GridColumn;
class SubscriptionTypesGridCellProvider extends GridCellProvider
{
//
// Template methods from GridCellProvider
//
/**
* Extracts variables for a given column from a data element
* so that they may be assigned to template before rendering.
*
* @param \PKP\controllers\grid\GridRow $row
* @param GridColumn $column
*
* @return array
*/
public function getTemplateVarsFromRowColumn($row, $column)
{
$subscriptionType = $row->getData();
switch ($column->getId()) {
case 'name':
return ['label' => $subscriptionType->getLocalizedName()];
case 'type':
return ['label' => __($subscriptionType->getInstitutional() ? 'manager.subscriptionTypes.institutional' : 'manager.subscriptionTypes.individual')];
case 'duration':
return ['label' => $subscriptionType->getDurationYearsMonths()];
case 'cost':
return ['label' => sprintf('%.2f', $subscriptionType->getCost()) . ' (' . $subscriptionType->getCurrencyStringShort() . ')'];
}
assert(false);
}
}
@@ -0,0 +1,250 @@
<?php
/**
* @file controllers/grid/subscriptions/SubscriptionTypesGridHandler.php
*
* Copyright (c) 2014-2021 Simon Fraser University
* Copyright (c) 2000-2021 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @class SubscriptionTypesGridHandler
*
* @ingroup controllers_grid_subscriptions
*
* @brief Handle subscription type grid requests.
*/
namespace APP\controllers\grid\subscriptions;
use APP\core\Request;
use APP\notification\NotificationManager;
use APP\subscription\SubscriptionTypeDAO;
use PKP\controllers\grid\feature\PagingFeature;
use PKP\controllers\grid\GridColumn;
use PKP\controllers\grid\GridHandler;
use PKP\core\JSONMessage;
use PKP\db\DAO;
use PKP\db\DAORegistry;
use PKP\linkAction\LinkAction;
use PKP\linkAction\request\AjaxModal;
use PKP\notification\PKPNotification;
use PKP\security\authorization\ContextAccessPolicy;
use PKP\security\Role;
class SubscriptionTypesGridHandler extends GridHandler
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->addRoleAssignment(
[Role::ROLE_ID_MANAGER, Role::ROLE_ID_SITE_ADMIN, Role::ROLE_ID_SUBSCRIPTION_MANAGER],
['fetchGrid', 'fetchRow', 'editSubscriptionType', 'updateSubscriptionType',
'deleteSubscriptionType', 'addSubscriptionType']
);
}
//
// Implement template methods from PKPHandler.
//
/**
* @copydoc PKPHandler::authorize()
*/
public function authorize($request, &$args, $roleAssignments)
{
$this->addPolicy(new ContextAccessPolicy($request, $roleAssignments));
return parent::authorize($request, $args, $roleAssignments);
}
/**
* @copydoc GridHandler::initialize()
*
* @param null|mixed $args
*/
public function initialize($request, $args = null)
{
parent::initialize($request, $args);
// Basic grid configuration.
$this->setTitle('subscriptionManager.subscriptionTypes');
// Grid actions.
$router = $request->getRouter();
$this->addAction(
new LinkAction(
'addSubscriptionType',
new AjaxModal(
$router->url($request, null, null, 'addSubscriptionType', null, null),
__('manager.subscriptionTypes.create'),
'modal_add_subscription_type',
true
),
__('manager.subscriptionTypes.create'),
'add_subscription_type'
)
);
//
// Grid columns.
//
$cellProvider = new SubscriptionTypesGridCellProvider();
$this->addColumn(
new GridColumn(
'name',
'common.name',
null,
null,
$cellProvider
)
);
$this->addColumn(
new GridColumn(
'type',
'manager.subscriptionTypes.subscriptions',
null,
null,
$cellProvider
)
);
$this->addColumn(
new GridColumn(
'duration',
'manager.subscriptionTypes.duration',
null,
null,
$cellProvider
)
);
$this->addColumn(
new GridColumn(
'cost',
'manager.subscriptionTypes.cost',
null,
null,
$cellProvider
)
);
}
//
// Implement methods from GridHandler.
//
/**
* @copydoc GridHandler::getRowInstance()
*
* @return SubscriptionTypesGridRow
*/
protected function getRowInstance()
{
return new SubscriptionTypesGridRow();
}
/**
* @copydoc GridHandler::initFeatures()
*/
public function initFeatures($request, $args)
{
return [new PagingFeature()];
}
/**
* @copydoc GridHandler::loadData()
*/
protected function loadData($request, $filter)
{
// Get the context.
$journal = $request->getContext();
$subscriptionTypeDao = DAORegistry::getDAO('SubscriptionTypeDAO'); /** @var SubscriptionTypeDAO $subscriptionTypeDao */
$rangeInfo = $this->getGridRangeInfo($request, $this->getId());
return $subscriptionTypeDao->getByJournalId($journal->getId(), $rangeInfo);
}
//
// Public grid actions.
//
/**
* Add a new subscription type.
*
* @param array $args
* @param Request $request
*/
public function addSubscriptionType($args, $request)
{
// Calling editSubscription with an empty row id will add a new subscription type.
return $this->editSubscriptionType($args, $request);
}
/**
* Edit an existing subscription type.
*
* @param array $args
* @param Request $request
*
* @return JSONMessage JSON object
*/
public function editSubscriptionType($args, $request)
{
// Form handling.
$subscriptionTypeForm = new SubscriptionTypeForm($request->getJournal()->getId(), $request->getUserVar('rowId'));
$subscriptionTypeForm->initData();
return new JSONMessage(true, $subscriptionTypeForm->fetch($request));
}
/**
* Update an existing subscription type.
*
* @param array $args
* @param Request $request
*
* @return JSONMessage JSON object
*/
public function updateSubscriptionType($args, $request)
{
$subscriptionTypeId = (int) $request->getUserVar('typeId');
// Form handling.
$subscriptionTypeForm = new SubscriptionTypeForm($request->getJournal()->getId(), $subscriptionTypeId);
$subscriptionTypeForm->readInputData();
if ($subscriptionTypeForm->validate()) {
$subscriptionTypeForm->execute();
$notificationManager = new NotificationManager();
$notificationManager->createTrivialNotification($request->getUser()->getId(), PKPNotification::NOTIFICATION_TYPE_SUCCESS);
// Prepare the grid row data.
return DAO::getDataChangedEvent($subscriptionTypeId);
} else {
return new JSONMessage(false);
}
}
/**
* Delete a subscription type.
*
* @param array $args
* @param Request $request
*
* @return JSONMessage JSON object
*/
public function deleteSubscriptionType($args, $request)
{
if (!$request->checkCSRF()) {
return new JSONMessage(false);
}
$context = $request->getContext();
$user = $request->getUser();
// Identify the subscription type ID.
$subscriptionTypeId = $request->getUserVar('rowId');
$subscriptionTypeDao = DAORegistry::getDAO('SubscriptionTypeDAO'); /** @var SubscriptionTypeDAO $subscriptionTypeDao */
$subscriptionTypeDao->deleteById($subscriptionTypeId, $context->getId());
return DAO::getDataChangedEvent($subscriptionTypeId);
}
}
@@ -0,0 +1,82 @@
<?php
/**
* @file controllers/grid/subscriptions/SubscriptionTypesGridRow.php
*
* Copyright (c) 2014-2021 Simon Fraser University
* Copyright (c) 2000-2021 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @class SubscriptionTypesGridRow
*
* @ingroup controllers_grid_subscriptions
*
* @brief User grid row definition
*/
namespace APP\controllers\grid\subscriptions;
use PKP\controllers\grid\GridRow;
use PKP\linkAction\LinkAction;
use PKP\linkAction\request\AjaxModal;
use PKP\linkAction\request\RemoteActionConfirmationModal;
class SubscriptionTypesGridRow extends GridRow
{
//
// Overridden methods from GridRow
//
/**
* @copydoc GridRow::initialize()
*
* @param null|mixed $template
*/
public function initialize($request, $template = null)
{
parent::initialize($request, $template);
// Is this a new row or an existing row?
$element = & $this->getData();
assert(is_a($element, 'SubscriptionType'));
$rowId = $this->getId();
if (!empty($rowId) && is_numeric($rowId)) {
// Only add row actions if this is an existing row
$router = $request->getRouter();
$actionArgs = [
'gridId' => $this->getGridId(),
'rowId' => $rowId
];
$actionArgs = array_merge($actionArgs, $this->getRequestArgs());
$this->addAction(
new LinkAction(
'edit',
new AjaxModal(
$router->url($request, null, null, 'editSubscriptionType', null, $actionArgs),
__('manager.subscriptionTypes.edit'),
'modal_edit',
true
),
__('common.edit'),
'edit'
)
);
$this->addAction(
new LinkAction(
'delete',
new RemoteActionConfirmationModal(
$request->getSession(),
__('manager.subscriptionTypes.confirmDelete'),
__('common.delete'),
$router->url($request, null, null, 'deleteSubscriptionType', null, $actionArgs),
'modal_delete'
),
__('grid.action.delete'),
'delete'
)
);
}
}
}
@@ -0,0 +1,69 @@
<?php
/**
* @file controllers/grid/subscriptions/SubscriptionsGridCellProvider.php
*
* Copyright (c) 2014-2021 Simon Fraser University
* Copyright (c) 2000-2021 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @class SubscriptionsGridCellProvider
*
* @ingroup controllers_grid_subscriptions
*
* @brief Class for a cell provider to display information about subscriptions
*/
namespace APP\controllers\grid\subscriptions;
use APP\facades\Repo;
use PKP\controllers\grid\GridCellProvider;
use PKP\controllers\grid\GridColumn;
class SubscriptionsGridCellProvider extends GridCellProvider
{
//
// Template methods from GridCellProvider
//
/**
* Extracts variables for a given column from a data element
* so that they may be assigned to template before rendering.
*
* @param \PKP\controllers\grid\GridRow $row
* @param GridColumn $column
*
* @return array
*/
public function getTemplateVarsFromRowColumn($row, $column)
{
$subscription = $row->getData();
switch ($column->getId()) {
case 'name':
switch (1) {
case is_a($subscription, 'IndividualSubscription'):
return ['label' => $subscription->getUserFullName()];
case is_a($subscription, 'InstitutionalSubscription'):
$institution = Repo::institution()->get($subscription->getInstitutionId());
return ['label' => $institution->getLocalizedName()];
}
assert(false);
break;
case 'email':
assert(is_a($subscription, 'IndividualSubscription'));
return ['label' => $subscription->getUserEmail()];
case 'subscriptionType':
return ['label' => $subscription->getSubscriptionTypeName()];
case 'status':
return ['label' => $subscription->getStatusString()];
case 'dateStart':
return ['label' => $subscription->getDateStart()];
case 'dateEnd':
return ['label' => $subscription->getDateEnd()];
case 'referenceNumber':
return ['label' => $subscription->getReferenceNumber()];
}
assert(false);
}
}
@@ -0,0 +1,166 @@
<?php
/**
* @file controllers/grid/subscriptions/SubscriptionsGridHandler.php
*
* Copyright (c) 2014-2021 Simon Fraser University
* Copyright (c) 2000-2021 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @class SubscriptionsGridHandler
*
* @ingroup controllers_grid_subscriptions
*
* @brief Handle subscription grid requests.
*/
namespace APP\controllers\grid\subscriptions;
use APP\core\Request;
use APP\subscription\IndividualSubscriptionDAO;
use APP\subscription\InstitutionalSubscriptionDAO;
use PKP\controllers\grid\feature\PagingFeature;
use PKP\controllers\grid\GridHandler;
use PKP\db\DAO;
use PKP\db\DAORegistry;
use PKP\linkAction\LinkAction;
use PKP\linkAction\request\AjaxModal;
use PKP\security\authorization\ContextAccessPolicy;
use PKP\security\Role;
abstract class SubscriptionsGridHandler extends GridHandler
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->addRoleAssignment(
[Role::ROLE_ID_MANAGER, Role::ROLE_ID_SITE_ADMIN, Role::ROLE_ID_SUBSCRIPTION_MANAGER],
['fetchGrid', 'fetchRow', 'editSubscription', 'updateSubscription',
'deleteSubscription', 'addSubscription', 'renewSubscription']
);
}
//
// Implement template methods from PKPHandler.
//
/**
* @copydoc PKPHandler::authorize()
*/
public function authorize($request, &$args, $roleAssignments)
{
$this->addPolicy(new ContextAccessPolicy($request, $roleAssignments));
return parent::authorize($request, $args, $roleAssignments);
}
/**
* @copydoc GridHandler::initialize()
*
* @param null|mixed $args
*/
public function initialize($request, $args = null)
{
parent::initialize($request, $args);
// Grid actions.
$router = $request->getRouter();
$this->addAction(
new LinkAction(
'addSubscription',
new AjaxModal(
$router->url($request, null, null, 'addSubscription', null, null),
__('manager.subscriptions.create'),
'modal_add_subscription',
true
),
__('manager.subscriptions.create'),
'add_subscription'
)
);
}
/**
* @copydoc GridHandler::initFeatures()
*/
public function initFeatures($request, $args)
{
return [new PagingFeature()];
}
/**
* @copydoc GridHandler::getRowInstance()
*
* @return SubscriptionsGridRow
*/
protected function getRowInstance()
{
return new SubscriptionsGridRow();
}
/**
* @copydoc GridHandler::getFilterSelectionData()
*
* @return array Filter selection data.
*/
public function getFilterSelectionData($request)
{
// Get the search terms.
$searchField = $request->getUserVar('searchField');
$searchMatch = $request->getUserVar('searchMatch');
$search = $request->getUserVar('search');
return $filterSelectionData = [
'searchField' => $searchField,
'searchMatch' => $searchMatch,
'search' => $search ? $search : ''
];
}
/**
* @copydoc GridHandler::getFilterForm()
*
* @return string Filter template.
*/
protected function getFilterForm()
{
return 'controllers/grid/subscriptions/subscriptionsGridFilter.tpl';
}
//
// Public grid actions.
//
/**
* Add a new subscription.
*
* @param array $args
* @param Request $request
*/
public function addSubscription($args, $request)
{
// Calling editSubscription with an empty row id will add a new subscription.
return $this->editSubscription($args, $request);
}
/**
* Renew a subscription.
*
* @param array $args first parameter is the ID of the subscription to renew
* @param Request $request
*/
public function renewSubscription($args, $request)
{
/** @var InstitutionalSubscriptionDAO|IndividualSubscriptionDAO */
$subscriptionDao = DAORegistry::getDAO($request->getUserVar('institutional') ? 'InstitutionalSubscriptionDAO' : 'IndividualSubscriptionDAO');
$subscriptionId = $request->getUserVar('rowId');
if ($subscription = $subscriptionDao->getById($subscriptionId, $request->getJournal()->getId())) {
$subscriptionDao->renewSubscription($subscription);
}
return DAO::getDataChangedEvent($subscriptionId);
}
}
@@ -0,0 +1,102 @@
<?php
/**
* @file controllers/grid/subscriptions/SubscriptionsGridRow.php
*
* Copyright (c) 2014-2021 Simon Fraser University
* Copyright (c) 2000-2021 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @class SubscriptionsGridRow
*
* @ingroup controllers_grid_subscriptions
*
* @brief Subscriptions grid row definition
*/
namespace APP\controllers\grid\subscriptions;
use PKP\controllers\grid\GridRow;
use PKP\linkAction\LinkAction;
use PKP\linkAction\request\AjaxModal;
use PKP\linkAction\request\RemoteActionConfirmationModal;
class SubscriptionsGridRow extends GridRow
{
//
// Overridden methods from GridRow
//
/**
* @copydoc GridRow::initialize()
*
* @param null|mixed $template
*/
public function initialize($request, $template = null)
{
parent::initialize($request, $template);
// Is this a new row or an existing row?
$element = & $this->getData();
assert(is_a($element, 'IndividualSubscription') || is_a($element, 'InstitutionalSubscription'));
$rowId = $this->getId();
if (!empty($rowId) && is_numeric($rowId)) {
// Only add row actions if this is an existing row
$router = $request->getRouter();
$actionArgs = [
'gridId' => $this->getGridId(),
'rowId' => $rowId
];
$actionArgs = array_merge($actionArgs, $this->getRequestArgs());
$this->addAction(new LinkAction(
'edit',
new AjaxModal(
$router->url($request, null, null, 'editSubscription', null, $actionArgs),
__('manager.subscriptions.edit'),
'modal_edit',
true
),
__('common.edit'),
'edit'
));
if (!$element->isNonExpiring()) {
$this->addAction(new LinkAction(
'renew',
new RemoteActionConfirmationModal(
$request->getSession(),
__('manager.subscriptions.confirmRenew'),
__('manager.subscriptions.renew'),
$router->url(
$request,
null,
null,
'renewSubscription',
null,
array_merge($actionArgs, [
'institutional' => is_a($element, 'InstitutionalSubscription') ? 1 : 0
])
),
'modal_delete'
),
__('manager.subscriptions.renew'),
'renew'
));
}
$this->addAction(new LinkAction(
'delete',
new RemoteActionConfirmationModal(
$request->getSession(),
__('subscriptionManager.subscription.confirmRemove'),
__('common.delete'),
$router->url($request, null, null, 'deleteSubscription', null, $actionArgs),
'modal_delete'
),
__('grid.action.delete'),
'delete'
));
}
}
}