52 lines
1.8 KiB
JavaScript
52 lines
1.8 KiB
JavaScript
/**
|
||
* Parse vendor status code from various possible locations in the error object.
|
||
* @param err
|
||
* @returns {number|null}
|
||
*/
|
||
const parseVendorStatusCode = (err) => {
|
||
// Prefer explicit numeric props when available.
|
||
const codeProp = err?.code ?? err?.statusCode ?? err?.meta?.status?.StatusCode ?? err?.status?.StatusCode;
|
||
const num = Number(codeProp);
|
||
if (!Number.isNaN(num) && num > 0) return num;
|
||
|
||
// Fallback: parse from message text (e.g., "... 507 CANNOT EXCEED ...")
|
||
const m = String(err?.message || "").match(/\b(\d{3})\b/);
|
||
return m ? Number(m[1]) : null;
|
||
};
|
||
|
||
/**
|
||
* Classify RR vendor errors into a small set of stable codes/messages for the FE.
|
||
* @param {any} err
|
||
* @returns {{vendorStatusCode:number|null, errorCode:string, title:string, friendlyMessage:string, severity:'info'|'warning'|'error', canRetry:boolean}}
|
||
*/
|
||
const classifyRRVendorError = (err) => {
|
||
const code = parseVendorStatusCode(err);
|
||
const rawMsg = String(err?.meta?.status?.Message || err?.status?.Message || err?.message || "").toUpperCase();
|
||
|
||
// Open RO cap exceeded
|
||
if (code === 507 || /MAXIMUM NUMBER OF ROS/.test(rawMsg)) {
|
||
return {
|
||
vendorStatusCode: 507,
|
||
errorCode: "RR_MAX_OPEN_ROS",
|
||
title: "Customer Open RO limit reached",
|
||
friendlyMessage:
|
||
"Reynolds has reached the maximum number of open Repair Orders for this Customer. Close or finalize an RO in Reynolds, then try again.",
|
||
severity: "warning",
|
||
canRetry: true
|
||
};
|
||
}
|
||
|
||
// Default fallback
|
||
return {
|
||
vendorStatusCode: code ?? null,
|
||
errorCode: "RR_VENDOR_ERROR",
|
||
title: "Reynolds request failed",
|
||
friendlyMessage:
|
||
"We couldn’t complete the request with Reynolds. Please try again or contact support if this persists.",
|
||
severity: "error",
|
||
canRetry: true
|
||
};
|
||
};
|
||
|
||
module.exports = { classifyRRVendorError };
|