00001 <?php
00002
00016 import('lib.pkp.classes.form.Form');
00017
00018 class ReviewerForm extends Form {
00020 var $_monograph;
00021
00023 var $_reviewRound;
00024
00026 var $_reviewerFormActions;
00027
00029 var $_userRoles;
00030
00036 function ReviewerForm(&$monograph, &$reviewRound) {
00037 parent::Form('controllers/grid/users/reviewer/form/defaultReviewerForm.tpl');
00038 $this->setMonograph($monograph);
00039 $this->setReviewRound($reviewRound);
00040
00041
00042 $this->addCheck(new FormValidator($this, 'responseDueDate', 'required', 'editor.review.errorAddingReviewer'));
00043 $this->addCheck(new FormValidator($this, 'reviewDueDate', 'required', 'editor.review.errorAddingReviewer'));
00044
00045 $this->addCheck(new FormValidatorPost($this));
00046 }
00047
00048
00049
00050
00055 function getMonographId() {
00056 $monograph =& $this->getMonograph();
00057 return $monograph->getId();
00058 }
00059
00064 function &getMonograph() {
00065 return $this->_monograph;
00066 }
00067
00072 function &getReviewRound() {
00073 return $this->_reviewRound;
00074 }
00075
00080 function setMonograph(&$monograph) {
00081 $this->_monograph =& $monograph;
00082 }
00083
00088 function setReviewRound(&$reviewRound) {
00089 $this->_reviewRound =& $reviewRound;
00090 }
00091
00096 function setReviewerFormAction($action) {
00097 $this->_reviewerFormActions[$action->getId()] =& $action;
00098 }
00099
00104 function setUserRoles($userRoles) {
00105 $this->_userRoles = $userRoles;
00106 }
00107
00112 function getUserRoles() {
00113 return $this->_userRoles;
00114 }
00115
00120 function getReviewerFormActions() {
00121 return $this->_reviewerFormActions;
00122 }
00123
00124
00125
00131 function initData($args, &$request) {
00132 $reviewerId = (int) $request->getUserVar('reviewerId');
00133 $press =& $request->getContext();
00134 $reviewRound =& $this->getReviewRound();
00135 $seriesEditorSubmissionDao =& DAORegistry::getDAO('SeriesEditorSubmissionDAO');
00136 $monograph =& $seriesEditorSubmissionDao->getById($this->getMonographId());
00137
00138
00139 if (!empty($reviewerId)) {
00140 if ($this->_isValidReviewer($press, $monograph, $reviewRound, $reviewerId)) {
00141 $userDao = & DAORegistry::getDAO('UserDAO');
00142 $reviewer =& $userDao->getById($reviewerId);
00143 $this->setData('userNameString', sprintf('%s (%s)', $reviewer->getFullname(), $reviewer->getUsername()));
00144 }
00145 }
00146
00147
00148 $reviewAssignmentDao =& DAORegistry::getDAO('ReviewAssignmentDAO');
00149 $reviewAssignment =& $reviewAssignmentDao->getReviewAssignment($reviewRound->getId(), $reviewerId);
00150
00151
00152 if (isset($reviewAssignment) && $reviewAssignment->getReviewMethod() != false) {
00153 $reviewMethod = $reviewAssignment->getReviewMethod();
00154 } else {
00155
00156 $reviewMethod = SUBMISSION_REVIEW_METHOD_BLIND;
00157 }
00158
00159
00160 if (isset($reviewAssignment) && $reviewAssignment->getDueDate() != null) {
00161 $reviewDueDate = strftime(Config::getVar('general', 'date_format_short'), strtotime($reviewAssignment->getDueDate()));
00162 } else {
00163 $numWeeks = max((int) $press->getSetting('numWeeksPerReview'), 4);
00164 $reviewDueDate = strftime(Config::getVar('general', 'date_format_short'), strtotime('+' . $numWeeks . ' week'));
00165 }
00166 if (isset($reviewAssignment) && $reviewAssignment->getResponseDueDate() != null) {
00167 $responseDueDate = strftime(Config::getVar('general', 'date_format_short'), strtotime($reviewAssignment->getResponseDueDate()));
00168 } else {
00169 $numWeeks = max((int) $press->getSetting('numWeeksPerResponse'), 3);
00170 $responseDueDate = strftime(Config::getVar('general', 'date_format_short'), strtotime('+' . $numWeeks . ' week'));
00171 }
00172
00173
00174 $selectionType = (int) $request->getUserVar('selectionType');
00175 $stageId = $reviewRound->getStageId();
00176
00177 $this->setData('monographId', $this->getMonographId());
00178 $this->setData('stageId', $stageId);
00179 $this->setData('reviewMethod', $reviewMethod);
00180 $this->setData('reviewRoundId', $reviewRound->getId());
00181 $this->setData('reviewerId', $reviewerId);
00182
00183 import('classes.mail.MonographMailTemplate');
00184 $template = new MonographMailTemplate($monograph, 'REVIEW_REQUEST');
00185 if ($template) {
00186 $user =& $request->getUser();
00187 $dispatcher =& $request->getDispatcher();
00188 $press =& $request->getPress();
00189 $template->assignParams(array(
00190 'pressUrl' => $dispatcher->url($request, ROUTE_PAGE, $press->getPath()),
00191 'editorialContactSignature' => $user->getContactSignature(),
00192 'signatureFullName' => $user->getFullname(),
00193 'messageToReviewer' => __('reviewer.step1.requestBoilerplate'),
00194 'submissionReviewUrl' => $dispatcher->url($request, ROUTE_PAGE, null, 'reviewer', 'submission', null, array('monographId' => $this->getMonographId()))
00195 ));
00196 }
00197 $this->setData('personalMessage', $template->getBody() . "\n" . $press->getSetting('emailSignature'));
00198 $this->setData('responseDueDate', $responseDueDate);
00199 $this->setData('reviewDueDate', $reviewDueDate);
00200 $this->setData('selectionType', $selectionType);
00201 }
00202
00208 function fetch(&$request) {
00209
00210
00211 $reviewAssignmentDao = DAORegistry::getDAO('ReviewAssignmentDAO');
00212 $reviewMethods = $reviewAssignmentDao->getReviewMethodsTranslationKeys();
00213
00214 $templateMgr =& TemplateManager::getManager();
00215 $templateMgr->assign('reviewMethods', $reviewMethods);
00216 $templateMgr->assign('reviewerActions', $this->getReviewerFormActions());
00217
00218
00219 $press =& $request->getPress();
00220 $userGroupDao =& DAORegistry::getDAO('UserGroupDAO');
00221 $reviewRound =& $this->getReviewRound();
00222 $reviewerUserGroups =& $userGroupDao->getUserGroupsByStage($press->getId(), $reviewRound->getStageId(), false, false, ROLE_ID_REVIEWER);
00223 $userGroups = array();
00224 while($userGroup =& $reviewerUserGroups->next()) {
00225 $userGroups[$userGroup->getId()] = $userGroup->getLocalizedName();
00226 unset($userGroup);
00227 }
00228
00229 $this->setData('userGroups', $userGroups);
00230 return parent::fetch($request);
00231 }
00232
00237 function readInputData() {
00238 $this->readUserVars(array(
00239 'selectionType',
00240 'monographId',
00241 'personalMessage',
00242 'responseDueDate',
00243 'reviewDueDate',
00244 'reviewMethod',
00245 'skipEmail',
00246 'keywords',
00247 'interestsTextOnly',
00248 'reviewRoundId',
00249 'stageId',
00250 ));
00251
00252 $keywords = $this->getData('keywords');
00253 if ($keywords != null && is_array($keywords['interests'])) {
00254
00255 $this->setData('interestsKeywords', array_map('urldecode', $keywords['interests']));
00256 }
00257 }
00258
00264 function execute($args, &$request) {
00265 $seriesEditorSubmissionDao =& DAORegistry::getDAO('SeriesEditorSubmissionDAO');
00266 $submission =& $seriesEditorSubmissionDao->getById($this->getMonographId());
00267 $press =& $request->getPress();
00268
00269 $currentReviewRound =& $this->getReviewRound();
00270 $stageId = $currentReviewRound->getStageId();
00271 $reviewDueDate = $this->getData('reviewDueDate');
00272 $responseDueDate = $this->getData('responseDueDate');
00273
00274
00275 $reviewerId = (int) $this->getData('reviewerId');
00276
00277 if (!$this->_isValidReviewer($press, $submission, $currentReviewRound, $reviewerId)) {
00278 fatalError('Invalid reviewer id.');
00279 }
00280
00281 $reviewMethod = (int) $this->getData('reviewMethod');
00282
00283 import('classes.submission.seriesEditor.SeriesEditorAction');
00284 $seriesEditorAction = new SeriesEditorAction();
00285 $seriesEditorAction->addReviewer($request, $submission, $reviewerId, $currentReviewRound, $reviewDueDate, $responseDueDate, $reviewMethod);
00286
00287
00288 $reviewAssignmentDao =& DAORegistry::getDAO('ReviewAssignmentDAO');
00289 $reviewAssignment =& $reviewAssignmentDao->getReviewAssignment($currentReviewRound->getId(), $reviewerId);
00290 $reviewAssignment->setDateNotified(Core::getCurrentDate());
00291 $reviewAssignment->setCancelled(0);
00292 $reviewAssignment->stampModified();
00293 $reviewAssignmentDao->updateObject($reviewAssignment);
00294
00295
00296 import('classes.mail.MonographMailTemplate');
00297 $mail = new MonographMailTemplate($submission, 'REVIEW_REQUEST', null, null, null, false);
00298
00299 if ($mail->isEnabled() && !$this->getData('skipEmail')) {
00300 $userDao = & DAORegistry::getDAO('UserDAO');
00301 $reviewer =& $userDao->getById($reviewerId);
00302 $user = $request->getUser();
00303 $mail->addRecipient($reviewer->getEmail(), $reviewer->getFullName());
00304 $mail->setBody($this->getData('personalMessage'));
00305 $dispatcher =& $request->getDispatcher();
00306
00307
00308 $paramArray = array(
00309 'reviewerName' => $reviewer->getFullName(),
00310 'responseDueDate' => $responseDueDate,
00311 'reviewDueDate' => $reviewDueDate,
00312 'reviewerUserName' => $reviewer->getUsername(),
00313 );
00314 $mail->assignParams($paramArray);
00315 $mail->send($request);
00316 }
00317
00318 return $reviewAssignment;
00319 }
00320
00321
00322
00323
00324
00331 function getSearchByNameAction(&$request) {
00332 $reviewRound =& $this->getReviewRound();
00333
00334 $actionArgs['monographId'] = $this->getMonographId();
00335 $actionArgs['stageId'] = $reviewRound->getStageId();
00336 $actionArgs['reviewRoundId'] = $reviewRound->getId();
00337 $actionArgs['selectionType'] = REVIEWER_SELECT_SEARCH_BY_NAME;
00338
00339 return new LinkAction(
00340 'addReviewer',
00341 new AjaxAction($request->url(null, null, 'reloadReviewerForm', null, $actionArgs)),
00342 __('editor.monograph.returnToSimpleSearch'),
00343 'return'
00344 );
00345 }
00346
00347
00348
00349
00350
00357 function _isValidReviewer(&$press, &$monograph, &$reviewRound, $reviewerId) {
00358 $seriesEditorSubmissionDao =& DAORegistry::getDAO('SeriesEditorSubmissionDAO');
00359 $reviewerFactory =& $seriesEditorSubmissionDao->getReviewersNotAssignedToMonograph($press->getId(), $monograph->getId(), $reviewRound);
00360 $reviewersArray = $reviewerFactory->toAssociativeArray();
00361 if (array_key_exists($reviewerId, $reviewersArray)) {
00362 return true;
00363 } else {
00364 return false;
00365 }
00366 }
00367 }
00368
00369 ?>