Skip to content

Commit 69a166c

Browse files
author
Vikas Agarwal
committed
Marking next milestone as active when a milestone is marked as complete
Also, makes one thing, from status and completionDate, optional to mark a milestone complete
1 parent afee68e commit 69a166c

File tree

1 file changed

+31
-5
lines changed

1 file changed

+31
-5
lines changed

src/routes/milestones/update.js

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,20 @@ import Sequelize from 'sequelize';
99
import { middleware as tcMiddleware } from 'tc-core-library-js';
1010
import util from '../../util';
1111
import validateTimeline from '../../middlewares/validateTimeline';
12-
import { EVENT } from '../../constants';
12+
import { EVENT, MILESTONE_STATUS } from '../../constants';
1313
import models from '../../models';
1414

1515
const permissions = tcMiddleware.permissions;
1616

1717
/**
1818
* Cascades endDate/completionDate changes to all milestones with a greater order than the given one.
19+
* @param {Object} originalMilestone the original milestone that was updated
1920
* @param {Object} updatedMilestone the milestone that was updated
2021
* @returns {Promise<void>} a promise that resolves to the last found milestone. If no milestone exists with an
2122
* order greater than the passed <b>updatedMilestone</b>, the promise will resolve to the passed
2223
* <b>updatedMilestone</b>
2324
*/
24-
function updateComingMilestones(updatedMilestone) {
25+
function updateComingMilestones(originalMilestone, updatedMilestone) {
2526
return models.Milestone.findAll({
2627
where: {
2728
timelineId: updatedMilestone.timelineId,
@@ -32,7 +33,7 @@ function updateComingMilestones(updatedMilestone) {
3233
let startDate = moment.utc(updatedMilestone.completionDate
3334
? updatedMilestone.completionDate
3435
: updatedMilestone.endDate).add(1, 'days').toDate();
35-
const promises = _.map(comingMilestones, (_milestone) => {
36+
const promises = _.map(comingMilestones, (_milestone, idx) => {
3637
const milestone = _milestone;
3738

3839
// Update the milestone startDate if different than the iterated startDate
@@ -48,6 +49,12 @@ function updateComingMilestones(updatedMilestone) {
4849
milestone.updatedBy = updatedMilestone.updatedBy;
4950
}
5051

52+
// if completionDate is alerted, update status of the next milestone to the current one
53+
if (!_.isEqual(originalMilestone.completionDate, updatedMilestone.completionDate) && idx === 0) {
54+
// activate next milestone
55+
milestone.status = MILESTONE_STATUS.ACTIVE;
56+
}
57+
5158
// Set the next startDate value to the next day after completionDate if present or the endDate
5259
startDate = moment.utc(milestone.completionDate
5360
? milestone.completionDate
@@ -132,14 +139,33 @@ module.exports = [
132139
}
133140

134141
original = _.omit(milestone.toJSON(), ['deletedAt', 'deletedBy']);
142+
const durationChanged = entityToUpdate.duration && entityToUpdate.duration !== milestone.duration;
143+
const statusChanged = entityToUpdate.status && entityToUpdate.status !== milestone.status;
144+
const completionDateChanged = entityToUpdate.completionDate
145+
&& !_.isEqual(milestone.completionDate, entityToUpdate.completionDate);
135146

136147
// Merge JSON fields
137148
entityToUpdate.details = util.mergeJsonObjects(milestone.details, entityToUpdate.details);
138149

139-
if (entityToUpdate.duration && entityToUpdate.duration !== milestone.duration) {
150+
if (durationChanged) {
140151
entityToUpdate.endDate = moment.utc(milestone.startDate).add(entityToUpdate.duration - 1, 'days').toDate();
141152
}
142153

154+
// if status has changed
155+
if (statusChanged) {
156+
// if status has changed to be completed, set the compeltionDate if not provided
157+
if (entityToUpdate.status === MILESTONE_STATUS.COMPLETED) {
158+
const today = moment.utc().hours(0).minutes(0).seconds(0)
159+
.milliseconds(0);
160+
entityToUpdate.completionDate = entityToUpdate.completionDate ? entityToUpdate.completionDate : today;
161+
}
162+
}
163+
164+
// if completionDate has changed
165+
if (!statusChanged && completionDateChanged) {
166+
entityToUpdate.status = MILESTONE_STATUS.COMPLETED;
167+
}
168+
143169
// Update
144170
return milestone.update(entityToUpdate);
145171
})
@@ -190,7 +216,7 @@ module.exports = [
190216
.then(() => {
191217
// Update dates of the other milestones only if the completionDate or the duration changed
192218
if (!_.isEqual(original.completionDate, updated.completionDate) || original.duration !== updated.duration) {
193-
return updateComingMilestones(updated)
219+
return updateComingMilestones(original, updated)
194220
.then((lastTimelineMilestone) => {
195221
if (!_.isEqual(lastTimelineMilestone.endDate, timeline.endDate)) {
196222
timeline.endDate = lastTimelineMilestone.endDate;

0 commit comments

Comments
 (0)