import { string } from 'alga-js' import refreshTokenHelper from "../../../../utils/refreshTokenHelper" import forceLogoutHelper from "../../../../utils/forceLogoutHelper" import errorHandlingHelper from "../../../../utils/errorHandlingHelper" import { isSigningAvailable, getLatestSigningRequestForRecord, effectiveStatus } from "../../../../utils/offers/contractSigningDb" // Latest online quote-confirmation / contract-signing link of a lead, reduced // to the badge state the dashboard card shows: 'signed' (accepted / signed — // coloured) or 'sent' (link out, not accepted yet: pending, expired, superseded, // canceled — greyed). null = never sent online. Fail-soft: a signing-store // problem must never break the leads feed. const linkState = (leadId: number, kind: 'quote' | 'contract'): 'signed' | 'sent' | null => { try { if (!isSigningAvailable()) return null const r = getLatestSigningRequestForRecord('lead', leadId, kind) if (!r) return null return effectiveStatus(r) === 'signed' ? 'signed' : 'sent' } catch { return null } } // Compact feed for the dashboard "Neueste Leads" card — leads (sales or // vendor) created in the last 14 days, newest first, capped to a handful. const handleFunc = async (event: any, authToken: any = null) => { const token = authToken ?? await getTokenHelper(event) const since = new Date(Date.now() - 14 * 24 * 60 * 60 * 1000).toISOString().slice(0, 10) const filter = `(isSalesLead eq true OR isVendorLead eq true) AND Created ge '${since}'` const res: any = await event.context.fetch( `models/ad_user?$filter=${string.urlEncode(filter)}&$orderby=${string.urlEncode('Created desc')}&$top=8`, 'GET', token, null ) const records = (res?.records ?? []).map((item: any) => ({ id: item.id, name: item.Name || '', companyname: item.companyname || '', created: item.Created || null, // contact data for the MOBILE dashboard card (tap-to-call / mail) — the desktop card ignores them phone: item.Phone || item.Phone2 || '', email: item.EMail || '', // Offer / contract online-link badges (see linkState above). quote: linkState(Number(item.id), 'quote'), contract: linkState(Number(item.id), 'contract') })) return { records } } export default defineEventHandler(async (event) => { let data: any = { records: [] } try { data = await handleFunc(event) } catch(err: any) { try { let authToken: any = await refreshTokenHelper(event) data = await handleFunc(event, authToken) } catch(error: any) { data = errorHandlingHelper(err?.data ?? err, error?.data ?? error) forceLogoutHelper(event, data) } } return data })