From 2887ef8d39c70a7b9af05a7130f8232e30d9b397 Mon Sep 17 00:00:00 2001 From: Gian Franco Zabarino Date: Sat, 28 Jul 2018 00:31:28 -0300 Subject: [PATCH 1/2] When creating a project from a project template, define phases' startDate, endDate and duration. --- src/routes/projects/create.js | 15 ++++++++++----- src/routes/projects/create.spec.js | 7 +++++++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/routes/projects/create.js b/src/routes/projects/create.js index d291a190..c8fb6ce0 100644 --- a/src/routes/projects/create.js +++ b/src/routes/projects/create.js @@ -4,6 +4,7 @@ import validate from 'express-validation'; import _ from 'lodash'; import Joi from 'joi'; import config from 'config'; +import moment from 'moment'; import models from '../../models'; import { PROJECT_MEMBER_ROLE, PROJECT_STATUS, PROJECT_PHASE_STATUS, USER_ROLE, EVENT, REGEX } from '../../constants'; @@ -90,12 +91,16 @@ function createProjectAndPhases(req, project, projectTemplate, productTemplates) productTemplates.forEach((pt) => { productTemplateMap[pt.id] = pt; }); - return Promise.all(_.map(phases, (phase, phaseIdx) => + return Promise.all(_.map(phases, (phase, phaseIdx) => { + const duration = _.get(phase, 'duration', 1); + const startDate = moment.utc(); // Create phase - models.ProjectPhase.create({ + return models.ProjectPhase.create({ projectId: newProject.id, name: _.get(phase, 'name', `Stage ${phaseIdx}`), - duration: _.get(phase, 'duration', 0), + duration, + startDate: startDate.format(), + endDate: moment.utc(startDate).add(duration - 1, 'days').format(), status: _.get(phase, 'status', PROJECT_PHASE_STATUS.DRAFT), budget: _.get(phase, 'budget', 0), updatedBy: req.authUser.userId, @@ -121,8 +126,8 @@ function createProjectAndPhases(req, project, projectTemplate, productTemplates) result.newPhases.push(newPhaseJson); return Promise.resolve(); }); - }), - )); + }); + })); }).then(() => Promise.resolve(result)); } diff --git a/src/routes/projects/create.spec.js b/src/routes/projects/create.spec.js index cf63ffc0..82b33b6e 100644 --- a/src/routes/projects/create.spec.js +++ b/src/routes/projects/create.spec.js @@ -1,6 +1,7 @@ /* eslint-disable no-unused-expressions */ import _ from 'lodash'; import chai from 'chai'; +import moment from 'moment'; import sinon from 'sinon'; import request from 'supertest'; @@ -85,6 +86,7 @@ describe('Project create', () => { phases: { phase1: { name: 'phase 1', + duration: 5, products: [ { id: 21, @@ -116,6 +118,7 @@ describe('Project create', () => { 1: { name: 'Design Stage', status: 'open', + duration: 10, details: { description: 'detailed description', }, @@ -130,6 +133,7 @@ describe('Project create', () => { 2: { name: 'Development Stage', status: 'open', + duration: 20, products: [ { id: 23, @@ -440,6 +444,9 @@ describe('Project create', () => { const phases = _.sortBy(resJson.phases, p => p.name); phases[0].name.should.be.eql('Design Stage'); phases[0].status.should.be.eql('open'); + phases[0].startDate.should.be.a('string'); + phases[0].duration.should.be.eql(10); + new Date(phases[0].endDate).should.be.eql(moment.utc(phases[0].startDate).add(9, 'days').toDate()); expect(phases[0].details).to.be.empty; phases[0].products.should.have.lengthOf(1); phases[0].products[0].name.should.be.eql('product 1'); From de0d52e0b0ba5467b810c4c13914d8a6160f2b86 Mon Sep 17 00:00:00 2001 From: Gian Franco Zabarino Date: Sat, 28 Jul 2018 01:34:38 -0300 Subject: [PATCH 2/2] Changes after comments on #138. --- src/routes/projects/create.js | 3 ++- src/routes/projects/create.spec.js | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/routes/projects/create.js b/src/routes/projects/create.js index c8fb6ce0..b45f639c 100644 --- a/src/routes/projects/create.js +++ b/src/routes/projects/create.js @@ -93,7 +93,8 @@ function createProjectAndPhases(req, project, projectTemplate, productTemplates) }); return Promise.all(_.map(phases, (phase, phaseIdx) => { const duration = _.get(phase, 'duration', 1); - const startDate = moment.utc(); + const startDate = moment.utc().hours(0).minutes(0).seconds(0) + .milliseconds(0); // Create phase return models.ProjectPhase.create({ projectId: newProject.id, diff --git a/src/routes/projects/create.spec.js b/src/routes/projects/create.spec.js index 82b33b6e..0b13f1be 100644 --- a/src/routes/projects/create.spec.js +++ b/src/routes/projects/create.spec.js @@ -446,7 +446,12 @@ describe('Project create', () => { phases[0].status.should.be.eql('open'); phases[0].startDate.should.be.a('string'); phases[0].duration.should.be.eql(10); - new Date(phases[0].endDate).should.be.eql(moment.utc(phases[0].startDate).add(9, 'days').toDate()); + const startDate = moment.utc(phases[0].startDate); + startDate.hours().should.be.eql(0); + startDate.minutes().should.be.eql(0); + startDate.seconds().should.be.eql(0); + startDate.milliseconds().should.be.eql(0); + new Date(phases[0].endDate).should.be.eql(startDate.add(9, 'days').toDate()); expect(phases[0].details).to.be.empty; phases[0].products.should.have.lengthOf(1); phases[0].products[0].name.should.be.eql('product 1');