From cb194d63722be0d8b6e1b040172c3236cfeadcd0 Mon Sep 17 00:00:00 2001 From: eisbilir Date: Wed, 28 Jul 2021 17:17:14 +0300 Subject: [PATCH 1/2] update: allow up to 10 daysWorked --- ...coder-bookings-api.postman_collection.json | 54 ++----------------- docs/swagger.yaml | 34 +++++++++--- .../ResourceBookingEventHandler.js | 12 +++-- src/services/ResourceBookingService.js | 2 + src/services/WorkPeriodService.js | 4 +- 5 files changed, 43 insertions(+), 63 deletions(-) diff --git a/docs/Topcoder-bookings-api.postman_collection.json b/docs/Topcoder-bookings-api.postman_collection.json index 8ee3ef14..bfcdc864 100644 --- a/docs/Topcoder-bookings-api.postman_collection.json +++ b/docs/Topcoder-bookings-api.postman_collection.json @@ -1,6 +1,6 @@ { "info": { - "_postman_id": "0bd597ba-4bc2-4ea1-be33-45776b80c1ce", + "_postman_id": "e9b3dfd2-60ad-45b3-9c41-87507820461d", "name": "Topcoder-bookings-api", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, @@ -15486,7 +15486,7 @@ "pm.test('Status code is 400', function () {\r", " pm.response.to.have.status(400);\r", " const response = pm.response.json()\r", - " pm.expect(response.message).to.eq(\"\\\"data.daysWorked\\\" must be less than or equal to 5\")\r", + " pm.expect(response.message).to.eq(\"\\\"data.daysWorked\\\" must be less than or equal to 10\")\r", "});" ], "type": "text/javascript" @@ -15504,55 +15504,7 @@ ], "body": { "mode": "raw", - "raw": "{\r\n \"daysWorked\": 6\r\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{URL}}/work-periods/{{workPeriodId-1}}", - "host": [ - "{{URL}}" - ], - "path": [ - "work-periods", - "{{workPeriodId-1}}" - ] - } - }, - "response": [] - }, - { - "name": "patch work period with invalid parameter 4", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test('Status code is 400', function () {\r", - " pm.response.to.have.status(400);\r", - " const response = pm.response.json()\r", - " pm.expect(response.message).to.eq(\"Maximum allowed daysWorked is (4)\")\r", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "PATCH", - "header": [ - { - "key": "Authorization", - "type": "text", - "value": "Bearer {{token_bookingManager}}" - } - ], - "body": { - "mode": "raw", - "raw": "{\r\n \"daysWorked\": 5\r\n}", + "raw": "{\r\n \"daysWorked\": 11\r\n}", "options": { "raw": { "language": "json" diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 81e140b7..55f22d0c 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -3947,7 +3947,7 @@ components: "job-closed", "offered", "withdrawn", - "withdrawn-prescreen" + "withdrawn-prescreen", ] description: "The job candidate status." externalId: @@ -4049,7 +4049,26 @@ components: type: array items: type: string - enum: ["open", "placed", "selected", "client rejected - screening", "client rejected - interview", "rejected - other", "cancelled", "interview", "topcoder-rejected", "applied", "rejected-pre-screen", "skills-test", "phone-screen", "job-closed", "offered", "withdrawn", "withdrawn-prescreen"] + enum: + [ + "open", + "placed", + "selected", + "client rejected - screening", + "client rejected - interview", + "rejected - other", + "cancelled", + "interview", + "topcoder-rejected", + "applied", + "rejected-pre-screen", + "skills-test", + "phone-screen", + "job-closed", + "offered", + "withdrawn", + "withdrawn-prescreen", + ] description: "The array of job Candidates status" JobCandidateRequestBody: required: @@ -4085,7 +4104,7 @@ components: "job-closed", "offered", "withdrawn", - "withdrawn-prescreen" + "withdrawn-prescreen", ] description: "The job candidate status." default: open @@ -4123,7 +4142,7 @@ components: "job-closed", "offered", "withdrawn", - "withdrawn-prescreen" + "withdrawn-prescreen", ] externalId: type: string @@ -4644,7 +4663,7 @@ components: daysWorked: type: integer minimum: 0 - maximum: 5 + maximum: 10 example: 2 description: "The count of the days worked for that work period." daysPaid: @@ -4696,6 +4715,8 @@ components: properties: daysWorked: type: integer + minimum: 0 + maximum: 10 example: 2 description: "The count of the days worked for that work period." WorkPeriodPayment: @@ -5275,7 +5296,7 @@ components: "job-closed", "offered", "withdrawn", - "withdrawn-prescreen" + "withdrawn-prescreen", ] description: "The job candidate status." skills: @@ -5872,4 +5893,3 @@ components: properties: message: type: string - diff --git a/src/eventHandlers/ResourceBookingEventHandler.js b/src/eventHandlers/ResourceBookingEventHandler.js index 1134674a..5ef0914e 100644 --- a/src/eventHandlers/ResourceBookingEventHandler.js +++ b/src/eventHandlers/ResourceBookingEventHandler.js @@ -188,11 +188,13 @@ async function updateWorkPeriods (payload) { const originalFirstWeek = _.find(workPeriods, ['startDate', firstWeek.startDate]) const existentFirstWeek = _.minBy(workPeriods, 'startDate') // recalculate daysWorked for the first week of existent workPeriods and daysWorked have changed - if (firstWeek.startDate === existentFirstWeek.startDate && firstWeek.daysWorked !== existentFirstWeek.daysWorked) { + if (firstWeek.startDate === existentFirstWeek.startDate && firstWeek.daysWorked !== existentFirstWeek.daysWorked && + existentFirstWeek.daysPaid <= firstWeek.daysWorked) { workPeriodsToUpdate.push(_.assign(firstWeek, { id: originalFirstWeek.id })) // if first of intersected workPeriods is not the first one of existent workPeriods // we only check if it's daysWorked exceeds the possible maximum - } else if (originalFirstWeek.daysWorked > firstWeek.daysWorked) { + } else if (originalFirstWeek.daysWorked > firstWeek.daysWorked && + originalFirstWeek.daysPaid <= firstWeek.daysWorked) { workPeriodsToUpdate.push(_.assign(firstWeek, { id: originalFirstWeek.id })) } } @@ -201,11 +203,13 @@ async function updateWorkPeriods (payload) { const originalLastWeek = _.find(workPeriods, ['startDate', lastWeek.startDate]) const existentLastWeek = _.maxBy(workPeriods, 'startDate') // recalculate daysWorked for the last week of existent workPeriods and daysWorked have changed - if (lastWeek.startDate === existentLastWeek.startDate && lastWeek.daysWorked !== existentLastWeek.daysWorked) { + if (lastWeek.startDate === existentLastWeek.startDate && lastWeek.daysWorked !== existentLastWeek.daysWorked && + existentLastWeek.daysPaid <= lastWeek.daysWorked) { workPeriodsToUpdate.push(_.assign(lastWeek, { id: originalLastWeek.id })) // if last of intersected workPeriods is not the last one of existent workPeriods // we only check if it's daysWorked exceeds the possible maximum - } else if (originalLastWeek.daysWorked > lastWeek.daysWorked) { + } else if (originalLastWeek.daysWorked > lastWeek.daysWorked && + originalLastWeek.daysPaid <= lastWeek.daysWorked) { workPeriodsToUpdate.push(_.assign(lastWeek, { id: originalLastWeek.id })) } } diff --git a/src/services/ResourceBookingService.js b/src/services/ResourceBookingService.js index 46d2fe62..ba7475dd 100644 --- a/src/services/ResourceBookingService.js +++ b/src/services/ResourceBookingService.js @@ -251,6 +251,7 @@ async function _ensurePaidWorkPeriodsNotDeleted (resourceBookingId, oldValue, ne // or any of it's WorkPeriodsPayment has status 'completed' or 'in-progress'. _checkForPaidWorkPeriods(workPeriodsToRemove) // check if this update makes maximum possible daysWorked value less than daysPaid + /* https://github.com/topcoder-platform/taas-apis/issues/428 _.each(newWorkPeriods, newWP => { const wp = _.find(workPeriods, ['startDate', newWP.startDate]) if (!wp) { @@ -260,6 +261,7 @@ async function _ensurePaidWorkPeriodsNotDeleted (resourceBookingId, oldValue, ne throw new errors.ConflictError(`Cannot make maximum daysWorked (${newWP.daysWorked}) to the value less than daysPaid (${wp.daysPaid}) for WorkPeriod: ${wp.id}`) } }) + */ } /** diff --git a/src/services/WorkPeriodService.js b/src/services/WorkPeriodService.js index 8d018fb0..702161a5 100644 --- a/src/services/WorkPeriodService.js +++ b/src/services/WorkPeriodService.js @@ -273,9 +273,11 @@ async function updateWorkPeriod (currentUser, id, data) { if (_.isNil(thisWeek)) { throw new errors.ConflictError('Work Period dates are not compatible with Resource Booking dates') } + /* https://github.com/topcoder-platform/taas-apis/issues/428 if (thisWeek.daysWorked < data.daysWorked) { throw new errors.BadRequestError(`Maximum allowed daysWorked is (${thisWeek.daysWorked})`) } + */ data.paymentStatus = helper.calculateWorkPeriodPaymentStatus(_.assign({}, oldValue, data)) data.updatedBy = await helper.getUserId(currentUser.userId) const updated = await workPeriod.update(data) @@ -300,7 +302,7 @@ partiallyUpdateWorkPeriod.schema = Joi.object().keys({ currentUser: Joi.object().required(), id: Joi.string().uuid().required(), data: Joi.object().keys({ - daysWorked: Joi.number().integer().min(0).max(5) + daysWorked: Joi.number().integer().min(0).max(10) }).required().min(1) }).required() From 0c7e49876a620945baff2abc17613cb6bb9dd031 Mon Sep 17 00:00:00 2001 From: eisbilir Date: Thu, 29 Jul 2021 00:24:14 +0300 Subject: [PATCH 2/2] update: search up to 10 days --- docs/Topcoder-bookings-api.postman_collection.json | 6 +++--- src/services/ResourceBookingService.js | 2 +- src/services/WorkPeriodPaymentService.js | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/Topcoder-bookings-api.postman_collection.json b/docs/Topcoder-bookings-api.postman_collection.json index bfcdc864..f675ea17 100644 --- a/docs/Topcoder-bookings-api.postman_collection.json +++ b/docs/Topcoder-bookings-api.postman_collection.json @@ -1,6 +1,6 @@ { "info": { - "_postman_id": "e9b3dfd2-60ad-45b3-9c41-87507820461d", + "_postman_id": "8ead1433-9679-46de-9baa-d27d59106673", "name": "Topcoder-bookings-api", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, @@ -16460,7 +16460,7 @@ "pm.test('Status code is 400', function () {\r", " pm.response.to.have.status(400);\r", " const response = pm.response.json()\r", - " pm.expect(response.message).to.eq(\"\\\"workPeriodPayment.days\\\" must be less than or equal to 5\")\r", + " pm.expect(response.message).to.eq(\"\\\"workPeriodPayment.days\\\" must be less than or equal to 10\")\r", "});" ], "type": "text/javascript" @@ -16478,7 +16478,7 @@ ], "body": { "mode": "raw", - "raw": "{\r\n \"workPeriodId\": \"{{workPeriodId-3}}\",\r\n \"days\": 6\r\n}", + "raw": "{\r\n \"workPeriodId\": \"{{workPeriodId-3}}\",\r\n \"days\": 11\r\n}", "options": { "raw": { "language": "json" diff --git a/src/services/ResourceBookingService.js b/src/services/ResourceBookingService.js index ba7475dd..294f4c2d 100644 --- a/src/services/ResourceBookingService.js +++ b/src/services/ResourceBookingService.js @@ -908,7 +908,7 @@ searchResourceBookings.schema = Joi.object().keys({ }) }), 'workPeriods.payments.status': Joi.workPeriodPaymentStatus(), - 'workPeriods.payments.days': Joi.number().integer().min(0).max(5) + 'workPeriods.payments.days': Joi.number().integer().min(0).max(10) }).required(), options: Joi.object().keys({ returnAll: Joi.boolean().default(false), diff --git a/src/services/WorkPeriodPaymentService.js b/src/services/WorkPeriodPaymentService.js index 9a7a7780..7c88d1b8 100644 --- a/src/services/WorkPeriodPaymentService.js +++ b/src/services/WorkPeriodPaymentService.js @@ -185,7 +185,7 @@ async function createWorkPeriodPayment (currentUser, workPeriodPayment) { const singleCreateWorkPeriodPaymentSchema = Joi.object().keys({ workPeriodId: Joi.string().uuid().required(), - days: Joi.number().integer().min(1).max(5) + days: Joi.number().integer().min(1).max(10) }) createWorkPeriodPayment.schema = Joi.object().keys({ currentUser: Joi.object().required(),