import { string } from 'alga-js' import refreshTokenHelper from '../../utils/refreshTokenHelper' import errorHandlingHelper from '../../utils/errorHandlingHelper' import fetchHelper from '../../utils/fetchHelper' import enrichProductNames from '../../utils/enrichProductNames' type EventRow = { id?: number SessionUID?: string ActionType?: string ActionTime?: string Created?: string DurationMs?: number | string Qty?: number | string ShippingService?: string Description?: string AD_User_ID?: any Foreign_AD_Org_ID?: any M_InOut_ID?: any C_Order_ID?: any M_Product_ID?: any C_BPartner_ID?: any } const fkId = (v: any): number | null => { if (v == null) return null if (typeof v === 'number') return Number.isFinite(v) ? v : null if (typeof v === 'object' && v.id != null) return Number(v.id) || null const n = Number(v) return Number.isFinite(n) ? n : null } const fkName = (v: any, fallback = ''): string => { if (v && typeof v === 'object' && v.identifier) return String(v.identifier) return fallback } const n = (v: any): number => { const x = Number(v) return Number.isFinite(x) ? x : 0 } const handleFunc = async (event: any, authToken: any = null) => { const token = authToken ?? await getTokenHelper(event) const q = getQuery(event) const sessionUID = String(q?.session_uid || '').trim() if (!sessionUID) return { sessionUID: '', events: [] } // Pull every event for this session — both active and previously-abandoned // (IsActive=false) rows are useful here for forensic inspection. const filter = `SessionUID eq '${sessionUID.replace(/'/g, "''")}'` const url = `models/cust_commissionactivity?$filter=${string.urlEncode(filter)}&$orderby=Created asc&$top=1000` const res: any = await fetchHelper(event, url, 'GET', token, null) const rows: EventRow[] = Array.isArray(res?.records) ? res.records : [] // Build the step list: chronological events with delta from previous step. let prevMs = 0 const events = rows.map((r, idx) => { const ms = n(r.DurationMs) const delta = idx === 0 ? 0 : Math.max(0, ms - prevMs) prevMs = ms return { stepIndex: idx + 1, actionType: r.ActionType || '', actionTime: r.ActionTime || r.Created || null, durationMs: ms, deltaMs: delta, qty: r.Qty != null ? Number(r.Qty) : null, shippingService: r.ShippingService || null, description: r.Description || null, adUserId: fkId(r.AD_User_ID), userName: fkName(r.AD_User_ID), mInoutId: fkId(r.M_InOut_ID), shipmentNo: fkName(r.M_InOut_ID), cOrderId: fkId(r.C_Order_ID), orderNo: fkName(r.C_Order_ID), cBPartnerId: fkId(r.C_BPartner_ID), partnerName: fkName(r.C_BPartner_ID), mProductId: fkId(r.M_Product_ID), productName: fkName(r.M_Product_ID), foreignAdOrgId: fkId(r.Foreign_AD_Org_ID), foreignOrgName: fkName(r.Foreign_AD_Org_ID), } }) await enrichProductNames(event, token, events) return { sessionUID, events, totalSteps: events.length } } export default defineEventHandler(async (event) => { let data: any = {} try { data = await handleFunc(event) } catch (err: any) { try { const authToken: any = await refreshTokenHelper(event) data = await handleFunc(event, authToken) } catch (error: any) { data = errorHandlingHelper(err?.data ?? err, error?.data ?? error) } } return data })