migros-api-wrapper
Version:
Making the api of migros more accessible to the public.
188 lines • 9.69 kB
JavaScript
;
/* eslint-disable @typescript-eslint/naming-convention */
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getCumulusReceipts = exports.getCumulusReceiptFromUrl = exports.getCumulusReceipt = void 0;
const cheerio = __importStar(require("cheerio"));
const requests_1 = require("../../utils/requests");
const apiPaths_1 = require("../apiPaths");
const Language_1 = require("../enums/Language");
const urlExport = apiPaths_1.migrosApiPaths["account"].purchases.receipts;
const urlList = apiPaths_1.migrosApiPaths["account"].purchases.receipts;
const defaultCumulusReceiptOptions = {
transactionId: "",
fallbackLanguage: Language_1.Language.DE,
type: "HTML",
};
async function getCumulusReceiptRequest(url, options, cookies, htmlOnly) {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1;
const headers = {
accept: "application/json, text/plain, */*",
"accept-language": "en-US,en;q=0.5",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin",
"X-CSRF-TOKEN": cookies.CSRF || "",
Referer: "https://account.migros.ch/purchases/receipts",
};
const response = await (0, requests_1.getRequest)(url, options, headers, cookies);
if (!response.text) {
throw new Error("No receipt has been found!");
}
if (htmlOnly) {
return await response.text();
}
const $ = cheerio.load(await response.text());
const articles = $("[class='article pre']").text().split("\n");
const store = $("[class='store text-center pre']").text().split("\n");
const discountRounding = $("[class='discount pre']")
.text()
.trim()
.split(/\s\s+/)[1];
const discountTotal = $("[class='discounttotal pre']")
.text()
.trim()
.split(/\s\s+/)[1];
const totalCost = $("[class='total pre']").text().trim().split(/\s+/);
const payment = $("[class='payment pre']").text().split("\n");
const eftPayment = $("[class='eftpayments pre']").text().split("\n");
const cumulus = $("[class='cumukus pre']").text().split("\n");
const footer = $("[class='footer pre']").text().split("\n");
const receiptArticles = [];
// eslint-disable-next-line no-loops/no-loops
for (let i = 2; i < articles.length - 1; i++) {
const receiptArticleStringArray = articles[i].trim().split(/\s\s+/);
receiptArticles.push({
product: receiptArticleStringArray[0],
count: parseFloat(receiptArticleStringArray[1]),
price: {
single: parseFloat(receiptArticleStringArray[2]),
discount: receiptArticleStringArray.length === 6
? parseFloat(receiptArticleStringArray[3])
: 0,
total: receiptArticleStringArray.length === 6
? parseFloat(receiptArticleStringArray[4])
: parseFloat(receiptArticleStringArray[3]),
},
});
}
return {
store: {
cooperative: store[0].trim(),
outlet: (_a = store[1]) === null || _a === void 0 ? void 0 : _a.trim(),
},
articles: receiptArticles,
discount: {
rounding: discountRounding
? parseFloat(discountRounding.split("-")[0])
: 0,
total: parseFloat(discountTotal) || 0,
},
total: {
value: parseFloat(totalCost[2]),
currency: totalCost[1],
},
payment: {
value: parseFloat((_b = payment[0].trim().split(/\s\s+/)[1]) === null || _b === void 0 ? void 0 : _b.trim()),
type: payment[0].trim().split(/\s\s+/)[0].trim(),
return: payment[1]
? parseFloat((_c = payment[1].trim().split(/\s\s+/)[1]) === null || _c === void 0 ? void 0 : _c.trim())
: 0,
},
eft: eftPayment
? {
booking: {
type: (_e = (_d = eftPayment[1]) === null || _d === void 0 ? void 0 : _d.trim().split(/\s\s+/)[1]) === null || _e === void 0 ? void 0 : _e.trim(),
card: (_f = eftPayment[2]) === null || _f === void 0 ? void 0 : _f.trim(),
},
date: new Date(+((_g = eftPayment[3]) === null || _g === void 0 ? void 0 : _g.trim().split(/\s\s+/)[0].trim().split(".")[2]), +((_h = eftPayment[3]) === null || _h === void 0 ? void 0 : _h.trim().split(/\s\s+/)[0].trim().split(".")[1]) - 1, +((_j = eftPayment[3]) === null || _j === void 0 ? void 0 : _j.trim().split(/\s\s+/)[0].trim().split(".")[0]), +((_k = eftPayment[3]) === null || _k === void 0 ? void 0 : _k.trim().split(/\s\s+/)[1].trim().split(":")[0]), +((_l = eftPayment[3]) === null || _l === void 0 ? void 0 : _l.trim().split(/\s\s+/)[1].trim().split(":")[1]), 0),
total: parseFloat((_m = eftPayment[5]) === null || _m === void 0 ? void 0 : _m.trim().split(/\s\s+/)[1].trim()),
}
: null,
cumulus: {
nr: (_o = cumulus[2]) === null || _o === void 0 ? void 0 : _o.trim().split(/\s\s+/)[1],
points: {
current: parseFloat((_p = cumulus[3]) === null || _p === void 0 ? void 0 : _p.trim().split(/\s\s+/)[1]),
received: parseFloat((_q = cumulus[4]) === null || _q === void 0 ? void 0 : _q.trim().split(/\s\s+/)[1]),
},
},
details: {
outlet: (_r = footer[2]) === null || _r === void 0 ? void 0 : _r.trim().split(/\s\s+/)[0],
bed: (_s = footer[2]) === null || _s === void 0 ? void 0 : _s.trim().split(/\s\s+/)[1],
box: (_t = footer[2]) === null || _t === void 0 ? void 0 : _t.trim().split(/\s\s+/)[2],
bon: (_u = footer[2]) === null || _u === void 0 ? void 0 : _u.trim().split(/\s\s+/)[3],
date: new Date(+((_v = footer[2]) === null || _v === void 0 ? void 0 : _v.trim().split(/\s\s+/)[4].split(".")[2]), +((_w = footer[2]) === null || _w === void 0 ? void 0 : _w.trim().split(/\s\s+/)[4].split(".")[1]) - 1, +((_x = footer[2]) === null || _x === void 0 ? void 0 : _x.trim().split(/\s\s+/)[4].split(".")[0]), +((_y = footer[2]) === null || _y === void 0 ? void 0 : _y.trim().split(/\s\s+/)[5].split(":")[0]), +((_z = footer[2]) === null || _z === void 0 ? void 0 : _z.trim().split(/\s\s+/)[5].split(":")[1]), +((_0 = footer[2]) === null || _0 === void 0 ? void 0 : _0.trim().split(/\s\s+/)[5].split(":")[2])),
letter: (_1 = footer[2]) === null || _1 === void 0 ? void 0 : _1.trim().split(/\s\s+/)[6].trim(),
},
};
}
async function getCumulusReceipt(cumulusReceiptOptions, cookies, htmlOnly = false) {
cumulusReceiptOptions = {
...defaultCumulusReceiptOptions,
...cumulusReceiptOptions,
};
return getCumulusReceiptRequest(urlExport + "/" + cumulusReceiptOptions.receiptId, cumulusReceiptOptions, cookies, htmlOnly);
}
exports.getCumulusReceipt = getCumulusReceipt;
async function getCumulusReceiptFromUrl(url, cookies, htmlOnly = false) {
url = apiPaths_1.migrosApiPaths["cumulus"] + url;
return getCumulusReceiptRequest(url, {}, cookies, htmlOnly);
}
exports.getCumulusReceiptFromUrl = getCumulusReceiptFromUrl;
function convertDateToCumulusDateString(date) {
const offset = date.getTimezoneOffset();
date = new Date(date.getTime() - offset * 60 * 1000);
return date.toISOString().split("T")[0];
}
const defaultCumulusReceiptsOptions = {
dateFrom: new Date(),
dateTo: new Date(),
};
async function getCumulusReceiptsRequest(url, options, cookies) {
const headers = {
accept: "application/json, text/plain, */*",
"accept-language": "en-US,en;q=0.5",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin",
"X-CSRF-TOKEN": cookies.CSRF || "",
Referer: "https://account.migros.ch/purchases/receipts",
};
const newOptions = {
dateFrom: convertDateToCumulusDateString(options.dateFrom),
dateTo: convertDateToCumulusDateString(options.dateTo || new Date()),
};
const response = await (0, requests_1.getRequest)(url, newOptions, headers, cookies);
return await response.json();
}
async function getCumulusReceipts(cumulusReceiptsOptions, cookies) {
cumulusReceiptsOptions = {
...defaultCumulusReceiptsOptions,
...cumulusReceiptsOptions,
};
return getCumulusReceiptsRequest(urlList, cumulusReceiptsOptions, cookies);
}
exports.getCumulusReceipts = getCumulusReceipts;
//# sourceMappingURL=receipts.js.map