From a8b75d8c1cc7684cab31697a29f2c6061c9b9c6a Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Thu, 29 Feb 2024 14:39:35 -0500 Subject: [PATCH 01/17] Adding deductible and base price line items to cart --- .../cart-dropdown/cart-dropdown.spec.js | 2 +- .../cart-dropdown/cart-dropdown.vue | 95 +++++++++++++++---- .../coverage-statement/coverage-statement.vue | 8 +- src/layouts/payment-method/payment-method.vue | 26 ++++- src/store/index.js | 23 ++--- 5 files changed, 116 insertions(+), 38 deletions(-) diff --git a/src/iss-components/cart-dropdown/cart-dropdown.spec.js b/src/iss-components/cart-dropdown/cart-dropdown.spec.js index e55bdc36..b2fc6245 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.spec.js +++ b/src/iss-components/cart-dropdown/cart-dropdown.spec.js @@ -81,7 +81,7 @@ describe('cart-dropdown component', () => { const { wrapper } = getMountedComponent(storeData); // Act - const result = wrapper.vm.isVerified; + const result = wrapper.vm.isVerifiedCoverageStatus; // Assert expect(result).toBe(expected); diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index 9ebfa58d..2dd9210c 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -10,13 +10,34 @@ href="javascript:void(0)" class="col d-flex justify-content-between py-0"> {{ amountDueLabel }} - {{ amountDueDisplayed }} + {{ getDisplayed(amountDue) }}
- Cart Table Placeholder + class="cart-table"> +
+
+
+ {{ deductibleOrBasePriceLabel }} + {{ getDisplayed(deductible) }} +
+
+ {{ deductibleOrBasePriceLabel }} + {{ getDisplayed(baseServicePrice) }} +
+
+
@@ -31,39 +52,56 @@ export default { components: {}, props: { showAsPaid: Boolean, - amountDueLabel: String + amountDueLabel: String, + deductibleOrBasePriceLabel: String }, data() { return { - isExpanded: false, + isExpanded: true, currencyFormatter: new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' - }), - widget: { - amountDue: 'AmountDueTextWidget' - } + }) }; }, computed: { - isVerified() { - return useMainStore().payment?.insuranceCoverage?.isVerified ?? false; + deductible() { + return useMainStore().order.currentDeductible; }, - amountDueDisplayed() { - return this.isVerified - ? this.getFormattedAmount(this.amountDue) - : VERIFYING_COVERAGE; + availableLineItems() { + // TODO make real + return [ + { + kitPrice: 1, + laborAmount: 2, + sellingPrice: 3 + } + ]; + }, + baseServicePrice() { + return this.availableLineItems + .reduce( + (accumulator, lineItem) => accumulator + this.getTotalLineItemPrice(lineItem), + 0 + ); + }, + showDeductibleLineItem() { + return !useMainStore().isNoComp && !useMainStore().policy.isITAC; + }, + isUnverified() { + return this.showDeductibleLineItem + && (this.deductible == null || !useMainStore().isVerifiedCoverageStatus); + }, + subTotal() { + return this.showDeductibleLineItem ? this.deductible : this.baseServicePrice; + }, + salesTax() { + return 0; // TODO }, amountDue() { return this.showAsPaid ? 0 : this.subTotal + this.salesTax; - }, - subTotal() { - return 0; - }, - salesTax() { - return 0; } }, methods: { @@ -72,6 +110,14 @@ export default { }, getFormattedAmount(amount) { return this.currencyFormatter.format(amount); + }, + getTotalLineItemPrice(lineItem) { + return lineItem.kitPrice + lineItem.laborAmount + lineItem.sellingPrice; + }, + getDisplayed(amount) { + return this.isUnverified + ? VERIFYING_COVERAGE + : this.getFormattedAmount(amount); } } }; @@ -84,6 +130,13 @@ export default { .color-black { color: $black; } +.color-gray-100 { + background-color: $gray-100; +} + +.line-item { + color: $darker-gray; +} .cart-table { max-height: 0; diff --git a/src/layouts/coverage-statement/coverage-statement.vue b/src/layouts/coverage-statement/coverage-statement.vue index fa6f17c3..bcdc76cb 100644 --- a/src/layouts/coverage-statement/coverage-statement.vue +++ b/src/layouts/coverage-statement/coverage-statement.vue @@ -130,6 +130,7 @@ import routerParams from '@/router/router-constants/router-params'; import issPageValues from '@/router/router-constants/issPage-values'; import bailoutCode from '@/constants/bailoutCode'; import bailoutMessage from '@/constants/bailoutMessage'; +import coverageStatuses from '@/constants/coverage-statuses'; export default { name: 'coverage-statement', @@ -265,8 +266,7 @@ export default { return damageString === 'match' ? '' : damageString; }, vehicleDeductible() { - const deductible = useMainStore().order.currentDeductible; - return deductible; + return useMainStore().order.currentDeductible; }, formattedDeductible() { return this.getDeductibleString(this.vehicleDeductible); @@ -355,6 +355,10 @@ export default { }, async initializeComponent() { useMainStore().updatePolicyITACFlag(this.verifiedITAC); + const coverageStatus = this.verifiedITAC || this.verifiedNoComp + ? coverageStatuses.VERIFIED + : coverageStatuses.PENDING; + useMainStore().updateCoverageStatus(coverageStatus); if (this.policyLookupSuccessful && useMainStore().order.vehicle.policyVehicleId >= 0 && useMainStore().isClaimRegistrationRequired diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index 8b03a875..1cafe4ef 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -21,7 +21,8 @@
+ :amountDueLabel="amountDueText" + :deductibleOrBasePriceLabel="deductibleOrBasePriceLabel" />
Pia Alert Placeholder
state.order.serviceLocation.appointmentType === AppointmentTypeStrings.DROP_OFF, isClaimRegistrationRequired: (state) => state.issConfig.isClaimRegistrationRequired, isBailout: (state) => state.applicationUser.pageData[issPageValues.BAILOUT_PAGE] != null, + isNoComp: (state) => state.order.policy.coverageStatus === coverageStatuses.NO_COMP, + isVerifiedCoverageStatus: (state) => state.order.policy.coverageStatus === coverageStatuses.VERIFIED, eventBusItem: (state) => (eventCategory, eventSubCategory) => { const matchedEvent = state.applicationUser.eventBus.find(({ category, subCategory }) => category === eventCategory && subCategory === eventSubCategory); return matchedEvent?.eventValue; @@ -489,6 +491,9 @@ export const useMainStore = defineStore({ }); }); }, + updateCoverageStatus(newStatus) { + this.order.payment.insuranceCoverage.coverageStatus = newStatus; + }, registerClaim() { const nonNumberCharRegex = /[^0-9]/g; const { order } = this; @@ -553,18 +558,15 @@ export const useMainStore = defineStore({ const registerClaimFailed = response.data.isError; order.payment.insuranceCoverage.isVerified = !registerClaimFailed; order.payment.insuranceCoverage.claimNumber = null; - if (registerClaimFailed) { - this.order.payment.insuranceCoverage.coverageStatus = coverageStatuses.PENDING; - } else if (this.policy.noCoverage) { - this.order.payment.insuranceCoverage.coverageStatus = coverageStatuses.NO_COMP; - } else { - this.order.payment.insuranceCoverage.coverageStatus = coverageStatuses.VERIFIED; + if (this.policy?.noCoverage ?? false) { + this.updateCoverageStatus(coverageStatuses.NO_COMP); + } else if (!registerClaimFailed) { + this.updateCoverageStatus(coverageStatuses.VERIFIED); this.order.payment.insuranceCoverage.claimNumber = response.data.claimNumber; } return resolve(response); }, (error) => { this.order.payment.insuranceCoverage.isVerified = false; - this.order.payment.insuranceCoverage.coverageStatus = coverageStatuses.PENDING; this.order.payment.insuranceCoverage.claimNumber = null; return reject(error); }); @@ -1264,7 +1266,7 @@ export const useMainStore = defineStore({ order.lineItems.vaps = data.order?.lineItems?.vaps; order.payment.insuranceCoverage.isVerified = data.order?.payment?.insuranceCoverage?.isVerified; - order.payment.insuranceCoverage.coverageStatus = data.order?.payment?.insuranceCoverage?.coverageStatus; + this.updateCoverageStatus(data.order?.payment?.insuranceCoverage?.coverageStatus ?? coverageStatuses.PENDING); const parentAccountNumber = Number.isNaN(data.order?.payment?.parentAccountNumber) ? 0 : data.order?.payment?.parentAccountNumber; @@ -1466,9 +1468,8 @@ export const useMainStore = defineStore({ // These could be undefined this.order.policy.noCoverage = vehicle.noCoverage; - this.order.payment.insuranceCoverage.coverageStatus = vehicle.noCoverage - ? coverageStatuses.NO_COMP - : coverageStatuses.PENDING; + const currentCoverageStatus = vehicle.noCoverage ? coverageStatuses.NO_COMP : coverageStatuses.PENDING; + this.updateCoverageStatus(currentCoverageStatus); this.order.policy.deductible.replace = vehicle.deductible; this.order.policy.deductible.repair = vehicle?.repairWaived ?? false ? 0 : vehicle.deductible; this.order.policy.endorsements = vehicle?.endorsements; From b5e24c814688664da74ae7aea9b6dea7e93b0725 Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Thu, 29 Feb 2024 14:49:53 -0500 Subject: [PATCH 02/17] Separating deductible and base pay --- .../cart-dropdown/cart-dropdown.vue | 7 ++-- src/layouts/payment-method/payment-method.vue | 32 ++++++++----------- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index 2dd9210c..1d52f580 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -24,7 +24,7 @@ class="d-flex justify-content-between align-items-center"> {{ deductibleOrBasePriceLabel }} + class="label">{{ deductibleLabel }} {{ getDisplayed(deductible) }}
{{ deductibleOrBasePriceLabel }} + class="label">{{ BasePriceLabel }} {{ getDisplayed(baseServicePrice) }}
@@ -53,7 +53,8 @@ export default { props: { showAsPaid: Boolean, amountDueLabel: String, - deductibleOrBasePriceLabel: String + deductibleLabel: String, + basePriceLabel: String }, data() { return { diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index 1cafe4ef..a57577f1 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -22,7 +22,8 @@ + :deductibleLabel="deductibleLabel" + :basePriceLabel="basePriceLabel" />
Pia Alert Placeholder
Date: Thu, 29 Feb 2024 14:53:54 -0500 Subject: [PATCH 03/17] Cleaning 1 --- .../cart-dropdown/cart-dropdown.vue | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index 1d52f580..579162c9 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -16,26 +16,26 @@
-
-
-
- {{ deductibleLabel }} - {{ getDisplayed(deductible) }} -
-
- {{ BasePriceLabel }} - {{ getDisplayed(baseServicePrice) }} -
+
+
+ {{ deductibleLabel }} + {{ getDisplayed(deductible) }} +
+
+ {{ BasePriceLabel }} + {{ getDisplayed(baseServicePrice) }}
From 5f6b99b0f1f838a8bd744b99ec2b86e06fcb8150 Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Thu, 29 Feb 2024 14:56:00 -0500 Subject: [PATCH 04/17] Making base service price never say unverified --- src/iss-components/cart-dropdown/cart-dropdown.vue | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index 579162c9..e9d0da00 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -10,7 +10,7 @@ href="javascript:void(0)" class="col d-flex justify-content-between py-0"> {{ amountDueLabel }} - {{ getDisplayed(amountDue) }} + {{ getDisplayedByUnverified(amountDue) }}
{{ deductibleLabel }} - {{ getDisplayed(deductible) }} + {{ getDisplayedByUnverified(deductible) }}
{{ BasePriceLabel }} - {{ getDisplayed(baseServicePrice) }} + {{ getFormattedAmount(baseServicePrice) }}
@@ -115,7 +115,7 @@ export default { getTotalLineItemPrice(lineItem) { return lineItem.kitPrice + lineItem.laborAmount + lineItem.sellingPrice; }, - getDisplayed(amount) { + getDisplayedByUnverified(amount) { return this.isUnverified ? VERIFYING_COVERAGE : this.getFormattedAmount(amount); From e40a7eef23935d34be0847aa1492a4c60dd39e77 Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Thu, 29 Feb 2024 14:58:01 -0500 Subject: [PATCH 05/17] Removing debug bool --- src/iss-components/cart-dropdown/cart-dropdown.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index e9d0da00..546ca470 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -58,7 +58,7 @@ export default { }, data() { return { - isExpanded: true, + isExpanded: false, currencyFormatter: new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' From 9e346265cc7f2586b0dfcddc159311198fcd7b19 Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Thu, 29 Feb 2024 15:02:34 -0500 Subject: [PATCH 06/17] Simplifying --- src/iss-components/cart-dropdown/cart-dropdown.vue | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index 546ca470..e9b23408 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -10,7 +10,7 @@ href="javascript:void(0)" class="col d-flex justify-content-between py-0"> {{ amountDueLabel }} - {{ getDisplayedByUnverified(amountDue) }} + {{ getDisplayed(amountDue) }}
{{ deductibleLabel }} - {{ getDisplayedByUnverified(deductible) }} + {{ getDisplayed(deductible) }}
{{ BasePriceLabel }} - {{ getFormattedAmount(baseServicePrice) }} + {{ getDisplayed(baseServicePrice) }}
@@ -79,6 +79,7 @@ export default { } ]; }, + // TODO share with claim registration page baseServicePrice() { return this.availableLineItems .reduce( @@ -94,6 +95,7 @@ export default { && (this.deductible == null || !useMainStore().isVerifiedCoverageStatus); }, subTotal() { + // TODO partial calculation for now return this.showDeductibleLineItem ? this.deductible : this.baseServicePrice; }, salesTax() { @@ -112,11 +114,12 @@ export default { getFormattedAmount(amount) { return this.currencyFormatter.format(amount); }, + // TODO share with claim registration page getTotalLineItemPrice(lineItem) { return lineItem.kitPrice + lineItem.laborAmount + lineItem.sellingPrice; }, - getDisplayedByUnverified(amount) { - return this.isUnverified + getDisplayed(amount) { + return this.isUnverified && this.showDeductibleLineItem ? VERIFYING_COVERAGE : this.getFormattedAmount(amount); } From 7e9f7d83c017e64c060b93c4d7aa0014b0b6ec75 Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Thu, 29 Feb 2024 15:06:39 -0500 Subject: [PATCH 07/17] Simplifying 2 --- src/layouts/payment-method/payment-method.vue | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index a57577f1..efdbb703 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -140,16 +140,10 @@ export default { return this.getCmsContent(this.widget.amountDue, widgetFields.TEXT_BLOCK_WIDGET.TEXT); }, deductibleLabel() { - return this.getCmsContent( - this.widget.deductible, - widgetFields.TEXT_BLOCK_WIDGET.TEXT - ); + return this.getCmsContent(this.widget.deductible, widgetFields.TEXT_BLOCK_WIDGET.TEXT); }, basePriceLabel() { - return this.getCmsContent( - this.widget.basePrice, - widgetFields.TEXT_BLOCK_WIDGET.TEXT - ); + return this.getCmsContent(this.widget.basePrice, widgetFields.TEXT_BLOCK_WIDGET.TEXT); } }, watch: { From 152a799caae9f03e64ca4411f6a22e6be7a111dc Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Fri, 1 Mar 2024 13:50:50 -0500 Subject: [PATCH 08/17] Partial --- src/constants/endpoints.js | 106 ++++++++++------- .../cart-dropdown/cart-dropdown.vue | 47 ++++++-- src/layouts/payment-method/payment-method.vue | 11 +- src/store/paymentStore.js | 112 ++++++++++++++++++ 4 files changed, 217 insertions(+), 59 deletions(-) create mode 100644 src/store/paymentStore.js diff --git a/src/constants/endpoints.js b/src/constants/endpoints.js index 5f3b1a91..6ac0a793 100644 --- a/src/constants/endpoints.js +++ b/src/constants/endpoints.js @@ -1,190 +1,204 @@ +const baseContentUrl = '/content/api/v1/content'; +const baseLocationUrl = '/location/api/v1/location'; +const baseScheduleUrl = '/schedule/api/v1/schedule'; +const basePartsUrl = '/parts/api/v1/parts'; +const baseVehicleUrl = '/vehicle/api/v1/vehicle'; +const basePriceUrl = '/price/api/v1/price'; +const baseAnalyticsUrl = '/analytics/api/v1/analytics'; +const baseExperimentsUrl = '/experiments/api/v1/experiments'; +const baseClientAuthUrl = '/clientauth/api/v1/clientauth'; +const baseOrderUrl = '/order/api/v1/order'; +const baseCoverageUrl = '/coverage/api/v1/coverage'; +const baseAccountUrl = '/account/api/v1/account/'; + const endpoints = Object.freeze({ GetRouteInfo: { - url: (applicationAbbreviation) => `/content/api/v1/content/${applicationAbbreviation}/RouteInfo`, + url: (applicationAbbreviation) => `${baseContentUrl}/${applicationAbbreviation}/RouteInfo`, method: 'POST' }, GetHomepageInfo: { - url: (applicationAbbreviation) => `/content/api/v1/content/${applicationAbbreviation}/HomepageInfo`, + url: (applicationAbbreviation) => `${baseContentUrl}/${applicationAbbreviation}/HomepageInfo`, method: 'GET' }, GetPageData: { - url: (applicationAbbreviation, pageName) => `/content/api/v1/content/${applicationAbbreviation}/${pageName}`, + url: (applicationAbbreviation, pageName) => `${baseContentUrl}/${applicationAbbreviation}/${pageName}`, method: 'GET' }, GetAlertReasons: { - url: '/location/api/v1/location/alert-reasons', + url: `${baseLocationUrl}/alert-reasons`, method: 'GET' }, GetShopTimeSlots: { - url: '/schedule/api/v1/schedule/shop-time-slots', + url: `${baseScheduleUrl}/shop-time-slots`, method: 'POST' }, GetMobileTimeSlots: { - url: '/schedule/api/v1/schedule/mobile-time-slots', + url: `${baseScheduleUrl}/mobile-time-slots`, method: 'POST' }, GetMobilePremiumFee: { - url: '/parts/api/v1/parts/mobile-premium-fee', + url: `${basePartsUrl}/mobile-premium-fee`, method: 'GET' }, GetVehicleYears: { - url: '/vehicle/api/v1/vehicle/years', + url: `${baseVehicleUrl}/years`, method: 'GET' }, GetVehicleMakes: { - url: '/vehicle/api/v1/vehicle/makes/', + url: `${baseVehicleUrl}/makes/`, method: 'GET' }, GetVehicleModels: { - url: '/vehicle/api/v1/vehicle/models', + url: `${baseVehicleUrl}/models`, method: 'GET' }, GetVehicleStyles: { - url: '/vehicle/api/v1/vehicle/styles', + url: `${baseVehicleUrl}/styles`, method: 'GET' }, GetDamageOptions: { - url: '/parts/api/v1/parts/damage-options', + url: `${basePartsUrl}/damage-options`, method: 'GET' }, GetPartsOrQuestions: { - url: '/parts/api/v1/parts/parts-or-questions', + url: `${basePartsUrl}/parts-or-questions`, method: 'POST' }, GetParts: { - url: '/parts/api/v1/parts/parts', + url: `${basePartsUrl}/parts`, method: 'POST' }, + // TODO finish GetInsurancePriceOrderItems: { - url: '/price/api/v1/price/order-items-with-insurance-pricing', + url: () => `${basePriceUrl}/order-items-with-insurance-pricing`, method: 'GET' }, GetPriceOrderItems: { - url: '/price/api/v1/price/order-items', + url: `${basePriceUrl}/order-items`, method: 'GET' }, GetProviders: { - url: '/location/api/v1/location/providers', + url: `${baseLocationUrl}/providers`, method: 'GET' }, GetCapabilityQuestions: { - url: '/parts/api/v1/parts/capability-questions', + url: `${basePartsUrl}/capability-questions`, method: 'GET' }, GetPartFromCapabilityAnswer: { - url: '/parts/api/v1/parts/part-from-capability-answer', + url: `${basePartsUrl}/part-from-capability-answer`, method: 'POST' }, GetWipers: { - url: '/parts/api/v1/parts/wipers', + url: `${basePartsUrl}/wipers`, method: 'GET' }, GetRainDefense: { - url: '/parts/api/v1/parts/rain-defense', + url: `${basePartsUrl}/rain-defense`, method: 'GET' }, GetSupportingItems: { - url: '/parts/api/v1/parts/supporting-items', + url: `${basePartsUrl}/supporting-items`, method: 'POST' }, GetMobileFeePart: { - url: '/parts/api/v1/parts/mobile-fee', + url: `${basePartsUrl}/mobile-fee`, method: 'GET' }, GetServiceabilityDetails: { - url: '/location/api/v1/location/serviceability-details', + url: `${baseLocationUrl}/serviceability-details`, method: 'GET' }, GetVehicle: { - url: '/vehicle/api/v1/vehicle/lookup', + url: `${baseVehicleUrl}/lookup`, method: 'GET' }, GetAccountInfo: { - url: '/account/api/v1/account/', + url: baseAccountUrl, method: 'GET' }, LogExperimentExposureIfAssigned: { - url: '/experiments/api/v1/experiments/log-exposure', + url: `${baseExperimentsUrl}/log-exposure`, method: 'POST' }, LogPageView: { - url: '/analytics/api/v1/analytics/log-page-view', + url: `${baseAnalyticsUrl}/log-page-view`, method: 'POST' }, LogCustomEvent: { - url: '/analytics/api/v1/analytics/log-custom-event', + url: `${baseAnalyticsUrl}/log-custom-event`, method: 'POST' }, LookupVehicleByVin: { - url: '/vehicle/api/v1/vehicle/lookup', + url: `${baseVehicleUrl}/lookup`, method: 'POST' }, LookupVinByAddress: { - url: '/vehicle/api/v1/vehicle/lookup-vin-by-address', + url: `${baseVehicleUrl}/lookup-vin-by-address`, method: 'POST' }, LookupVinByPlate: { - url: '/vehicle/api/v1/vehicle/lookup-vin-by-plate', + url: `${baseVehicleUrl}/lookup-vin-by-plate`, method: 'POST' }, InitializeSession: { - url: '/analytics/api/v1/analytics/initialize', + url: `${baseAnalyticsUrl}/initialize`, method: 'POST' }, GetExperimentsByUser: { - url: '/analytics/api/v1/analytics/get-experiments', + url: `${baseAnalyticsUrl}/get-experiments`, method: 'GET' }, RunExperimentsForTrigger: { - url: '/experiments/api/v1/experiments/run', + url: `${baseExperimentsUrl}/run`, method: 'POST' }, ValidateZip: { - url: '/location/api/v1/location/zip', + url: `${baseLocationUrl}/zip`, method: 'GET' }, GooglePlaces: { url: (apiKey) => `https://maps.googleapis.com/maps/api/js?key=${apiKey}&libraries=places` }, ValidateClientTag: { - url: '/clientauth/api/v1/clientauth/validate-client-tag', + url: `${baseClientAuthUrl}/validate-client-tag`, method: 'GET' }, ValidateClientSignature: { - url: '/clientauth/api/v1/clientauth/validate-client-signature', + url: `${baseClientAuthUrl}/validate-client-signature`, method: 'POST' }, IsVinbyAddressPermissible: { - url: '/vehicle/api/v1/vehicle/is-vin-by-address-permissible', + url: `${baseVehicleUrl}/is-vin-by-address-permissible`, method: 'Get' }, CoveragePolicyInfo: { - url: '/coverage/api/v1/coverage/policy-information', + url: `${baseCoverageUrl}/policy-information`, method: 'POST' }, RegisterClaim: { - url: '/coverage/api/v1/coverage/register-claim', + url: `${baseCoverageUrl}/register-claim`, method: 'POST' }, SaveSession: { - url: '/order/api/v1/order/save-session/iss', + url: `${baseOrderUrl}/save-session/iss`, method: 'POST' }, LoadSession: { - url: '/order/api/v1/order/load-session', + url: `${baseOrderUrl}/load-session`, method: 'POST' }, DuplicateSearch: { // eslint-disable-next-line max-len - url: (accountNumber, policyNumber, dateOfLoss) => `/order/api/v1/order/duplicate-check/${accountNumber}/${policyNumber}/${dateOfLoss}`, + url: (accountNumber, policyNumber, dateOfLoss) => `${baseOrderUrl}/duplicate-check/${accountNumber}/${policyNumber}/${dateOfLoss}`, method: 'GET' }, FinalDeductible: { - url: '/coverage/api/v1/coverage/final-deductible', + url: `${baseCoverageUrl}/final-deductible`, method: 'POST' }, GetPaymentSignature: { - url: '/order/api/v1/order/sign', + url: `${baseOrderUrl}/sign`, method: 'POST' } }); diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index e9b23408..4e2caae7 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -54,7 +54,8 @@ export default { showAsPaid: Boolean, amountDueLabel: String, deductibleLabel: String, - basePriceLabel: String + basePriceLabel: String, + baseServiceLineItems: Array }, data() { return { @@ -69,19 +70,9 @@ export default { deductible() { return useMainStore().order.currentDeductible; }, - availableLineItems() { - // TODO make real - return [ - { - kitPrice: 1, - laborAmount: 2, - sellingPrice: 3 - } - ]; - }, // TODO share with claim registration page baseServicePrice() { - return this.availableLineItems + return this.baseServiceLineItems .reduce( (accumulator, lineItem) => accumulator + this.getTotalLineItemPrice(lineItem), 0 @@ -105,6 +96,10 @@ export default { return this.showAsPaid ? 0 : this.subTotal + this.salesTax; + }, + clonedGlassParts() { + const valueToClone = useMainStore().order.lineItems.glassParts ?? []; + return JSON.parse(JSON.stringify(valueToClone)) ?? []; } }, methods: { @@ -122,6 +117,34 @@ export default { return this.isUnverified && this.showDeductibleLineItem ? VERIFYING_COVERAGE : this.getFormattedAmount(amount); + }, + async temporaryMethod() { + // TODO need supporting items + // TODO need pricing results from getPriceOrderItems + // get base service line items + const supportingItems = await useMainStore().getSupportingItems(); + supportingItems.then((data) => { + // TODO do something + }); + const availableLineItems = [ + ...(supportingItems ?? []), + ...(this.clonedGlassParts) + ]; + + let pricingResults = []; + if (useMainStore().policy.policyLookupSuccessful && useMainStore().vehicle.policyVehicleId >= 0) { + // await useMainStore().getFinalDeductible(); + // I don't think we need to perform the getFinalDeductible call + // policy data is set in policy.policyData + pricingResults = await useMainStore().getPriceOrderItems(availableLineItems) + } + + // Call the "next" function to complete the transition to this page. + // vm.setSupportingItems(supportingItems); + // // eslint-disable-next-line no-param-reassign + // vm.availableLineItems = pricingResults; + // vm.initializeComponent(availableLineItems); + return []; } } }; diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index efdbb703..d7c6b0df 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -23,7 +23,8 @@ :showAsPaid="false" :amountDueLabel="amountDueText" :deductibleLabel="deductibleLabel" - :basePriceLabel="basePriceLabel" /> + :basePriceLabel="basePriceLabel" + :baseServiceLineItems="baseServiceLineItems" />
Pia Alert Placeholder
{ + let queryStringSnippet = `&LineItems[${index}].partNumber=${lineItem.partNumber}`; + if (lineItem.childParts) { + queryStringSnippet += getLineItemQueryStringForPricing(lineItem.childParts); + } + + return queryStringSnippet; + }).join(''); +} + +function addPricesToLineItems(lineItems, pricingLineItems) { + return lineItems.map((lineItem) => { + const updatedLineItem = lineItem; + updatedLineItem.childParts = lineItem.childParts.map((childItem) => addPricesToLineItems(childItem, pricingLineItems)); + + const lineItemIndex = pricingLineItems.findIndex((pricingLineItem) => pricingLineItem.partNumber === lineItem.partNumber); + + if (lineItemIndex > -1) { + const pricedLineItem = pricingLineItems[lineItemIndex]; + updatedLineItem.laborAmount = pricedLineItem.laborAmount; + updatedLineItem.sellingPrice = pricedLineItem.sellingPrice; + updatedLineItem.kitPrice = pricedLineItem.kitPrice; + } + return updatedLineItem; + }); +} + +const usePaymentStore = defineStore({ + id: paymentStoreId, + state: () => ({ + deductible: null, + coverageStatus: coverageStatuses.PENDING, + isITAC: false, + isNoComp: false, + baseServiceLineItems: null, + supportingItems: null + }), + getters: {}, + actions: { + setBaseServiceLineItems() { + this.baseServiceLineItems = []; + }, + async getPriceOrderItems(availableLineItems) { + const zipCodeToUse = this.order.serviceLocation.zipCode; + if (!this.order.serviceLocation.zipCodeCtu) { + const zipInfo = await this.validateZip({ zip: zipCodeToUse }); + this.order.serviceLocation.zipCodeCtu = zipInfo.data.zipCodeCtu; + } + const ctuToUse = this.order.serviceLocation.zipCodeCtu; + const availableLineItemsFormattedForRequest = getLineItemQueryStringForPricing(availableLineItems); + const deductibleToUse = this.order.currentDeductible ?? 0; + + let queryString = + `ParentAccountNumber=${this.order.accountNumber}` + + `&CTU=${ctuToUse}` + + `&Deductible=${deductibleToUse}` + + `&ZipCode=${zipCodeToUse}` + + `${availableLineItemsFormattedForRequest}`; + + const lineItemServerData = this.order.lineItems?.serverData; + if (lineItemServerData) { + queryString += `&ServerData=${encodeURIComponent(lineItemServerData)}`; + } + + const response = await globalMethods + .callHttpClient({ + method: endpoints.GetInsurancePriceOrderItems.method, + endpoint: `${endpoints.GetInsurancePriceOrderItems.url}?${queryString}` + }).catch((error) => { + console.error(error); + throw error; + }); + + if (response.data?.lineItems) { + const retAvailableLineItems = addPricesToLineItems(availableLineItems, response.data.lineItems); + return retAvailableLineItems; + } + return availableLineItems; + }, + async setSupportingItems() { + const glassPartsArray = useMainStore().lineItems.glassParts ?? []; + const { carId } = useMainStore().vehicle; + const { isRepair, numberOfChips } = useMainStore().damage; + + this.supportingItems = await globalMethods + .callHttpClient({ + method: endpoints.GetSupportingItems.method, + endpoint: endpoints.GetSupportingItems.url, + payload: { + carId, + damageType: isRepair ? 'Repair' : 'Replace', + parentAccountNumber: applicationConfig.CASH_PARENT_ACCOUNT_NUMBER, + parts: glassPartsArray, + numberOfRepairChips: isRepair ? numberOfChips : 0 + } + }); + } + }, + persist: true +}); + +export { usePaymentStore }; From 4d0a3524413cf9c36157228f105200234e0b23fa Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Fri, 1 Mar 2024 13:54:33 -0500 Subject: [PATCH 09/17] Forgot to save --- .../cart-dropdown/cart-dropdown.vue | 6 ---- .../coverage-statement/coverage-statement.vue | 9 ++++- src/store/paymentStore.js | 33 ++++++++----------- 3 files changed, 21 insertions(+), 27 deletions(-) diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index 4e2caae7..e29ed819 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -138,12 +138,6 @@ export default { // policy data is set in policy.policyData pricingResults = await useMainStore().getPriceOrderItems(availableLineItems) } - - // Call the "next" function to complete the transition to this page. - // vm.setSupportingItems(supportingItems); - // // eslint-disable-next-line no-param-reassign - // vm.availableLineItems = pricingResults; - // vm.initializeComponent(availableLineItems); return []; } } diff --git a/src/layouts/coverage-statement/coverage-statement.vue b/src/layouts/coverage-statement/coverage-statement.vue index bcdc76cb..1e5efb02 100644 --- a/src/layouts/coverage-statement/coverage-statement.vue +++ b/src/layouts/coverage-statement/coverage-statement.vue @@ -179,7 +179,13 @@ export default { await useMainStore().getFinalDeductible(); pricingResults = await useMainStore().getPriceOrderItems(availableLineItems) .catch((err) => { - useMainStore().setBailout(to, bailoutMessage.pricingResponseError(availableLineItems.map((li) => li.partNumber), { code: err.code, message: err.message, data: err.data })); + useMainStore().setBailout( + to, + bailoutMessage.pricingResponseError( + availableLineItems.map((li) => li.partNumber), + { code: err.code, message: err.message, data: err.data } + ) + ); hasBailedOut = true; next(`/?issPage=${issPageValues.BAILOUT_PAGE}`); }); @@ -306,6 +312,7 @@ export default { isRepair() { return useMainStore().order.damage.isRepair; }, + // TODO share totalServicePrice() { let total = 0; this.availableLineItems.forEach((lineItem) => { diff --git a/src/store/paymentStore.js b/src/store/paymentStore.js index 237c765e..21a74436 100644 --- a/src/store/paymentStore.js +++ b/src/store/paymentStore.js @@ -18,10 +18,10 @@ function getLineItemQueryStringForPricing(lineItems) { }).join(''); } -function addPricesToLineItems(lineItems, pricingLineItems) { +function getPricedLineItems(lineItems, pricingLineItems) { return lineItems.map((lineItem) => { const updatedLineItem = lineItem; - updatedLineItem.childParts = lineItem.childParts.map((childItem) => addPricesToLineItems(childItem, pricingLineItems)); + updatedLineItem.childParts = lineItem.childParts.map((childItem) => getPricedLineItems(childItem, pricingLineItems)); const lineItemIndex = pricingLineItems.findIndex((pricingLineItem) => pricingLineItem.partNumber === lineItem.partNumber); @@ -51,26 +51,19 @@ const usePaymentStore = defineStore({ this.baseServiceLineItems = []; }, async getPriceOrderItems(availableLineItems) { - const zipCodeToUse = this.order.serviceLocation.zipCode; - if (!this.order.serviceLocation.zipCodeCtu) { - const zipInfo = await this.validateZip({ zip: zipCodeToUse }); - this.order.serviceLocation.zipCodeCtu = zipInfo.data.zipCodeCtu; - } - const ctuToUse = this.order.serviceLocation.zipCodeCtu; + const { zipCode, zipCodeCtu } = useMainStore().order.serviceLocation; const availableLineItemsFormattedForRequest = getLineItemQueryStringForPricing(availableLineItems); - const deductibleToUse = this.order.currentDeductible ?? 0; + const deductibleToUse = this.currentDeductible ?? 0; let queryString = - `ParentAccountNumber=${this.order.accountNumber}` - + `&CTU=${ctuToUse}` - + `&Deductible=${deductibleToUse}` - + `&ZipCode=${zipCodeToUse}` - + `${availableLineItemsFormattedForRequest}`; + `ParentAccountNumber=${useMainStore().order.accountNumber}` + + `&CTU=${zipCodeCtu}` + + `&Deductible=${deductibleToUse}` + + `&ZipCode=${zipCode}` + + `${availableLineItemsFormattedForRequest}`; - const lineItemServerData = this.order.lineItems?.serverData; - if (lineItemServerData) { - queryString += `&ServerData=${encodeURIComponent(lineItemServerData)}`; - } + const lineItemServerData = useMainStore().lineItems?.serverData; + queryString += lineItemServerData ? `&ServerData=${encodeURIComponent(lineItemServerData)}` : ''; const response = await globalMethods .callHttpClient({ @@ -82,8 +75,8 @@ const usePaymentStore = defineStore({ }); if (response.data?.lineItems) { - const retAvailableLineItems = addPricesToLineItems(availableLineItems, response.data.lineItems); - return retAvailableLineItems; + const returnedAvailableLineItems = getPricedLineItems(availableLineItems, response.data.lineItems); + return returnedAvailableLineItems; } return availableLineItems; }, From 41a1d8b74cfb3b3244ebb84882cd080dc9f19b3c Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Fri, 8 Mar 2024 11:48:14 -0500 Subject: [PATCH 10/17] Using real line items --- .../cart-dropdown/cart-dropdown.vue | 45 +++---------------- src/layouts/payment-method/payment-method.vue | 21 ++++++--- src/store/index.js | 2 +- 3 files changed, 20 insertions(+), 48 deletions(-) diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index e29ed819..f9168eed 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -34,7 +34,7 @@ class="d-flex justify-content-between align-items-center"> {{ BasePriceLabel }} + class="label">{{ basePriceLabel }} {{ getDisplayed(baseServicePrice) }} @@ -44,6 +44,7 @@