IO-836 Added all job costing data.

This commit is contained in:
Patrick Fic
2021-04-12 10:19:37 -07:00
parent e93bcd14ef
commit 84959209e6
2 changed files with 139 additions and 16 deletions

View File

@@ -57,16 +57,129 @@ async function JobCostingMulti(req, res) {
});
//for Each!***************
const multiSummary = {
costCenterData: [],
summaryData: {
totalLaborSales: Dinero({ amount: 0 }),
totalPartsSales: Dinero({ amount: 0 }),
totalSales: Dinero({ amount: 0 }),
totalLaborCost: Dinero({ amount: 0 }),
totalPartsCost: Dinero({ amount: 0 }),
totalCost: Dinero({ amount: 0 }),
gpdollars: Dinero({ amount: 0 }),
gppercent: null,
gppercentFormatted: null,
},
};
const ret = {};
resp.jobs.map((job) => {
console.time(`CostingData-${job.id}`);
ret[job.id] = GenerateCostingData(job);
const costingData = GenerateCostingData(job);
ret[job.id] = costingData;
console.timeEnd(`CostingData-${job.id}`);
console.time(`SummaryOfCostingData-${job.id}`);
//Merge on a cost center basis.
costingData.costCenterData.forEach((c) => {
//Find the Cost Center if it exists.
const CostCenterIndex = multiSummary.costCenterData.findIndex(
(x) => x.cost_center === c.cost_center
);
console.log(`CostCenterIndex`, CostCenterIndex);
if (CostCenterIndex >= 0) {
//Add it in place
multiSummary.costCenterData[CostCenterIndex] = {
...multiSummary.costCenterData[CostCenterIndex],
sale_labor_dinero: multiSummary.costCenterData[
CostCenterIndex
].sale_labor_dinero.add(c.sale_labor_dinero),
sale_parts_dinero: multiSummary.costCenterData[
CostCenterIndex
].sale_parts_dinero.add(c.sale_parts_dinero),
cost_labor_dinero: multiSummary.costCenterData[
CostCenterIndex
].cost_labor_dinero.add(c.cost_labor_dinero),
cost_parts_dinero: multiSummary.costCenterData[
CostCenterIndex
].cost_parts_dinero.add(c.cost_parts_dinero),
gpdollars_dinero: multiSummary.costCenterData[
CostCenterIndex
].gpdollars_dinero.add(c.gpdollars_dinero),
costs_dinero: multiSummary.costCenterData[
CostCenterIndex
].costs_dinero.add(c.costs_dinero),
sales_dinero: multiSummary.costCenterData[
CostCenterIndex
].sales_dinero.add(c.sales_dinero),
};
} else {
//Add it to the list instead.
multiSummary.costCenterData.push(c);
}
});
//Add all summary data.
multiSummary.summaryData.totalPartsSales = multiSummary.summaryData.totalPartsSales.add(
costingData.summaryData.totalPartsSales
);
multiSummary.summaryData.totalSales = multiSummary.summaryData.totalSales.add(
costingData.summaryData.totalSales
);
multiSummary.summaryData.totalLaborCost = multiSummary.summaryData.totalLaborCost.add(
costingData.summaryData.totalLaborCost
);
multiSummary.summaryData.totalLaborSales = multiSummary.summaryData.totalLaborSales.add(
costingData.summaryData.totalLaborSales
);
multiSummary.summaryData.totalPartsCost = multiSummary.summaryData.totalPartsCost.add(
costingData.summaryData.totalPartsCost
);
multiSummary.summaryData.totalCost = multiSummary.summaryData.totalCost.add(
costingData.summaryData.totalCost
);
multiSummary.summaryData.gpdollars = multiSummary.summaryData.gpdollars.add(
costingData.summaryData.gpdollars
);
console.timeEnd(`SummaryOfCostingData-${job.id}`);
//Take the summary data & add it to total summary data.
});
//For each center, recalculate and toFormat() the values.
const finalCostingdata = multiSummary.costCenterData.map((c) => {
return {
...c,
sale_labor: c.sale_labor_dinero && c.sale_labor_dinero.toFormat(),
sale_parts: c.sale_parts_dinero && c.sale_parts_dinero.toFormat(),
sales: c.sale_labor_dinero.add(c.sale_parts_dinero).toFormat(),
cost_parts: c.cost_parts_dinero && c.cost_parts_dinero.toFormat(),
cost_labor: c.cost_labor_dinero && c.cost_labor_dinero.toFormat(),
costs: c.cost_parts_dinero.add(c.cost_labor_dinero).toFormat(),
gpdollars: c.gpdollars_dinero.toFormat(),
gppercent: formatGpPercent(
(
(c.gpdollars_dinero.getAmount() / c.sales_dinero.getAmount()) *
100
).toFixed(2)
),
};
});
//Calculate thte total gross profit percentages.
console.timeEnd("JobCostingMultiQueryExecution");
res.status(200).json(ret);
res.status(200).json({
costCenterData: finalCostingdata,
summaryData: multiSummary.summaryData,
data: ret,
});
} catch (error) {
console.log("error", error);
res.status(400).send(JSON.stringify(error));
@@ -191,12 +304,6 @@ function GenerateCostingData(job) {
100
).toFixed(2);
let gppercentFormatted;
if (isNaN(gppercent)) gppercentFormatted = "0%";
else if (!isFinite(gppercent)) gppercentFormatted = "- ∞";
else {
gppercentFormatted = `${gppercent}%`;
}
//Push summary data to avoid extra loop.
summaryData.totalLaborSales = summaryData.totalLaborSales.add(sale_labor);
summaryData.totalPartsSales = summaryData.totalPartsSales.add(sale_parts);
@@ -211,15 +318,20 @@ function GenerateCostingData(job) {
id: idx,
cost_center: ccVal,
sale_labor: sale_labor && sale_labor.toFormat(),
sale_labor_dinero: sale_labor,
sale_parts: sale_parts && sale_parts.toFormat(),
sale_parts_dinero: sale_parts,
sales: sale_labor.add(sale_parts).toFormat(),
sales_dinero: sale_labor.add(sale_parts),
cost_parts: cost_parts && cost_parts.toFormat(),
cost_parts_dinero: cost_parts,
cost_labor: cost_labor && cost_labor.toFormat(),
cost_labor_dinero: cost_labor,
costs: cost_parts.add(cost_labor).toFormat(),
costs_dinero: cost_parts.add(cost_labor),
gpdollars_dinero: gpdollars,
gpdollars: gpdollars.toFormat(),
gppercent: gppercentFormatted,
gppercent: formatGpPercent(gppercent),
};
});
@@ -243,3 +355,14 @@ function GenerateCostingData(job) {
exports.JobCosting = JobCosting;
exports.JobCostingMulti = JobCostingMulti;
const formatGpPercent = (gppercent) => {
let gppercentFormatted;
if (isNaN(gppercent)) gppercentFormatted = "0%";
else if (!isFinite(gppercent)) gppercentFormatted = "- ∞";
else {
gppercentFormatted = `${gppercent}%`;
}
return gppercentFormatted;
};