173 lines
5.1 KiB
JavaScript
173 lines
5.1 KiB
JavaScript
import { uniqBy } from "lodash";
|
|
|
|
/**
|
|
* Get value from path
|
|
* @param obj
|
|
* @param path
|
|
* @returns {*}
|
|
*/
|
|
const getValueFromPath = (obj, path) => path.split(".").reduce((prev, curr) => prev?.[curr], obj);
|
|
|
|
/**
|
|
* Generate options from array
|
|
* @param bodyshop
|
|
* @param path
|
|
* @returns {unknown[]}
|
|
*/
|
|
const generateOptionsFromArray = (bodyshop, path) => {
|
|
const options = getValueFromPath(bodyshop, path);
|
|
return uniqBy(
|
|
options.map((value) => ({
|
|
label: value,
|
|
value: value
|
|
})),
|
|
"value"
|
|
);
|
|
};
|
|
|
|
/**
|
|
* Valid internal reflections
|
|
* Note: This is intended for future functionality
|
|
* @type {{special: string[], bodyshop: [{name: string, type: string}]}}
|
|
*/
|
|
const VALID_INTERNAL_REFLECTIONS = {
|
|
bodyshop: [
|
|
{
|
|
name: "md_ro_statuses.statuses",
|
|
type: "kv-to-v"
|
|
}
|
|
]
|
|
};
|
|
|
|
/**
|
|
* Generate options
|
|
* @param bodyshop
|
|
* @param path
|
|
* @param labelPath
|
|
* @param valuePath
|
|
* @returns {{label: *, value: *}[]}
|
|
*/
|
|
const generateOptionsFromObject = (bodyshop, path, labelPath, valuePath) => {
|
|
const options = getValueFromPath(bodyshop, path);
|
|
return uniqBy(
|
|
Object.values(options).map((value) => ({
|
|
label: value[labelPath],
|
|
value: value[valuePath]
|
|
})),
|
|
"value"
|
|
);
|
|
};
|
|
|
|
/**
|
|
* Generate special reflections
|
|
* @param bodyshop
|
|
* @param finalPath
|
|
* @param t - i18n
|
|
* @returns {{label: *, value: *}[]|{label: *, value: *}[]|{label: string, value: *}[]|*[]}
|
|
*/
|
|
const generateSpecialReflections = (bodyshop, finalPath, t) => {
|
|
switch (finalPath) {
|
|
case "payment_payers":
|
|
return [
|
|
{
|
|
label: t("payments.labels.customer"),
|
|
value: t("payments.labels.customer")
|
|
},
|
|
{
|
|
label: t("payments.labels.insurance"),
|
|
value: t("payments.labels.insurance")
|
|
},
|
|
// This is a weird one supposedly only used by one shop and could potentially be
|
|
// placed behind a SplitSDK
|
|
{
|
|
label: t("payments.labels.external"),
|
|
value: t("payments.labels.external")
|
|
}
|
|
];
|
|
case "payment_types":
|
|
return generateOptionsFromArray(bodyshop, "md_payment_types");
|
|
case "alt_transports":
|
|
return generateOptionsFromArray(bodyshop, "appt_alt_transport");
|
|
case "lost_sale_reasons":
|
|
return generateOptionsFromArray(bodyshop, "md_lost_sale_reasons");
|
|
// Special case because Referral Sources is an Array, not an Object.
|
|
case "referral_source":
|
|
return generateOptionsFromArray(bodyshop, "md_referral_sources");
|
|
case "class":
|
|
return generateOptionsFromArray(bodyshop, "md_classes");
|
|
case "cost_centers":
|
|
return generateOptionsFromObject(bodyshop, "md_responsibility_centers.costs", "name", "name");
|
|
// Special case because Categories is an Array, not an Object.
|
|
case "categories":
|
|
return generateOptionsFromArray(bodyshop, "md_categories");
|
|
case "insurance_companies":
|
|
return generateOptionsFromObject(bodyshop, "md_ins_cos", "name", "name");
|
|
case "employee_teams":
|
|
return generateOptionsFromObject(bodyshop, "employee_teams", "name", "id");
|
|
// Special case because Employees uses a concatenation of first_name and last_name
|
|
case "employees": {
|
|
const employeesOptions = getValueFromPath(bodyshop, "employees");
|
|
return uniqBy(
|
|
Object.values(employeesOptions).map((value) => ({
|
|
label: `${value.first_name} ${value.last_name}`,
|
|
value: value.id
|
|
})),
|
|
"value"
|
|
);
|
|
}
|
|
case "last_names":
|
|
return generateOptionsFromObject(bodyshop, "employees", "last_name", "last_name");
|
|
case "first_names":
|
|
return generateOptionsFromObject(bodyshop, "employees", "first_name", "first_name");
|
|
case "job_statuses": {
|
|
const statusOptions = getValueFromPath(bodyshop, "md_ro_statuses.statuses");
|
|
return Object.values(statusOptions).map((value) => ({
|
|
label: value,
|
|
value
|
|
}));
|
|
}
|
|
default:
|
|
console.error("Invalid Special reflection provided by Report Filters");
|
|
return [];
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Generate bodyshop reflections
|
|
* @param bodyshop
|
|
* @param finalPath
|
|
* @returns {{label: *, value: *}[]|*[]}
|
|
*/
|
|
const generateBodyshopReflections = (bodyshop, finalPath) => {
|
|
const options = getValueFromPath(bodyshop, finalPath);
|
|
const reflectionRenderer = VALID_INTERNAL_REFLECTIONS.bodyshop.find((reflection) => reflection.name === finalPath);
|
|
if (reflectionRenderer?.type === "kv-to-v") {
|
|
return Object.values(options).map((value) => ({
|
|
label: value,
|
|
value
|
|
}));
|
|
}
|
|
return [];
|
|
};
|
|
|
|
/**
|
|
* Generate internal reflections based on the path and bodyshop
|
|
* @param bodyshop
|
|
* @param upperPath
|
|
* @param finalPath
|
|
* @param t - i18n
|
|
* @returns {{label: *, value: *}[]|[]|{label: *, value: *}[]|{label: string, value: *}[]|{label: *, value: *}[]|*[]}
|
|
*/
|
|
const generateInternalReflections = ({ bodyshop, upperPath, finalPath, t }) => {
|
|
switch (upperPath) {
|
|
case "special":
|
|
return generateSpecialReflections(bodyshop, finalPath, t);
|
|
case "bodyshop":
|
|
return generateBodyshopReflections(bodyshop, finalPath);
|
|
default:
|
|
return [];
|
|
}
|
|
};
|
|
|
|
export { generateInternalReflections };
|