|
|
|
@@ -221,6 +221,8 @@ const CreateRepairOrderTag = (job, errorCallback) => {
|
|
|
|
|
|
|
|
|
|
|
|
const repairCosts = CreateCosts(job);
|
|
|
|
const repairCosts = CreateCosts(job);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const LaborDetailLines = generateLaborLines(job.timetickets);
|
|
|
|
|
|
|
|
|
|
|
|
//Calculate detail only lines.
|
|
|
|
//Calculate detail only lines.
|
|
|
|
const detailAdjustments = job.joblines
|
|
|
|
const detailAdjustments = job.joblines
|
|
|
|
.filter((jl) => jl.ah_detail_line && jl.mod_lbr_ty)
|
|
|
|
.filter((jl) => jl.ah_detail_line && jl.mod_lbr_ty)
|
|
|
|
@@ -606,12 +608,14 @@ const CreateRepairOrderTag = (job, errorCallback) => {
|
|
|
|
// CSIID: null,
|
|
|
|
// CSIID: null,
|
|
|
|
InsGroupCode: null
|
|
|
|
InsGroupCode: null
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
DetailLines: {
|
|
|
|
DetailLines: {
|
|
|
|
DetailLine:
|
|
|
|
DetailLine:
|
|
|
|
job.joblines.length > 0
|
|
|
|
job.joblines.length > 0
|
|
|
|
? job.joblines.map((jl) => GenerateDetailLines(job, jl, job.bodyshop.md_order_statuses))
|
|
|
|
? job.joblines.map((jl) => GenerateDetailLines(job, jl, job.bodyshop.md_order_statuses))
|
|
|
|
: [generateNullDetailLine()]
|
|
|
|
: [generateNullDetailLine()]
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
LaborDetailLines: {
|
|
|
|
|
|
|
|
LaborDetailLine: LaborDetailLines
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
return ret;
|
|
|
|
return ret;
|
|
|
|
@@ -787,6 +791,76 @@ const CreateCosts = (job) => {
|
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const generateLaborLines = (timetickets) => {
|
|
|
|
|
|
|
|
if (!timetickets || timetickets.length === 0) return [];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const codeToProps = {
|
|
|
|
|
|
|
|
LAB: { actual: "LaborBodyActualHours", flag: "LaborBodyFlagHours", cost: "LaborBodyCost" },
|
|
|
|
|
|
|
|
LAM: { actual: "LaborMechanicalActualHours", flag: "LaborMechanicalFlagHours", cost: "LaborMechanicalCost" },
|
|
|
|
|
|
|
|
LAG: { actual: "LaborGlassActualHours", flag: "LaborGlassFlagHours", cost: "LaborGlassCost" },
|
|
|
|
|
|
|
|
LAS: { actual: "LaborStructuralActualHours", flag: "LaborStructuralFlagHours", cost: "LaborStructuralCost" },
|
|
|
|
|
|
|
|
LAE: { actual: "LaborElectricalActualHours", flag: "LaborElectricalFlagHours", cost: "LaborElectricalCost" },
|
|
|
|
|
|
|
|
LAA: { actual: "LaborAluminumActualHours", flag: "LaborAluminumFlagHours", cost: "LaborAluminumCost" },
|
|
|
|
|
|
|
|
LAR: { actual: "LaborRefinishActualHours", flag: "LaborRefinishFlagHours", cost: "LaborRefinishCost" },
|
|
|
|
|
|
|
|
LAU: { actual: "LaborDetailActualHours", flag: "LaborDetailFlagHours", cost: "LaborDetailCost" },
|
|
|
|
|
|
|
|
LA1: { actual: "LaborOtherActualHours", flag: "LaborOtherFlagHours", cost: "LaborOtherCost" },
|
|
|
|
|
|
|
|
LA2: { actual: "LaborOtherActualHours", flag: "LaborOtherFlagHours", cost: "LaborOtherCost" },
|
|
|
|
|
|
|
|
LA3: { actual: "LaborOtherActualHours", flag: "LaborOtherFlagHours", cost: "LaborOtherCost" },
|
|
|
|
|
|
|
|
LA4: { actual: "LaborOtherActualHours", flag: "LaborOtherFlagHours", cost: "LaborOtherCost" }
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return timetickets.map((ticket, idx) => {
|
|
|
|
|
|
|
|
const { ciecacode, employee, actualhrs = 0, productivehrs = 0, rate = 0 } = ticket;
|
|
|
|
|
|
|
|
const isFlatRate = employee?.flat_rate;
|
|
|
|
|
|
|
|
const hours = isFlatRate ? productivehrs : actualhrs;
|
|
|
|
|
|
|
|
const cost = rate * hours;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const laborDetail = {
|
|
|
|
|
|
|
|
LaborDetailLineNumber: idx + 1,
|
|
|
|
|
|
|
|
TechnicianNameFirst: employee?.first_name || "",
|
|
|
|
|
|
|
|
TechnicianNameLast: employee?.last_name || "",
|
|
|
|
|
|
|
|
LaborBodyActualHours: 0,
|
|
|
|
|
|
|
|
LaborMechanicalActualHours: 0,
|
|
|
|
|
|
|
|
LaborGlassActualHours: 0,
|
|
|
|
|
|
|
|
LaborStructuralActualHours: 0,
|
|
|
|
|
|
|
|
LaborElectricalActualHours: 0,
|
|
|
|
|
|
|
|
LaborAluminumActualHours: 0,
|
|
|
|
|
|
|
|
LaborRefinishActualHours: 0,
|
|
|
|
|
|
|
|
LaborDetailActualHours: 0,
|
|
|
|
|
|
|
|
LaborOtherActualHours: 0,
|
|
|
|
|
|
|
|
LaborBodyFlagHours: 0,
|
|
|
|
|
|
|
|
LaborMechanicalFlagHours: 0,
|
|
|
|
|
|
|
|
LaborGlassFlagHours: 0,
|
|
|
|
|
|
|
|
LaborStructuralFlagHours: 0,
|
|
|
|
|
|
|
|
LaborElectricalFlagHours: 0,
|
|
|
|
|
|
|
|
LaborAluminumFlagHours: 0,
|
|
|
|
|
|
|
|
LaborRefinishFlagHours: 0,
|
|
|
|
|
|
|
|
LaborDetailFlagHours: 0,
|
|
|
|
|
|
|
|
LaborOtherFlagHours: 0,
|
|
|
|
|
|
|
|
LaborBodyCost: 0,
|
|
|
|
|
|
|
|
LaborMechanicalCost: 0,
|
|
|
|
|
|
|
|
LaborGlassCost: 0,
|
|
|
|
|
|
|
|
LaborStructuralCost: 0,
|
|
|
|
|
|
|
|
LaborElectricalCost: 0,
|
|
|
|
|
|
|
|
LaborAluminumCost: 0,
|
|
|
|
|
|
|
|
LaborRefinishCost: 0,
|
|
|
|
|
|
|
|
LaborDetailCost: 0,
|
|
|
|
|
|
|
|
LaborOtherCost: 0
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const effectiveCiecacode = ciecacode || "LA4";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (codeToProps[effectiveCiecacode]) {
|
|
|
|
|
|
|
|
const { actual, flag, cost: costProp } = codeToProps[effectiveCiecacode];
|
|
|
|
|
|
|
|
laborDetail[actual] = actualhrs;
|
|
|
|
|
|
|
|
laborDetail[flag] = productivehrs;
|
|
|
|
|
|
|
|
laborDetail[costProp] = cost;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return laborDetail;
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const StatusMapping = (status, md_ro_statuses) => {
|
|
|
|
const StatusMapping = (status, md_ro_statuses) => {
|
|
|
|
//Possible return statuses EST, SCH, ARR, IPR, RDY, DEL, CLO, CAN, UNDEFINED.
|
|
|
|
//Possible return statuses EST, SCH, ARR, IPR, RDY, DEL, CLO, CAN, UNDEFINED.
|
|
|
|
const {
|
|
|
|
const {
|
|
|
|
|