@@ -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.
@@ -4043,13 +4059,18 @@ else if (isDevContest) {
40434059 if (useExistingAsset && assetDTO .getForum () != null ) {
40444060 forumId = assetDTO .getForum ().getJiveCategoryId ();
40454061 } else {
4046- if (!isStudio (contest )) {
4047- // software contest
4048- forumId = createForum (tcSubject , assetDTO , tcSubject .getUserId (),
4049- contest .getProjectHeader ().getProjectCategory ().getId ());
4062+ if (isPrivateProject (contest )) { // no forum to be created for private tasks
4063+ logger .debug ("Skip forum creation for private task: " +assetDTO .getName ());
4064+ forumId = -1 ;
40504065 } else {
4051- // studio contest
4052- forumId = createStudioForum (assetDTO .getName (), tcSubject .getUserId ());
4066+ if (!isStudio (contest )) {
4067+ // software contest
4068+ forumId = createForum (tcSubject , assetDTO , tcSubject .getUserId (),
4069+ contest .getProjectHeader ().getProjectCategory ().getId ());
4070+ } else {
4071+ // studio contest
4072+ forumId = createStudioForum (assetDTO .getName (), tcSubject .getUserId ());
4073+ }
40534074 }
40544075 }
40554076 }
@@ -5516,8 +5537,9 @@ public Set<Long> updatePreRegister(TCSubject tcSubject, SoftwareCompetition cont
55165537
55175538 removedUsers = uploadExternalServices .removeSubmitters (contest .getId (), removedUsers ,
55185539 String .valueOf (tcSubject .getUserId ()));
5519- // remove forum
5520- if (createForum ) {
5540+ // remove forum user permissions for public projects.
5541+ // private tasks do not have forums created
5542+ if (createForum && !isPrivateProject (contest )) {
55215543 try {
55225544 forumId = contest .getAssetDTO ().getForum ().getJiveCategoryId ();
55235545 forum = getSoftwareForums ();
@@ -5536,7 +5558,7 @@ public Set<Long> updatePreRegister(TCSubject tcSubject, SoftwareCompetition cont
55365558 for (Long member : preRegisterMembers ) {
55375559 try {
55385560 this .addSubmitter (tcSubject , contest .getId (), member );
5539- if (createForum ) {
5561+ if (createForum && ! isPrivateProject ( contest ) ) {
55405562 forum .assignRole (member , userRoleId );
55415563 }
55425564 addedUsers .add (member );
@@ -9862,25 +9884,30 @@ public void closeSoftwareContest(TCSubject tcSubject, long projectId, long winne
98629884 DataHandler dataHandler = new DataHandler (new FileDataSource (mockSubmissionFilePath + mockSubmissionFileName ));
98639885 long submissionId = uploadSubmission (winnerId , contest .getId (), mockSubmissionFileName , dataHandler );
98649886
9865- // close submission and review phase
9887+ Date currentDate = new Date ();
9888+ // subtract one minute from the current date
9889+ // this will be used to set the registration start/end dates
9890+ Date oneMinuteEarlier = addMinutesToDate (currentDate , -1 );
9891+
9892+ // close registration, submission and review phases
98669893 com .topcoder .project .phases .Phase submissionPhase = null ;
98679894 com .topcoder .project .phases .Phase reviewPhase = null ;
98689895 for (com .topcoder .project .phases .Phase phase : phases ) {
98699896 if (PROJECT_SUBMISSION_PHASE_NAME .equals (phase .getPhaseType ().getName ())) {
98709897 if (phaseNeedToUpdate && !phaseHasClosed ) {
98719898 // submission is scheduled
9872- phase .setActualStartDate (new Date () );
9873- phase .setActualEndDate (new Date () );
9899+ phase .setActualStartDate (currentDate );
9900+ phase .setActualEndDate (currentDate );
98749901 } else if (!phaseNeedToUpdate ) {
98759902 // phase already open
9876- phase .setActualEndDate (new Date () );
9903+ phase .setActualEndDate (currentDate );
98779904 }
98789905 phase .setPhaseStatus (PhaseStatus .CLOSED );
98799906 submissionPhase = phase ;
98809907 } else if (PROJECT_REVIEW_PHASE_NAME .equals (phase .getPhaseType ().getName ())
98819908 || PROJECT_ITERATIVE_REVIEW_PHASE_NAME .equals (phase .getPhaseType ().getName ())) {
98829909 if (phase .getPhaseStatus ().getId () == PhaseStatus .SCHEDULED .getId ()) {
9883- phase .setActualStartDate (new Date () );
9910+ phase .setActualStartDate (currentDate );
98849911 phase .setScheduledEndDate (null );
98859912 phase .setScheduledStartDate (phase .calcStartDate ());
98869913 phase .setScheduledEndDate (phase .calcEndDate ());
@@ -9890,6 +9917,21 @@ public void closeSoftwareContest(TCSubject tcSubject, long projectId, long winne
98909917 // skiping closed iterative review
98919918 reviewPhase = phase ;
98929919 }
9920+ } else if (PROJECT_REGISTRATION_PHASE_NAME .equals (phase .getPhaseType ().getName ())) {
9921+ if (phase .getActualStartDate () != null ) {
9922+ // The registration phase is already started, we only need to set the end date if not set already
9923+ // The actual end date is set to one minute earlier than the submission phase
9924+ // This will ensure that the phases are shown in the correct order in Online Review
9925+ if (phase .getActualEndDate () == null ) {
9926+ phase .setActualEndDate (oneMinuteEarlier );
9927+ }
9928+ } else {
9929+ // The registration phase is not opened yet (start date is in the future)
9930+ phase .setActualStartDate (oneMinuteEarlier );
9931+ phase .setActualEndDate (oneMinuteEarlier );
9932+ }
9933+ // Set the registration status to closed
9934+ phase .setPhaseStatus (PhaseStatus .CLOSED );
98939935 }
98949936 }
98959937 projectPhases .setPhases (new HashSet <com .topcoder .project .phases .Phase >(Arrays .asList (phases )));
0 commit comments