@@ -2354,6 +2354,22 @@ private XMLGregorianCalendar getXMLGregorianCalendar(Date date) {
23542354 }
23552355 }
23562356
2357+ /**
2358+ * <p>
2359+ * Adds the specified number of minutes to the given date and returns the result.
2360+ * </p>
2361+ *
2362+ * @param date The Date to which to add the given minutes amount
2363+ * @param minutes The number of minutes to add to the given date (Can be negative)
2364+ * @return The resulting date = input date + number of minutes
2365+ */
2366+ private Date addMinutesToDate (Date date , int minutes ) {
2367+ Calendar cal = Calendar .getInstance ();
2368+ cal .setTime (date );
2369+ cal .add (Calendar .MINUTE , minutes );
2370+ return cal .getTime ();
2371+ }
2372+
23572373 /**
23582374 * <p>
23592375 * Processes the contest sale.
@@ -9862,25 +9878,30 @@ public void closeSoftwareContest(TCSubject tcSubject, long projectId, long winne
98629878 DataHandler dataHandler = new DataHandler (new FileDataSource (mockSubmissionFilePath + mockSubmissionFileName ));
98639879 long submissionId = uploadSubmission (winnerId , contest .getId (), mockSubmissionFileName , dataHandler );
98649880
9865- // close submission and review phase
9881+ Date currentDate = new Date ();
9882+ // subtract one minute from the current date
9883+ // this will be used to set the registration start/end dates
9884+ Date oneMinuteEarlier = addMinutesToDate (currentDate , -1 );
9885+
9886+ // close registration, submission and review phases
98669887 com .topcoder .project .phases .Phase submissionPhase = null ;
98679888 com .topcoder .project .phases .Phase reviewPhase = null ;
98689889 for (com .topcoder .project .phases .Phase phase : phases ) {
98699890 if (PROJECT_SUBMISSION_PHASE_NAME .equals (phase .getPhaseType ().getName ())) {
98709891 if (phaseNeedToUpdate && !phaseHasClosed ) {
98719892 // submission is scheduled
9872- phase .setActualStartDate (new Date () );
9873- phase .setActualEndDate (new Date () );
9893+ phase .setActualStartDate (currentDate );
9894+ phase .setActualEndDate (currentDate );
98749895 } else if (!phaseNeedToUpdate ) {
98759896 // phase already open
9876- phase .setActualEndDate (new Date () );
9897+ phase .setActualEndDate (currentDate );
98779898 }
98789899 phase .setPhaseStatus (PhaseStatus .CLOSED );
98799900 submissionPhase = phase ;
98809901 } else if (PROJECT_REVIEW_PHASE_NAME .equals (phase .getPhaseType ().getName ())
98819902 || PROJECT_ITERATIVE_REVIEW_PHASE_NAME .equals (phase .getPhaseType ().getName ())) {
98829903 if (phase .getPhaseStatus ().getId () == PhaseStatus .SCHEDULED .getId ()) {
9883- phase .setActualStartDate (new Date () );
9904+ phase .setActualStartDate (currentDate );
98849905 phase .setScheduledEndDate (null );
98859906 phase .setScheduledStartDate (phase .calcStartDate ());
98869907 phase .setScheduledEndDate (phase .calcEndDate ());
@@ -9890,6 +9911,21 @@ public void closeSoftwareContest(TCSubject tcSubject, long projectId, long winne
98909911 // skiping closed iterative review
98919912 reviewPhase = phase ;
98929913 }
9914+ } else if (PROJECT_REGISTRATION_PHASE_NAME .equals (phase .getPhaseType ().getName ())) {
9915+ if (phase .getActualStartDate () != null ) {
9916+ // The registration phase is already started, we only need to set the end date if not set already
9917+ // The actual end date is set to one minute earlier than the submission phase
9918+ // This will ensure that the phases are shown in the correct order in Online Review
9919+ if (phase .getActualEndDate () == null ) {
9920+ phase .setActualEndDate (oneMinuteEarlier );
9921+ }
9922+ } else {
9923+ // The registration phase is not opened yet (start date is in the future)
9924+ phase .setActualStartDate (oneMinuteEarlier );
9925+ phase .setActualEndDate (oneMinuteEarlier );
9926+ }
9927+ // Set the registration status to closed
9928+ phase .setPhaseStatus (PhaseStatus .CLOSED );
98939929 }
98949930 }
98959931 projectPhases .setPhases (new HashSet <com .topcoder .project .phases .Phase >(Arrays .asList (phases )));
0 commit comments