<?php
/**
* @file api/v1/_submissions/BackendSubmissionsHandler.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 BackendSubmissionsHandler
*
* @ingroup api_v1_backend
*
* @brief Handle API requests for backend operations.
*
*/
namespace APP\API\v1\_submissions;
use APP\core\Application;
use APP\payment\ojs\OJSCompletedPaymentDAO;
use APP\payment\ojs\OJSPaymentManager;
use APP\submission\Collector;
use PKP\core\APIResponse;
use PKP\db\DAORegistry;
use PKP\security\authorization\SubmissionAccessPolicy;
use PKP\security\Role;
use PKP\stageAssignment\StageAssignmentDAO;
use Slim\Http\Request;
class BackendSubmissionsHandler extends \PKP\API\v1\_submissions\PKPBackendSubmissionsHandler
{
/**
* Constructor
*/
public function __construct()
{
$this->_endpoints = array_merge_recursive($this->_endpoints, [
'PUT' => [
[
'pattern' => '/{contextPath}/api/{version}/_submissions/{submissionId:\d+}/payment',
'handler' => [$this, 'payment'],
'roles' => [
Role::ROLE_ID_SUB_EDITOR,
Role::ROLE_ID_MANAGER,
Role::ROLE_ID_SITE_ADMIN,
Role::ROLE_ID_ASSISTANT,
],
],
],
]);
parent::__construct();
}
/**
* @copydoc PKPHandler::authorize()
*/
public function authorize($request, &$args, $roleAssignments)
{
$routeName = $this->getSlimRequest()->getAttribute('route')->getName();
if ($routeName === 'payment') {
$this->addPolicy(new SubmissionAccessPolicy($request, $args, $roleAssignments));
}
return parent::authorize($request, $args, $roleAssignments);
}
/**
* Change the status of submission payments.
*
* @param Request $slimRequest Slim request object
* @param APIResponse $response object
* @param array $args arguments
*
* @return APIResponse
*/
public function payment($slimRequest, $response, $args)
{
$request = $this->getRequest();
$context = $request->getContext();
$submission = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_SUBMISSION);
if (!$submission || !$context || $context->getId() != $submission->getContextId()) {
return $response->withStatus(404)->withJsonError('api.404.resourceNotFound');
}
$paymentManager = Application::getPaymentManager($context);
$publicationFeeEnabled = $paymentManager->publicationEnabled();
if (!$publicationFeeEnabled) {
return $response->withStatus(404)->withJsonError('api.404.resourceNotFound');
}
$params = $slimRequest->getParsedBody();
if (empty($params['publicationFeeStatus'])) {
return $response->withJson([
'publicationFeeStatus' => [__('validator.required')],
], 400);
}
$completedPaymentDao = DAORegistry::getDAO('OJSCompletedPaymentDAO'); /** @var OJSCompletedPaymentDAO $completedPaymentDao */
$publicationFeePayment = $completedPaymentDao->getByAssoc(null, OJSPaymentManager::PAYMENT_TYPE_PUBLICATION, $submission->getId());
switch ($params['publicationFeeStatus']) {
case 'waived':
// Check if a waiver already exists; if so, don't do anything.
if ($publicationFeePayment && !$publicationFeePayment->getAmount()) {
break;
}
// If a fulfillment (nonzero amount) already exists, remove it.
if ($publicationFeePayment) {
$completedPaymentDao->deleteById($publicationFeePayment->getId());
}
// Record a waived payment.
$queuedPayment = $paymentManager->createQueuedPayment(
$request,
OJSPaymentManager::PAYMENT_TYPE_PUBLICATION,
$request->getUser()->getId(),
$submission->getId(),
0,
'' // Zero amount, no currency
);
$paymentManager->queuePayment($queuedPayment);
$paymentManager->fulfillQueuedPayment($request, $queuedPayment, 'ManualPayment');
break;
case 'paid':
// Check if a fulfilled payment already exists; if so, don't do anything.
if ($publicationFeePayment && $publicationFeePayment->getAmount()) {
break;
}
// If a waiver (0 amount) already exists, remove it.
if ($publicationFeePayment) {
$completedPaymentDao->deleteById($publicationFeePayment->getId());
}
// Record a fulfilled payment.
$stageAssignmentDao = DAORegistry::getDAO('StageAssignmentDAO'); /** @var StageAssignmentDAO $stageAssignmentDao */
$submitterAssignments = $stageAssignmentDao->getBySubmissionAndRoleIds($submission->getId(), [Role::ROLE_ID_AUTHOR]);
$submitterAssignment = $submitterAssignments->next();
$queuedPayment = $paymentManager->createQueuedPayment(
$request,
OJSPaymentManager::PAYMENT_TYPE_PUBLICATION,
$submitterAssignment->getUserId(),
$submission->getId(),
$context->getSetting('publicationFee'),
$context->getSetting('currency')
);
$paymentManager->queuePayment($queuedPayment);
$paymentManager->fulfillQueuedPayment($request, $queuedPayment, 'Waiver');
break;
case 'unpaid':
if ($publicationFeePayment) {
$completedPaymentDao->deleteById($publicationFeePayment->getId());
}
break;
default:
return $response->withJson([
'publicationFeeStatus' => [__('validator.required')],
], 400);
}
return $response->withJson(true);
}
/** @copydoc PKPSubmissionHandler::getSubmissionCollector() */
protected function getSubmissionCollector(array $queryParams): Collector
{
$collector = parent::getSubmissionCollector($queryParams);
if (isset($queryParams['issueIds'])) {
$collector->filterByIssueIds(
array_map('intval', $this->paramToArray($queryParams['issueIds']))
);
}
if (isset($queryParams['sectionIds'])) {
$collector->filterBySectionIds(
array_map('intval', $this->paramToArray($queryParams['sectionIds']))
);
}
return $collector;
}
}
|