// All M_Transaction rows of one organization (= its warehouse) in a date window, enriched like the // product-history route. Query: orgId (required), from / to (YYYY-MM-DD, default last 30 days), // top (hard cap MAX_ROWS). Response: { records, rowCount, truncated, from, to }. import { string } from 'alga-js' import refreshTokenHelper from "../../utils/refreshTokenHelper" import forceLogoutHelper from "../../utils/forceLogoutHelper" import errorHandlingHelper from "../../utils/errorHandlingHelper" import fetchHelper from "../../utils/fetchHelper" import { enrichTransactions } from "../../utils/transactionEnrichHelper" const MAX_ROWS = 5000 const PAGE = 1000 const isoDate = (d: Date) => d.toISOString().slice(0, 10) const validDate = (v: any) => typeof v === 'string' && /^\d{4}-\d{2}-\d{2}$/.test(v) ? v : null const handleFunc = async (event: any, authToken: any = null) => { const token = authToken ?? await getTokenHelper(event) const query = getQuery(event) const orgId = Number(query.orgId) if (!orgId || orgId <= 0) { setResponseStatus(event, 400) return { status: 400, message: 'Organization ID is required', records: [] } } const today = new Date() const to = validDate(query.to) ?? isoDate(today) const from = validDate(query.from) ?? isoDate(new Date(today.getTime() - 30 * 86400000)) const top = Math.min(Math.max(Number(query.top) || MAX_ROWS, 1), MAX_ROWS) const filter = `AD_Org_ID eq ${orgId} and MovementDate ge '${from}' and MovementDate le '${to}'` // Page through newest-first until the cap; idempiere-rest reports the full count as row-count. const records: any[] = [] let rowCount = 0 for (let skip = 0; skip < top; skip += PAGE) { const pageTop = Math.min(PAGE, top - skip) const res: any = await fetchHelper( event, `models/m_transaction?$filter=${string.urlEncode(filter)}&$orderby=${string.urlEncode('MovementDate desc, M_Transaction_ID desc')}&$top=${pageTop}&$skip=${skip}`, 'GET', token, null ) const page = res?.records || [] if (skip === 0) rowCount = Number(res?.['row-count']) || page.length records.push(...page) if (page.length < pageTop || records.length >= rowCount) break } const enriched = await enrichTransactions(event, token, records) return { records: enriched, rowCount, truncated: rowCount > enriched.length, from, to } } 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 })