import { config } from '../../config.js' import { parsePortalSession } from '../../middleware/session.js' /** * Pilot-Schalter der neuen Kundenansicht: KUNDENANSICHT_NEU = off (Vorgabe) | pilot | on, dazu die Komma-Liste * KUNDENANSICHT_NEU_PILOT_EMAILS ('*' = alle). Liest config.kundenansichtNeu bei jedem Aufruf. Der Modus off * schlaegt jede Liste; eine leere Liste im Pilot laesst nur die Mitarbeiter-Kundenansicht durch. */ /** 'off' | 'pilot' | 'on'; alles andere (leer, unbekannt) gilt als off. */ export function neueAnsichtModus() { const mode = config.kundenansichtNeu.mode return mode === 'pilot' || mode === 'on' ? mode : 'off' } /** Nicht-leerer Text nach dem Trimmen? */ const istText = (wert) => typeof wert === 'string' && wert.trim() !== '' /** Listenvergleich im Pilot: '*' oder die getrimmte, klein geschriebene E-Mail steht in der Liste; ein Nicht-Text zaehlt als leer. */ function stehtInPilotListe(email) { const erlaubt = config.kundenansichtNeu.pilotEmails if (erlaubt.includes('*')) return true const adresse = typeof email === 'string' ? email.trim().toLowerCase() : '' return adresse !== '' && erlaubt.includes(adresse) } const istObjekt = (wert) => wert !== null && typeof wert === 'object' && !Array.isArray(wert) /** Mitarbeiter-Kundenansicht ("Als Kunde ansehen") mit Kennung. */ const istKundenansicht = (s) => s.viewAs === true && istText(s.viewId) /** Angemeldeter Kunde (keine alte Mitarbeiter-Sitzung). */ const istKundenSitzung = (s) => istText(s.customerId) && istText(s.appwriteUserId) && s.role !== 'admin' /** Sieht diese Sitzung die neue Kundenansicht? Ungueltige Sitzungen: nie. */ export function neueAnsichtFuerSession(session) { const modus = neueAnsichtModus() if (modus === 'off') return false if (!istObjekt(session)) return false const kundenansicht = istKundenansicht(session) if (!kundenansicht && !istKundenSitzung(session)) return false if (modus === 'on') return true return kundenansicht || stehtInPilotListe(session.email) } /** Sieht diese Anfrage die neue Kundenansicht? req.session hat Vorrang, sonst das signierte Cookie. */ export function neueAnsicht(req) { return neueAnsichtFuerSession(req?.session ?? parsePortalSession(req)) } /** * Fuer Jobs und Dienste ohne Cookie: gleiche Modus- und Listenregeln, aber ohne Sitzungspruefung und ohne * Mitarbeiter-Regel. Ohne nicht-leere customerId ist die Antwort in jedem Modus false. */ export function neueAnsichtFuerKunde(kunde) { const modus = neueAnsichtModus() if (modus === 'off') return false if (!istObjekt(kunde) || !istText(kunde.customerId)) return false if (modus === 'on') return true return stehtInPilotListe(kunde.email) }