@@ -104,43 +104,53 @@ async function syncChallengePhases (legacyId, v5Phases, createdBy, isSelfService
104
104
const phasesFromIFx = await timelineService . getChallengePhases ( legacyId )
105
105
logger . debug ( `Phases from v5: ${ JSON . stringify ( v5Phases ) } ` )
106
106
logger . debug ( `Phases from IFX: ${ JSON . stringify ( phasesFromIFx ) } ` )
107
- for ( const phase of phasesFromIFx ) {
108
- const phaseName = _ . get ( _ . find ( phaseTypes , pt => pt . phase_type_id === phase . phase_type_id ) , 'name' )
109
- const v5Equivalent = _ . find ( v5Phases , p => p . name === phaseName )
110
- logger . info ( `v4 Phase: ${ JSON . stringify ( phase ) } , v5 Equiv: ${ JSON . stringify ( v5Equivalent ) } ` )
111
- if ( v5Equivalent ) {
112
- // Compare duration and status
113
- // if (v5Equivalent.duration * 1000 !== phase.duration * 1 || isSelfService) {
114
- // ||
115
- // (v5Equivalent.isOpen && _.toInteger(phase.phase_status_id) === constants.PhaseStatusTypes.Closed) ||
116
- // (!v5Equivalent.isOpen && _.toInteger(phase.phase_status_id) === constants.PhaseStatusTypes.Open)) {
117
- // const newStatus = v5Equivalent.isOpen
118
- // ? constants.PhaseStatusTypes.Open
119
- // : (new Date().getTime() <= new Date(v5Equivalent.scheduledEndDate).getTime() ? constants.PhaseStatusTypes.Scheduled : constants.PhaseStatusTypes.Closed)
120
- // update phase
121
- logger . debug ( `Will update phase ${ phaseName } /${ v5Equivalent . name } from ${ phase . duration } to duration ${ v5Equivalent . duration * 1000 } milli` )
122
- const newStatus = v5Equivalent . isOpen
123
- ? constants . PhaseStatusTypes . Open
124
- : ( new Date ( ) . getTime ( ) <= new Date ( v5Equivalent . scheduledEndDate ) . getTime ( ) ? constants . PhaseStatusTypes . Scheduled : constants . PhaseStatusTypes . Closed )
125
- await timelineService . updatePhase (
126
- phase . project_phase_id ,
127
- legacyId ,
128
- phase . fixed_start_time ? v5Equivalent . scheduledStartDate : null ,
129
- v5Equivalent . scheduledStartDate ,
130
- v5Equivalent . scheduledEndDate ,
131
- v5Equivalent . duration * 1000 ,
132
- newStatus
133
- )
134
- // newStatus)
135
- // } else {
136
- // logger.info(`Durations for ${phaseName} match: ${v5Equivalent.duration * 1000} === ${phase.duration}`)
137
- // }
138
- } else {
139
- logger . info ( `No v5 Equivalent Found for ${ phaseName } ` )
107
+ let phaseGroups = { }
108
+ _ . forEach ( phasesFromIFx , p => {
109
+ if ( ! phaseGroups [ p . phase_type_id ] ) {
110
+ phaseGroups [ p . phase_type_id ] = [ ]
140
111
}
141
- if ( isSelfService && phaseName === 'Review' ) {
142
- // make sure to set the required reviewers to 2
143
- await createOrSetNumberOfReviewers ( _ . toString ( phase . project_phase_id ) , _ . toString ( numOfReviewers ) , _ . toString ( createdBy ) )
112
+ phaseGroups [ p . phase_type_id ] . push ( p )
113
+ } )
114
+ _ . forEach ( _ . cloneDeep ( phaseGroups ) , ( pg , pt ) => {
115
+ phaseGroups [ pt ] = _ . sortBy ( pg , 'scheduled_start_time' )
116
+ } )
117
+
118
+ for ( const key of _ . keys ( phaseGroups ) ) {
119
+ let phaseOrder = 0
120
+ let v5Equivalents = undefined
121
+ for ( const phase of phaseGroups [ key ] ) {
122
+ const phaseName = _ . get ( _ . find ( phaseTypes , pt => pt . phase_type_id === phase . phase_type_id ) , 'name' )
123
+ if ( _ . isUndefined ( v5Equivalents ) ) {
124
+ v5Equivalents = _ . sortBy ( _ . filter ( v5Phases , p => p . name === phaseName ) , 'scheduledStartDate' )
125
+ }
126
+ if ( v5Equivalents . length > 0 ) {
127
+ if ( v5Equivalents . length === phaseGroups [ key ] . length ) {
128
+ const v5Equivalent = v5Equivalents [ phaseOrder ]
129
+ logger . debug ( `Will update phase ${ phaseName } /${ v5Equivalent . name } from ${ phase . duration } to duration ${ v5Equivalent . duration * 1000 } milli` )
130
+ let newStatus = _ . toInteger ( phase . phase_status_id )
131
+ if ( v5Equivalent . isOpen && _ . toInteger ( phase . phase_status_id ) === constants . PhaseStatusTypes . Closed ) {
132
+ newStatus = constants . PhaseStatusTypes . Scheduled
133
+ }
134
+ await timelineService . updatePhase (
135
+ phase . project_phase_id ,
136
+ legacyId ,
137
+ phase . fixed_start_time ? v5Equivalent . scheduledStartDate : null ,
138
+ v5Equivalent . scheduledStartDate ,
139
+ v5Equivalent . scheduledEndDate ,
140
+ v5Equivalent . duration * 1000 ,
141
+ newStatus
142
+ )
143
+ } else {
144
+ logger . info ( `number of ${ phaseName } does not match` )
145
+ }
146
+ } else {
147
+ logger . info ( `No v5 Equivalent Found for ${ phaseName } ` )
148
+ }
149
+ if ( isSelfService && phaseName === 'Review' ) {
150
+ // make sure to set the required reviewers to 2
151
+ await createOrSetNumberOfReviewers ( _ . toString ( phase . project_phase_id ) , _ . toString ( numOfReviewers ) , _ . toString ( createdBy ) )
152
+ }
153
+ phaseOrder = phaseOrder + 1
144
154
}
145
155
}
146
156
// TODO: What about iterative reviews? There can be many for the same challenge.
0 commit comments