From 881004fc9bb2475e896aed685aaed13baf09e43e Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Thu, 25 May 2023 15:31:03 -0400 Subject: [PATCH] CSR-1137 | Integrate shop-time-slots endpoint --- src/constants/endpoints.js | 5 +- .../date-picker/date-picker.vue | 11 ++-- src/layouts/schedule/schedule.vue | 7 ++- .../time-slot-modal-question.vue | 16 +++-- src/store/index.js | 62 ++++++++++++------- 5 files changed, 64 insertions(+), 37 deletions(-) diff --git a/src/constants/endpoints.js b/src/constants/endpoints.js index 7d83642a6..f1aeded2e 100644 --- a/src/constants/endpoints.js +++ b/src/constants/endpoints.js @@ -108,7 +108,10 @@ const endpoints = { }, GetShopTimeSlots: { url: "/schedule/api/v1/schedule/shop-time-slots", - mockUrl: "https://mockey.qa.sagaws.net/service/shop-time-slots", // TODO: REMOVE MOCKURL + method: "POST", + }, + GetMobileTimeSlots: { + url: "/schedule/api/v1/schedule/mobile-time-slots", method: "POST", }, GetMobileEarlyBirdFee: { diff --git a/src/digital-components/date-picker/date-picker.vue b/src/digital-components/date-picker/date-picker.vue index bd9ae6d9a..fefeb30ff 100644 --- a/src/digital-components/date-picker/date-picker.vue +++ b/src/digital-components/date-picker/date-picker.vue @@ -245,9 +245,10 @@ export default { let myPromise = new Promise((resolve, reject) => { const response = config.customSelectableDatesCallback( - initialViewStartDate, - initialViewEndDate, - store.getters.order.serviceLocation.appointmentType + initialViewStartDate.toISOString().split("T")[0], + initialViewEndDate.toISOString().split("T")[0], + store.getters.order.serviceLocation.appointmentType, + store.getters.order.serviceLocation.provider.providerNumber ); resolve(response); }); @@ -309,7 +310,6 @@ export default { this.hideSomeDaysForInitialView = config.hideSomeDaysForInitialView; const hideSecondMonth = config.hideSecondMonth; const direction = config.calendarViewDirection; - const monthsAfterToLoadOffset = 12; const monthsBeforeToLoadOffset = 36; config.initialShopTimeSlotsResponse.days.forEach((selectableDate) => { @@ -526,7 +526,8 @@ export default { const moreSelectableDates = await this.customSelectableDatesCallback( monthStart, monthEnd, - this.$store.getters.order.serviceLocation.appointmentType + this.$store.getters.order.serviceLocation.appointmentType, + this.$store.getters.order.serviceLocation.provider.providerNumber ); moreSelectableDates.days.forEach((selectableDate) => { const index = this.selectableDatesData.findIndex( diff --git a/src/layouts/schedule/schedule.vue b/src/layouts/schedule/schedule.vue index 1d4a83c36..24deff3e5 100644 --- a/src/layouts/schedule/schedule.vue +++ b/src/layouts/schedule/schedule.vue @@ -81,7 +81,7 @@ import store from "@/store"; defineRule("date-required", required(errorMessages.DATE_REQUIRED)); defineRule("time-slot-selection-required", required(errorMessages.DATE_REQUIRED)); -const getAvailableDates = async (startDate, endDate, appointmentType) => { +const getAvailableDates = async (startDate, endDate, appointmentType, providerNumber) => { // USING DATES PASSED, MAKE AN API CALL const newShopTimeSlotsResponse = await baseMixin.methods.dispatchStoreAction( storeActions.GET_SHOP_TIME_SLOTS, @@ -89,6 +89,7 @@ const getAvailableDates = async (startDate, endDate, appointmentType) => { startDate: startDate, endDate: endDate, shopAppointmentType: appointmentType, + providerNumber: providerNumber, }, false ); @@ -152,7 +153,6 @@ export default { const alertReasonsPromise = locationAlerts.methods.loadInitialData( store.getters.order.serviceLocation.zipCodeCtu ); - // Settle promises and get results const promiseResultMap = [ { @@ -241,7 +241,8 @@ export default { const newShopTimeSlots = await getAvailableDates( startDate, endDate, - this.appointmentType + this.appointmentType, + this.$store.getters.order.serviceLocation.provider.providerNumber ); // ADD API CALL RESULTS TO EXISTING DATE DATA this.selectableDatesData.days = this.selectableDatesData.days.concat( diff --git a/src/layouts/schedule/time-slot-modal-question/time-slot-modal-question.vue b/src/layouts/schedule/time-slot-modal-question/time-slot-modal-question.vue index 0091b986f..079df757d 100644 --- a/src/layouts/schedule/time-slot-modal-question/time-slot-modal-question.vue +++ b/src/layouts/schedule/time-slot-modal-question/time-slot-modal-question.vue @@ -165,7 +165,11 @@ export default { // This conversion ensures we don't get get GMT induced date changes const dateObject = new Date(`${this.dateAndTimeSlotData.dateString}T00:00:00`); // Ex: Tuesday, April 22 - return dateObject.toLocaleDateString("en-us", {weekday:"long", month:"long", day:"numeric"}); + return dateObject.toLocaleDateString("en-us", { + weekday: "long", + month: "long", + day: "numeric", + }); }, availableTimeSlots() { if (this.dateAndTimeSlotData === null) { @@ -240,7 +244,7 @@ export default { }); }, getAvailableTimeSlotsForDropOff(timeSlotsForSelectedDate) { - return [ + return [ { value: timeSlotsForSelectedDate[0].id, buttonLabel: this.dropoffButtonText, @@ -248,7 +252,7 @@ export default { ]; }, getAvailableTimeSlotsForMobile(timeSlotsForSelectedDate) { - const availableTimeSlots = timeSlotsForSelectedDate.map((timeSlot) => { + const availableTimeSlots = timeSlotsForSelectedDate.map((timeSlot) => { const readableTime = `${this.getDisplayTextForMilitaryTime( timeSlot.startTime )} - ${this.getDisplayTextForMilitaryTime(timeSlot.endTime)}`; @@ -262,7 +266,9 @@ export default { const hasPremiumPartAvailable = this.premiumAppointmentFee?.partType === PREMIUM_FEE_PART_TYPE; if (isPremiumTimeSlot && hasPremiumPartAvailable) { - availableTimeSlots.unshift(this.getPremiumAppointmentTimeSlot(timeSlotsForSelectedDate[0])); + availableTimeSlots.unshift( + this.getPremiumAppointmentTimeSlot(timeSlotsForSelectedDate[0]) + ); } return availableTimeSlots; @@ -278,7 +284,7 @@ export default { additionalButtonData: { isPremiumAppointment: true, }, - } + }; }, autoSelectTimeSlotIfOnlyOneIsAvailable(newdateAndTimeSlotDataValue) { const numberOfOptions = newdateAndTimeSlotDataValue?.timeSlots.length; diff --git a/src/store/index.js b/src/store/index.js index 9d06df11a..8d020e255 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1116,39 +1116,55 @@ export const actions = { }); }, - getShopTimeSlots( - context, - { startDate = "2023-01-01", endDate = "2023-05-01", shopAppointmentType = "" } - ) { + getShopTimeSlots(context, { startDate, endDate, shopAppointmentType, providerNumber }) { const order = context.state.order; - const mockArray = []; - + const vehicle = context.state.order.vehicle; + let partNumbers = [ + ...(order.lineItems.supportingItems ?? []), + ...(order.lineItems.vaps ?? []), + ...getFlattenedArrayOfLineItemsWithChildParts(order.lineItems.glassParts), + ]; + partNumbers = partNumbers.map((lineItem) => { + return lineItem.partNumber; + }); + const glassPieces = order.damage.glassToReplace ?? []; var payload = { - providerNumber: order.providerNumber, + providerNumber: providerNumber, startDate: startDate, endDate: endDate, shopAppointmentType: shopAppointmentType, - applicationName: applicationConfig.APPLICATION_NAME, + applicationName: "Safelite.com funnel", parentAccountNumber: context.getters.payment.parentAccountNumber, - carId: context.getters.vehicle.carId, - partNumbers: mockArray, // TODO: WHERE DO I GET THIS? + carId: vehicle.carId, + partNumbers: partNumbers, + glassPieces: glassPieces, eon: order.eon, - provisionalReasons: mockArray, // TODO: WHERE DO I GET THIS? + coverage: { + status: "", + deductible: 0, + additionalAuthFlag: "", + }, + partSelection: { + // TODO: Provisional booking will utilize these fields + hasAnsweredPartQuestions: false, + hasAnsweredMoldingQuestions: false, + hasAnsweredCapabilityQuestions: false, + hasManuallySelectedParts: false, + }, + vehicle: { + year: vehicle.year, + make: vehicle.make, + model: vehicle.model, + style: vehicle.style, + vin: vehicle.vin, + }, }; - - // TODO: REMOVE MOCK CALL & USE REAL CALL BELOW - return globalMethods.callMockHttpClient({ + return globalMethods.callHttpClient({ method: endpoints.GetShopTimeSlots.method, - endpoint: endpoints.GetShopTimeSlots.mockUrl, + endpoint: endpoints.GetShopTimeSlots.url, payload: payload, + logApiCall: false, }); - // TODO: RESTORE THIS - // return globalMethods.callHttpClient({ - // method: endpoints.GetShopTimeSlots.method, - // endpoint: endpoints.GetShopTimeSlots.url, - // payload: payload, - // logApiCall: false, - // }); }, getMobileEarlyBirdFee(context) { const damageType = context.getters.damage.isRepair ? "Repair" : "Replace"; @@ -1863,7 +1879,7 @@ function addPricesToLineItems(lineItems, pricingLineItems) { function getFlattenedArrayOfLineItemsWithChildParts(lineItems) { let flattenedArray = []; - lineItems.forEach((lineItem) => { + lineItems?.forEach((lineItem) => { flattenedArray.push(lineItem); if (lineItem.childParts) { flattenedArray = [