130 lines
4.3 KiB
JavaScript
130 lines
4.3 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);
|
|
|
|
/**
|
|
* 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');
|
|
}
|
|
|
|
const generateOptionsFromArray = (bodyshop, path) => {
|
|
const options = getValueFromPath(bodyshop, path);
|
|
return uniqBy(options.map((value) => ({
|
|
label: value,
|
|
value: value,
|
|
})), 'value');
|
|
}
|
|
|
|
/**
|
|
* Generate special reflections
|
|
* @param bodyshop
|
|
* @param finalPath
|
|
* @returns {{label: *, value: *}[]|{label: *, value: *}[]|{label: string, value: *}[]|*[]}
|
|
*/
|
|
const generateSpecialReflections = (bodyshop, finalPath) => {
|
|
switch (finalPath) {
|
|
// 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');
|
|
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
|
|
* @returns {{label: *, value: *}[]|[]|{label: *, value: *}[]|{label: string, value: *}[]|{label: *, value: *}[]|*[]}
|
|
*/
|
|
const generateInternalReflections = ({bodyshop, upperPath, finalPath}) => {
|
|
switch (upperPath) {
|
|
case 'special':
|
|
return generateSpecialReflections(bodyshop, finalPath);
|
|
case 'bodyshop':
|
|
return generateBodyshopReflections(bodyshop, finalPath);
|
|
default:
|
|
return [];
|
|
}
|
|
};
|
|
|
|
export {generateInternalReflections,}
|