Badge indicator showing whether an opportunity has an associated Service Request
This commit is contained in:
60
src/services/fusion/crm-service-requests.js
Normal file
60
src/services/fusion/crm-service-requests.js
Normal file
@@ -0,0 +1,60 @@
|
||||
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";
|
||||
function createPayload(offset) {
|
||||
return {
|
||||
aggregationResults: false, applications: ["ORACLE-ISS-APP"], onlyData: true,
|
||||
entity: "CRMServiceRequest", copiedFrom: "queries/c521309c-1310-49a0-9723-da2eb1988205",
|
||||
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", "_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)) {
|
||||
const items = [];
|
||||
let offset = 0;
|
||||
while (isActive()) {
|
||||
const payload = createPayload(offset);
|
||||
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, Authorization: `Bearer ${maskToken(token)}` }, body: JSON.stringify(payload, null, 2), metadata: { offset } });
|
||||
try {
|
||||
const response = await fetch(url, {
|
||||
method: "POST", credentials: "include", headers, body: JSON.stringify(payload)
|
||||
});
|
||||
logRequestSuccess(entry, response, await readResponseBodyForDebug(response));
|
||||
if (!response.ok) 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;
|
||||
items.push(...data.items);
|
||||
if (!data.hasMore) return items;
|
||||
const received = data.count === undefined ? data.items.length : Number(data.count);
|
||||
const current = data.offset === undefined ? offset : Number(data.offset);
|
||||
if (!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.");
|
||||
}
|
||||
offset = current + received;
|
||||
} catch (error) {
|
||||
logRequestFailure(entry, error.message || "CRM service request query failed.");
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
return { createPayload, requestCrmServiceRequest };
|
||||
}
|
||||
Reference in New Issue
Block a user