/** * Vendor label / grouping key of an inbox document — shared by the inbox list (vendor filter, * group-by-vendor, sorting) so "the same vendor" means the same thing everywhere. * * The extracted seller name is often a whole letterhead line * ("easybell GmbH | Brückenstraße 5A | 10179 Berlin", "NetConnections GmbH - Jesinger Straße 52 - …"): * the label is its first segment, the key additionally ignores case, punctuation and legal forms * ("LogYou GmbH" = "LOGYOU GMBH, MÜHLENWEG 4"). A learned profile's vendor name wins. */ const LEGAL = /\b(gmbh|mbh|ag|ug|kg|kgaa|ohg|gbr|ek|co|inc|ltd|llc|plc|bv|sa|sarl|srl|se|ood|haftungsbeschraenkt)\b/g export const inboxVendorLabel = (r: any): string => { const raw = String(r?.extracted?._profile?.vendorName || r?.extracted?.seller?.name || String(r?.vendorFingerprint || '').replace(/^name:/, '').replace(/^(layout|vat|iban):.*/, '') || '') const first = raw.split(/\s[|·•]\s|\s-\s|,\s|\s{3,}/)[0].trim() return (first || raw.trim()).slice(0, 48) } export const inboxVendorKey = (r: any): string => { const folded = inboxVendorLabel(r).toLowerCase() .replace(/ä/g, 'ae').replace(/ö/g, 'oe').replace(/ü/g, 'ue').replace(/ß/g, 'ss') .normalize('NFD').replace(/[̀-ͯ]/g, '') .replace(/[^a-z0-9Ѐ-ӿ ]/g, ' ') const key = folded.replace(LEGAL, ' ').replace(/\s+/g, '') return key || folded.replace(/\s+/g, '') || '—' }