const Dinero = require("dinero.js"); const queries = require("../graphql-client/queries"); const GraphQLClient = require("graphql-request").GraphQLClient; const logger = require("../utils/logger"); const { CalculateExpectedHoursForJob, CalculateTicketsHoursForJob } = require("./pay-all"); const moment = require("moment"); // Dinero.defaultCurrency = "USD"; // Dinero.globalLocale = "en-CA"; Dinero.globalRoundingMode = "HALF_EVEN"; exports.claimtask = async function (req, res) { const { jobid, task, calculateOnly, employee } = req.body; logger.log("job-payroll-pay-all", "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 }); const theTaskPreset = job.bodyshop.md_tasks_presets.presets.find((tp) => tp.name === task); if (!theTaskPreset) { res.status(400).json({ success: false, error: "Provided task preset not found." }); return; } //Get all of the assignments that are filtered. const { assignmentHash, employeeHash } = CalculateExpectedHoursForJob(job, theTaskPreset.hourstype); const ticketsToInsert = []; //Then add them in based on a percentage to each employee. Object.keys(employeeHash).forEach((employeeIdKey) => { //At the employee level. Object.keys(employeeHash[employeeIdKey]).forEach((laborTypeKey) => { //At the labor level Object.keys(employeeHash[employeeIdKey][laborTypeKey]).forEach((rateKey) => { //At the rate level. const expectedHours = employeeHash[employeeIdKey][laborTypeKey][rateKey] * (theTaskPreset.percent / 100); ticketsToInsert.push({ task_name: task, jobid: job.id, bodyshopid: job.bodyshop.id, employeeid: employeeIdKey, productivehrs: expectedHours, rate: rateKey, ciecacode: laborTypeKey, flat_rate: true, cost_center: job.bodyshop.md_responsibility_centers.defaults.costs[laborTypeKey], memo: `*Flagged Task* ${theTaskPreset.memo}` }); }); }); }); if (!calculateOnly) { //Insert the time ticekts if we're not just calculating them. const insertResult = await client.request(queries.INSERT_TIME_TICKETS, { timetickets: ticketsToInsert.filter((ticket) => ticket.productivehrs !== 0) }); const updateResult = await client.request(queries.UPDATE_JOB, { jobId: job.id, job: { status: theTaskPreset.nextstatus, completed_tasks: [ ...job.completed_tasks, { name: task, completedat: moment(), completed_by: employee, useremail: req.user.email } ] } }); } res.json({ unassignedHours: assignmentHash.unassigned, ticketsToInsert }); } catch (error) { logger.log("job-payroll-claim-task-error", "ERROR", req.user.email, jobid, { jobid: jobid, error }); res.status(503).send(); } };