16 import(
'lib.pkp.classes.form.Form');
43 function __construct($request, $assocType, $assocId, $stageId, $queryId =
null) {
44 parent::__construct(
'controllers/grid/queries/form/queryForm.tpl');
52 $query = $queryDao->newDataObject();
53 $query->setAssocType($assocType);
54 $query->setAssocId($assocId);
55 $query->setStageId($stageId);
56 $query->setSequence(REALLY_BIG_NUMBER);
57 $queryDao->insertObject($query);
58 $queryDao->resequence($assocType, $assocId);
61 $queryDao->insertParticipant($query->getId(), $request->getUser()->getId());
65 $headNote = $noteDao->newDataObject();
66 $headNote->setUserId($request->getUser()->getId());
67 $headNote->setAssocType(ASSOC_TYPE_QUERY);
68 $headNote->setAssocId($query->getId());
70 $noteDao->insertObject($headNote);
72 $query = $queryDao->getById($queryId, $assocType, $assocId);
73 assert(isset($query));
75 $this->_isNew = !$query->getHeadNote();
82 return count($users) > 1;
84 $this->
addCheck(
new FormValidator($this,
'subject',
'required',
'submission.queries.subjectRequired'));
85 $this->
addCheck(
new FormValidator($this,
'comment',
'required',
'submission.queries.messageRequired'));
106 $this->_query = $query;
122 $this->_stageId = $stageId;
130 return $this->
getData(
'assocType');
138 $this->
setData(
'assocType', $assocType);
146 return $this->
getData(
'assocId');
154 $this->
setData(
'assocId', $assocId);
167 $headNote = $query->getHeadNote();
168 $this->_data = array(
169 'queryId' => $query->getId(),
170 'subject' => $headNote?$headNote->getTitle():
null,
171 'comment' => $headNote?$headNote->getContents():
null,
172 'userIds' => $queryDao->getParticipantIds($query->getId()),
178 return parent::initData();
187 function fetch($request, $template =
null, $display =
false, $actionArgs = array()) {
191 $headNote = $query->getHeadNote();
192 $user = $request->getUser();
193 $context = $request->getContext();
196 $templateMgr->assign(array(
197 'isNew' => $this->_isNew,
198 'noteId' => $headNote->getId(),
199 'actionArgs' => $actionArgs,
200 'csrfToken' => $request->getSession()->getCSRFToken(),
204 if ($query->getAssocType() == ASSOC_TYPE_SUBMISSION) {
210 $assignedParticipants = $query->getId() ? $queryDao->getParticipantIds($query->getId()) : array();
213 $includeUsers[] = $user->getId();
214 $excludeUsers =
null;
217 $reviewAssignments = array();
218 if ($query->getStageId() == WORKFLOW_STAGE_ID_EXTERNAL_REVIEW || $query->getStageId() == WORKFLOW_STAGE_ID_INTERNAL_REVIEW) {
222 $reviewAssignments = $reviewAssignmentDao->getBySubmissionId($query->getAssocId());
226 $usersAssignments = $stageAssignmentDao->getBySubmissionAndStageId($query->getAssocId(), $query->getStageId(),
null, $user->getId());
227 while ($usersAssignment = $usersAssignments->next()) {
229 $userGroup = $userGroupDao->getById($usersAssignment->getUserGroupId());
230 $assignedRoles[] = $userGroup->getRoleId();
234 if ($user->hasRole([ROLE_ID_SITE_ADMIN], CONTEXT_SITE) ||
235 array_intersect([ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR], $assignedRoles)) {
236 foreach ($reviewAssignments as $reviewAssignment) {
237 $includeUsers[] = $reviewAssignment->getReviewerId();
242 foreach ($reviewAssignments as $reviewAssignment) {
243 if ($reviewAssignment->getReviewerId() == $user->getId() ){
244 if ($reviewAssignment->getReviewMethod() != SUBMISSION_REVIEW_METHOD_OPEN){
245 $authorAssignments = $stageAssignmentDao->getBySubmissionAndRoleId($query->getAssocId(), ROLE_ID_AUTHOR);
246 while ($assignment = $authorAssignments->next()) {
247 $excludeUsers[] = $assignment->getUserId();
254 if (array_intersect(array(ROLE_ID_AUTHOR), $assignedRoles)) {
255 foreach ($reviewAssignments as $reviewAssignment) {
256 if ($reviewAssignment->getReviewMethod() == SUBMISSION_REVIEW_METHOD_OPEN && $reviewAssignment->getDateConfirmed()){
257 $includeUsers[] = $reviewAssignment->getReviewerId();
265 'contextId' => $context->getId(),
268 'assignedToSubmission' => $query->getAssocId(),
269 'assignedToSubmissionStage' => $query->getStageId(),
270 'includeUsers' => $includeUsers,
271 'excludeUsers' => $excludeUsers,
275 $usersIterator = $userService->getMany($params);
277 $allParticipants = [];
278 if (count($usersIterator)) {
280 foreach ($usersIterator as $user) {
281 $allUserGroups = $userGroupDao->getByUserId($user->getId(), $context->getId())->toArray();
283 $userRoles = array();
284 $userAssignments = $stageAssignmentDao->getBySubmissionAndStageId($query->getAssocId(), $query->getStageId(),
null, $user->getId())->toArray();
285 foreach ($userAssignments as $userAssignment) {
286 foreach ($allUserGroups as $userGroup) {
287 if ($userGroup->getId() == $userAssignment->getUserGroupId()) {
288 $userRoles[] = $userGroup->getLocalizedName();
292 foreach ($reviewAssignments as $assignment) {
293 if ($assignment->getReviewerId() == $user->getId()) {
294 $userRoles[] = __(
'user.role.reviewer') .
" (" . __($assignment->getReviewMethodKey()) .
")";
297 if (!count($userRoles)) {
298 $userRoles[] = __(
'submission.status.unassigned');
300 $allParticipants[$user->getId()] = __(
'submission.query.participantTitle', [
301 'fullName' => $user->getFullName(),
302 'userGroup' => join(__(
'common.commaListSeparator'), $userRoles),
307 $templateMgr->assign([
308 'allParticipants' => $allParticipants,
309 'assignedParticipants' => $assignedParticipants,
313 return parent::fetch($request, $template, $display);
331 function execute(...$functionArgs) {
336 $headNote = $query->getHeadNote();
337 $headNote->setTitle($this->
getData(
'subject'));
338 $headNote->setContents($this->
getData(
'comment'));
341 $noteDao->updateObject($headNote);
343 $queryDao->updateObject($query);
346 $oldParticipantIds = $queryDao->getParticipantIds($query->getId());
347 $newParticipantIds = $this->
getData(
'users');
348 $queryDao->removeAllParticipants($query->getId());
349 foreach ($newParticipantIds as $userId) {
350 $queryDao->insertParticipant($query->getId(), $userId);
355 $removed = array_diff($oldParticipantIds, $newParticipantIds);
356 $added = array_diff($newParticipantIds, $oldParticipantIds);
357 foreach($removed as $userId) {
360 $notificationDao->deleteByAssoc(ASSOC_TYPE_QUERY, $query->getId(), $userId);
362 $currentUser = $request->getUser();
363 foreach($added as $userId) {
365 if ($currentUser->getId() == $userId) {
368 $notificationManager->createNotification(
371 NOTIFICATION_TYPE_NEW_QUERY,
372 $request->getContext()->getId(),
375 NOTIFICATION_LEVEL_TASK
380 if ($query->getAssocType() == ASSOC_TYPE_SUBMISSION) {
381 $submission =
Services::get(
'submission')->get($query->getAssocId());
382 $submission->stampLastActivity();
384 $submissionDao->updateObject($submission);
387 parent::execute(...$functionArgs);