· 5 years ago · Mar 11, 2020, 08:22 PM
1package controller;
2
3import java.io.*;
4import java.sql.ResultSet;
5import java.sql.SQLException;
6import java.sql.Statement;
7import java.time.DayOfWeek;
8import java.time.LocalDate;
9import java.time.LocalDateTime;
10import java.util.ArrayList;
11import java.util.List;
12import java.io.IOException;
13import javax.servlet.ServletException;
14import javax.servlet.annotation.WebServlet;
15import javax.servlet.http.HttpServlet;
16import javax.servlet.http.HttpSession;
17
18import baseblocksystem.servletBase;
19import database.ActivityReport;
20import database.ActivitySubType;
21import database.ActivityType;
22import database.DatabaseService;
23import database.TimeReport;
24import database.User;
25
26import javax.servlet.http.HttpServletRequest;
27import javax.servlet.http.HttpServletResponse;
28
29/**
30 * Servlet implementation class TimeReportController
31 *
32 * A xx page.
33 *
34 * Description of the class.
35 *
36 * @author Ferit B�lezek ( Enter name if you've messed around with this file ;)
37 * )
38 * @version 1.0
39 *
40 */
41
42// wtf is this i try to fix but it never work
43
44@WebServlet("/TimeReportPage")
45public class TimeReportController extends servletBase {
46
47 DatabaseService dbService;
48
49 public TimeReportController() {
50 super();
51 try {
52 this.dbService = new DatabaseService();
53 } catch (SQLException e) {
54 // TODO Auto-generated catch block
55 e.printStackTrace();
56 }
57 }
58
59
60
61 private void createActivityReport(int activityTypeId, int
62 activitySubTypeId, LocalDate date, int week, int minutes, int userId, int projectId ) throws SQLException {
63
64 TimeReport timereport = null;
65
66 if(dbService.hasTimeReport(week, date.getYear(), userId, projectId)) {// Does timereport this week exist?
67
68 List<TimeReport> allReports = dbService.getTimeReportsByUser(userId); //Find timereport for this week
69 for(TimeReport tr : allReports) {
70 if(tr.getWeek() == week) {
71 timereport = tr;
72 }
73 }
74 }
75 else {
76 timereport = dbService.createTimeReport(new TimeReport(0, 1/*ska bytas*/, 0, LocalDateTime.now(), date.getYear(), week, LocalDateTime.now(), false)); //TODO: ProjectuserID get samt signedAt (och signedBy?)
77 }
78
79
80 if(minutes > 1440) {
81 new Exception("För många minuter rapporterade under ett dygn");
82 }
83 else {
84 dbService.createActivityReport(new ActivityReport(0, activityTypeId, activitySubTypeId, timereport.getTimeReportId(), date, minutes));
85 }
86
87 }
88
89
90 @Override
91 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
92 try{
93
94 //TODO: Fixa vecka när man skapar rapport
95
96 //TODO: Datum picker när man skapar rapporter, finns HTML standard grej <input type= "date" >
97 //TRY/CATCH RUNT HELA
98
99 PrintWriter out = resp.getWriter();
100 setUserId(req,19); //USER ID 19 = PROJECTLEADER
101 this.setIsLoggedIn(req, true);
102 setProjectId(req, 1);
103
104 /* TimeReport tr = dbService.getTimeReportById(4);
105 tr.sign(1); FOR TESTING TO SIGN TIMEREPORT
106 dbService.updateTimeReport(tr);*/
107
108 User loggedInUser = dbService.getUserById(19); // SKA VARA SEN this.getLoggedInUser(req);
109
110 String activityType = req.getParameter("activity");
111 String subType = req.getParameter("subType");
112 String timeSpent = req.getParameter("timeSpent");
113 String timeReportSignId = req.getParameter("timeReportIdToSign");
114 String deleteActivityReportId = req.getParameter("deleteActivityReportId");
115 String timeReportUnsignId = req.getParameter("timeReportIdToUnsign");
116 String timeReportId = req.getParameter("timeReportId");
117 String addReportWeek = req.getParameter("addReportWeek");
118 String timeReportFinishedId = req.getParameter("timeReportFinishedId");
119 String deleteTimeReportId = req.getParameter("deleteTimeReportId");
120 String showAllUnsignedReports = req.getParameter("showAllUnsignedReports");
121
122 if(activityType != null && subType != null && timeSpent != null && addReportWeek != null && timeReportId != null) {
123
124 int activityTypeId = 0;
125 int activitySubTypeId = 0;
126
127 List<ActivityType> typeList = dbService.getActivityTypes(); //get activity typeID
128 for(ActivityType at : typeList) {
129
130 if(at.getType().equals(activityType))
131 {
132 activityTypeId = at.getActivityTypeId();
133 }
134 }
135
136 List<ActivitySubType> subTypeList = dbService.getActivitySubTypes(); //get activity subtypeID
137 for(ActivitySubType ast : subTypeList) {
138
139 if(ast.getSubType().equals(subType))
140 {
141 activitySubTypeId = ast.getActivitySubTypeId();
142 }
143 }
144
145
146
147 activitySubTypeId = 1; //TODO: Denna är konstig
148
149 createActivityReport( activityTypeId, activitySubTypeId, LocalDate.now(), Integer.parseInt(addReportWeek),
150 Integer.parseInt(timeSpent), this.getLoggedInUser(req).getUserId(), this.getProjectId(req) ); //TODO: LocalDate.now() ska bytas mot en datepicker som skickas med från activityreport meotden
151
152 TimeReport timereport = dbService.getTimeReportById(Integer.parseInt(timeReportId)); //get timereport
153 out.print(getActivityReports(timereport.getTimeReportId(), req)); //Returns to the view of all activityreports for that timereport
154
155 return;
156 }
157
158 if(addReportWeek != null && timeReportId != null && activityType == null && subType == null) {
159 out.print(activityReportForm(Integer.parseInt(addReportWeek), timeReportId));
160 return;
161 }
162
163 if(deleteActivityReportId != null && timeReportId != null) {
164
165 dbService.deleteActivityReport(Integer.parseInt(deleteActivityReportId));
166 out.print(getActivityReports(Integer.parseInt(timeReportId), req));
167
168 return;
169
170 }
171
172 if(showAllUnsignedReports != null) {
173
174 out.println(getUnsignedTimeReports(req));
175 return;
176 }
177
178 if(timeReportFinishedId != null) {
179
180 TimeReport timeReport = dbService.getTimeReportById(Integer.parseInt(timeReportFinishedId));
181 timeReport.setFinished(true);
182 dbService.updateTimeReport(timeReport);
183 out.println(getUserTimeReports(loggedInUser, req));
184 return;
185 }
186
187 if(deleteTimeReportId != null) {
188
189 dbService.deleteTimeReport(Integer.parseInt(deleteTimeReportId));
190 out.print(getUserTimeReports(loggedInUser, req));
191 return;
192 }
193
194 if(addReportWeek != null) {
195 out.print(activityReportForm(Integer.parseInt(addReportWeek), ""));
196 return;
197 }
198
199 if(timeReportId != null) {
200
201 out.print(getActivityReports(Integer.parseInt(timeReportId), req));
202 return;
203 }
204 //TODO: Visa egna tidsrapporter - Om url finns, om projektledare visa alla rapporter
205 //knapp -> ny sida för att visa alla users -> en knapp till varje user för att selecta deras rapporter
206
207 out.println(getUserTimeReports(loggedInUser, req)); //Standard case
208
209
210 }
211
212 catch (NumberFormatException e) {
213 e.printStackTrace();
214 } catch (Exception e) {
215 e.printStackTrace();
216 }
217
218
219 }
220
221 private String getActivityReports(int timeReportId, HttpServletRequest req) throws Exception {
222
223 TimeReport timeReport = dbService.getTimeReportById(timeReportId);
224 boolean isProjectLeader = isProjectLeader(req);
225 boolean reportIsSigned = timeReport.isSigned();
226 boolean reportIsFinished = timeReport.isFinished();
227
228 String html = "<table width=\"600\" border=\"2\">\r\n" + "<tr>\r\n" + "<td> Datum </td>\r\n"
229 + "<td> Aktivitetstyp </td>\r\n" + "<td> Subtyp </td>\r\n" + "<td> Minuter </td>\r\n"
230 + "<td> Ta bort aktivitetsrapport </td>\r\n";
231
232 List<ActivityReport> activityReports = dbService.getActivityReports(timeReportId);
233 List<ActivityType> activityTypes = dbService.getActivityTypes();
234 List<ActivitySubType> activitySubTypes = dbService.getActivitySubTypes();
235
236 String activityType;
237 String activitySubType;
238
239 for (ActivityReport aReport : activityReports) {
240
241 activityType = getActivityType(aReport, activityTypes);
242 activitySubType = getActivitySubType(aReport, activitySubTypes);
243
244
245 html += "<tr>\r\n"
246 + "<td>" + aReport.getReportDate().toString() + "</td>\r\n"
247 + "<td>" + activityType + "</td>\r\n"
248 + "<td>" + activitySubType + "</td>\r\n"
249 + "<td>" + aReport.getMinutes() + "</td>\r\n";
250
251
252 if(!reportIsSigned) { //If timereport isn't signed, show button for deleting timeReport, else dont show it.
253 html += "<td> <form action=\"TimeReportPage?deleteActivityReportId=\""+aReport.getActivityReportId()+"&timeReportId=\"" + timeReportId + "\" method=\"get\">\r\n" +
254 " <input name=\"deleteActivityReportId\" type=\"hidden\" value=\""+aReport.getActivityReportId()+"\"></input>\r\n" +
255 " <input name=\"timeReportId\" type=\"hidden\" value=\""+timeReportId+"\"></input>\r\n" +
256 " <input type=\"submit\" value=\"Ta bort\"></input>\r\n" +
257 " </td> \r\n"
258 + "</form>";//Add activity report button ; //TODO: ska gå att tabort aktivitetsrapport om den inte är signerad
259
260 }
261
262
263 }
264
265 html += "</tr>\r\n" + "</table>"; //Ends the HTML table
266 if(isProjectLeader) { //If projectleader is looking at timereports, show sign/unsign buttons
267
268 if(reportIsSigned) {
269 html += "<td> <form method=\"get\"> <button name=\"timeReportIdToUnsign\" type=\"submit\" value=\"" + timeReport.getTimeReportId()
270 + "\"> Avsignera </button> </form> \r\n" ;
271 }
272
273 else if(!reportIsSigned && reportIsFinished) {
274 html += "<td> <form method=\"get\"> <button name=\"timeReportIdToSign\" type=\"submit\" value=\"" + timeReport.getTimeReportId()
275 + "\"> Signera </button> </form> \r\n";
276 }
277 }
278
279
280 if(timeReport.getProjectUserId() == this.getLoggedInUser(req).getUserId() && !timeReport.isFinished()) { //If timereport owner is the one logged in and looking at this screen AND timereport already exists and isnt marked as finished
281 html += "<form action=\"TimeReportPage?week=\""+timeReport.getWeek()+"&timeReportId=\"" + timeReportId + "\" method=\"get\">\r\n" +
282 " <input name=\"addReportWeek\" type=\"hidden\" value=\""+timeReport.getWeek()+"\"></input>\r\n" +
283 " <input name=\"timeReportId\" type=\"hidden\" value=\""+timeReportId+"\"></input>\r\n" +
284 " <input type=\"submit\" value=\"Lägg till ny aktivitet.\"></input>\r\n" +
285 " </form>";//Add activity report button
286
287 html += "<td> <form action = \"TimeReportPage?timeReportFinishedId=\""+timeReport.getTimeReportId()+"\" method=\"get\"> <button name=\"timeReportFinishedId\" type=\"submit\" value=\"" + timeReport.getTimeReportId()
288 + "\"> Markera tidrapport som färdig. </button> </form> \r\n"; //Mark activity report as finished
289 }
290
291
292
293
294 return html;
295 }
296
297
298
299 private String getActivityType(ActivityReport activityReport, List<ActivityType> typeList) throws Exception {
300
301 for(ActivityType aType: typeList) { //Get activity type for current activity report
302
303 if(aType.getActivityTypeId() == activityReport.getActivityTypeId()) {
304 return aType.getType();
305 }
306 }
307
308 throw new Exception("Kunde inte hitta aktivitetstyp");
309
310 }
311
312 private String getActivitySubType(ActivityReport activityReport, List<ActivitySubType> subTypeList) throws Exception{
313
314 for (ActivitySubType aSubType : subTypeList) { // Get activity type for current activity report
315
316 if (aSubType.getActivitySubTypeId() == activityReport.getActivitySubTypeId()) {
317
318 return aSubType.getSubType();
319 }
320 }
321 return ""; //TODO: Det mesta som har med subtypes verkar gå sönder --
322 //throw new Exception("Kunde inte hitta aktivitetssubtyp");
323 }
324
325
326 private String getUserTimeReports(User user, HttpServletRequest req) throws SQLException {
327
328 String html = "";
329
330 List<TimeReport> userTimeReports = dbService.getTimeReportsByUser(user.getUserId()); //TODO: Get all timereports for logged in user
331
332 if(userTimeReports.isEmpty()) {
333 html += "<body> Inga tidsrapporter finns för den valda användaren </body>";
334 }
335
336 else {
337
338 html = "<table width=\"400\" border=\"2\">\r\n"
339 + "<tr>\r\n"
340 + "<td> Week </td>\r\n"
341 + "<td> Timespent(minutes) </td>\r\n"
342 + "<td> Status </td>\r\n"
343 + "<td> Välj tidrapport </td>\r\n"
344 + "<td> Ta bort tidrapport </td>\r\n";
345
346 for (TimeReport tr : userTimeReports) {
347
348 int timeReportTotalTime = getTotalTimeReportTime(tr);
349 String signed;
350
351 if (tr.isSigned()) { // get isSigned or not
352 signed = "Signerad";
353 } else {
354 signed = "Ej signerad";
355 }
356
357 html += "<tr>\r\n" + "<td>" + tr.getWeek() + "</td>\r\n" + // set values into HTML
358 "<td>" + timeReportTotalTime + "</td>\r\n" + "<td>" + signed + "</td>\r\n"
359 + "<td> <form action=\"TimeReportPage?timeReportId="+tr.getTimeReportId()+"\" method=\"get\"> "
360 + "<button name=\"timeReportId\" type=\"submit\" value=\"" + tr.getTimeReportId()
361 + "\"> Välj </button> </form> </td> \r\n";
362
363 if(!tr.isSigned()) { //If timereport isn't signed, a button for deleting it should be visible
364 html += "<td> <form action=\"TimeReportPage?deleteTimeReportId="+tr.getTimeReportId()+"\" method=\"get\"> "
365 + "<button name=\"deleteTimeReportId\" type=\"submit\" value=\"" + tr.getTimeReportId() + "\"> Ta bort </button> </form> </td> \r\n";
366 }
367
368 html += "</tr>\r\n";
369
370 }
371 }
372 //END OF TABLE
373 html += "</tr>\r\n" + "</table>";
374
375 try {
376 if(user.getUserId() == this.getLoggedInUser(req).getUserId()) { // IF the logged in user is the one browsing this page, give the option to create a new timereport.
377 html += "<form action=\"TimeReportPage?addReportWeek\" metod=\"get\">\r\n" +
378 " <label for=\"week\">Week number:</label>\r\n" +
379 " <input type=\"text\" id=\"addReportWeek\" name=\"addReportWeek\" pattern= \"[0-9]+\" maxlength=\"2\" title=\"Skriv endast siffror\" ><br><br>\r\n" +
380 " <label for=\"lname\">Skapa tidrapport:</label>\r\n" +
381 " <input type=\"submit\" value=\"Skicka in\" >\r\n" +
382 "</form>";//Add activity report button
383 }
384
385 if(isProjectLeader(req)) {
386
387 html += "<form action=\"TimeReportPage?showAllUnsignedReports\" metod=\"get\">\r\n" +
388 " <input name=\"showAllUnsignedReports\" type=\"submit\" value=\"Visa alla osignerade tidrapporter\" >\r\n" +
389 "</form>";//Add activity report button
390 }
391 } catch (Exception e) {
392 // TODO Auto-generated catch block
393 e.printStackTrace();
394 }
395
396 return html;
397
398 }
399 /**
400 * Project leader retrives a table of all unsigned timereports.
401 * @return HTML Page
402 * @throws SQLException
403 */
404 private String getUnsignedTimeReports(HttpServletRequest req) throws SQLException {
405
406 String html= "";
407
408 try {
409 if(isProjectLeader(req)) {
410 new Exception("Endast en projekledare har tillgång till denna vyn");
411 }
412
413
414
415 List <TimeReport> allTimeReports = dbService.getTimeReportsByProject(this.getProjectId(req));
416 List <TimeReport> unsignedTimeReports = new ArrayList<TimeReport>();
417
418 for(TimeReport tr : allTimeReports) {
419
420 if(!tr.isSigned()) {
421 unsignedTimeReports.add(tr);
422 }
423 }
424
425 if(unsignedTimeReports.isEmpty()) {
426
427 html += "<body> Det finns inga osignerade tidrapporter i systemet!</body>";
428 }
429
430
431 html = "<table width=\"400\" border=\"2\">\r\n"
432 + "<tr>\r\n"
433 + "<td> Vecka </td>\r\n"
434 + "<td> Användarnamn </td>\r\n"
435 + "<td> Tid spenderad (minuter) </td>\r\n"
436 + "<td> Status </td>\r\n"
437 + "<td> Välj tidrapport </td>\r\n";
438
439 for (TimeReport tr : unsignedTimeReports) {
440
441 int timeReportTotalTime = getTotalTimeReportTime(tr);
442 String signed;
443
444 if (tr.isSigned()) { // get isSigned or not
445 signed = "Signerad";
446 } else {
447 signed = "Ej signerad";
448 }
449
450 User trOwner = dbService.getUserById(tr.getProjectUserId()); //denna är fel
451
452 html += "<tr>\r\n" + "<td>" + tr.getWeek() + "</td>\r\n" + // set values into HTML
453 "<td>" + trOwner.getUsername() + "</td>\r\n" +
454 "<td>" + timeReportTotalTime + "</td>\r\n"
455 + "<td>" + signed + "</td>\r\n" //Should be "Ej signerad" for all reports
456 + "<td> <form method=\"get\"> <button name=\"timeReportId\" type=\"submit\" value=\"" + tr.getTimeReportId() + "\"> Välj </button> </form> \r\n"
457 + "</td>\r\n" + "</tr>\r\n";
458
459 }
460
461 html += "</tr>\r\n" + "</table>"; // END HTML
462
463
464 } catch (Exception e) {
465 // TODO Auto-generated catch block
466 e.printStackTrace();
467 }
468
469 return html;
470 }
471
472 private int getTotalTimeReportTime(TimeReport tr) throws SQLException {
473
474 int totalTime = 0;
475
476 List<ActivityReport> activitiesInTimeReport = dbService.getActivityReports(tr.getTimeReportId());
477
478 for (ActivityReport ar : activitiesInTimeReport) { // calculate total time from all activity reports inside this
479 // timeReport
480 totalTime += ar.getMinutes();
481 }
482 return totalTime;
483 }
484
485 private String activityReportForm(int week, String timeReportId) {
486 return "<!--square.html-->\r\n" +
487 "<!DOCTYPE html>\r\n" +
488 "<html>\r\n"
489 + "<link rel=\"stylesheet\" type=\"text/css\" href=\"StyleSheets/SessionController.css\">"
490 + " <form id=\"filter_form\" onsubmit=\"checkInput()\">\r\n" + " Aktivitetstyp\r\n"
491 + " <div id=\"activity_picker\">\r\n"
492 + " <select id=\"act_picker\" name=\"activity\" form=\"filter_form\">\r\n"
493 + " <option value=\"SDP\">SDP</option>\r\n"
494 + " <option value=\"SRS\">SRS</option>\r\n"
495 + " <option value=\"SVVS\">SVVS</option>\r\n"
496 + " <option value=\"STLDD\">STLDD</option>\r\n"
497 + " <option value=\"SVVI\">SVVI</option>\r\n"
498 + " <option value=\"SDDD\">SDDD</option>\r\n"
499 + " <option value=\"SVVR\">SVVR</option>\r\n"
500 + " <option value=\"SSD\">SSD</option>\r\n"
501 + " <option value=\"Slutrapport\">Slutrapport</option>\r\n"
502 + " <option value=\"Funktionstest\">Funktionstest</option>\r\n"
503 + " <option value=\"Systemtest\">Systemtest</option>\r\n"
504 + " <option value=\"Regressionstest\">Regressionstest</option>\r\n"
505 + " <option value=\"Mote\">Möte</option>\r\n"
506 + " <option value=\"Foreläsning\">Föreläsning</option>\r\n"
507 + " <option value=\"Ovning\">Övning</option>\r\n"
508 + " <option value=\"Terminalovning\">Terminalövning</option>\r\n"
509 + " <option value=\"Sjalvstudier\">Självstudier</option>\r\n"
510 + " <option value=\"Ovrigt\">Övrigt</option>\r\n"
511 + " </select>\r\n" + " </div>\r\n" + " </div>\r\n"
512 + " <div>\r\n" + " <p class=\"descriptors\">Aktivitet subtyp</p>\r\n"
513 + " <div id=\"activity_picker\">\r\n"
514 + " <select id=\"act_picker\" name=\"subType\" form=\"filter_form\">\r\n"
515 + " <option value=\"\"></option>\r\n"
516 + " <option value=\"Utveckling\">Utveckling</option>\r\n"
517 + " <option value=\"Omarbete\">Omarbete</option>\r\n"
518 + " <option value=\"Informellgranskning\">Informellgranskning</option>\r\n"
519 + " <option value=\"Formellgranskning\">Formellgranskning</option>\r\n"
520 + " </select>\r\n" + " </div>\r\n" + " </div>\r\n"
521 + " <p class=\"descriptors\">Tid spenderad (i minuter) </p>\r\n"
522 + " <div id=\"activity_picker\">\r\n" + " </div>"
523 + " <input class=\"credentials_rect\" type=\"text\" id=\"timeSpent\" name=\"timeSpent\" pattern=\"^[0-9]*$\" title=\"Please enter numbers only.\" maxlength=\"4\" placeholder=\"Tid Spenderad\" required><br>\r\n"
524 + " <input name=\"addReportWeek\" type=\"hidden\" value=\""+ week + "\"></input>\r\n"
525 + " <input name=\"timeReportId\" type=\"hidden\" value=\""+ timeReportId + "\"></input>\r\n"
526 + " <input class=\"submitBtn\" type=\"submit\" value=\"Skicka in\">\r\n"
527 + " </div>\r\n"
528 + " </form>"
529 + " </html>";
530
531 // html += activitysubtype.getId...
532 }
533
534 private boolean isProjectLeader(HttpServletRequest req) throws Exception {
535 return this.isProjectLeader(req, this.getProjectId(req));
536 }
537
538}