diff --git a/backend/src/tools/koepi/routes.js b/backend/src/tools/koepi/routes.js index 94bb469..73c2834 100644 --- a/backend/src/tools/koepi/routes.js +++ b/backend/src/tools/koepi/routes.js @@ -56,12 +56,33 @@ function extractNextData(html) { try { return JSON.parse(html.slice(start, end)); } catch { return null; } } -// ── Händler-Filter ──────────────────────────────────────────────────────────── -const TARGET_PUBLISHERS = ['rewe','edeka','netto','trinkgut','getränke','penny','aldi','lidl']; +// ── Gewünschte Filialen ────────────────────────────────────────────────────── +const TARGET_STORES = [ + { name: 'edeka', street: 'düsseldorfer landstr', label: 'EDEKA E center Angerbogen' }, + { name: 'edeka', street: 'angerbogen', label: 'EDEKA E center Angerbogen' }, + { name: 'e center', street: 'düsseldorfer', label: 'EDEKA E center Angerbogen' }, + { name: 'rewe', street: 'mündelheimer', label: 'REWE Mündelheimer Str.' }, + { name: 'rewe', street: 'keniastr', label: 'REWE XXL Schwinning' }, + { name: 'netto', street: 'bonnefeld', label: 'Netto Im Bonnefeld' }, + { name: 'kaufland', street: 'auf der höhe', label: 'Kaufland Kaßlerfeld' }, + { name: 'penny', street: 'sittardsberger', label: 'Penny Sittardsberger Allee' }, + { name: 'trinkgut', street: 'keniastr', label: 'Trinkgut Keniastraße' }, +]; + +function matchesTargetStore(publisherName, storeName, street) { + const p = (publisherName || '').toLowerCase(); + const s = (storeName || '').toLowerCase(); + const r = (street || '').toLowerCase(); + for (const t of TARGET_STORES) { + if ((p.includes(t.name) || s.includes(t.name)) && r.includes(t.street)) return t.label; + } + return null; +} + function isTargetPublisher(name) { if (!name) return false; const n = name.toLowerCase(); - return TARGET_PUBLISHERS.some(p => n.includes(p)); + return ['rewe','edeka','e center','netto','kaufland','penny','trinkgut'].some(p => n.includes(p)); } // ── Angebote via Puppeteer (BrochureBox_Basic + OfferGrid) ────────────────── @@ -171,10 +192,12 @@ async function scrapeProspekte() { const cached = cacheGet(cacheKey); if (cached) return cached; + // Koordinaten rund um deine Filialen (alle im Süden Duisburgs) const locations = [ - { lat: 51.4332, lng: 6.7625, city: 'Duisburg', zip: '47051' }, - { lat: 51.5167, lng: 6.9833, city: 'Essen', zip: '45127' }, - { lat: 51.2217, lng: 6.7762, city: 'Düsseldorf', zip: '40213' }, + { lat: 51.3750, lng: 6.7680, city: 'Duisburg', zip: '47259' }, // Im Bonnefeld / Netto + { lat: 51.4020, lng: 6.7616, city: 'Duisburg', zip: '47055' }, // REWE Mündelheimer + { lat: 51.4406, lng: 6.7555, city: 'Duisburg', zip: '47059' }, // Kaufland / REWE Kenia / Trinkgut + { lat: 51.3900, lng: 6.7900, city: 'Duisburg', zip: '47259' }, // Penny Sittardsberger ]; const allBrochures = new Map(); @@ -199,20 +222,24 @@ async function scrapeProspekte() { const publisher = c.publisher?.name || ''; const store = c.closestStore; + const storeStreet = store ? `${store.street || ''} ${store.streetNumber || ''}`.trim() : ''; + const matchLabel = matchesTargetStore(publisher, store?.name, storeStreet); + allBrochures.set(id, { id, publisher, title: c.title || '', store: store?.name || publisher, + storeLabel: matchLabel || store?.name || publisher, city: store?.city || loc.city, - street: store ? `${store.street || ''} ${store.streetNumber || ''}`.trim() : '', + street: storeStreet, zip: store?.zip || loc.zip, image: c.brochureImages?.find(i => i.size === '260x270')?.url || c.brochureImage?.url || null, validFrom: c.validFrom || null, validTo: c.validUntil || null, pageCount: c.pageCount || null, url: `https://www.kaufda.de/webapp/brochure/${id}`, - isTarget: isTargetPublisher(publisher), + isTarget: !!matchLabel, badges: c.contentBadges?.map(b => b.name) || [], }); } diff --git a/frontend/src/tools/koepi.jsx b/frontend/src/tools/koepi.jsx index 0420537..0ee39a0 100644 --- a/frontend/src/tools/koepi.jsx +++ b/frontend/src/tools/koepi.jsx @@ -183,11 +183,11 @@ function ProspektCard({ b }) {
- {b.publisher} + {b.storeLabel || b.publisher}
{b.title}
- 📍 {b.store}{b.city && b.store !== b.city ? ` · ${b.city}` : ''} + 📍 {b.street || b.store}{b.city ? ` · ${b.city}` : ''}
{b.street &&
{b.street}
} {(b.validFrom || b.validTo) && (