function createFusionCrmServiceRequests({ isCurrentPeriodRequest, logRequestStart, logRequestSuccess, logRequestFailure, readResponseBodyForDebug, maskToken, environment }) { const { fetch } = environment; const url = "https://eeho.fa.us2.oraclecloud.com/crmRestApi/searchResources/latest/custom-actions/queries"; async function requestSRSearchResources(token) { const searchUrl = `${url}?applications=461e5791-9f15-4cd1-b5cd-19e8480cbce4&entity=CRMServiceRequest&language=en&limit=-1&onlyData=true`; const headers = { Accept: "application/json", Authorization: `Bearer ${token}` }; const entry = logRequestStart({ name: "requestSRSearchResources", method: "GET", url: searchUrl, headers }); try { const response = await fetch(searchUrl, { method: "GET", credentials: "include", headers }); logRequestSuccess(entry, response, await readResponseBodyForDebug(response)); if (response.status !== 200) throw new Error(`requestSRSearchResources failed with status ${response.status}.`); const data = await response.json(); const number = data?.items?.[0]?.savedSearchNumber; if (!Array.isArray(data?.items) || typeof number !== "string" || !number.trim()) { throw new Error("requestSRSearchResources did not return savedSearchNumber in its first item."); } return number.trim(); } catch (error) { logRequestFailure(entry, error.message); throw error; } } function createPayload(offset, savedSearchNumber) { if (typeof savedSearchNumber !== "string" || !savedSearchNumber.trim()) throw new Error("Missing SR savedSearchNumber."); return { aggregationResults: false, applications: ["ORACLE-ISS-APP"], onlyData: true, entity: "CRMServiceRequest", copiedFrom: `queries/${savedSearchNumber.trim()}`, q: { op: "$and", criteria: [ { op: "$in", attribute: "StatusCd", values: ["SVC_PENDING_DELIVERY"] }, { op: "$eq", attribute: "RecordSet", value: "ORA_SVC_MY_SR_TEAM_SRS" } ] }, keywords: null, fields: ["SrNumber", "OpportunityName_Id_c.OptyNumber", "ReportedHours_c", "CustomerDeadline_c", "PrimaryPillarNew_c", "_actions", "Title", "Owner.PersonFirstName", "Owner.PersonLastName", "Owner.PrimaryEmail.EmailAddress", "DoNotCallFlag", "DoNotEmailFlag"], sort: [{ attribute: "_score", direction: "descending" }], language: "en", keywordsFields: ["SrNumber", "ServiceNew_Id_c.RecordName", "CustomerAccount", "OpportunityName_Id_c", "OpportunityName_Id_c.OptyNumber", "Owner"], skipInValidFields: true, limit: 15, offset }; } async function requestCrmServiceRequest(token, version, isActive = () => isCurrentPeriodRequest(version), onProgress = () => {}) { if (!isActive()) return null; const savedSearchNumber = await requestSRSearchResources(token); const items = []; let offset = 0; let attempt = 1; while (isActive()) { const payload = createPayload(offset, savedSearchNumber); const headers = { Accept: "application/json", "Content-Type": "application/json", Authorization: `Bearer ${token}`, Origin: "https://eeho.fa.us2.oraclecloud.com", Preference: "transient" }; const entry = logRequestStart({ name: "resquestCrmServiceRequest", method: "POST", url, headers: { ...headers }, body: JSON.stringify(payload, null, 2), metadata: { offset, attempt } }); try { const response = await fetch(url, { method: "POST", credentials: "include", headers, body: JSON.stringify(payload) }); logRequestSuccess(entry, response, await readResponseBodyForDebug(response)); if (response.status !== 200) throw new Error(`CRM service request query failed with status ${response.status}.`); const data = await response.json(); if (!data || !Array.isArray(data.items) || typeof data.hasMore !== "boolean") { throw new Error("CRM service request query returned an invalid response."); } if (!isActive()) return null; const received = data.count === undefined ? data.items.length : Number(data.count); const current = data.offset === undefined ? offset : Number(data.offset); if (data.hasMore && (!data.items.length || !Number.isInteger(received) || received <= 0 || !Number.isInteger(current) || current !== offset || current + received <= offset)) { throw new Error("CRM service request pagination did not advance."); } items.push(...data.items); onProgress(items.length, Number.isFinite(data.totalResults) && data.totalResults >= items.length ? data.totalResults : null, items.slice()); if (!data.hasMore) return items; offset = current + received; attempt = 1; } catch (error) { logRequestFailure(entry, error.message || "CRM service request query failed."); if (attempt === 5) throw error; attempt += 1; } } return null; } return { createPayload, requestCrmServiceRequest, requestSRSearchResources }; }