diff --git a/src/helpers/line-items-helper.spec.js b/src/helpers/line-items-helper.spec.js index af8337a7..c191d852 100644 --- a/src/helpers/line-items-helper.spec.js +++ b/src/helpers/line-items-helper.spec.js @@ -1,6 +1,57 @@ import { getLineItemsFlattened } from '@/helpers/line-items-helper'; describe('getLineItemsFlattened', () => { + function mapLineItemsForGetITACPrice(lineItems) { + console.log(`before: ${JSON.stringify(lineItems)}`); + const x = lineItems.map(({ safelitePartNumber, childParts, ...rest }) => ({ + ...rest, + partNumber: safelitePartNumber, + childParts: childParts.map((part) => ({ + partNumber: part.safelitePartNumber + })) + })); + console.log(`after: ${JSON.stringify(x)}`); + return x; + } + describe.only('test', () => { + // Arrange + const lineItems = [{ + apple: 'a', + banana: 'b', + partNumber: 111, + safelitePartNumber: 222, + childParts: [ + { + partNumber: 333, + safelitePartNumber: 444 + }, + { + partNumber: 555, + safelitePartNumber: 666 + } + ] + }]; + const expected = [{ + apple: 'a', + banana: 'b', + partNumber: 222, + childParts: [ + { + partNumber: 444 + }, + { + partNumber: 666 + } + ] + }]; + + // Act + const result = mapLineItemsForGetITACPrice(lineItems); + console.log(JSON.stringify(result)); + + // Assert + expect(result).toMatchObject(expected); + }); describe('getLineItemsFlattened', () => { it('Returns empty array when null is passed', () => { // Arrange diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index ebb083fa..40993b6d 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -178,7 +178,7 @@ import { import { getPriceOfLineItems, getTaxOfLineItems } from '@/helpers/price-calculator'; const VERIFYING_COVERAGE = 'Verifying coverage'; -const RECYCLING_MODAL_REF_NAME = "RecycleModal"; +const RECYCLING_MODAL_REF_NAME = 'RecycleModal'; export default { name: 'cart-dropdown', @@ -234,6 +234,8 @@ export default { return getRecycleFeeLineItem(this.cartOrder); }, servicePrice() { + const x = getServiceLineItems(this.cartOrder); + console.log(`service line items: ${JSON.stringify(x)}`); return getPriceOfLineItems(getServiceLineItems(this.cartOrder)) ?? 0; }, isUnverified() { diff --git a/src/layouts/coverage-statement/coverage-statement.vue b/src/layouts/coverage-statement/coverage-statement.vue index 41f6d3b8..979ca436 100644 --- a/src/layouts/coverage-statement/coverage-statement.vue +++ b/src/layouts/coverage-statement/coverage-statement.vue @@ -382,6 +382,7 @@ export default { ...(this.mainStore.lineItems.supportingItems ?? []), ...(clonedGlassParts ?? []) ]; + console.log(`available line items: ${JSON.stringify(availableLineItems)}`); // We only call the ITAC pricing endpoint if we are not repair or we are NoComp if (!this.isRepair || this.mainStore.isNoComp) { diff --git a/src/mixins/vehicle-questions-mixin.js b/src/mixins/vehicle-questions-mixin.js index 76964e08..c5f59540 100644 --- a/src/mixins/vehicle-questions-mixin.js +++ b/src/mixins/vehicle-questions-mixin.js @@ -23,9 +23,10 @@ export default { glassParts.forEach((glass) => { if (Array.isArray(glass.parts) && glass.parts.length === 1) { const singlePart = glass.parts[0]; - if (singlePart){ + if (singlePart) { reducedGlassParts.push({ partNumber: singlePart.partNumber, + safelitePartNumber: singlePart.safelitePartNumber, description: singlePart.description, color: singlePart.color, partType: singlePart.partType, @@ -119,10 +120,10 @@ export default { }); // remove any disabled dependent answers - const answerQuestionNums = new Set(alreadyAnsweredQuestions[alreadyAnsweredQuestions.length-1].answeredQuestions.map(q => q.questionNum)); - glass.questions.forEach(q => { - if(!answerQuestionNums.has(q.questionSequence)) { - delete q.answerSelected + const answerQuestionNums = new Set(alreadyAnsweredQuestions[alreadyAnsweredQuestions.length - 1].answeredQuestions.map((q) => q.questionNum)); + glass.questions.forEach((q) => { + if (!answerQuestionNums.has(q.questionSequence)) { + delete q.answerSelected; } }); diff --git a/src/store/index.js b/src/store/index.js index 7f26d157..8df3849f 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1076,9 +1076,23 @@ export const useMainStore = defineStore({ return availableLineItems; }, + // TODO move to helper + // replaces partNumber, which is NAGS with the safelite part number + mapLineItemsForGetITACPrice(lineItems) { + const x = lineItems.map(({ safelitePartNumber, childParts, ...rest }) => ({ + ...rest, + partNumber: safelitePartNumber, + childParts: childParts.map((part) => ({ + partNumber: part.safelitePartNumber + })) + })); + return x; + }, + + // NOTE: The endpoint requires that safelite part numbers be used!! async getITACPriceOrderItems(availableLineItems) { const { policy, vehicle, contactInfo, serviceLocation, insuranceCoverage } = this.order; - + const lineItemsUsingSafelitePartNumber = this.mapLineItemsForGetITACPrice(availableLineItems); const response = await globalMethods .callHttpClient({ method: endpoints.GetITACPriceOrderItems.method, @@ -1088,7 +1102,7 @@ export const useMainStore = defineStore({ ReferralNumber: this.order.referralNumber, ReferralSequenceNumber: this.order.referralSequenceNumber, ReferralDate: `${this.order.referralDate}Z`, - lineItems: getLineItemsFlattened(availableLineItems), + lineItems: getLineItemsFlattened(lineItemsUsingSafelitePartNumber), ServerData: this.order.lineItems.serverData, ServiceZipCode: serviceLocation.zipCode, Customer: { @@ -1122,6 +1136,8 @@ export const useMainStore = defineStore({ const { lineItems, serverData, isItac, primaryBillToNumber } = response.data; + console.log(`response data: ${JSON.stringify(response.data)}`); + if (serverData) { this.order.lineItems.serverData = serverData; } @@ -1141,7 +1157,9 @@ export const useMainStore = defineStore({ } if (lineItems) { - const retAvailableLineItems = addPricesToLineItems(availableLineItems, lineItems); + console.log(`returned line items: ${JSON.stringify(lineItems)}`); + const retAvailableLineItems = addPricesToLineItems(availableLineItems, lineItems, false); + console.log(`line items with prices: ${JSON.stringify(retAvailableLineItems)}`); return retAvailableLineItems; } @@ -2767,14 +2785,22 @@ function convertGlassPieceNamingFromApi(glassArray) { return glassArray; } -function addPricesToLineItems(lineItems, pricingLineItems) { +// TODO does this work +// Note this is used for both the insurance and the itac endpoints, so it needs to deal with safelite or nags part numbers +function addPricesToLineItems(lineItems, pricingLineItems, pricedPartNumberIsNags = true) { const partOffset = {}; + const partNumberProperty = pricedPartNumberIsNags ? 'partNumber' : 'safelitePartNumber'; + + console.log(partNumberProperty); + console.log(lineItems[0].partNumber); + console.log(lineItems[0].safelitePartNumber); + console.log(lineItems[0][partNumberProperty]); lineItems.forEach((lineItem) => { if (lineItem.childParts) { addPricesToLineItems(lineItem.childParts, pricingLineItems); } - const pricedIndex = findLineItemIndex(pricingLineItems, lineItem.partNumber, partOffset[lineItem.partNumber] ?? 0); + const pricedIndex = findLineItemIndex(pricingLineItems, lineItem[partNumberProperty], partOffset[lineItem.partNumber] ?? 0); if (pricedIndex !== -1) { const pricedLineItem = pricingLineItems[pricedIndex]; lineItem.laborAmount = pricedLineItem.laborAmount;