UNPKG

@golemio/parkings

Version:
135 lines 6.34 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.TSKParkingTariffTransformation = void 0; const integration_engine_1 = require("@golemio/core/dist/integration-engine"); const _sch_1 = require("../../schema-definitions"); const uuid_by_string_1 = __importDefault(require("uuid-by-string")); const TskCalculationHelper_1 = require("../helpers/TskCalculationHelper"); const DayMap = { "1": "Mo", "2": "Tu", "3": "We", "4": "Th", "5": "Fr", "6": "Sa", "7": "Su", // 0 in input data }; class TSKParkingTariffTransformation extends integration_engine_1.BaseTransformation { constructor() { super(); this.transform = async (data) => { const { tsk, lastUpdated } = data; const tariffMap = tsk.reduce((acc, item) => ({ ...acc, [item["CTARIF"]]: [...(acc[item["CTARIF"]] || []), item] }), {}); const dayAggregation = []; for (const key in tariffMap) { dayAggregation.push(this.aggregateByDay(tariffMap[key])); } const flattenHoliday = []; for (const key in dayAggregation) { flattenHoliday.push(this.flattenPayAtHoliday(dayAggregation[key])); } const result = []; for (const key in flattenHoliday) { result.push(...this.transformElement({ data: flattenHoliday[key], lastUpdated })); } return result; }; this.hasEqualDescription = (itemA, itemB) => itemA.TimeFrom === itemB.TimeFrom && itemA.TimeTo === itemB.TimeTo && itemA.PricePerHour == itemB.PricePerHour && itemA.MaxParkingTime === itemB.MaxParkingTime && itemA.MaxPrice === itemB.MaxPrice && itemA.MinPrice === itemB.MinPrice; this.aggregateByDay = (tariffMapItem) => { return tariffMapItem.reduce((acc, current) => { const ind = acc.findIndex((item) => { return item.PayAtHoliday === current.PayAtHoliday && this.hasEqualDescription(item, current); }); const { Day, ...rest } = current; if (ind === -1) { acc.push({ ...rest, Day: [Day === "0" ? "7" : Day] }); } else { acc[ind].Day.push(Day === "0" ? "7" : Day); } return acc; }, []); }; this.flattenPayAtHoliday = (tariffMapItem) => { return tariffMapItem.reduce((acc, current) => { const ind = acc.findIndex((item) => { return (this.hasEqualDescription(item, current) && JSON.stringify(item.Day.sort()) === JSON.stringify(current.Day.sort())); }); const { PayAtHoliday, Day, ...rest } = current; if (ind === -1) { acc.push({ ...rest, Day: Day.sort(), PayAtHoliday: [PayAtHoliday] }); } else { acc[ind].PayAtHoliday.push(PayAtHoliday); } return acc; }, []); }; this.dayFormatter = (data) => { let seqLength = 0; let dateString = `${DayMap[data[0]]}`; for (let i = 1; i < data.length; i++) { if (+data[i - 1] + 1 === +data[i] && data[i + 1]) { seqLength++; continue; } seqLength ? (dateString += `-${DayMap[data[i]]}`) : (dateString += `,${DayMap[data[i]]}`); } return dateString; }; this.openingHoursFormatter = (day, time, payAtHoliday) => { const payAtHolidayText = payAtHoliday.length === 1 ? (payAtHoliday[0] === "YES" ? "; PH only" : "; PH off") : ""; return `${day} ${time}` + `${payAtHolidayText}`; }; this.transformElement = (element) => { const { lastUpdated, data } = element; const result = []; for (const item of data) { const dayString = this.dayFormatter(item.Day); const desc = { tariff_id: (0, uuid_by_string_1.default)(`${this.dataSource}`.toUpperCase() + item.CTARIF), last_updated: lastUpdated.toISOString(), source: this.dataSource, payment_mode: "", payment_additional_description: "Parkování Praha", free_of_charge: item.PricePerHour == 0, charge_band_name: item.CTARIF, charge_currency: "CZK", start_time_of_period: this.openingHoursFormatter(dayString, item.TimeFrom, item.PayAtHoliday), end_time_of_period: this.openingHoursFormatter(dayString, item.TimeTo, item.PayAtHoliday), }; result.push({ ...desc, charge_interval: TskCalculationHelper_1.TskCalculationHelper.getChargeInterval(+item.MinPrice, +item.PricePerHour), max_iterations_of_charge: TskCalculationHelper_1.TskCalculationHelper.getMaxChargeIterations(+item.MaxParkingTime, +item.MinPrice, +item.PricePerHour), charge: TskCalculationHelper_1.TskCalculationHelper.getCharge(+item.MinPrice, +item.PricePerHour), charge_order_index: result.length, accepts_litacka: true, }); if (+item.PricePerHour !== 0 && item.MaxPrice !== "0") { result.push({ ...desc, charge: +item.MaxPrice, charge_order_index: result.length, charge_type: "maximum", accepts_litacka: true, }); } } return result; }; this.name = _sch_1.Parkings.tsk.name + "Data"; this.dataSource = "tsk"; } } exports.TSKParkingTariffTransformation = TSKParkingTariffTransformation; //# sourceMappingURL=TSKParkingTariffTransformation.js.map