import { string } from 'alga-js' import refreshTokenHelper from "../../../utils/refreshTokenHelper" import getTokenHelper from "../../../utils/getTokenHelper" import forceLogoutHelper from "../../../utils/forceLogoutHelper" import errorHandlingHelper from "../../../utils/errorHandlingHelper" import fetchHelper from "../../../utils/fetchHelper" import { getNonReceivableLocatorIds } from "../../../utils/returnLocatorHelper" const handleFunc = async (event: any, authToken: any = null) => { let data: any = {} const config = useRuntimeConfig() const token = authToken ?? await getTokenHelper(event) const query = getQuery(event) // Callers send `m_product_id` (keep `product_id` as a tolerant fallback). const productId = query?.m_product_id ?? query?.product_id ?? '' if(!productId) { data['record'] = {} return data } const newFilter = string.urlEncode(`m_product_id eq ${productId}`) const res: any = await fetchHelper(event, `models/m_storage?$filter=${newFilter}&$expand=m_locator_id&$orderby=${string.urlEncode('QtyOnHand desc')}`, 'GET', token, null) if(res) { let records: any[] = res.records ?? [] // Opt-in (receipt positions pass `exclude_return_locators`): never preset a // locator whose M_LocatorType allows neither shipping nor reservation // (covers the "Retouren"/blocked types). The returns flow does NOT pass the // flag, so its preset behaviour is unchanged. if(query?.exclude_return_locators) { const excludedLocatorIds = await getNonReceivableLocatorIds(event, token, null) if(excludedLocatorIds.size >= 1) { records = records.filter((item: any) => !excludedLocatorIds.has(Number(item?.M_Locator_ID?.id))) } } const newWarehouseId = query?.warehouse_id ?? null if(newWarehouseId) { data['record'] = records.filter((item: any) => { return Number(item?.M_Locator_ID?.M_Warehouse_ID?.id) === Number(newWarehouseId) })?.[0] ?? {} } else { data['record'] = records?.[0] ?? {} } } return data } export default defineEventHandler(async (event) => { let data: any = {} 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 })