import { UserDataState } from '../state/UserDataState'; import { QuoteClient } from '../clients/QuoteClient'; import { AddressClient } from '../clients/AddressClient'; import { AppConfigType } from '../entities/AppConfig'; import { Quote, QuoteWithMeters, SaveQuoteRequest, SaveQuoteResponse } from '../entities/Quote'; import { SupplierTariffRequestParams } from '../entities/Suppliers'; import { Region } from '../entities/Enums'; import { QuoteRequestConversions } from '../conversions/QuoteRequestConversions'; import { AnalyticsService } from './AnalyticsService'; import { Address, Meter } from "../entities/Address"; export class QuoteService { quoteState: QuoteWithMeters; constructor(private appConfig: AppConfigType, private $q: QService, private quoteClient: QuoteClient, private addressClient: AddressClient, private userDataState: UserDataState, private analyticsService: AnalyticsService) { } /** Cleans any previous quote from memory. */ clear() { delete this.quoteState; } /** Returns the quote in memory, or if absent, generates a new quote. */ getQuote(): Promise { if (this.quoteState) return this.$q.when(this.quoteState); else return this.getNewQuote(); } /** Forces generation of a new quote and overwrites any existing in memory quote. */ getNewQuote(): Promise { return this.getMeters() .then(meters => this.getQuoteByType().then( quote => ({ ...quote.data, meters })) ); } /** Assumes it is move in in case address is already on supply, on error sets meters to [] */ private getMeters(): Promise { return this.addressClient.getMeterDetails(this.mergeMeterPointNumbers(this.userDataState.supplyAddress)) .then(meters => { if ( meters.data.length > 0 ) { meters.data.forEach((meter) => { if (meter.fuel === 'Gas') this.userDataState.gasUsage = meter.eac_qa; if (meter.fuel === 'Electricity') this.userDataState.electricityUsage = meter.eac_qa; }); // only setting the quote type to move in if the eac qa is set to something different from 0 if (this.userDataState.electricityUsage && (this.userDataState.fuel === 'Electricity' || this.userDataState.gasUsage)) { this.userDataState.quoteType = 'MoveIn'; } } return meters.data; }) .catch(() => [] ); } // Pass other methods through to underlying client so controllers don't have the extra dependency suppliers(region: Region) { return this.quoteClient.suppliers(region); } supplierTariffs(params: SupplierTariffRequestParams) { return this.quoteClient.supplierTariffs(params); } saveQuote(request: SaveQuoteRequest): HttpPromise { return this.quoteClient.saveQuote(request); } retrieveSavedQuote(id: string) { return this.quoteClient.retrieveSavedQuote(id); } private mergeMeterPointNumbers(address: Address): string { if (address.mpans) return (address.mprns)? address.mpans.concat(address.mprns).join(): address.mpans.join(); if (address.mprns) return (address.mpans)? address.mpans.concat(address.mprns).join(): address.mprns.join(); } /** For internal use only - doesn't store the generated quote state. */ private getQuoteByType(): HttpPromise { const quoteConversions = new QuoteRequestConversions(this.userDataState, this.appConfig.retailer); switch (this.userDataState.quoteType) { case 'Quick': const params = quoteConversions.convertToQuickQuoteParams(); this.analyticsService.push({event: 'GetQuickQuote', ...params}); return this.quoteClient.quickQuote(params); case 'Estimated': return this.quoteClient.estimatedQuote(quoteConversions.convertToEstimatedQuoteParams()); case 'UsageBased': return this.quoteClient.usageBasedQuote(quoteConversions.convertToUsageBasedQuoteParams()); case 'MoveIn': return this.quoteClient.moveInQuote(quoteConversions.convertToMoveInQuoteParams()); default: return this.$q.reject("Invalid quote type"); } } }