@@ -160,6 +160,125 @@ class ChallengePhaseHelper {
160
160
}
161
161
}
162
162
163
+ async populatePhasesForChallengeCreation ( phases , startDate , timelineTemplateId ) {
164
+ if ( _ . isUndefined ( timelineTemplateId ) ) {
165
+ throw new errors . BadRequestError ( `Invalid timeline template ID: ${ timelineTemplateId } ` ) ;
166
+ }
167
+ const { timelineTempate } = await this . getTemplateAndTemplateMap ( timelineTemplateId ) ;
168
+ const { phaseDefinitionMap } = await this . getPhaseDefinitionsAndMap ( ) ;
169
+ const finalPhases = _ . map ( timelineTempate , ( phaseFromTemplate ) => {
170
+ const phaseDefinition = phaseDefinitionMap . get ( phaseFromTemplate . phaseId ) ;
171
+ const phaseFromInput = _ . find ( phases , ( p ) => p . phaseId === phaseFromTemplate . phaseId ) ;
172
+ const phase = {
173
+ id : uuid ( ) ,
174
+ phaseId : phaseFromTemplate . phaseId ,
175
+ name : phaseDefinition . name ,
176
+ description : phaseDefinition . description ,
177
+ duration : _ . defaultTo ( _ . get ( phaseFromInput , "duration" ) , phaseFromTemplate . defaultDuration ) ,
178
+ isOpen : false ,
179
+ predecessor : phaseFromTemplate . predecessor ,
180
+ constraints : _ . defaultTo ( _ . get ( phaseFromInput , "constraints" ) , [ ] ) ,
181
+ scheduledStartDate : undefined ,
182
+ scheduledEndDate : undefined ,
183
+ actualStartDate : undefined ,
184
+ actualEndDate : undefined ,
185
+ } ;
186
+ if ( _ . isUndefined ( phase . predecessor ) ) {
187
+ if ( _ . isUndefined ( _ . get ( phaseFromInput , "scheduledStartDate" ) ) ) {
188
+ phase . scheduledStartDate = moment ( startDate ) . toDate ( ) ;
189
+ } else {
190
+ phase . scheduledStartDate = moment ( _ . get ( phaseFromInput , "scheduledStartDate" ) ) . toDate ( ) ;
191
+ }
192
+ phase . scheduledEndDate = moment ( phase . scheduledStartDate )
193
+ . add ( phase . duration , "seconds" )
194
+ . toDate ( ) ;
195
+ }
196
+ return phase ;
197
+ } ) ;
198
+ for ( let phase of finalPhases ) {
199
+ if ( _ . isUndefined ( phase . predecessor ) ) {
200
+ continue ;
201
+ }
202
+ const precedecessorPhase = _ . find ( finalPhases , {
203
+ phaseId : phase . predecessor ,
204
+ } ) ;
205
+ if ( phase . name === "Iterative Review Phase" ) {
206
+ phase . scheduledStartDate = precedecessorPhase . scheduledStartDate ;
207
+ } else {
208
+ phase . scheduledStartDate = precedecessorPhase . scheduledEndDate ;
209
+ }
210
+ phase . scheduledEndDate = moment ( phase . scheduledStartDate )
211
+ . add ( phase . duration , "seconds" )
212
+ . toDate ( ) ;
213
+ }
214
+ return finalPhases ;
215
+ }
216
+
217
+ async populatePhasesForChallengeUpdate ( challengePhases , newPhases , isBeingActivated ) {
218
+ const { timelineTempate, timelineTemplateMap } = await this . getTemplateAndTemplateMap (
219
+ timelineTemplateId
220
+ ) ;
221
+ const { phaseDefinitionMap } = await this . getPhaseDefinitionsAndMap ( ) ;
222
+
223
+ const updatedPhases = _ . map ( challengePhases , ( phase ) => {
224
+ const phaseFromTemplate = timelineTemplateMap . get ( phase . phaseId ) ;
225
+ const phaseDefinition = phaseDefinitionMap . get ( phase . phaseId ) ;
226
+ const updatedPhase = {
227
+ ...phase ,
228
+ predecessor : phaseFromTemplate . predecessor ,
229
+ description : phaseDefinition . description ,
230
+ } ;
231
+ if ( ! _ . isUndefined ( phase . actualEndDate ) ) {
232
+ return updatedPhase ;
233
+ }
234
+ if ( phase . name === "Iterative Review Phase" ) {
235
+ return updatedPhase ;
236
+ }
237
+ const newPhase = _ . find ( newPhases , ( p ) => p . phaseId === phase . phaseId ) ;
238
+ if ( _ . isUndefined ( newPhase ) && ! isBeingActivated ) {
239
+ return updatedPhase ;
240
+ }
241
+ phase . duration = _ . defaultTo ( _ . get ( newPhase , "duration" ) , phase . duration ) ;
242
+ if ( _ . isUndefined ( phase . predecessor ) ) {
243
+ if (
244
+ isBeingActivated &&
245
+ moment (
246
+ _ . defaultTo ( _ . get ( newPhase , "scheduledStartDate" ) , phase . scheduledStartDate )
247
+ ) . isSameOrBefore ( moment ( ) )
248
+ ) {
249
+ phase . isOpen = true ;
250
+ phase . scheduledStartDate = moment ( ) . toDate ( ) ;
251
+ phase . actualStartDate = phase . scheduledStartDate ;
252
+ } else if ( phase . isOpen === false && ! _ . isUndefined ( newPhase . scheduledStartDate ) ) {
253
+ phase . scheduledStartDate = moment ( newPhase . scheduledStartDate ) . toDate ( ) ;
254
+ }
255
+ phase . scheduledEndDate = moment ( phase . scheduledStartDate )
256
+ . add ( phase . duration , "seconds" )
257
+ . toDate ( ) ;
258
+ }
259
+ if ( ! _ . isUndefined ( newPhase ) && ! _ . isUndefined ( newPhase . constraints ) ) {
260
+ phase . constraints = newPhase . constraints ;
261
+ }
262
+ return updatedPhase ;
263
+ } ) ;
264
+ for ( let phase of updatedPhases ) {
265
+ if ( _ . isUndefined ( phase . predecessor ) ) {
266
+ continue ;
267
+ }
268
+ if ( phase . name === "Iterative Review Phase" ) {
269
+ continue ;
270
+ }
271
+ const precedecessorPhase = _ . find ( updatedPhases , {
272
+ phaseId : phase . predecessor ,
273
+ } ) ;
274
+ phase . scheduledStartDate = precedecessorPhase . scheduledEndDate ;
275
+ phase . scheduledEndDate = moment ( phase . scheduledStartDate )
276
+ . add ( phase . duration , "seconds" )
277
+ . toDate ( ) ;
278
+ }
279
+ return updatedPhases ;
280
+ }
281
+
163
282
async validatePhases ( phases ) {
164
283
if ( ! phases || phases . length === 0 ) {
165
284
return ;
0 commit comments