1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * The contents of this file are subject to the terms of the Liferay Enterprise
5    * Subscription License ("License"). You may not use this file except in
6    * compliance with the License. You can obtain a copy of the License by
7    * contacting Liferay, Inc. See the License for the specific language governing
8    * permissions and limitations under the License, including but not limited to
9    * distribution rights of the Software.
10   *
11   *
12   *
13   */
14  
15  package com.liferay.portlet.tasks.service.impl;
16  
17  import com.liferay.portal.PortalException;
18  import com.liferay.portal.SystemException;
19  import com.liferay.portal.kernel.json.JSONFactoryUtil;
20  import com.liferay.portal.kernel.json.JSONObject;
21  import com.liferay.portal.kernel.util.SetUtil;
22  import com.liferay.portal.model.User;
23  import com.liferay.portlet.tasks.DuplicateReviewUserIdException;
24  import com.liferay.portlet.tasks.model.TasksProposal;
25  import com.liferay.portlet.tasks.model.TasksReview;
26  import com.liferay.portlet.tasks.service.base.TasksReviewLocalServiceBaseImpl;
27  import com.liferay.portlet.tasks.social.TasksActivityKeys;
28  
29  import java.util.Date;
30  import java.util.HashSet;
31  import java.util.List;
32  import java.util.Set;
33  
34  /**
35   * <a href="TasksReviewLocalServiceImpl.java.html"><b><i>View Source</i></b></a>
36   *
37   * @author Raymond Augé
38   * @author Brian Wing Shun Chan
39   */
40  public class TasksReviewLocalServiceImpl
41      extends TasksReviewLocalServiceBaseImpl {
42  
43      public TasksReview addReview(
44              long userId, long proposalId, long assignedByUserId, int stage)
45          throws PortalException, SystemException {
46  
47          // Review
48  
49          User user = userPersistence.findByPrimaryKey(userId);
50          TasksProposal proposal = tasksProposalPersistence.findByPrimaryKey(
51              proposalId);
52          User assignedByUser = userPersistence.findByPrimaryKey(
53              assignedByUserId);
54          Date now = new Date();
55  
56          long reviewId = counterLocalService.increment();
57  
58          TasksReview review = tasksReviewPersistence.create(reviewId);
59  
60          review.setGroupId(proposal.getGroupId());
61          review.setCompanyId(user.getCompanyId());
62          review.setUserId(user.getUserId());
63          review.setUserName(user.getFullName());
64          review.setCreateDate(now);
65          review.setModifiedDate(now);
66          review.setProposalId(proposalId);
67          review.setAssignedByUserId(assignedByUserId);
68          review.setAssignedByUserName(assignedByUser.getFullName());
69          review.setStage(stage);
70          review.setCompleted(false);
71          review.setRejected(false);
72  
73          tasksReviewPersistence.update(review, false);
74  
75          // Social
76  
77          JSONObject extraData = JSONFactoryUtil.createJSONObject();
78  
79          extraData.put("stage", review.getStage());
80          extraData.put("completed", review.getCompleted());
81          extraData.put("rejected", review.getRejected());
82  
83          socialActivityLocalService.addActivity(
84              assignedByUserId, proposal.getGroupId(),
85              TasksProposal.class.getName(), proposalId,
86              TasksActivityKeys.ASSIGN_PROPOSAL, extraData.toString(), userId);
87  
88          return review;
89      }
90  
91      public TasksReview approveReview(
92              long userId, long proposalId, int stage)
93          throws PortalException, SystemException {
94  
95          return updateReview(userId, proposalId, stage, false);
96      }
97  
98      public void deleteReview(long reviewId)
99          throws PortalException, SystemException {
100 
101         TasksReview review = tasksReviewPersistence.findByPrimaryKey(
102             reviewId);
103 
104         deleteReview(review);
105     }
106 
107     public void deleteReview(TasksReview review) throws SystemException {
108         tasksReviewPersistence.remove(review);
109     }
110 
111     public void deleteReviews(long proposalId) throws SystemException {
112         List<TasksReview> reviews = tasksReviewPersistence.findByProposalId(
113             proposalId);
114 
115         for (TasksReview review : reviews) {
116             deleteReview(review);
117         }
118     }
119 
120     public TasksReview getReview(long reviewId)
121         throws PortalException, SystemException {
122 
123         return tasksReviewPersistence.findByPrimaryKey(reviewId);
124     }
125 
126     public TasksReview getReview(long userId, long proposalId)
127         throws PortalException, SystemException {
128 
129         return tasksReviewPersistence.findByU_P(userId, proposalId);
130     }
131 
132     public List<TasksReview> getReviews(long proposalId)
133         throws SystemException {
134 
135         return tasksReviewPersistence.findByProposalId(proposalId);
136     }
137 
138     public List<TasksReview> getReviews(long proposalId, int stage)
139         throws SystemException {
140 
141         return tasksReviewPersistence.findByP_S(proposalId, stage);
142     }
143 
144     public List<TasksReview> getReviews(
145             long proposalId, int stage, boolean completed)
146         throws SystemException {
147 
148         return tasksReviewPersistence.findByP_S_C(proposalId, stage, completed);
149     }
150 
151     public List<TasksReview> getReviews(
152             long proposalId, int stage, boolean completed, boolean rejected)
153         throws SystemException {
154 
155         return tasksReviewPersistence.findByP_S_C_R(
156             proposalId, stage, completed, rejected);
157     }
158 
159     public TasksReview rejectReview(
160             long userId, long proposalId, int stage)
161         throws PortalException, SystemException {
162 
163         return updateReview(userId, proposalId, stage, true);
164     }
165 
166     public void updateReviews(
167             long proposalId, long assignedByUserId, long[][] userIdsPerStage)
168         throws PortalException, SystemException {
169 
170         Set<Long> assignedUserIds = new HashSet<Long>();
171 
172         for (int i = 0; i < userIdsPerStage.length; i++) {
173             long[] userIds = userIdsPerStage[i];
174 
175             for (long userId : userIds) {
176                 if (assignedUserIds.contains(userId)) {
177                     throw new DuplicateReviewUserIdException();
178                 }
179                 else {
180                     assignedUserIds.add(userId);
181                 }
182             }
183         }
184 
185         for (int i = 0; i < userIdsPerStage.length; i++) {
186             Set<Long> userIds = SetUtil.fromArray(userIdsPerStage[i]);
187 
188             updateReviews(proposalId, assignedByUserId, i + 2, userIds);
189         }
190     }
191 
192     protected TasksReview updateReview(
193             long userId, long proposalId, int stage, boolean rejected)
194         throws PortalException, SystemException {
195 
196         TasksReview review = tasksReviewPersistence.findByU_P(
197             userId, proposalId);
198 
199         review.setModifiedDate(new Date());
200         review.setCompleted(true);
201         review.setRejected(rejected);
202 
203         tasksReviewPersistence.update(review, false);
204 
205         // Social
206 
207         JSONObject extraData = JSONFactoryUtil.createJSONObject();
208 
209         extraData.put("stage", review.getStage());
210         extraData.put("completed", review.getCompleted());
211         extraData.put("rejected", review.getRejected());
212 
213         socialActivityLocalService.addActivity(
214             userId, review.getGroupId(), TasksProposal.class.getName(),
215             proposalId, TasksActivityKeys.REVIEW_PROPOSAL, extraData.toString(),
216             review.getAssignedByUserId());
217 
218         return review;
219     }
220 
221     protected void updateReviews(
222             long proposalId, long assignedByUserId, int stage,
223             Set<Long> userIds)
224         throws PortalException, SystemException {
225 
226         Set<Long> reviewUserIds = new HashSet<Long>();
227 
228         List<TasksReview> reviews = tasksReviewPersistence.findByP_S(
229             proposalId, stage);
230 
231         for (TasksReview review : reviews) {
232             if (!userIds.contains(review.getUserId())) {
233                 deleteReview(review);
234             }
235             else {
236                 reviewUserIds.add(review.getUserId());
237             }
238         }
239 
240         for (long userId : userIds) {
241             if (!reviewUserIds.contains(userId)) {
242                 addReview(userId, proposalId, assignedByUserId, stage);
243             }
244         }
245     }
246 
247 }