General source code refactoring
This commit is contained in:
166
src/services/fusion/opportunities.js
Normal file
166
src/services/fusion/opportunities.js
Normal file
@@ -0,0 +1,166 @@
|
||||
function createFusionOpportunities({
|
||||
OPPORTUNITIES_PAGE_LIMIT,
|
||||
OPPORTUNITIES_QUERY_URL,
|
||||
isCurrentPeriodRequest,
|
||||
logRequestFailure,
|
||||
logRequestStart,
|
||||
logRequestSuccess,
|
||||
maskToken,
|
||||
getOpportunityTypeValues,
|
||||
readResponseBodyForDebug,
|
||||
environment
|
||||
}) {
|
||||
const { fetch } = environment;
|
||||
async function requestOpportunitiesPage(token, period, dateRange, offset, accumulatedItems, requestVersion, page) {
|
||||
if (!isCurrentPeriodRequest(requestVersion)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const payload = createOpportunitiesQueryPayload(dateRange, offset);
|
||||
const requestBody = JSON.stringify(payload);
|
||||
const requestEntry = logRequestStart({
|
||||
name: "requestOpportunities",
|
||||
method: "POST",
|
||||
url: OPPORTUNITIES_QUERY_URL,
|
||||
headers: {
|
||||
Accept: "application/json",
|
||||
Authorization: `Bearer ${maskToken(token)}`,
|
||||
"Content-Type": "application/json",
|
||||
Origin: "https://eeho.fa.us2.oraclecloud.com",
|
||||
Preference: "transient"
|
||||
},
|
||||
body: JSON.stringify(payload, null, 2),
|
||||
metadata: {
|
||||
period,
|
||||
page,
|
||||
offset,
|
||||
startCloseDate: dateRange.startCloseDate,
|
||||
endCloseDate: dateRange.endCloseDate
|
||||
}
|
||||
});
|
||||
|
||||
try {
|
||||
const response = await fetch(OPPORTUNITIES_QUERY_URL, {
|
||||
method: "POST",
|
||||
credentials: "include",
|
||||
headers: {
|
||||
Accept: "application/json",
|
||||
Authorization: `Bearer ${token}`,
|
||||
"Content-Type": "application/json",
|
||||
Origin: "https://eeho.fa.us2.oraclecloud.com",
|
||||
Preference: "transient"
|
||||
},
|
||||
body: requestBody
|
||||
});
|
||||
|
||||
const responseBody = await readResponseBodyForDebug(response);
|
||||
logRequestSuccess(requestEntry, response, responseBody);
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`Opportunities query failed with status ${response.status}.`);
|
||||
}
|
||||
|
||||
const responseData = await response.json();
|
||||
const pageItems = Array.isArray(responseData.items) ? responseData.items : [];
|
||||
const allItems = accumulatedItems.concat(pageItems);
|
||||
|
||||
if (!responseData.hasMore) {
|
||||
return allItems;
|
||||
}
|
||||
|
||||
const responseOffset = Number(responseData.offset);
|
||||
const responseCount = Number(responseData.count);
|
||||
const receivedCount = Number.isFinite(responseCount) ? responseCount : pageItems.length;
|
||||
const currentOffset = Number.isFinite(responseOffset) ? responseOffset : offset;
|
||||
|
||||
if (receivedCount <= 0) {
|
||||
throw new Error("Opportunities query returned hasMore without additional results.");
|
||||
}
|
||||
|
||||
return requestOpportunitiesPage(
|
||||
token,
|
||||
period,
|
||||
dateRange,
|
||||
currentOffset + receivedCount,
|
||||
allItems,
|
||||
requestVersion,
|
||||
page + 1
|
||||
);
|
||||
} catch (error) {
|
||||
logRequestFailure(requestEntry, error.message || "Request failed.");
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
function createOpportunitiesQueryPayload(dateRange, offset) {
|
||||
return {
|
||||
aggregationResults: false,
|
||||
applications: ["ORACLE-ISS-APP"],
|
||||
onlyData: true,
|
||||
entity: "Opportunity",
|
||||
q: {
|
||||
op: "$and",
|
||||
criteria: [
|
||||
{
|
||||
op: "$or",
|
||||
criteria: Array.from(getOpportunityTypeValues(), (value) => ({
|
||||
op: "$eq",
|
||||
attribute: "RecordSet",
|
||||
value
|
||||
}))
|
||||
},
|
||||
{
|
||||
op: "$wi",
|
||||
attribute: "EffectiveDate",
|
||||
value1: dateRange.startCloseDate,
|
||||
value2: dateRange.endCloseDate,
|
||||
dynamicDate: false
|
||||
}
|
||||
]
|
||||
},
|
||||
keywords: null,
|
||||
keywordsFields: [
|
||||
"Name",
|
||||
"OptyNumber",
|
||||
"PrimaryRevenue.WinProb",
|
||||
"CustomerAccount",
|
||||
"PrimaryRevenue.RevnAmount",
|
||||
"EffectiveDate",
|
||||
"StatusCode",
|
||||
"DealRisk_c",
|
||||
"Owner",
|
||||
"ForecastGroup_c",
|
||||
"LastUpdateDate",
|
||||
"PrimaryRevenue.RevnAmountCurcyCode",
|
||||
"OptyId"
|
||||
],
|
||||
fields: [
|
||||
"Name",
|
||||
"OptyNumber",
|
||||
"PrimaryRevenue.WinProb",
|
||||
"CustomerAccount",
|
||||
"PrimaryRevenue.RevnAmount",
|
||||
"EffectiveDate",
|
||||
"StatusCode",
|
||||
"DealRisk_c",
|
||||
"Owner",
|
||||
"ForecastGroup_c",
|
||||
"LastUpdateDate",
|
||||
"PrimaryRevenue.RevnAmountCurcyCode",
|
||||
"OptyId",
|
||||
"CustomerAccount.PartyUniqueName",
|
||||
"CustomerAccount.PartyId",
|
||||
"CustomerAccount.PartyNumber"
|
||||
],
|
||||
sort: [],
|
||||
language: "en",
|
||||
skipInValidFields: true,
|
||||
skipHiddenFromUIFields: true,
|
||||
copiedFrom: "queries/d5dbcd01-9ff3-40be-9b5b-64744cbf7162",
|
||||
limit: OPPORTUNITIES_PAGE_LIMIT,
|
||||
offset
|
||||
};
|
||||
}
|
||||
|
||||
return { requestOpportunitiesPage, createOpportunitiesQueryPayload };
|
||||
}
|
||||
65
src/services/fusion/products.js
Normal file
65
src/services/fusion/products.js
Normal file
@@ -0,0 +1,65 @@
|
||||
function createFusionProducts({
|
||||
OPPTY_PRODUCTS_FIELDS,
|
||||
OPPTY_PRODUCTS_MAX_PAGES,
|
||||
OPPTY_PRODUCTS_PAGE_LIMIT,
|
||||
ORACLE_DOMAIN,
|
||||
environment
|
||||
}) {
|
||||
const { fetch } = environment;
|
||||
async function fetchAllOpptyProducts(optyNumber, accessToken) {
|
||||
let offset = 0;
|
||||
let page = 0;
|
||||
const items = [];
|
||||
|
||||
while (page < OPPTY_PRODUCTS_MAX_PAGES) {
|
||||
const response = await fetch(createOpptyProductsUrl(optyNumber, offset), {
|
||||
method: "GET",
|
||||
credentials: "include",
|
||||
headers: {
|
||||
Accept: "application/json",
|
||||
Authorization: `Bearer ${accessToken}`
|
||||
}
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`requestOpptyProducts failed with status ${response.status}.`);
|
||||
}
|
||||
|
||||
const responseData = await response.json();
|
||||
const pageItems = Array.isArray(responseData.items) ? responseData.items : [];
|
||||
items.push(...pageItems);
|
||||
page += 1;
|
||||
|
||||
if (!responseData.hasMore) {
|
||||
return items;
|
||||
}
|
||||
|
||||
const responseOffset = Number(responseData.offset);
|
||||
const responseCount = Number(responseData.count);
|
||||
const receivedCount = Number.isFinite(responseCount) ? responseCount : pageItems.length;
|
||||
const currentOffset = Number.isFinite(responseOffset) ? responseOffset : offset;
|
||||
|
||||
if (receivedCount <= 0) {
|
||||
throw new Error("requestOpptyProducts returned hasMore without additional results.");
|
||||
}
|
||||
|
||||
offset = currentOffset + receivedCount;
|
||||
}
|
||||
|
||||
throw new Error("requestOpptyProducts exceeded the pagination safety limit.");
|
||||
}
|
||||
|
||||
function createOpptyProductsUrl(optyNumber, offset) {
|
||||
const url = new URL(`https://${ORACLE_DOMAIN}/crmRestApi/rest/rv:be91c002-2e5d-4ed2-a37e-e0c837bf141f/en/11.13.18.05:9/opportunities/${encodeURIComponent(optyNumber)}/child/ChildRevenue`);
|
||||
url.searchParams.set("onlyData", "true");
|
||||
url.searchParams.set("q", "(SplitTypeCode!='DETAILCHILDSPLIT') AND (RecurTypeCode!='CHILDRECUR')");
|
||||
url.searchParams.set("totalResults", "false");
|
||||
url.searchParams.set("fields", OPPTY_PRODUCTS_FIELDS.join(","));
|
||||
url.searchParams.set("orderBy", "CreationDate:desc");
|
||||
url.searchParams.set("limit", String(OPPTY_PRODUCTS_PAGE_LIMIT));
|
||||
url.searchParams.set("offset", String(offset));
|
||||
return url.toString();
|
||||
}
|
||||
|
||||
return { fetchAllOpptyProducts, createOpptyProductsUrl };
|
||||
}
|
||||
Reference in New Issue
Block a user