Implemented the Plan Detail view to display consumption overages or forfeitures

This commit is contained in:
2026-09-22 19:17:53 -03:00
parent ea164cdcd6
commit 9ac5ffb11d
22 changed files with 1221 additions and 25 deletions

View File

@@ -13,7 +13,8 @@ function createMessageTypes() {
requestAccountPlans: "opportunitiesExtension.requestAccountPlans",
requestInstallBase: "opportunitiesExtension.requestInstallBase",
requestCustomerServiceRequest: "opportunitiesExtension.requestCustomerServiceRequest",
requestConsumptionTrend: "opportunitiesExtension.requestConsumptionTrend"
requestConsumptionTrend: "opportunitiesExtension.requestConsumptionTrend",
requestConsumptionPlanDetail: "opportunitiesExtension.requestConsumptionPlanDetail"
});
}
@@ -623,7 +624,32 @@ function createSpaConsumption({
}
}
return { requestConsumptionTrend };
async function requestConsumptionPlanDetail(message) {
const debugRequests = [];
try {
const subPlanNum = typeof message.subPlanNum === "string" ? message.subPlanNum.trim() : "";
const authorization = normalizeMessageAuthorization(message.authorization, "g2m-authorization");
if (!subPlanNum) throw new Error("Sub plan number is required for plan details.");
if (!authorization.value) throw new Error("OCICONS-TS authorization is unavailable for plan details.");
const url = `https://spa.oracle.com/oalcrm/web/api/provider-proxy/g2m-consumption/service/v1/plan/plandetail/${encodeURIComponent(subPlanNum)}?active=true`;
const items = await fetchJson(url, {
method: "GET", credentials: "include", cache: "no-store",
headers: { Accept: "application/json", "G2m-Authorization": authorization.value }
}, "requestConsumptionPlanDetail", debugRequests);
const validLines = (lines, depth = 0) => Array.isArray(lines) && depth <= 20 && lines.every(line =>
line && typeof line === "object" && !Array.isArray(line)
&& (line.clines === undefined || line.clines === null || validLines(line.clines, depth + 1)));
if (!validLines(items)) throw new Error("requestConsumptionPlanDetail returned invalid plan details.");
return { ok: true, subPlanNum, items, debugRequests };
} catch (error) {
const entry = debugRequests[debugRequests.length - 1];
if (entry && entry.status === "success") { entry.status = "failed"; entry.error = error.message; }
error.debugRequests = debugRequests;
throw error;
}
}
return { requestConsumptionTrend, requestConsumptionPlanDetail };
}
// Source: src/services/spa/response-shapes.js
@@ -1580,6 +1606,7 @@ function registerBackgroundMessages({
requestCustomerServiceRequest,
requestConsumerTokenService,
requestConsumptionTrend,
requestConsumptionPlanDetail,
requestOpptyProducts,
runtimeApi
}) {
@@ -1687,6 +1714,14 @@ runtimeApi.runtime.onMessage.addListener((message, sender, sendResponse) => {
return true;
}
if (message.type === messageTypes.requestConsumptionPlanDetail) {
requestConsumptionPlanDetail(message).then(sendResponse).catch(error => sendResponse({
ok: false, error: error.message || "Unable to load consumption plan details.",
debugRequests: Array.isArray(error.debugRequests) ? error.debugRequests : []
}));
return true;
}
if (message.type === messageTypes.requestConsumptionTrend) {
requestConsumptionTrend(message)
.then(sendResponse)
@@ -1821,10 +1856,11 @@ function createBackgroundApplication(overrides = {}) {
const requestCustomerServiceRequest = (...args) => spaCustomerServiceRequests.requestCustomerServiceRequest(...args);
const requestConsumerTokenService = (...args) => authConsumerSession.requestConsumerTokenService(...args);
const requestConsumptionTrend = (...args) => spaConsumption.requestConsumptionTrend(...args);
const requestConsumptionPlanDetail = (...args) => spaConsumption.requestConsumptionPlanDetail(...args);
const requestOpptyProducts = (...args) => productsBackgroundJobs.requestOpptyProducts(...args);
const runtimeApi = environment.browser || environment.chrome;
function start() {
startBackgroundApplication({ messageTypes, getXsrfTokenCookie, refreshXsrfCookie, requestAccountPlans, requestInstallBase, requestCustomerServiceRequest, requestConsumerTokenService, requestConsumptionTrend, requestOpptyProducts, runtimeApi });
startBackgroundApplication({ messageTypes, getXsrfTokenCookie, refreshXsrfCookie, requestAccountPlans, requestInstallBase, requestCustomerServiceRequest, requestConsumerTokenService, requestConsumptionTrend, requestConsumptionPlanDetail, requestOpptyProducts, runtimeApi });
}
return {
start, contracts,

File diff suppressed because one or more lines are too long