Skip to content

Commit 01c6595

Browse files
committed
daysWorked constraint
1 parent 90d0a00 commit 01c6595

File tree

2 files changed

+22
-7
lines changed

2 files changed

+22
-7
lines changed

src/models/WorkPeriod.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ module.exports = (sequelize) => {
7878
},
7979
daysWorked: {
8080
field: 'days_worked',
81-
type: Sequelize.INTEGER
81+
type: Sequelize.INTEGER,
82+
allowNull: false
8283
},
8384
memberRate: {
8485
field: 'member_rate',

src/services/WorkPeriodService.js

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ createWorkPeriod.schema = Joi.object().keys({
245245
resourceBookingId: Joi.string().uuid().required(),
246246
startDate: Joi.workPeriodStartDate(),
247247
endDate: Joi.workPeriodEndDate(),
248-
daysWorked: Joi.number().integer().min(0).allow(null),
248+
daysWorked: Joi.number().integer().min(0).max(5).required(),
249249
memberRate: Joi.number().allow(null),
250250
customerRate: Joi.number().allow(null),
251251
paymentStatus: Joi.paymentStatus().required()
@@ -265,18 +265,32 @@ async function updateWorkPeriod (currentUser, id, data) {
265265

266266
const workPeriod = await WorkPeriod.findById(id)
267267
const oldValue = workPeriod.toJSON()
268-
268+
let resourceBooking
269269
// if resourceBookingId is provided then update projectId and userHandle
270270
if (data.resourceBookingId) {
271-
const resourceBooking = await helper.ensureResourceBookingById(data.resourceBookingId) // ensure resource booking exists
271+
resourceBooking = await helper.ensureResourceBookingById(data.resourceBookingId) // ensure resource booking exists
272272
data.projectId = resourceBooking.projectId
273273

274274
const user = await helper.ensureUserById(resourceBooking.userId) // ensure user exists
275275
data.userHandle = user.handle
276+
} else {
277+
resourceBooking = await helper.ensureResourceBookingById(oldValue.resourceBookingId)
276278
}
277279
// If one of the dates are missing then auto-calculate it
278280
_autoCalculateDates(data)
279-
281+
if (data.daysWorked) {
282+
const weeks = helper.extractWorkPeriods(resourceBooking.startDate, resourceBooking.endDate)
283+
if (_.isEmpty(weeks)) {
284+
throw new errors.ConflictError('Resource booking has missing dates')
285+
}
286+
const thisWeek = _.find(weeks, ['startDate', oldValue.startDate])
287+
if (_.isNil(thisWeek)) {
288+
throw new errors.ConflictError('Work Period dates are not compatible with Resource Booking dates')
289+
}
290+
if (thisWeek.daysWorked < data.daysWorked) {
291+
throw new errors.BadRequestError(`Maximum allowed daysWorked is (${thisWeek.daysWorked})`)
292+
}
293+
}
280294
data.updatedBy = await helper.getUserId(currentUser.userId)
281295
let updated = null
282296
try {
@@ -311,7 +325,7 @@ partiallyUpdateWorkPeriod.schema = Joi.object().keys({
311325
resourceBookingId: Joi.string().uuid(),
312326
startDate: Joi.workPeriodStartDate(),
313327
endDate: Joi.workPeriodEndDateOptional(),
314-
daysWorked: Joi.number().integer().min(0).allow(null),
328+
daysWorked: Joi.number().integer().min(0).max(5),
315329
memberRate: Joi.number().allow(null),
316330
customerRate: Joi.number().allow(null),
317331
paymentStatus: Joi.paymentStatus()
@@ -336,7 +350,7 @@ fullyUpdateWorkPeriod.schema = Joi.object().keys({
336350
resourceBookingId: Joi.string().uuid().required(),
337351
startDate: Joi.workPeriodStartDate(),
338352
endDate: Joi.workPeriodEndDate(),
339-
daysWorked: Joi.number().integer().min(0).allow(null).default(null),
353+
daysWorked: Joi.number().integer().min(0).required(),
340354
memberRate: Joi.number().allow(null).default(null),
341355
customerRate: Joi.number().allow(null).default(null),
342356
paymentStatus: Joi.paymentStatus().required()

0 commit comments

Comments
 (0)