import refreshTokenHelper from "../../../utils/refreshTokenHelper" import forceLogoutHelper from "../../../utils/forceLogoutHelper" import errorHandlingHelper from "../../../utils/errorHandlingHelper" import fetchHelper from "../../../utils/fetchHelper" const handleFunc = async (event: any, authToken: any = null) => { let data: any = {} const token = authToken ?? await getTokenHelper(event) const query = getQuery(event) const top = Number(query.top || 200) // Cross-org by default (role/tenant scoped by the token); ?organizationId= narrows. const filter = query.organizationId ? `$filter=${encodeURIComponent(`AD_Org_ID eq ${Number(query.organizationId)}`)}&` : '' const res: any = await fetchHelper(event, `models/m_production?${filter}$orderby=${encodeURIComponent('M_Production_ID desc')}&$top=${top}&$expand=C_OrderLine_ID`, 'GET', token, null) // M_Product_ID.identifier is iDempiere's REST FK label (Value/SKU-based), NOT // M_Product.Name — every production is for a BOM product, so batch-fetch the // same "active BOM products" set open-lines.get.ts uses and read .Name off it. const productFilter = `IsBOM eq true and IsActive eq true` const productRes: any = await fetchHelper(event, `models/m_product?$filter=${encodeURIComponent(productFilter)}&$top=1000`, 'GET', token, null) const productNameById: any = {} for(const p of (productRes?.records || [])) { productNameById[p.id] = p.Name } const records = (res?.records || []).map((item: any) => { const orderLine = item.C_OrderLine_ID return { id: item.id, documentNo: item.DocumentNo, name: item.Name || '', description: item.Description || '', movementDate: item.MovementDate, datePromised: item.DatePromised || '', productionQty: Number(item.ProductionQty ?? 0), productId: item.M_Product_ID?.id || '', product: productNameById[item.M_Product_ID?.id] || item.M_Product_ID?.identifier || '', locatorId: item.M_Locator_ID?.id || '', locator: item.M_Locator_ID?.identifier || '', bomId: item.PP_Product_BOM_ID?.id || '', bom: item.PP_Product_BOM_ID?.identifier || '', docStatusId: item.DocStatus?.id || '', docStatus: item.DocStatus?.identifier || '', isCreated: item.IsCreated?.id === 'Y', isComplete: item.IsComplete === true, processed: item.Processed === true, partnerId: item.C_BPartner_ID?.id || '', partner: item.C_BPartner_ID?.identifier || '', organizationId: item.AD_Org_ID?.id || '', organization: item.AD_Org_ID?.identifier || '', orderLineId: orderLine?.id || '', orderId: orderLine?.C_Order_ID?.id || '', orderDocumentNo: orderLine?.C_Order_ID?.identifier || '', // FBA relabel code on the related order line (alternative barcode Amazon requires) printLabelCode: String(orderLine?.printLabelCode ?? orderLine?.PrintLabelCode ?? '').trim(), created: item.Created } }) data = { records, status: 200, message: '' } 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) { data = errorHandlingHelper(err?.data ?? err, error?.data ?? error) forceLogoutHelper(event, data) } } return data })