202 lines
8.0 KiB
PHP
202 lines
8.0 KiB
PHP
<?php
|
|
/**
|
|
* @file classes/publication/Repository.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 Repository
|
|
*
|
|
* @brief Get publications and information about publications
|
|
*/
|
|
|
|
namespace APP\publication;
|
|
|
|
use APP\core\Application;
|
|
use APP\core\Services;
|
|
use APP\facades\Repo;
|
|
use APP\payment\ojs\OJSCompletedPaymentDAO;
|
|
use APP\payment\ojs\OJSPaymentManager;
|
|
use APP\submission\Submission;
|
|
use Illuminate\Support\Facades\App;
|
|
use PKP\context\Context;
|
|
use PKP\core\Core;
|
|
use PKP\core\PKPString;
|
|
use PKP\db\DAORegistry;
|
|
use PKP\publication\Collector;
|
|
|
|
class Repository extends \PKP\publication\Repository
|
|
{
|
|
/** @copydoc \PKP\submission\Repository::$schemaMap */
|
|
public $schemaMap = maps\Schema::class;
|
|
|
|
public function getCollector(): Collector
|
|
{
|
|
return App::makeWith(Collector::class, ['dao' => $this->dao]);
|
|
}
|
|
|
|
/** @copydoc PKP\publication\Repository::validate() */
|
|
public function validate($publication, array $props, Submission $submission, Context $context): array
|
|
{
|
|
$errors = parent::validate($publication, $props, $submission, $context);
|
|
|
|
$allowedLocales = $context->getSupportedSubmissionLocales();
|
|
$primaryLocale = $submission->getLocale();
|
|
|
|
// Ensure that the specified section exists
|
|
$section = null;
|
|
if (isset($props['sectionId'])) {
|
|
$section = Repo::section()->get($props['sectionId'], $context->getId());
|
|
if (!$section) {
|
|
$errors['sectionId'] = [__('publication.invalidSection')];
|
|
}
|
|
}
|
|
|
|
// Get the section so we can validate section abstract requirements
|
|
if (!$section && !is_null($publication)) {
|
|
$section = Repo::section()->get($publication->getData('sectionId'), $context->getId());
|
|
}
|
|
|
|
// Only validate section settings for completed submissions
|
|
if ($section && !$submission->getData('submissionProgress')) {
|
|
// Require abstracts for new publications if the section requires them
|
|
if (is_null($publication) && !$section->getData('abstractsNotRequired') && empty($props['abstract'])) {
|
|
$errors['abstract'][$primaryLocale] = [__('author.submit.form.abstractRequired')];
|
|
}
|
|
|
|
if (isset($props['abstract']) && empty($errors['abstract'])) {
|
|
// Require abstracts in the primary language if the section requires them
|
|
if (!$section->getData('abstractsNotRequired')) {
|
|
if (empty($props['abstract'][$primaryLocale])) {
|
|
if (!isset($errors['abstract'])) {
|
|
$errors['abstract'] = [];
|
|
};
|
|
$errors['abstract'][$primaryLocale] = [__('author.submit.form.abstractRequired')];
|
|
}
|
|
}
|
|
|
|
// Check the word count on abstracts
|
|
foreach ($allowedLocales as $localeKey) {
|
|
if (empty($props['abstract'][$localeKey])) {
|
|
continue;
|
|
}
|
|
$wordCount = PKPString::getWordCount($props['abstract'][$localeKey]);
|
|
$wordCountLimit = $section->getData('wordCount');
|
|
if ($wordCountLimit && $wordCount > $wordCountLimit) {
|
|
if (!isset($errors['abstract'])) {
|
|
$errors['abstract'] = [];
|
|
};
|
|
$errors['abstract'][$localeKey] = [__('publication.wordCountLong', ['limit' => $wordCountLimit, 'count' => $wordCount])];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Ensure that the issueId exists
|
|
if (isset($props['issueId']) && empty($errors['issueId'])) {
|
|
if (!Repo::issue()->exists($props['issueId'])) {
|
|
$errors['issueId'] = [__('publication.invalidIssue')];
|
|
}
|
|
}
|
|
|
|
return $errors;
|
|
}
|
|
|
|
/** @copydoc PKP\publication\Repository::validatePublish() */
|
|
public function validatePublish(Publication $publication, Submission $submission, array $allowedLocales, string $primaryLocale): array
|
|
{
|
|
$errors = parent::validatePublish($publication, $submission, $allowedLocales, $primaryLocale);
|
|
|
|
// Every publication must be scheduled in an issue
|
|
if (!$publication->getData('issueId') || !Repo::issue()->get($publication->getData('issueId'))) {
|
|
$errors['issueId'] = __('publication.required.issue');
|
|
}
|
|
|
|
// If submission fees are enabled, check that they're fulfilled
|
|
$context = Application::get()->getRequest()->getContext();
|
|
if (!$context || $context->getId() !== $submission->getData('contextId')) {
|
|
$context = Services::get('context')->get($submission->getData('contextId'));
|
|
}
|
|
$paymentManager = Application::getPaymentManager($context);
|
|
$completedPaymentDao = DAORegistry::getDAO('OJSCompletedPaymentDAO'); /** @var OJSCompletedPaymentDAO $completedPaymentDao */
|
|
$publicationFeeEnabled = $paymentManager->publicationEnabled();
|
|
$publicationFeePayment = $completedPaymentDao->getByAssoc(null, OJSPaymentManager::PAYMENT_TYPE_PUBLICATION, $submission->getId());
|
|
if ($publicationFeeEnabled && !$publicationFeePayment) {
|
|
$errors['publicationFeeStatus'] = __('editor.article.payment.publicationFeeNotPaid');
|
|
}
|
|
|
|
return $errors;
|
|
}
|
|
|
|
/** @copydoc \PKP\publication\Repository::version() */
|
|
public function version(Publication $publication): int
|
|
{
|
|
$newId = parent::version($publication);
|
|
|
|
$context = Application::get()->getRequest()->getContext();
|
|
|
|
$galleys = $publication->getData('galleys');
|
|
$isDoiVersioningEnabled = $context->getData(Context::SETTING_DOI_VERSIONING);
|
|
if (!empty($galleys)) {
|
|
foreach ($galleys as $galley) {
|
|
$newGalley = clone $galley;
|
|
$newGalley->setData('id', null);
|
|
$newGalley->setData('publicationId', $newId);
|
|
if ($isDoiVersioningEnabled) {
|
|
$newGalley->setData('doiId', null);
|
|
}
|
|
Repo::galley()->add($newGalley);
|
|
}
|
|
}
|
|
|
|
return $newId;
|
|
}
|
|
|
|
/** @copydoc \PKP\publication\Repository::setStatusOnPublish() */
|
|
protected function setStatusOnPublish(Publication $publication)
|
|
{
|
|
// A publication may be scheduled in a future issue. In such cases,
|
|
// the `datePublished` should remain empty and the status should be set to
|
|
// scheduled.
|
|
//
|
|
// If there is no assigned issue, the journal may be using a continuous
|
|
// publishing model in which articles are published right away.
|
|
$issue = Repo::issue()->get($publication->getData('issueId'));
|
|
if ($issue && !$issue->getData('published')) {
|
|
$publication->setData('datePublished', null);
|
|
$publication->setData('status', Submission::STATUS_SCHEDULED);
|
|
} else {
|
|
$publication->setData('status', Submission::STATUS_PUBLISHED);
|
|
if (!$publication->getData('datePublished')) {
|
|
$publication->setData('datePublished', Core::getCurrentDate());
|
|
}
|
|
}
|
|
}
|
|
|
|
/** @copydoc \PKP\publication\Repository::delete() */
|
|
public function delete(Publication $publication)
|
|
{
|
|
$galleys = Repo::galley()->getCollector()
|
|
->filterByPublicationIds([$publication->getId()])
|
|
->getMany();
|
|
|
|
foreach ($galleys as $galley) {
|
|
Repo::galley()->delete($galley);
|
|
}
|
|
|
|
parent::delete($publication);
|
|
}
|
|
|
|
/**
|
|
* Create all DOIs associated with the publication.
|
|
*
|
|
* @throws \Exception
|
|
*/
|
|
protected function createDois(Publication $newPublication): void
|
|
{
|
|
$submission = Repo::submission()->get($newPublication->getData('submissionId'));
|
|
Repo::submission()->createDois($submission);
|
|
}
|
|
}
|