import { DelhiveryAuthentication } from "./authentication"; import { MyGlobal as app } from "../globals"; import { DelhiveryAction, DelhiveryResponse, FlclTrackingRespons, TrackingArgs, TrackingHistory } from "./tracking.types"; import { extractErrMessage } from "./utility"; import { TrakingStatus } from "../constants"; import { FlclError } from "fc-logger"; export class Tracking { constructor() { } async getTrackingStatus(data: TrackingArgs) { try { const Authenticator = new DelhiveryAuthentication(); await Authenticator.authenticate(); const trackingURL = app.tracking_url?.replace("#WAYBILL_NO#", data.tracking_number) const TrackingResponse = await app.axios?.get(`${trackingURL}`); app.logger?.info({ className: 'Delhivery', methodName: 'getTrackingStatus', propertyName: 'TrackingResponse', propertyValue: { TrackingResponse: TrackingResponse?.data } }); const trackingData = this.buildTrackingResponse(TrackingResponse?.data, data); app.logger?.info({ className: 'Delhivery', methodName: 'getTrackingStatus', propertyName: 'trackingData', propertyValue: trackingData }); return trackingData; } catch (e) { throw e; } } private buildTrackingResponse(delhiveryTrackingResponse: DelhiveryResponse, args: TrackingArgs) { try { let response: FlclTrackingRespons = { reference: args.reference_id, tracking_number: args.tracking_number, tracking_history: [] } if (delhiveryTrackingResponse.payload.waybills_found.length <= 0) { var errorMessage= delhiveryTrackingResponse?.payload?.waybills_not_found[0]?.status || `No data found in waybillResponse`; throw FlclError.create({ className: 'Delhivery', methodName: 'getTrackingStatus', message: extractErrMessage(errorMessage) , propertyName: 'delhiveryTrackingResponse', propertyValue: { delhiveryTrackingResponse: delhiveryTrackingResponse } }); } const delhiveryScans = delhiveryTrackingResponse.payload.waybills_found[0].scans; delhiveryScans.forEach((delhiveryScan) => { let history: TrackingHistory = { code: delhiveryScan.action, status: this.getDelhiveryTrackingStatus(delhiveryScan.action), status_date: new Date(delhiveryScan.time * 1000), event_date: delhiveryScan.time * 1000, status_detail: `${delhiveryScan.remarks}${delhiveryScan.carrier_remarks ? ` ,${delhiveryScan.carrier_remarks}` : ``}`, carrier: 'Delhivery', location: this.getLocationDetails(delhiveryScan.city, delhiveryScan.state), country: '' } response.tracking_history.push(history) }); return response; } catch (e) { throw e } } private getLocationDetails(city: string, state: string) { return `${city?.replace("/_/gi", " ")}${state ? `, ${state}` : ``}` } private getDelhiveryTrackingStatus(action: DelhiveryAction) { const status = TrakingStatus[action] || ''; if (!status) { app.logger?.error({ className: 'Delhivery', methodName: 'getTrackingStatus', message: "The delhivery tracking status is not found in flavorcloud system.", propertyName: 'DelhiveryTrackingStatus', propertyValue: action }); } return status; } }