import { string } from 'alga-js' import refreshTokenHelper from "../../../../utils/refreshTokenHelper" import getTokenHelper from "../../../../utils/getTokenHelper" import errorHandlingHelper from "../../../../utils/errorHandlingHelper" import fetchHelper from "../../../../utils/fetchHelper" /** * List OrderSources with DPD_USE_CUSTOM=true, including organization info. * Used by the manual-label page to let the user pick which DPD account * should be billed for a one-off label. * * Response shape: { records: [{ id, name, orgId, orgName, label }] } */ const handleFunc = async (event: any, authToken: any = null) => { const token = authToken ?? await getTokenHelper(event) const filter = `DPD_USE_CUSTOM eq true` const res: any = await fetchHelper( event, `models/c_ordersource?$filter=${string.urlEncode(filter)}&$top=200`, 'GET', token, null ) // Filter inactive in JS (OData boolean filters on IsActive can interact // oddly with the DPD_USE_CUSTOM filter on iDempiere). AD_Org_ID is returned // as a nested {id, identifier} object by default — no $expand needed. const records = (res?.records || []) .filter((r: any) => r?.IsActive !== false) .map((r: any) => ({ id: r.id, name: r.Name || r.Value || '', orgId: r?.AD_Org_ID?.id ?? null, orgName: r?.AD_Org_ID?.identifier ?? '', // Friendly display label: "" label: [r?.AD_Org_ID?.identifier, (r.Name || r.Value || '')].filter(Boolean).join(' — ') })) return { records, status: 200 } } export default defineEventHandler(async (event) => { let data: any = { records: [] } 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 })