IO-836 Added all job costing data.
This commit is contained in:
14
client/package-lock.json
generated
14
client/package-lock.json
generated
@@ -2292,9 +2292,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@popperjs/core": {
|
"@popperjs/core": {
|
||||||
"version": "2.9.1",
|
"version": "2.9.2",
|
||||||
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.1.tgz",
|
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.2.tgz",
|
||||||
"integrity": "sha512-DvJbbn3dUgMxDnJLH+RZQPnXak1h4ZVYQ7CWiFWjQwBFkVajT4rfw2PdpHLTSTwxrYfnoEXkuBiwkDm6tPMQeA=="
|
"integrity": "sha512-VZMYa7+fXHdwIq1TDhSXoVmSPEGM/aa+6Aiq3nVVJ9bXr24zScr+NlKFKC3iPljA7ho/GAZr+d2jOf5GIRC30Q=="
|
||||||
},
|
},
|
||||||
"@protobufjs/aspromise": {
|
"@protobufjs/aspromise": {
|
||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
@@ -14417,13 +14417,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"react-big-calendar": {
|
"react-big-calendar": {
|
||||||
"version": "0.32.0",
|
"version": "0.33.2",
|
||||||
"resolved": "https://registry.npmjs.org/react-big-calendar/-/react-big-calendar-0.32.0.tgz",
|
"resolved": "https://registry.npmjs.org/react-big-calendar/-/react-big-calendar-0.33.2.tgz",
|
||||||
"integrity": "sha512-IidodG2oCd9VH7f9AsZAMyPZw12wLoicjHzEECrqdg3PIOuKOTScYhsqrSdNq+5j3vfy5sby5cWdBxgViMz9Mg==",
|
"integrity": "sha512-bUpkLdkHyAHj7wYdPdAXbhPE1S3y0eFJ69m4Hi2rz41gdgP3Ti10rTOhRYYsO7GS4RGqsCUtUrn37iHqdcOJog==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"@babel/runtime": "^7.1.5",
|
"@babel/runtime": "^7.1.5",
|
||||||
"clsx": "^1.0.4",
|
"clsx": "^1.0.4",
|
||||||
"date-arithmetic": "^4.0.1",
|
"date-arithmetic": "^4.1.0",
|
||||||
"dom-helpers": "^5.1.0",
|
"dom-helpers": "^5.1.0",
|
||||||
"invariant": "^2.2.4",
|
"invariant": "^2.2.4",
|
||||||
"lodash": "^4.17.11",
|
"lodash": "^4.17.11",
|
||||||
|
|||||||
@@ -57,16 +57,129 @@ async function JobCostingMulti(req, res) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//for Each!***************
|
//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 = {};
|
const ret = {};
|
||||||
resp.jobs.map((job) => {
|
resp.jobs.map((job) => {
|
||||||
console.time(`CostingData-${job.id}`);
|
console.time(`CostingData-${job.id}`);
|
||||||
ret[job.id] = GenerateCostingData(job);
|
const costingData = GenerateCostingData(job);
|
||||||
|
ret[job.id] = costingData;
|
||||||
console.timeEnd(`CostingData-${job.id}`);
|
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");
|
console.timeEnd("JobCostingMultiQueryExecution");
|
||||||
|
|
||||||
res.status(200).json(ret);
|
res.status(200).json({
|
||||||
|
costCenterData: finalCostingdata,
|
||||||
|
summaryData: multiSummary.summaryData,
|
||||||
|
data: ret,
|
||||||
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log("error", error);
|
console.log("error", error);
|
||||||
res.status(400).send(JSON.stringify(error));
|
res.status(400).send(JSON.stringify(error));
|
||||||
@@ -191,12 +304,6 @@ function GenerateCostingData(job) {
|
|||||||
100
|
100
|
||||||
).toFixed(2);
|
).toFixed(2);
|
||||||
|
|
||||||
let gppercentFormatted;
|
|
||||||
if (isNaN(gppercent)) gppercentFormatted = "0%";
|
|
||||||
else if (!isFinite(gppercent)) gppercentFormatted = "- ∞";
|
|
||||||
else {
|
|
||||||
gppercentFormatted = `${gppercent}%`;
|
|
||||||
}
|
|
||||||
//Push summary data to avoid extra loop.
|
//Push summary data to avoid extra loop.
|
||||||
summaryData.totalLaborSales = summaryData.totalLaborSales.add(sale_labor);
|
summaryData.totalLaborSales = summaryData.totalLaborSales.add(sale_labor);
|
||||||
summaryData.totalPartsSales = summaryData.totalPartsSales.add(sale_parts);
|
summaryData.totalPartsSales = summaryData.totalPartsSales.add(sale_parts);
|
||||||
@@ -211,15 +318,20 @@ function GenerateCostingData(job) {
|
|||||||
id: idx,
|
id: idx,
|
||||||
cost_center: ccVal,
|
cost_center: ccVal,
|
||||||
sale_labor: sale_labor && sale_labor.toFormat(),
|
sale_labor: sale_labor && sale_labor.toFormat(),
|
||||||
|
sale_labor_dinero: sale_labor,
|
||||||
sale_parts: sale_parts && sale_parts.toFormat(),
|
sale_parts: sale_parts && sale_parts.toFormat(),
|
||||||
|
sale_parts_dinero: sale_parts,
|
||||||
sales: sale_labor.add(sale_parts).toFormat(),
|
sales: sale_labor.add(sale_parts).toFormat(),
|
||||||
sales_dinero: sale_labor.add(sale_parts),
|
sales_dinero: sale_labor.add(sale_parts),
|
||||||
cost_parts: cost_parts && cost_parts.toFormat(),
|
cost_parts: cost_parts && cost_parts.toFormat(),
|
||||||
|
cost_parts_dinero: cost_parts,
|
||||||
cost_labor: cost_labor && cost_labor.toFormat(),
|
cost_labor: cost_labor && cost_labor.toFormat(),
|
||||||
|
cost_labor_dinero: cost_labor,
|
||||||
costs: cost_parts.add(cost_labor).toFormat(),
|
costs: cost_parts.add(cost_labor).toFormat(),
|
||||||
costs_dinero: cost_parts.add(cost_labor),
|
costs_dinero: cost_parts.add(cost_labor),
|
||||||
|
gpdollars_dinero: gpdollars,
|
||||||
gpdollars: gpdollars.toFormat(),
|
gpdollars: gpdollars.toFormat(),
|
||||||
gppercent: gppercentFormatted,
|
gppercent: formatGpPercent(gppercent),
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -243,3 +355,14 @@ function GenerateCostingData(job) {
|
|||||||
|
|
||||||
exports.JobCosting = JobCosting;
|
exports.JobCosting = JobCosting;
|
||||||
exports.JobCostingMulti = JobCostingMulti;
|
exports.JobCostingMulti = JobCostingMulti;
|
||||||
|
|
||||||
|
const formatGpPercent = (gppercent) => {
|
||||||
|
let gppercentFormatted;
|
||||||
|
if (isNaN(gppercent)) gppercentFormatted = "0%";
|
||||||
|
else if (!isFinite(gppercent)) gppercentFormatted = "- ∞";
|
||||||
|
else {
|
||||||
|
gppercentFormatted = `${gppercent}%`;
|
||||||
|
}
|
||||||
|
|
||||||
|
return gppercentFormatted;
|
||||||
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user