const path = require("path"); require("dotenv").config({ path: path.resolve( process.cwd(), `.env.${process.env.NODE_ENV || "development"}` ), }); const GraphQLClient = require("graphql-request").GraphQLClient; const soap = require("soap"); const queries = require("../graphql-client/queries"); const CdkBase = require("../web-sockets/web-socket"); const CdkWsdl = require("./cdk-wsdl").default; const logger = require("../utils/logger"); const Dinero = require("dinero.js"); const _ = require("lodash"); exports.default = async function (socket, jobid) { try { CdkBase.createLogEvent( socket, "DEBUG", `Received request to calculate allocations for ${jobid}` ); const job = await QueryJobData(socket, jobid); const { bodyshop } = job; const profitCenterHash = job.joblines.reduce((acc, val) => { //Check the Parts Assignment if (val.profitcenter_part) { if (!acc[val.profitcenter_part]) acc[val.profitcenter_part] = Dinero(); acc[val.profitcenter_part] = acc[val.profitcenter_part].add( Dinero({ amount: Math.round((val.act_price || 0) * 100), }).multiply(val.part_qty || 0) ); } if (val.profitcenter_labor) { //Check the Labor Assignment. if (!acc[val.profitcenter_labor]) acc[val.profitcenter_labor] = Dinero(); acc[val.profitcenter_labor] = acc[val.profitcenter_labor].add( Dinero({ amount: Math.round( job[`rate_${val.mod_lbr_ty.toLowerCase()}`] * 100 ), }).multiply(val.mod_lb_hrs) ); } return acc; }, {}); const costCenterHash = job.bills.reduce((bill_acc, bill_val) => { bill_val.billlines.map((line_val) => { if (!bill_acc[line_val.cost_center]) bill_acc[line_val.cost_center] = Dinero(); bill_acc[line_val.cost_center] = bill_acc[line_val.cost_center].add( Dinero({ amount: Math.round((line_val.actual_cost || 0) * 100), }) .multiply(line_val.quantity) .multiply(bill_val.is_credit_memo ? -1 : 1) ); return null; }); return bill_acc; }, {}); console.log( "🚀 ~ file: dms-allocations-summary.component.jsx ~ line 69 ~ costCenterHash", costCenterHash ); return _.union( Object.keys(profitCenterHash), Object.keys(costCenterHash) ).map((key) => { console.log("Key", key); const profitCenter = bodyshop.md_responsibility_centers.profits.find( (c) => c.name === key ); const costCenter = bodyshop.md_responsibility_centers.costs.find( (c) => c.name === key ); return { center: key, sale: profitCenterHash[key] ? profitCenterHash[key].toFormat() : Dinero().toFormat(), cost: costCenterHash[key] ? costCenterHash[key].toFormat() : Dinero().toFormat(), profitCenter, costCenter, }; }); } catch (error) { CdkBase.createLogEvent( socket, "ERROR", `Error encountered in CdkCalculateAllocations. ${error}` ); } }; async function QueryJobData(socket, jobid) { CdkBase.createLogEvent(socket, "DEBUG", `Querying job data for id ${jobid}`); const client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, {}); const result = await client .setHeaders({ Authorization: `Bearer ${socket.handshake.auth.token}` }) .request(queries.GET_CDK_ALLOCATIONS, { id: jobid }); CdkBase.createLogEvent( socket, "TRACE", `Job data query result ${JSON.stringify(result, null, 2)}` ); return result.jobs_by_pk; }