Files
bodyshop/server/payroll/calculate-totals.js

83 lines
2.7 KiB
JavaScript

const queries = require("../graphql-client/queries");
const logger = require("../utils/logger");
const { CalculateExpectedHoursForJob, CalculateTicketsHoursForJob } = require("./pay-all");
exports.calculatelabor = async function (req, res) {
const { jobid } = req.body;
logger.log("job-payroll-calculate-labor", "DEBUG", req.user.email, jobid, null);
const BearerToken = req.BearerToken;
const client = req.userGraphQLClient;
try {
const { jobs_by_pk: job } = await client
.setHeaders({ Authorization: BearerToken })
.request(queries.QUERY_JOB_PAYROLL_DATA, {
id: jobid
});
//iterate over each ticket, building a hash of team -> employee to calculate total assigned hours.
const { employeeHash, assignmentHash } = CalculateExpectedHoursForJob(job);
const ticketHash = CalculateTicketsHoursForJob(job);
const totals = [];
//Iteratively go through all 4 levels of the object and create an array that can be presented.
// use the employee hash as the golden record (i.e. what they should have), and add what they've claimed.
//While going through, delete items from ticket hash.
//Anything left in ticket hash is an extra entered item.
Object.keys(employeeHash).forEach((employeeIdKey) => {
//At the employee level.
Object.keys(employeeHash[employeeIdKey]).forEach((laborTypeKey) => {
const expected = employeeHash[employeeIdKey][laborTypeKey];
const claimed = ticketHash?.[employeeIdKey]?.[laborTypeKey];
if (claimed) {
delete ticketHash[employeeIdKey][laborTypeKey];
}
totals.push({
employeeid: employeeIdKey,
rate: expected.rate,
mod_lbr_ty: laborTypeKey,
expectedHours: expected.hours,
claimedHours: claimed?.hours || 0
});
});
});
Object.keys(ticketHash).forEach((employeeIdKey) => {
//At the employee level.
Object.keys(ticketHash[employeeIdKey]).forEach((laborTypeKey) => {
const claimed = ticketHash[employeeIdKey][laborTypeKey];
totals.push({
employeeid: employeeIdKey,
rate: claimed.rate,
mod_lbr_ty: laborTypeKey,
expectedHours: 0,
claimedHours: claimed.hours || 0
});
});
});
if (assignmentHash.unassigned > 0) {
totals.push({
employeeid: undefined,
//rate: rateKey,
//mod_lbr_ty: laborTypeKey,
expectedHours: assignmentHash.unassigned,
claimedHours: 0
});
}
res.json(totals);
//res.json(assignmentHash);
} catch (error) {
logger.log("job-payroll-calculate-labor-error", "ERROR", req.user.email, jobid, {
jobid: jobid,
error
});
res.status(400).json({ error: error.message });
}
};