From 144e84fb98c4d71b06502266024b20893a16440d Mon Sep 17 00:00:00 2001 From: eisbilir Date: Thu, 1 Dec 2022 19:27:32 +0300 Subject: [PATCH 1/3] handle multiple phases with same name --- src/services/ProcessorService.js | 79 ++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 35 deletions(-) diff --git a/src/services/ProcessorService.js b/src/services/ProcessorService.js index 271a9a3..fd1563c 100644 --- a/src/services/ProcessorService.js +++ b/src/services/ProcessorService.js @@ -104,42 +104,51 @@ async function syncChallengePhases (legacyId, v5Phases, createdBy, isSelfService const phasesFromIFx = await timelineService.getChallengePhases(legacyId) logger.debug(`Phases from v5: ${JSON.stringify(v5Phases)}`) logger.debug(`Phases from IFX: ${JSON.stringify(phasesFromIFx)}`) - for (const phase of phasesFromIFx) { - const phaseName = _.get(_.find(phaseTypes, pt => pt.phase_type_id === phase.phase_type_id), 'name') - const v5Equivalent = _.find(v5Phases, p => p.name === phaseName) - logger.info(`v4 Phase: ${JSON.stringify(phase)}, v5 Equiv: ${JSON.stringify(v5Equivalent)}`) - if (v5Equivalent) { - // Compare duration and status - // if (v5Equivalent.duration * 1000 !== phase.duration * 1 || isSelfService) { - // || - // (v5Equivalent.isOpen && _.toInteger(phase.phase_status_id) === constants.PhaseStatusTypes.Closed) || - // (!v5Equivalent.isOpen && _.toInteger(phase.phase_status_id) === constants.PhaseStatusTypes.Open)) { - // const newStatus = v5Equivalent.isOpen - // ? constants.PhaseStatusTypes.Open - // : (new Date().getTime() <= new Date(v5Equivalent.scheduledEndDate).getTime() ? constants.PhaseStatusTypes.Scheduled : constants.PhaseStatusTypes.Closed) - // update phase - logger.debug(`Will update phase ${phaseName}/${v5Equivalent.name} from ${phase.duration} to duration ${v5Equivalent.duration * 1000} milli`) - const newStatus = v5Equivalent.isOpen - ? constants.PhaseStatusTypes.Open - : (new Date().getTime() <= new Date(v5Equivalent.scheduledEndDate).getTime() ? constants.PhaseStatusTypes.Scheduled : constants.PhaseStatusTypes.Closed) - await timelineService.updatePhase( - phase.project_phase_id, - legacyId, - v5Equivalent.scheduledStartDate, - v5Equivalent.scheduledEndDate, - v5Equivalent.duration * 1000, - newStatus - ) - // newStatus) - // } else { - // logger.info(`Durations for ${phaseName} match: ${v5Equivalent.duration * 1000} === ${phase.duration}`) - // } - } else { - logger.info(`No v5 Equivalent Found for ${phaseName}`) + let phaseGroups = {} + _.forEach(phasesFromIFx, p => { + if (!phaseGroups[p.phase_type_id]) { + phaseGroups[p.phase_type_id] = [] } - if (isSelfService && phaseName === 'Review') { - // make sure to set the required reviewers to 2 - await createOrSetNumberOfReviewers(_.toString(phase.project_phase_id), _.toString(numOfReviewers), _.toString(createdBy)) + phaseGroups[p.phase_type_id].push(p) + }) + _.forEach(_.cloneDeep(phaseGroups), (pg, pt) => { + phaseGroups[pt] = _.sortBy(pg, 'scheduled_start_time') + }) + + for (const key of _.keys(phaseGroups)) { + let phaseOrder = 0 + let v5Equivalents = undefined + for (const phase of phaseGroups[key]) { + const phaseName = _.get(_.find(phaseTypes, pt => pt.phase_type_id === phase.phase_type_id), 'name') + if (_.isUndefined(v5Equivalents)) { + v5Equivalents = _.sortBy(_.filter(v5Phases, p => p.name === phaseName), 'scheduledStartDate') + } + if (v5Equivalents.length > 0) { + if (v5Equivalents.length === phaseGroups[key].length) { + const v5Equivalent = v5Equivalents[phaseOrder] + logger.debug(`Will update phase ${phaseName}/${v5Equivalent.name} from ${phase.duration} to duration ${v5Equivalent.duration * 1000} milli`) + const newStatus = v5Equivalent.isOpen + ? constants.PhaseStatusTypes.Open + : (new Date().getTime() <= new Date(v5Equivalent.scheduledEndDate).getTime() ? constants.PhaseStatusTypes.Scheduled : constants.PhaseStatusTypes.Closed) + await timelineService.updatePhase( + phase.project_phase_id, + legacyId, + v5Equivalent.scheduledStartDate, + v5Equivalent.scheduledEndDate, + v5Equivalent.duration * 1000, + newStatus + ) + } else { + logger.info(`number of ${phaseName} does not match`) + } + } else { + logger.info(`No v5 Equivalent Found for ${phaseName}`) + } + if (isSelfService && phaseName === 'Review') { + // make sure to set the required reviewers to 2 + await createOrSetNumberOfReviewers(_.toString(phase.project_phase_id), _.toString(numOfReviewers), _.toString(createdBy)) + } + phaseOrder = phaseOrder + 1 } } // TODO: What about iterative reviews? There can be many for the same challenge. From 2a0e5ee06fefc5c956d4084b9613cff07ddba263 Mon Sep 17 00:00:00 2001 From: eisbilir Date: Thu, 1 Dec 2022 19:28:22 +0300 Subject: [PATCH 2/3] fix phase status flip --- src/services/ProcessorService.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/ProcessorService.js b/src/services/ProcessorService.js index fd1563c..081feec 100644 --- a/src/services/ProcessorService.js +++ b/src/services/ProcessorService.js @@ -129,7 +129,7 @@ async function syncChallengePhases (legacyId, v5Phases, createdBy, isSelfService logger.debug(`Will update phase ${phaseName}/${v5Equivalent.name} from ${phase.duration} to duration ${v5Equivalent.duration * 1000} milli`) const newStatus = v5Equivalent.isOpen ? constants.PhaseStatusTypes.Open - : (new Date().getTime() <= new Date(v5Equivalent.scheduledEndDate).getTime() ? constants.PhaseStatusTypes.Scheduled : constants.PhaseStatusTypes.Closed) + : _.toInteger(phase.phase_status_id) await timelineService.updatePhase( phase.project_phase_id, legacyId, From 925fcedecea689211d49745572df3c07d015154c Mon Sep 17 00:00:00 2001 From: eisbilir Date: Thu, 1 Dec 2022 19:39:42 +0300 Subject: [PATCH 3/3] update new phase status --- src/services/ProcessorService.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/services/ProcessorService.js b/src/services/ProcessorService.js index 081feec..d7ba9be 100644 --- a/src/services/ProcessorService.js +++ b/src/services/ProcessorService.js @@ -127,6 +127,10 @@ async function syncChallengePhases (legacyId, v5Phases, createdBy, isSelfService if (v5Equivalents.length === phaseGroups[key].length) { const v5Equivalent = v5Equivalents[phaseOrder] logger.debug(`Will update phase ${phaseName}/${v5Equivalent.name} from ${phase.duration} to duration ${v5Equivalent.duration * 1000} milli`) + let newStatus = _.toInteger(phase.phase_status_id) + if (v5Equivalent.isOpen && _.toInteger(phase.phase_status_id) === constants.PhaseStatusTypes.Closed) { + newStatus = constants.PhaseStatusTypes.Scheduled + } const newStatus = v5Equivalent.isOpen ? constants.PhaseStatusTypes.Open : _.toInteger(phase.phase_status_id)