@golemio/parkings
Version:
Golemio Parkings Module
135 lines • 6.34 kB
JavaScript
;
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