@@ -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