16 import(
'classes.handler.Handler');
19 import(
'lib.pkp.classes.core.JSONMessage');
29 function authorize($request, &$args, $roleAssignments) {
32 import(
'lib.pkp.classes.security.authorization.internal.ReviewRoundRequiredPolicy');
35 if (!parent::authorize($request, $args, $roleAssignments))
return false;
39 $operation = $request->getRouter()->getRequestedOp($request);
40 if (in_array($operation, $reviewRoundOps)) {
42 foreach ($userAccessibleStages as $stageId => $roles) {
43 if (in_array(ROLE_ID_AUTHOR, $roles)) {
57 LOCALE_COMPONENT_APP_COMMON,
58 LOCALE_COMPONENT_APP_EDITOR,
59 LOCALE_COMPONENT_APP_SUBMISSION,
60 LOCALE_COMPONENT_PKP_EDITOR,
61 LOCALE_COMPONENT_PKP_SUBMISSION
98 $args, $request,
'InitiateExternalReviewForm',
99 WORKFLOW_STAGE_PATH_EXTERNAL_REVIEW,
100 SUBMISSION_EDITOR_DECISION_EXTERNAL_REVIEW
176 return $this->_saveGeneralPromote($args, $request);
187 return $this->_saveGeneralPromote($args, $request);
209 $reviewAssignments = $reviewAssignmentDao->getBySubmissionId($submission->getId(), $reviewRound->getId());
210 $reviewIndexes = $reviewAssignmentDao->getReviewIndexesForRound($submission->getId(), $reviewRound->getId());
214 $textSeparator =
'------------------------------------------------------';
215 foreach ($reviewAssignments as $reviewAssignment) {
217 if ($reviewAssignment->getDateCompleted() !=
null) {
219 $submissionComments = $submissionCommentDao->getSubmissionComments($submission->getId(), COMMENT_TYPE_PEER_REVIEW, $reviewAssignment->getId());
221 $body .=
"<br><br>$textSeparator<br>";
223 if ($reviewAssignment->getReviewMethod() == SUBMISSION_REVIEW_METHOD_OPEN) {
224 $body .= $reviewAssignment->getReviewerFullName() .
"<br>\n";
226 $body .= __(
'submission.comments.importPeerReviews.reviewerLetter', array(
'reviewerLetter' =>
PKPString::enumerateAlphabetically($reviewIndexes[$reviewAssignment->getId()]))) .
"<br>\n";
229 while ($comment = $submissionComments->next()) {
231 if ($comment->getViewable()) {
237 $recommendation = $reviewAssignment->getLocalizedRecommendation();
238 $body .= __(
'submission.recommendation', array(
'recommendation' => $recommendation)) .
"<br>\n";
240 $body .=
"<br>$textSeparator<br><br>";
242 if ($reviewFormId = $reviewAssignment->getReviewFormId()) {
243 $reviewId = $reviewAssignment->getId();
246 $reviewFormElements = $reviewFormElementDao->getByReviewFormId($reviewFormId);
247 if(!$submissionComments) {
248 $body .=
"$textSeparator<br>";
250 $body .= __(
'submission.comments.importPeerReviews.reviewerLetter', array(
'reviewerLetter' =>
PKPString::enumerateAlphabetically($reviewIndexes[$reviewAssignment->getId()]))) .
'<br><br>';
252 while ($reviewFormElement = $reviewFormElements->next()) {
253 if (!$reviewFormElement->getIncluded())
continue;
256 $reviewFormResponse = $reviewFormResponseDao->getReviewFormResponse($reviewId, $reviewFormElement->getId());
258 if ($reviewFormResponse) {
259 $possibleResponses = $reviewFormElement->getLocalizedPossibleResponses();
261 if (in_array($reviewFormElement->getElementType(), array(REVIEW_FORM_ELEMENT_TYPE_CHECKBOXES, REVIEW_FORM_ELEMENT_TYPE_RADIO_BUTTONS))) {
262 ksort($possibleResponses);
263 $possibleResponses = array_values($possibleResponses);
265 if (in_array($reviewFormElement->getElementType(), $reviewFormElement->getMultipleResponsesElementTypes())) {
266 if ($reviewFormElement->getElementType() == REVIEW_FORM_ELEMENT_TYPE_CHECKBOXES) {
268 foreach ($reviewFormResponse->getValue() as $value) {
277 $body .=
'<blockquote>' . nl2br(htmlspecialchars($reviewFormResponse->getValue())) .
'</blockquote>';
282 $body .=
"$textSeparator<br><br>";
290 $user = $request->getUser();
291 $notificationMgr->createTrivialNotification($user->getId(), NOTIFICATION_TYPE_SUCCESS, array(
'contents' => __(
'editor.review.reviewsAdded')));
293 return new JSONMessage(
true, empty($body)?__(
'editor.review.noReviews'):$body);
308 assert(is_a($reviewRound,
'ReviewRound'));
311 import(
'lib.pkp.controllers.modals.editorDecision.form.RecommendationForm');
312 $editorRecommendationForm =
new RecommendationForm($submission, $stageId, $reviewRound);
313 $editorRecommendationForm->initData();
314 return new JSONMessage(
true, $editorRecommendationForm->fetch($request));
329 assert(is_a($reviewRound,
'ReviewRound'));
332 import(
'lib.pkp.controllers.modals.editorDecision.form.RecommendationForm');
333 $editorRecommendationForm =
new RecommendationForm($submission, $stageId, $reviewRound);
334 $editorRecommendationForm->readInputData();
335 if ($editorRecommendationForm->validate()) {
336 $editorRecommendationForm->execute();
338 $json->setGlobalEvent(
'decisionActionUpdated');
353 return array(
'promoteInReview',
'savePromoteInReview',
'newReviewRound',
'saveNewReviewRound',
'sendReviewsInReview',
'saveSendReviewsInReview',
'importPeerReviews',
'sendRecommendation',
'saveRecommendation');
363 case 'EditorDecisionWithEmailForm':
364 case 'NewReviewRoundForm':
366 case 'SendReviewsForm':
367 return "lib.pkp.controllers.modals.editorDecision.form.$formName";
388 $editorDecisionForm =
new $formName($submission, $decision, $stageId, $reviewRound);
391 if (is_a($editorDecisionForm,
'PromoteForm')) {
392 $editorDecisionForm->setSaveFormOperation(
'savePromoteInReview');
393 }
else if (is_a($editorDecisionForm,
'SendReviewsForm')) {
394 $editorDecisionForm->setSaveFormOperation(
'saveSendReviewsInReview');
397 $editorDecisionForm =
new $formName($submission, $decision, $stageId);
400 if (is_a($editorDecisionForm, $formName)) {
401 return $editorDecisionForm;
417 $decision = (int)$request->getUserVar(
'decision');
421 $editorDecisionForm->initData();
423 return new JSONMessage(
true, $editorDecisionForm->fetch($request));
435 protected function _saveEditorDecision($args, $request, $formName, $redirectOp =
null, $decision =
null) {
439 if (is_null($decision)) {
440 $decision = (int)$request->getUserVar(
'decision');
444 $editorDecisionForm->readInputData();
445 if ($editorDecisionForm->validate()) {
446 $editorDecisionForm->execute();
449 $authorUserIds = array();
451 $submitterAssignments = $stageAssignmentDao->getBySubmissionAndRoleId($submission->getId(), ROLE_ID_AUTHOR);
452 while ($assignment = $submitterAssignments->next()) {
453 $authorUserIds[] = $assignment->getUserId();
456 $authorUserIds = array_unique($authorUserIds);
460 $editorDecisionNotificationType = $this->_getNotificationTypeByEditorDecision($decision);
462 $notificationMgr->updateNotification(
466 ASSOC_TYPE_SUBMISSION,
471 $submissionNotificationsToUpdate = array(
472 SUBMISSION_EDITOR_DECISION_ACCEPT => array(NOTIFICATION_TYPE_ASSIGN_COPYEDITOR, NOTIFICATION_TYPE_AWAITING_COPYEDITS),
473 SUBMISSION_EDITOR_DECISION_SEND_TO_PRODUCTION => array(
474 NOTIFICATION_TYPE_ASSIGN_COPYEDITOR,
475 NOTIFICATION_TYPE_AWAITING_COPYEDITS,
476 NOTIFICATION_TYPE_ASSIGN_PRODUCTIONUSER,
477 NOTIFICATION_TYPE_AWAITING_REPRESENTATIONS,
481 if (array_key_exists($decision, $submissionNotificationsToUpdate)) {
482 $notificationMgr->updateNotification(
484 $submissionNotificationsToUpdate[$decision],
486 ASSOC_TYPE_SUBMISSION,
493 $redirectUrl = $dispatcher->url($request, ROUTE_PAGE,
null,
'workflow', $redirectOp, array($submission->getId()));
494 return $request->redirectUrlJson($redirectUrl);
496 if (in_array($decision, [SUBMISSION_EDITOR_DECISION_DECLINE, SUBMISSION_EDITOR_DECISION_INITIAL_DECLINE])) {
498 $redirectUrl = $dispatcher->url($request, ROUTE_PAGE,
null,
'workflow',
'access', array($submission->getId()));
499 return $request->redirectUrlJson($redirectUrl);