diff --git a/backend/src/tools/koepi/routes.js b/backend/src/tools/koepi/routes.js index f820561..0179d12 100644 --- a/backend/src/tools/koepi/routes.js +++ b/backend/src/tools/koepi/routes.js @@ -325,12 +325,16 @@ async function fetchOffersViaApi() { const leafletUrl = detail ? `https://www.marktguru.de/leaflets/${detail.id}${child ? `/page/${child.pageIndex}` : ''}` : null; + const knownStore = storeInfo.id != null + ? db.prepare('SELECT retailer FROM koepi_local_stores WHERE store_id=?').get(storeInfo.id) + : null; + const retailerLabel = knownStore?.retailer || advertiser.name || ''; return { name: r.description || r.title || advertiser.name || '', brand: r.brand?.name || '', price: Number.isFinite(priceNum) ? `€ ${priceNum.toFixed(2).replace('.', ',')}` : (r.price || ''), oldPrice: Number.isFinite(oldPriceNum) ? `€ ${oldPriceNum.toFixed(2).replace('.', ',')}` : (r.oldPrice || ''), - retailer: advertiser.name || '', + retailer: retailerLabel, dateRange: weekInfo ? `${baseDateRange} ${weekInfo}` : baseDateRange, weekInfo, validity: '', @@ -566,10 +570,17 @@ async function scrapeProspekte() { const detail = await fetchLeafletDetail(f.mainLeafletId, leafletCache); const store = detail.closestStore; const weekInfo = weekInfoWithFallback(detail.name, f.validFrom); + // Store-spezifische Bezeichnung aus der Whitelist bevorzugen (z.B. "Netto + // Getränke-Discount") statt dem generischen advertiser.name von marktguru + // (liefert für diese Filiale fälschlich nur "Netto Marken-Discount") + const knownStore = store.id != null + ? db.prepare('SELECT retailer FROM koepi_local_stores WHERE store_id=?').get(store.id) + : null; all.push({ id: f.id, - publisher: f.advertiser?.name || '', + publisher: knownStore?.retailer || f.advertiser?.name || '', title: f.advertiser?.name || cleanTitle(detail.name) || '', + rawName: detail.name || '', // nur intern, für den Ausschluss-Filter unten weekInfo, street: store.address || '', zip: MG_ZIP, @@ -596,13 +607,15 @@ async function scrapeProspekte() { for (const b of all) b.hasKoenigPilsener = false; } - // "Sondermagazin"-Prospekte ausblenden (keine normalen Wochenangebote) // Unerwünschte Prospekt-Typen ausblenden (Sondermagazine, Reise-Prospekte etc.) + // WICHTIG: gegen rawName (den echten Leaflet-Namen) prüfen, nicht gegen + // title/publisher — die zeigen nur noch den sauberen Kettennamen und würden + // "Sondermagazin"/"Bestellmagazin" im echten Namen sonst nie mehr finden. const EXCLUDED_TITLE_KEYWORDS = ['sondermagazin', 'reisen', 'bestellmagazin']; const withoutSondermagazin = all.filter(b => { - const t = (b.title || '').toLowerCase(); + const t = (b.rawName || '').toLowerCase(); return !EXCLUDED_TITLE_KEYWORDS.some(kw => t.includes(kw)); - }); + }).map(({ rawName, ...rest }) => rest); // rawName war nur intern nötig const targeted = withoutSondermagazin.filter(b => b.isTarget); // Chronologisch in "aktuell laufend" und "kommend" trennen