Fix Billa weighted item prices analogously to Spar. See #10

This commit is contained in:
Mario Zechner 2023-05-20 15:38:29 +02:00
parent 978354d69e
commit 46bc81dff3
5 changed files with 839 additions and 18 deletions

View File

@ -54,7 +54,7 @@ function billaToCanonical(rawItems, today) {
name: item.data.name,
price: item.data.price.final,
priceHistory: [{ date: today, price: item.data.price.final }],
unit: item.data.grammage
unit: item.data.grammagePriceFactor != 1 ? item.data.grammage : "kg"
});
}
return canonicalItems;
@ -133,7 +133,7 @@ function mergePriceHistory(oldItems, items) {
/// Given a directory of raw data of the form `billa-$date.json` and `spar-$date.json`, constructs
/// a canonical list of all products and their historical price data.
function replay(rawDataDir) {
exports.replay = function(rawDataDir) {
const today = currentDate();
const files = fs.readdirSync(rawDataDir).filter(
@ -218,19 +218,3 @@ exports.updateData = async function (dataDir, done) {
if (done) done(items);
return items;
}
async function restore() {
console.log("Restoring data");
writeJSON("data/latest-canonical.json", replay("data"));
await exports.updateData("data");
const today = currentDate();
const items = readJSON("data/latest-canonical.json");
for (item of items) {
if (item.priceHistory[0].date == today && item.priceHistory.length > 1) {
console.log(`${item.store} ${item.name} ${item.priceHistory[1].price} -> ${item.priceHistory[0].price}`);
}
}
}
// writeJSON("data/latest-canonical-replay.json", replay("data"));
// restore()

5
restore.js Normal file
View File

@ -0,0 +1,5 @@
const fs = require("fs");
const analysis = require("./analysis.js");
fs.copyFileSync("docker/data/latest-canonical.json", "docker/data/latest-canonical-old.json");
fs.writeFileSync("docker/data/latest-canonical.json", JSON.stringify(analysis.replay("docker/data"), null, 2));

780
site/carts.json Normal file
View File

@ -0,0 +1,780 @@
[
{
"name": "Butter",
"items": [
{
"store": "billa",
"id": "00-425413",
"name": "Clever Österreichische Teebutter",
"price": 1.85,
"priceHistory": [
{
"date": "2023-05-15",
"price": 1.85
}
],
"unit": "250 Gramm Packung",
"search": "clever österreichische teebutter 250 gramm packung"
},
{
"store": "hofer",
"id": 546430,
"name": "MILFINA Teebutter 250g",
"price": 1.85,
"priceHistory": [
{
"date": "2023-05-18",
"price": 1.85
}
],
"unit": "252 gramm",
"search": "milfina teebutter 250g 252 gramm"
},
{
"store": "spar",
"id": "8798786420737",
"name": "S-BUDGET Butter",
"price": 1.85,
"priceHistory": [
{
"date": "2023-05-15",
"price": 1.85
}
],
"unit": "250 G",
"search": "s-budget butter 250 g"
}
]
},
{
"name": "Eigenmarken Grundnahrungsmittel",
"items": [
{
"store": "billa",
"id": "00-425413",
"name": "Clever Österreichische Teebutter",
"price": 1.85,
"priceHistory": [
{
"date": "2023-05-15",
"price": 1.85
}
],
"unit": "250 Gramm Packung",
"search": "clever österreichische teebutter 250 gramm packung"
},
{
"store": "spar",
"id": "8798786420737",
"name": "S-BUDGET Butter",
"price": 1.85,
"priceHistory": [
{
"date": "2023-05-15",
"price": 1.85
}
],
"unit": "250 G",
"search": "s-budget butter 250 g"
},
{
"store": "hofer",
"id": 546430,
"name": "MILFINA Teebutter 250g",
"price": 1.85,
"priceHistory": [
{
"date": "2023-05-18",
"price": 1.85
}
],
"unit": "252 gramm",
"search": "milfina teebutter 250g 252 gramm"
},
{
"store": "billa",
"id": "00-594850",
"name": "Clever Weizenmehl W700 Glatt",
"price": 0.85,
"priceHistory": [
{
"date": "2023-05-18",
"price": 0.85
},
{
"date": "2023-05-15",
"price": 0.99
}
],
"unit": "1 Kilogramm Packung",
"search": "clever weizenmehl w700 glatt 1 kilogramm packung"
},
{
"store": "billa",
"id": "00-760899",
"name": "Clever Mehl Universal",
"price": 0.85,
"priceHistory": [
{
"date": "2023-05-18",
"price": 0.85
},
{
"date": "2023-05-15",
"price": 0.99
}
],
"unit": "1 Kilogramm Packung",
"search": "clever mehl universal 1 kilogramm packung"
},
{
"store": "spar",
"id": "8800167428097",
"name": "S-BUDGET Weizenmehl Glatt, Type W 700",
"price": 0.85,
"priceHistory": [
{
"date": "2023-05-15",
"price": 0.85
}
],
"unit": "1 KG",
"search": "s-budget weizenmehl glatt, type w 700 1 kg"
},
{
"store": "spar",
"id": "8800000999425",
"name": "S-BUDGET Weizenmehl Universal, Type W 700",
"price": 0.85,
"priceHistory": [
{
"date": "2023-05-15",
"price": 0.85
}
],
"unit": "1 KG",
"search": "s-budget weizenmehl universal, type w 700 1 kg"
},
{
"store": "spar",
"id": "8800167460865",
"name": "S-BUDGET Weizenmehl griffig, Type W 700",
"price": 0.85,
"priceHistory": [
{
"date": "2023-05-15",
"price": 0.85
}
],
"unit": "1 KG",
"search": "s-budget weizenmehl griffig, type w 700 1 kg"
},
{
"store": "hofer",
"id": 543651,
"name": "HAPPY HARVEST Weizenmehl Glatt Type 480 1kg",
"price": 0.85,
"priceHistory": [
{
"date": "2023-05-18",
"price": 0.85
}
],
"unit": "1010 gramm",
"search": "happy harvest weizenmehl glatt type 480 1kg 1010 gramm"
},
{
"store": "hofer",
"id": 543781,
"name": "HAPPY HARVEST Weizenmehl Griffig Type 480 1kg",
"price": 0.85,
"priceHistory": [
{
"date": "2023-05-18",
"price": 0.85
}
],
"unit": "1010 gramm",
"search": "happy harvest weizenmehl griffig type 480 1kg 1010 gramm"
},
{
"store": "hofer",
"id": 543782,
"name": "HAPPY HARVEST Weizenmehl Universal Type 480 1kg",
"price": 0.85,
"priceHistory": [
{
"date": "2023-05-18",
"price": 0.85
}
],
"unit": "1000 gramm",
"search": "happy harvest weizenmehl universal type 480 1kg 1000 gramm"
},
{
"store": "billa",
"id": "00-309662",
"name": "Clever Langkornreis",
"price": 1.19,
"priceHistory": [
{
"date": "2023-05-15",
"price": 1.19
}
],
"unit": "1 Kilogramm Beutel",
"search": "clever langkornreis 1 kilogramm beutel"
},
{
"store": "hofer",
"id": 548180,
"name": "HAPPY HARVEST Langkorn Reis 1kg",
"price": 1.19,
"priceHistory": [
{
"date": "2023-05-18",
"price": 1.19
}
],
"unit": "1004 gramm",
"search": "happy harvest langkorn reis 1kg 1004 gramm"
},
{
"store": "spar",
"id": "8800167297025",
"name": "S-BUDGET Langkornreis",
"price": 1.29,
"priceHistory": [
{
"date": "2023-05-15",
"price": 1.29
}
],
"unit": "1 KG",
"search": "s-budget langkornreis 1 kg"
},
{
"store": "billa",
"id": "00-746506",
"name": "Clever Haltbar-Vollmilch 3.5%",
"price": 1.09,
"priceHistory": [
{
"date": "2023-05-15",
"price": 1.09
}
],
"unit": "1 Liter Packung",
"search": "clever haltbar-vollmilch 3.5% 1 liter packung"
},
{
"store": "billa",
"id": "00-504029",
"name": "Clever Vollmilch länger frisch 3.5%",
"price": 1.29,
"priceHistory": [
{
"date": "2023-05-15",
"price": 1.29
}
],
"unit": "1 Liter Packung (Einweg)",
"search": "clever vollmilch länger frisch 3.5% 1 liter packung (einweg)"
},
{
"store": "billa",
"id": "00-425337",
"name": "Clever Vollmilch 3.5%",
"price": 1.29,
"priceHistory": [
{
"date": "2023-05-15",
"price": 1.29
}
],
"unit": "1 Liter Packung (Einweg)",
"search": "clever vollmilch 3.5% 1 liter packung (einweg)"
},
{
"store": "spar",
"id": "8799203852289",
"name": "S-BUDGET Haltbare Vollmilch 3,5% Fett",
"price": 1.09,
"priceHistory": [
{
"date": "2023-05-15",
"price": 1.09
}
],
"unit": "1 L EINWEG",
"search": "s-budget haltbare vollmilch 3,5% fett 1 l einweg"
},
{
"store": "spar",
"id": "8798840356865",
"name": "S-BUDGET Vollmilch 3,5% Fett länger frisch",
"price": 1.29,
"priceHistory": [
{
"date": "2023-05-15",
"price": 1.29
}
],
"unit": "1 L EINWEG",
"search": "s-budget vollmilch 3,5% fett länger frisch 1 l einweg"
},
{
"store": "hofer",
"id": 546463,
"name": "MILFINA Vollmilch 3,5% Fett 1l",
"price": 1.29,
"priceHistory": [
{
"date": "2023-05-18",
"price": 1.29
}
],
"unit": "1066 gramm",
"search": "milfina vollmilch 3,5% fett 1l 1066 gramm"
},
{
"store": "hofer",
"id": 546464,
"name": "MILFINA Längerfrische Vollmilch 3,5% Fett 1l",
"price": 1.29,
"priceHistory": [
{
"date": "2023-05-18",
"price": 1.29
}
],
"unit": "1088 gramm",
"search": "milfina längerfrische vollmilch 3,5% fett 1l 1088 gramm"
},
{
"store": "billa",
"id": "00-480884",
"name": "Clever Knopfsemmel",
"price": 0.23,
"priceHistory": [
{
"date": "2023-05-19",
"price": 0.23
}
],
"unit": "65 Gramm Stück",
"search": "clever knopfsemmel 65 gramm stück"
},
{
"store": "spar",
"id": "8799882412033",
"name": "S-BUDGET Semmel",
"price": 0.23,
"priceHistory": [
{
"date": "2023-05-15",
"price": 0.23
}
],
"unit": "1 STK",
"search": "s-budget semmel 1 stk"
},
{
"store": "hofer",
"id": 546074,
"name": "BACKBOX Kaisersemmel 65g",
"price": 0.23,
"priceHistory": [
{
"date": "2023-05-18",
"price": 0.23
}
],
"unit": "65 gramm",
"search": "backbox kaisersemmel 65g 65 gramm"
},
{
"store": "billa",
"id": "00-829484",
"name": "Clever Roggenvollkornbrot",
"price": 0.99,
"priceHistory": [
{
"date": "2023-05-15",
"price": 0.99
}
],
"unit": "500 Gramm Stück",
"search": "clever roggenvollkornbrot 500 gramm stück"
},
{
"store": "spar",
"id": "8798918541313",
"name": "S-BUDGET Roggen-Vollkornbrot mit Sonnenblumenkernen",
"price": 0.99,
"priceHistory": [
{
"date": "2023-05-15",
"price": 0.99
}
],
"unit": "500 G",
"search": "s-budget roggen-vollkornbrot mit sonnenblumenkernen 500 g"
},
{
"store": "hofer",
"id": 543790,
"name": "BIO NATURA Roggen Vollkornbrot mit Sonnenblumenkernen 500g",
"price": 1.39,
"priceHistory": [
{
"date": "2023-05-18",
"price": 1.39
}
],
"unit": "520 gramm",
"search": "bio natura roggen vollkornbrot mit sonnenblumenkernen 500g 520 gramm"
},
{
"store": "spar",
"id": "8802286469121",
"name": "S-BUDGET Faschiertes gemischt per Packung",
"price": 5.58,
"priceHistory": [
{
"date": "2023-05-15",
"price": 5.58
}
],
"unit": "700 G",
"search": "s-budget faschiertes gemischt per packung 700 g"
},
{
"store": "billa",
"id": "00-317050",
"name": "Clever Faschiertes gemischt",
"price": 4.89,
"priceHistory": [
{
"date": "2023-05-15",
"price": 4.89
}
],
"unit": "700 g Tasse",
"search": "clever faschiertes gemischt 700 g tasse"
},
{
"store": "spar",
"id": "8799981240321",
"name": "S-BUDGET Tomaten",
"price": 2.49,
"priceHistory": [
{
"date": "2023-05-15",
"price": 2.49
}
],
"unit": "1 KG",
"search": "s-budget tomaten 1 kg"
},
{
"store": "billa",
"id": "00-402113",
"name": "Clever Tomaten aus Spanien / Marokko / Österreich",
"price": 2.49,
"priceHistory": [
{
"date": "2023-05-15",
"price": 2.49
}
],
"unit": "1 kg Becher",
"search": "clever tomaten aus spanien / marokko / österreich 1 kg becher"
},
{
"store": "hofer",
"id": 547855,
"name": "HOFER MARKTPLATZ Tomaten 1kg",
"price": 2.49,
"priceHistory": [
{
"date": "2023-05-18",
"price": 2.49
}
],
"unit": "1000 gramm",
"search": "hofer marktplatz tomaten 1kg 1000 gramm"
},
{
"store": "billa",
"id": "00-486890",
"name": "Clever Gouda 45%",
"price": 3.49,
"priceHistory": [
{
"date": "2023-05-18",
"price": 3.49
},
{
"date": "2023-05-15",
"price": 3.79
}
],
"unit": "450 g Stk",
"search": "clever gouda 45% 450 g stk"
},
{
"store": "spar",
"id": "8799996084225",
"name": "S-BUDGET Österreichischer Gouda 45% F.i.T.",
"price": 3.49,
"priceHistory": [
{
"date": "2023-05-15",
"price": 3.49
}
],
"unit": "450 G",
"search": "s-budget österreichischer gouda 45% f.i.t. 450 g"
},
{
"store": "hofer",
"id": 549722,
"name": "HOFBURGER Gouda in Scheiben 400g",
"price": 3.49,
"priceHistory": [
{
"date": "2023-05-18",
"price": 3.49
}
],
"unit": "410 gramm",
"search": "hofburger gouda in scheiben 400g 410 gramm"
},
{
"store": "hofer",
"id": 547383,
"name": "HOFER MARKTPLATZ Kartoffeln, vorwiegend festkochend 5kg",
"price": 4.49,
"priceHistory": [
{
"date": "2023-05-18",
"price": 4.49
}
],
"unit": "5000 gramm",
"search": "hofer marktplatz kartoffeln, vorwiegend festkochend 5kg 5000 gramm"
},
{
"store": "spar",
"id": "8799317032961",
"name": "S-BUDGET Kartoffeln",
"price": 4.49,
"priceHistory": [
{
"date": "2023-05-15",
"price": 4.49
}
],
"unit": "5 KG",
"search": "s-budget kartoffeln 5 kg"
},
{
"store": "billa",
"id": "00-89517",
"name": "Clever Erdäpfel vorwiegend festkochend aus Österreich",
"price": 4.49,
"priceHistory": [
{
"date": "2023-05-15",
"price": 4.49
}
],
"unit": "5 kg Sack",
"search": "clever erdäpfel vorwiegend festkochend aus österreich 5 kg sack"
}
]
},
{
"name": "Bier",
"items": [
{
"store": "hofer",
"id": 545090,
"name": "PUNTIGAMER Vollbier 0,5l",
"price": 1.19,
"priceHistory": [
{
"date": "2023-05-18",
"price": 1.19
}
],
"unit": "520 gramm",
"search": "puntigamer vollbier 0,5l 520 gramm"
},
{
"store": "billa",
"id": "00-407579",
"name": "Puntigamer \"Das bierige Bier\"",
"price": 1.25,
"priceHistory": [
{
"date": "2023-05-15",
"price": 1.25
}
],
"unit": "0.5 l Dose (Einweg)",
"search": "puntigamer \"das bierige bier\" 0.5 l dose (einweg)"
},
{
"store": "spar",
"id": "8799342624769",
"name": "Puntigamer Das \"bierige\" Bier",
"price": 1.25,
"priceHistory": [
{
"date": "2023-05-15",
"price": 1.25
}
],
"unit": "500 ML EINWEG",
"search": "puntigamer das \"bierige\" bier 500 ml einweg"
},
{
"store": "hofer",
"id": 545103,
"name": "STIEGL Goldbräu 0,5l",
"price": 1.15,
"priceHistory": [
{
"date": "2023-05-18",
"price": 1.15
}
],
"unit": "515 gramm",
"search": "stiegl goldbräu 0,5l 515 gramm"
},
{
"store": "billa",
"id": "00-424638",
"name": "Stiegl Goldbräu",
"price": 1.45,
"priceHistory": [
{
"date": "2023-05-15",
"price": 1.45
}
],
"unit": "0.5 l Dose (Einweg)",
"search": "stiegl goldbräu 0.5 l dose (einweg)"
},
{
"store": "spar",
"id": "8799696617473",
"name": "Stiegl Goldbräu",
"price": 1.44,
"priceHistory": [
{
"date": "2023-05-15",
"price": 1.44
}
],
"unit": "500 ML EINWEG",
"search": "stiegl goldbräu 500 ml einweg"
},
{
"store": "spar",
"id": "8800422756353",
"name": "Gösser Märzen",
"price": 1.34,
"priceHistory": [
{
"date": "2023-05-15",
"price": 1.34
}
],
"unit": "500 ML MEHRWEG",
"search": "gösser märzen 500 ml mehrweg"
},
{
"store": "billa",
"id": "00-12297",
"name": "Gösser Märzen",
"price": 1.49,
"priceHistory": [
{
"date": "2023-05-15",
"price": 1.49
}
],
"unit": "0.5 l Dose (Einweg)",
"search": "gösser märzen 0.5 l dose (einweg)"
},
{
"store": "hofer",
"id": 545109,
"name": "GÖSSER Märzen 0,5l",
"price": 1.39,
"priceHistory": [
{
"date": "2023-05-18",
"price": 1.39
}
],
"unit": "561 gramm",
"search": "gösser märzen 0,5l 561 gramm"
}
]
},
{
"name": "Milch",
"items": [
{
"store": "billa",
"id": "00-425337",
"name": "Clever Vollmilch 3.5%",
"price": 1.29,
"priceHistory": [
{
"date": "2023-05-15",
"price": 1.29
}
],
"unit": "1 Liter Packung (Einweg)",
"search": "clever vollmilch 3.5% 1 liter packung (einweg)"
},
{
"store": "hofer",
"id": 546463,
"name": "MILFINA Vollmilch 3,5% Fett 1l",
"price": 1.29,
"priceHistory": [
{
"date": "2023-05-18",
"price": 1.29
}
],
"unit": "1066 gramm",
"search": "milfina vollmilch 3,5% fett 1l 1066 gramm"
},
{
"store": "spar",
"id": "8798840356865",
"name": "S-BUDGET Vollmilch 3,5% Fett länger frisch",
"price": 1.29,
"priceHistory": [
{
"date": "2023-05-15",
"price": 1.29
}
],
"unit": "1 L EINWEG",
"search": "s-budget vollmilch 3,5% fett länger frisch 1 l einweg"
}
]
},
{
"name": "Schokolade",
"items": []
}
]

5
stats.sh Executable file
View File

@ -0,0 +1,5 @@
#!/bin/bash
set -e
scp marioslab.io:/home/badlogic/heissepreise/docker/data/logs/access.log .
goaccess access.log -o report.html --log-format=COMBINED
open report.html

47
stuff.js Normal file
View File

@ -0,0 +1,47 @@
const fs = require("fs");
const items = JSON.parse(fs.readFileSync("docker/data/latest-canonical.json"));
items.sort(item => item.priceHistory.length);
for (item of items) {
if (item.priceHistory.length > 2)
console.log(JSON.stringify(item, null, 2));
}
const units = {};
const unitsSmall = {}
for (item of items) {
const tokens = item.unit ? item.unit.split(/\s+/) : [];
if (tokens.length == 0) continue;
if (tokens[0].charAt(0) >= '0' && tokens[0].charAt(0) <= '9') {
tokens.splice(0, 1);
}
units[tokens.join(" ")] = item;
unitsSmall[tokens[0]] = item;
}
console.log(JSON.stringify(Object.keys(units), null, 2));
console.log(Object.keys(units).length);
console.log(JSON.stringify(Object.keys(unitsSmall), null, 2));
console.log(Object.keys(unitsSmall).length);
const hofer = JSON.parse(fs.readFileSync("docker/data/hofer-2023-05-19.json"));
const unitTypes = {}
for (item of hofer) {
unitTypes[item.UnitType] = true;
}
console.log(JSON.stringify(unitTypes, null, 2));
const billa = JSON.parse(fs.readFileSync("docker/data/billa-2023-05-19.json"));
for (item of billa) {
if (item.data.grammagePriceFactor != 1) {
console.log(JSON.stringify(item.data.name + " " + item.data.grammage, null, 2));
}
}
const spar = JSON.parse(fs.readFileSync("docker/data/spar-2023-05-19.json"));
for (item of spar) {
if (item.masterValues["quantity-selector"]) {
console.log(JSON.stringify(item.masterValues["short-description"] + " " + item.masterValues["price-per-unit"], null, 2));
}
}