import { debugLog } from "@/helpers/debug-log-helper.js"; import { AppointmentTypeStrings } from "@/constants/schedule-constants"; import { coverageStatus } from "@/constants/insurance"; import { applicationConfig } from "@/constants/application-config"; /** * Logs the start of the page prerequisites check. * Should be used on pages before the page prerequisites check is executed. * @param {string} source - The source of the page prerequisites check. * @param {boolean} preReqResult - The result of the page prerequisites check. */ export function logPagePrereqsStart(source, preReqResult) { // prettier-ignore { debugLog(`--- ${source} pagePrereqs start ---`, null, !preReqResult); } } /** * Logs the end of the page prerequisites check. * Should be used on pages after the page prerequisites check is executed. * @param {string} source - The source of the page prerequisites check. * @param {boolean} preReqResult - The result of the page prerequisites check. */ export function logPagePrereqsEnd(source, preReqResult) { // prettier-ignore { debugLog(`--- ${source} pagePrereqs end ---`, null, !preReqResult); } } /** * Flushes the page prerequisites logs. * @param {string} source - The source of the page prerequisites check. This is the page name most places. * @param {boolean} preReqResult - The result of the page prerequisites check. * @param {Array} logQueue - The queue of log functions. */ export function flushPagePrereqsLogs(source, preReqResult, logQueue) { logPagePrereqsStart(source, preReqResult); logQueue.forEach((fn) => fn()); logPagePrereqsEnd(source, preReqResult); } /** * Pushes a log function to the log queue. * @param {Array} logQueue - The queue of log functions. * @param {Function} logFn - The log function to be executed. */ function queueLogging(logQueue, logFn) { if (logQueue) { logQueue.push(logFn); } } /** * Checks whether the service zip code information is valid for the order. * Should be used on pages after service zip code collection is complete. * Returns true if the zip code and zip code CTU are present on serviceLocation. */ export function hasServiceZipInfo(order, logQueue = null) { const serviceLocation = order.serviceLocation; const result = !!(serviceLocation.zipCode && serviceLocation.zipCodeCtu); queueLogging(logQueue, () => { // prettier-ignore { debugLog("hasServiceZipInfo:", result, !result); debugLog("serviceLocation.zipCode:", serviceLocation.zipCode, !result); debugLog("serviceLocation.zipCodeCtu:", serviceLocation.zipCodeCtu, !result); debugLog("", null, !result); } }); return result; } /** * Checks whether the service location information is valid for the appointment. * Returns true if the required info is present for the chosen appointment type. * For MOBILE: address, city, state, and zipCode must be present on serviceLocation. * For INSHOP/DROPOFF: all provider address fields must be present. */ export function hasServiceLocationInfo(order, logQueue = null) { const serviceLocation = order.serviceLocation; const mobileReqs = !!( serviceLocation.address && serviceLocation.city && serviceLocation.state && serviceLocation.zipCode ); const providerLocation = serviceLocation.provider.address; const dropOffInshopReqs = !!( providerLocation.streetAddress && providerLocation.city && providerLocation.state && providerLocation.zipCode ); const isMobile = serviceLocation.appointmentType === AppointmentTypeStrings.MOBILE; const result = (isMobile && mobileReqs) || (!isMobile && dropOffInshopReqs); queueLogging(logQueue, () => { // prettier-ignore { debugLog("hasServiceLocationInfo mobileReqs:", mobileReqs, !result); debugLog("serviceLocation.address:", serviceLocation.address, !result); debugLog("serviceLocation.city:", serviceLocation.city, !result); debugLog("serviceLocation.state:", serviceLocation.state, !result); debugLog("serviceLocation.zipCode:", serviceLocation.zipCode, !result); debugLog("dropOffInshopReqs:", dropOffInshopReqs, !result); debugLog("providerLocation.streetAddress:", providerLocation.streetAddress, !result); debugLog("providerLocation.city:", providerLocation.city, !result); debugLog("providerLocation.state:", providerLocation.state, !result); debugLog("providerLocation.zipCode:", providerLocation.zipCode, !result); debugLog("", null, !result); } }); return result; } /** * Checks whether the insurance information is valid for the order. To be used after all insurance info collection is complete. * Returns true if cash selected or if insurance is selected and some insurance fields are present. */ export function hasInsuranceInfo(order, logQueue = null) { const isInsurance = order.payment?.isInsurance; const insuranceCoverageStatus = order.payment?.insuranceCoverage?.coverageStatus; const currentDeductible = order.policy?.currentDeductible; const parentAccountNumber = order.payment?.parentAccountNumber; const policyNumber = order.policy?.policyNumber; let result = false; if (isInsurance !== null) { if (isInsurance === false) { result = true; // Cash selected - no need for policy number or parent account } else { const parentAccountNotCash = parentAccountNumber !== applicationConfig.CASH_PARENT_ACCOUNT_NUMBER; const hasPolicyNumber = !!policyNumber; if (!parentAccountNotCash || !hasPolicyNumber) { result = false; } else if ( insuranceCoverageStatus === coverageStatus.VERIFIED && !(currentDeductible === 0 || currentDeductible > 0) ) { result = false; // if coverageStatus is verified there must be a valid deductible also } else { result = true; } } } queueLogging(logQueue, () => { // prettier-ignore { debugLog("hasInsuranceInfo:", result, !result); if (isInsurance === true) { debugLog("hasInsuranceInfo parentAccountNumber:", parentAccountNumber, !result); debugLog("hasInsuranceInfo policyNumber:", policyNumber, !result); } if (insuranceCoverageStatus === coverageStatus.VERIFIED) { debugLog("hasInsuranceInfo coverageStatus:", insuranceCoverageStatus, !result); debugLog("hasInsuranceInfo currentDeductible:", currentDeductible, !result); } debugLog("", null, !result); } }); return result; } /** * Checks whether the scheduling information is valid for the order. * Should be used on pages after scheduling info collection is complete. * Returns true if the required info is present for the chosen appointment type. * For MOBILE: date, startTime, endTime, jobMaxMinutes, and jobMinMinutes must be present on schedule. * For INSHOP/DROPOFF: all provider scheduling fields must be present. */ export function hasSchedulingInfo(order, logQueue = null) { const schedule = order.schedule; const result = !!( schedule.date && schedule.startTime && schedule.endTime && schedule.jobMaxMinutes && schedule.jobMinMinutes ); queueLogging(logQueue, () => { // prettier-ignore { debugLog("hasSchedulingInfo:", result, !result); debugLog("schedule.date:", schedule.date, !result); debugLog("schedule.startTime:", schedule.startTime, !result); debugLog("schedule.endTime:", schedule.endTime, !result); debugLog("schedule.jobMaxMinutes:", schedule.jobMaxMinutes, !result); debugLog("schedule.jobMinMinutes:", schedule.jobMinMinutes, !result); debugLog("", null, !result); } }); return result; } /** * Checks whether the customer information is valid for the order. * Should be used on pages after customer info collection is complete. * Returns true if the firstName, lastName, phoneNumber, and emailAddress are present on customer. */ export function hasCustomerInfo(order, logQueue = null) { const customer = order.customer; const result = !!( customer.firstName && customer.lastName && customer.phoneNumber && customer.emailAddress ); queueLogging(logQueue, () => { // prettier-ignore { debugLog("hasCustomerInfo:", result, !result); debugLog("customer.firstName:", customer.firstName, !result); debugLog("customer.lastName:", customer.lastName, !result); debugLog("customer.phoneNumber:", customer.phoneNumber, !result); debugLog("customer.emailAddress:", customer.emailAddress, !result); debugLog("", null, !result); } }); return result; } /** * Checks whether the glass parts or repair information is valid for the order. * Should be used on pages after glass parts or repair info collection is complete. * Returns true if the isRepair is true or if the glassParts array is not empty. */ export function hasGlassPartsOrRepairInfo(order, logQueue = null) { const isRepair = order.damage?.isRepair; const glassParts = order.lineItems?.glassParts; const hasGlassParts = glassParts != null && glassParts.length > 0; const result = !!isRepair || hasGlassParts; queueLogging(logQueue, () => { // prettier-ignore { debugLog("hasGlassPartsOrRepairInfo:", result, !result); debugLog("damage.isRepair:", isRepair, !result); debugLog("lineItems.glassParts:", glassParts, !result); debugLog("", null, !result); } }); return result; } /** * Checks whether the payment method information is valid for the order. * Should only be used on pages after payment method info collection is complete which is only the payment collection pages. * Returns true if the isPia is true or if the piaType is set. */ export function hasPaymentMethodInfo(order, logQueue = null) { const payment = order.payment; const result = payment.isPia !== null && (payment.isPia || !!payment.piaType); queueLogging(logQueue, () => { // prettier-ignore { debugLog("hasPaymentMethodInfo:", result, !result); debugLog("payment.isPia:", payment?.isPia, !result); debugLog("payment.piaType:", payment?.piaType, !result); debugLog("", null, !result); } }); return result; }