From 79124daa9a8ada0886354b9e3fa0a081017a2481 Mon Sep 17 00:00:00 2001 From: Patrick Fic <> Date: Tue, 1 Mar 2022 13:14:03 -0800 Subject: [PATCH 01/14] IO-1719 Add invoice number to job line --- .../job-lines-bill-reference.component.jsx | 2 +- client/src/graphql/jobs.queries.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/client/src/components/job-lines-bill-reference/job-lines-bill-reference.component.jsx b/client/src/components/job-lines-bill-reference/job-lines-bill-reference.component.jsx index 84b43e9ab..7866d88fa 100644 --- a/client/src/components/job-lines-bill-reference/job-lines-bill-reference.component.jsx +++ b/client/src/components/job-lines-bill-reference/job-lines-bill-reference.component.jsx @@ -10,7 +10,7 @@ export default function JobLinesBillRefernece({ jobline }) { {subletRequired && } {`${(billLine.actual_price * billLine.quantity).toFixed(2)} (${ billLine.bill.vendor.name - })`} + } #${billLine.bill.invoice_number})`} ); } diff --git a/client/src/graphql/jobs.queries.js b/client/src/graphql/jobs.queries.js index 9d0641d8a..c2b60a88c 100644 --- a/client/src/graphql/jobs.queries.js +++ b/client/src/graphql/jobs.queries.js @@ -696,6 +696,7 @@ export const GET_JOB_BY_PK = gql` joblineid bill { id + invoice_number vendor { id name From 0cd1b41ed94d6f85d56d1453405ebaf15fe8d329 Mon Sep 17 00:00:00 2001 From: Patrick Fic <> Date: Tue, 1 Mar 2022 13:24:07 -0800 Subject: [PATCH 02/14] IO-1728 Remove unsaved changes popup when creating CC --- .../courtesy-car-form/courtesy-car-form.component.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/components/courtesy-car-form/courtesy-car-form.component.jsx b/client/src/components/courtesy-car-form/courtesy-car-form.component.jsx index e9486afa9..f994f25dc 100644 --- a/client/src/components/courtesy-car-form/courtesy-car-form.component.jsx +++ b/client/src/components/courtesy-car-form/courtesy-car-form.component.jsx @@ -9,7 +9,7 @@ import { DateFormatter } from "../../utils/DateFormatter"; import CourtesyCarFuelSlider from "../courtesy-car-fuel-select/courtesy-car-fuel-select.component"; import CourtesyCarStatus from "../courtesy-car-status-select/courtesy-car-status-select.component"; import FormDatePicker from "../form-date-picker/form-date-picker.component"; -import FormFieldsChanged from "../form-fields-changed-alert/form-fields-changed-alert.component"; +//import FormFieldsChanged from "../form-fields-changed-alert/form-fields-changed-alert.component"; import CurrencyInput from "../form-items-formatted/currency-form-item.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; @@ -32,7 +32,7 @@ export default function CourtesyCarCreateFormComponent({ form, saveLoading }) { } /> - + {/* */} Date: Tue, 1 Mar 2022 14:53:42 -0800 Subject: [PATCH 03/14] IO-1745 Resolve scheduling showing incorrect days. --- server/scheduling/scheduling-job.js | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/server/scheduling/scheduling-job.js b/server/scheduling/scheduling-job.js index 24b5577b0..95091e8e7 100644 --- a/server/scheduling/scheduling-job.js +++ b/server/scheduling/scheduling-job.js @@ -111,10 +111,9 @@ exports.job = async (req, res) => { } if ( - moment(item.actual_completion || item.scheduled_completion).tz(timezone).isBefore( - moment().tz(timezone), - "day" - ) + moment(item.actual_completion || item.scheduled_completion) + .tz(timezone) + .isBefore(moment().tz(timezone), "day") ) { console.log("Job should have already gone. Ignoring it.", item); return; @@ -128,7 +127,9 @@ exports.job = async (req, res) => { } else { const itemDate = moment( item.actual_completion || item.scheduled_completion - ).tz(timezone).format("yyyy-MM-DD"); + ) + .tz(timezone) + .format("yyyy-MM-DD"); if (!!load[itemDate]) { load[itemDate].hoursOut = (load[itemDate].hoursOut || 0) + @@ -153,14 +154,20 @@ exports.job = async (req, res) => { const end = moment.max([ ...filteredArrJobs.map((a) => moment(a.scheduled_in).tz(timezone)), ...filteredCompJobs - .map((p) => moment(p.actual_completion || p.scheduled_completion).tz(timezone)) + .map((p) => + moment(p.actual_completion || p.scheduled_completion).tz(timezone) + ) .filter((p) => p.isValid() && p.isAfter(yesterday)), moment().tz(timezone).add(15, "days"), ]); const range = Math.round(moment.duration(end.diff(today)).asDays()); for (var day = 0; day < range; day++) { - const current = moment(today).tz(timezone).add(day, "days").format("yyyy-MM-DD"); - const prev = moment(today).tz(timezone) + const current = moment(today) + .tz(timezone) + .add(day, "days") + .format("yyyy-MM-DD"); + const prev = moment(today) + .tz(timezone) .add(day - 1, "days") .format("yyyy-MM-DD"); if (!!!load[current]) { @@ -204,7 +211,7 @@ exports.job = async (req, res) => { loadKeys.forEach((loadKey) => { const isShopOpen = - (workingdays[dayOfWeekMapper(moment(loadKey).tz(timezone).day())] || false) && + (workingdays[dayOfWeekMapper(moment(loadKey).day())] || false) && !load[loadKey].blocked; if ( From 63ec578b6a9d158796782aabad4c782d63e28591 Mon Sep 17 00:00:00 2001 From: Patrick Fic <> Date: Tue, 1 Mar 2022 15:17:33 -0800 Subject: [PATCH 04/14] IO-1749 Inactive employees removed from drop downs. --- .../job-employee-assignments.component.jsx | 20 ++++++++++--------- ...n-list-columns.empassignment.component.jsx | 20 ++++++++++--------- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/client/src/components/job-employee-assignments/job-employee-assignments.component.jsx b/client/src/components/job-employee-assignments/job-employee-assignments.component.jsx index 954d04970..6cfdc8307 100644 --- a/client/src/components/job-employee-assignments/job-employee-assignments.component.jsx +++ b/client/src/components/job-employee-assignments/job-employee-assignments.component.jsx @@ -55,15 +55,17 @@ export function JobEmployeeAssignments({ 0 } > - {bodyshop.employees.map((emp) => ( - - {`${emp.first_name} ${emp.last_name}`} - - ))} + {bodyshop.employees + .filter((emp) => emp.active) + .map((emp) => ( + + {`${emp.first_name} ${emp.last_name}`} + + ))} diff --git a/client/src/components/production-list-columns/production-list-columns.empassignment.component.jsx b/client/src/components/production-list-columns/production-list-columns.empassignment.component.jsx index 606867975..e2ed28896 100644 --- a/client/src/components/production-list-columns/production-list-columns.empassignment.component.jsx +++ b/client/src/components/production-list-columns/production-list-columns.empassignment.component.jsx @@ -116,15 +116,17 @@ export function ProductionListEmpAssignment({ 0 } > - {bodyshop.employees.map((emp) => ( - - {`${emp.first_name} ${emp.last_name}`} - - ))} + {bodyshop.employees + .filter((emp) => emp.active) + .map((emp) => ( + + {`${emp.first_name} ${emp.last_name}`} + + ))} From 0660b79c01fa914b1852b0dd47bd3ccf0153d99f Mon Sep 17 00:00:00 2001 From: Patrick Fic <> Date: Tue, 1 Mar 2022 17:27:04 -0800 Subject: [PATCH 05/14] Autohouse Extract Updates & Remove duedate on payables. --- server/accounting/qbo/qbo-payables.js | 13 ++++---- server/accounting/qbxml/qbxml-payables.js | 13 ++++---- server/data/autohouse.js | 37 +++++++++++++++++++---- 3 files changed, 45 insertions(+), 18 deletions(-) diff --git a/server/accounting/qbo/qbo-payables.js b/server/accounting/qbo/qbo-payables.js index b7bddd1a7..20f68441e 100644 --- a/server/accounting/qbo/qbo-payables.js +++ b/server/accounting/qbo/qbo-payables.js @@ -181,12 +181,13 @@ async function InsertBill(oauthClient, qbo_realmId, req, bill, vendor) { TxnDate: moment(bill.date) //.tz(bill.job.bodyshop.timezone) .format("YYYY-MM-DD"), - ...(bill.vendor.due_date && { - DueDate: moment(bill.date) - //.tz(bill.job.bodyshop.timezone) - .add(bill.vendor.due_date, "days") - .format("YYYY-MM-DD"), - }), + ...(!bill.is_credit_memo && + bill.vendor.due_date && { + DueDate: moment(bill.date) + //.tz(bill.job.bodyshop.timezone) + .add(bill.vendor.due_date, "days") + .format("YYYY-MM-DD"), + }), DocNumber: bill.invoice_number, //...(bill.job.class ? { ClassRef: { Id: classes[bill.job.class] } } : {}), diff --git a/server/accounting/qbxml/qbxml-payables.js b/server/accounting/qbxml/qbxml-payables.js index 07d426da7..28e7ba2cd 100644 --- a/server/accounting/qbxml/qbxml-payables.js +++ b/server/accounting/qbxml/qbxml-payables.js @@ -75,12 +75,13 @@ const generateBill = (bill) => { TxnDate: moment(bill.date) //.tz(bill.job.bodyshop.timezone) .format("YYYY-MM-DD"), - ...(bill.vendor.due_date && { - DueDate: moment(bill.date) - // .tz(bill.job.bodyshop.timezone) - .add(bill.vendor.due_date, "days") - .format("YYYY-MM-DD"), - }), + ...(!bill.is_credit_memo && + bill.vendor.due_date && { + DueDate: moment(bill.date) + // .tz(bill.job.bodyshop.timezone) + .add(bill.vendor.due_date, "days") + .format("YYYY-MM-DD"), + }), RefNumber: bill.invoice_number, Memo: `RO ${bill.job.ro_number || ""}`, ExpenseLineAdd: bill.billlines.map((il) => diff --git a/server/data/autohouse.js b/server/data/autohouse.js index 1cba662d6..46b4e2d6d 100644 --- a/server/data/autohouse.js +++ b/server/data/autohouse.js @@ -214,7 +214,7 @@ const CreateRepairOrderTag = (job, errorCallback) => { Street: job.ownr_addr1 || "", City: job.ownr_city || "", State: job.ownr_st || "", - Zip: job.ownr_zip || "", + Zip: (job.ownr_zip && job.ownr_zip.substring(0, 3)) || "", Phone1: job.ownr_ph1 || "", Phone2: null, Phone2Extension: null, @@ -488,8 +488,8 @@ const CreateRepairOrderTag = (job, errorCallback) => { PartsReconditionedCost: repairCosts.PartsReconditionedCost.toFormat(AHDineroFormat), PartsRecycled: Dinero( - job.job_totals.parts.parts.list.PAR && - job.job_totals.parts.parts.list.PAR.total + job.job_totals.parts.parts.list.PAL && + job.job_totals.parts.parts.list.PAL.total ).toFormat(AHDineroFormat), PartsRecycledCost: repairCosts.PartsRecycledCost.toFormat(AHDineroFormat), @@ -555,7 +555,9 @@ const CreateRepairOrderTag = (job, errorCallback) => { AHDineroFormat ), BMTotalCost: repairCosts.BMTotalCost.toFormat(AHDineroFormat), - MiscTotal: 0, + MiscTotal: Dinero(job.job_totals.additional.additionalCosts).toFormat( + AHDineroFormat + ), MiscTotalCost: 0, TowingTotal: Dinero(job.job_totals.additional.towing).toFormat( AHDineroFormat @@ -673,7 +675,7 @@ const CreateCosts = (job) => { }); return bill_acc; }, {}); - const materialsHours = { mapaHrs: 0, mashHrs: 0 }; + //If the hourly rates for job costing are set, add them in. if (job.bodyshop.jc_hourly_rates && job.bodyshop.jc_hourly_rates.mapa) { if ( @@ -694,9 +696,32 @@ const CreateCosts = (job) => { (job.bodyshop.jc_hourly_rates && job.bodyshop.jc_hourly_rates.mapa * 100) || 0, - }).multiply(materialsHours.mapaHrs) + }).multiply(job.job_totals.rates.mapa.hours) ); } + if (job.bodyshop.jc_hourly_rates && job.bodyshop.jc_hourly_rates.mash) { + if ( + !billTotalsByCostCenters[ + job.bodyshop.md_responsibility_centers.defaults.costs.MASH + ] + ) + billTotalsByCostCenters[ + job.bodyshop.md_responsibility_centers.defaults.costs.MASH + ] = Dinero(); + billTotalsByCostCenters[ + job.bodyshop.md_responsibility_centers.defaults.costs.MASH + ] = billTotalsByCostCenters[ + job.bodyshop.md_responsibility_centers.defaults.costs.MASH + ].add( + Dinero({ + amount: + (job.bodyshop.jc_hourly_rates && + job.bodyshop.jc_hourly_rates.mash * 100) || + 0, + }).multiply(job.job_totals.rates.mash.hours) + ); + } + const ticketTotalsByCostCenter = job.timetickets.reduce( (ticket_acc, ticket_val) => { //At the invoice level. From a2a88682235b844daa83d2081ea2fe779a727c26 Mon Sep 17 00:00:00 2001 From: Patrick Fic <> Date: Wed, 2 Mar 2022 11:18:10 -0800 Subject: [PATCH 06/14] IO-1748 Add vendor # to parts order modal. --- .../vendor-search-select.component.jsx | 28 +++++++++++++------ client/src/graphql/vendors.queries.js | 1 + 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/client/src/components/vendor-search-select/vendor-search-select.component.jsx b/client/src/components/vendor-search-select/vendor-search-select.component.jsx index 465007841..7f3c67729 100644 --- a/client/src/components/vendor-search-select/vendor-search-select.component.jsx +++ b/client/src/components/vendor-search-select/vendor-search-select.component.jsx @@ -1,6 +1,7 @@ import { HeartOutlined } from "@ant-design/icons"; -import { Select, Tag } from "antd"; +import { Select, Space, Tag } from "antd"; import React, { forwardRef, useEffect, useState } from "react"; +import PhoneNumberFormatter from "../../utils/PhoneFormatter"; const { Option } = Select; //To be used as a form element only. @@ -35,6 +36,7 @@ const VendorSearchSelect = ( style={{ width: "100%", }} + dropdownMatchSelectWidth={false} onChange={setOption} optionFilterProp="name" onSelect={onSelect} @@ -50,10 +52,15 @@ const VendorSearchSelect = ( >
{o.name}
- - {o.discount && o.discount !== 0 ? ( - {`${o.discount * 100}%`} - ) : null} + + + {o.phone && ( + {o.phone} + )} + {o.discount && o.discount !== 0 ? ( + {`${o.discount * 100}%`} + ) : null} +
)) @@ -64,9 +71,14 @@ const VendorSearchSelect = (
{o.name}
- {o.discount && o.discount !== 0 ? ( - {`${o.discount * 100}%`} - ) : null} + + {o.phone && ( + {o.phone} + )} + {o.discount && o.discount !== 0 ? ( + {`${o.discount * 100}%`} + ) : null} +
)) diff --git a/client/src/graphql/vendors.queries.js b/client/src/graphql/vendors.queries.js index d4a3986cf..f18b124ff 100644 --- a/client/src/graphql/vendors.queries.js +++ b/client/src/graphql/vendors.queries.js @@ -87,6 +87,7 @@ export const QUERY_ALL_VENDORS_FOR_ORDER = gql` discount email active + phone } jobs(where: { id: { _eq: $jobId } }) { v_make_desc From 3e121a1a257664422bab79a856ec871ced1f90ca Mon Sep 17 00:00:00 2001 From: Patrick Fic <> Date: Wed, 2 Mar 2022 12:56:29 -0800 Subject: [PATCH 07/14] IO-1759 Replace offset with timezone. --- client/src/utils/RenderTemplate.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/utils/RenderTemplate.js b/client/src/utils/RenderTemplate.js index 9511416f8..7aab1139a 100644 --- a/client/src/utils/RenderTemplate.js +++ b/client/src/utils/RenderTemplate.js @@ -39,7 +39,7 @@ export default async function RenderTemplate( ...templateObject.context, headerpath: `/${bodyshop.imexshopid}/header.html`, bodyshop: bodyshop, - offset: moment().utcOffset(), + offset: bodyshop.timezone, //moment().utcOffset(), }, }; From c0220f0ca220e7c5fc3886f199042a60815f8c0a Mon Sep 17 00:00:00 2001 From: Patrick Fic <> Date: Wed, 2 Mar 2022 14:36:19 -0800 Subject: [PATCH 08/14] IO-1756 Include documents when sending job notes. --- client/src/components/jobs-notes/jobs.notes.component.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/components/jobs-notes/jobs.notes.component.jsx b/client/src/components/jobs-notes/jobs.notes.component.jsx index 0d07e2516..928eec29c 100644 --- a/client/src/components/jobs-notes/jobs.notes.component.jsx +++ b/client/src/components/jobs-notes/jobs.notes.component.jsx @@ -124,7 +124,7 @@ export function JobNotesComponent({ messageObject={{ subject: Templates.individual_job_note.subject, }} - id={record.id} + id={jobId} /> ), From b98bfe566a088c7b7913b28883da14a0af12ffc8 Mon Sep 17 00:00:00 2001 From: Patrick Fic <> Date: Wed, 2 Mar 2022 15:26:18 -0800 Subject: [PATCH 09/14] IO-1760 --- .../parts-order-modal.container.jsx | 7 ++++++- .../vendors-form/vendors-form.component.jsx | 14 ++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/client/src/components/parts-order-modal/parts-order-modal.container.jsx b/client/src/components/parts-order-modal/parts-order-modal.container.jsx index 28ac6c0d9..9e88647ee 100644 --- a/client/src/components/parts-order-modal/parts-order-modal.container.jsx +++ b/client/src/components/parts-order-modal/parts-order-modal.container.jsx @@ -196,6 +196,11 @@ export function PartsOrderModalContainer({ (item) => item.id === values.vendorid )[0]; + let vendorEmails = + matchingVendor && + matchingVendor.email && + matchingVendor.email.split(RegExp("[;,]")); + GenerateDocument( { name: isReturn @@ -206,7 +211,7 @@ export function PartsOrderModalContainer({ }, }, { - to: matchingVendor ? [matchingVendor.email] : null, + to: matchingVendor ? vendorEmails : null, replyTo: bodyshop.email, subject: isReturn ? Templates.parts_return_slip.subject diff --git a/client/src/components/vendors-form/vendors-form.component.jsx b/client/src/components/vendors-form/vendors-form.component.jsx index b52739788..3fe8374e6 100644 --- a/client/src/components/vendors-form/vendors-form.component.jsx +++ b/client/src/components/vendors-form/vendors-form.component.jsx @@ -109,12 +109,14 @@ export default function VendorsFormComponent({ From f8151e387ea71aeeae21bafe0b511213ef48604f Mon Sep 17 00:00:00 2001 From: Patrick Fic <> Date: Wed, 2 Mar 2022 16:04:49 -0800 Subject: [PATCH 10/14] Resolve missing fields from time tickets query. --- client/src/graphql/jobs-lines.queries.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/src/graphql/jobs-lines.queries.js b/client/src/graphql/jobs-lines.queries.js index cc4b59c04..3617df239 100644 --- a/client/src/graphql/jobs-lines.queries.js +++ b/client/src/graphql/jobs-lines.queries.js @@ -59,6 +59,8 @@ export const GET_LINE_TICKET_BY_PK = gql` employeeid memo flat_rate + clockon + clockoff employee { id first_name From c1068ec92b4a41cddbe2ef790fa72bcd71c101ce Mon Sep 17 00:00:00 2001 From: Patrick Fic <> Date: Thu, 3 Mar 2022 08:37:21 -0800 Subject: [PATCH 11/14] IO-1728 Set cc create form to be vertical. --- .../courtesy-car-create.page.container.jsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/client/src/pages/courtesy-car-create/courtesy-car-create.page.container.jsx b/client/src/pages/courtesy-car-create/courtesy-car-create.page.container.jsx index 332b8127d..f373e4066 100644 --- a/client/src/pages/courtesy-car-create/courtesy-car-create.page.container.jsx +++ b/client/src/pages/courtesy-car-create/courtesy-car-create.page.container.jsx @@ -70,7 +70,12 @@ export function CourtesyCarCreateContainer({ return ( -
+
From d22979dadc8376a9bdc084d73a62b29acc7b0552 Mon Sep 17 00:00:00 2001 From: Patrick Fic <> Date: Thu, 3 Mar 2022 08:52:25 -0800 Subject: [PATCH 12/14] IO-1748 Remove show phone on vendor search select in report cente.r --- .../parts-order-modal/parts-order-modal.component.jsx | 1 + .../vendor-search-select/vendor-search-select.component.jsx | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/client/src/components/parts-order-modal/parts-order-modal.component.jsx b/client/src/components/parts-order-modal/parts-order-modal.component.jsx index 073091cb0..7c206f59e 100644 --- a/client/src/components/parts-order-modal/parts-order-modal.component.jsx +++ b/client/src/components/parts-order-modal/parts-order-modal.component.jsx @@ -73,6 +73,7 @@ export function PartsOrderModalComponent({ options={vendorList} disabled={isReturn} preferredMake={preferredMake} + showPhone />
{ const [option, setOption] = useState(value); @@ -54,7 +54,7 @@ const VendorSearchSelect = (
{o.name}
- {o.phone && ( + {o.phone && showPhone && ( {o.phone} )} {o.discount && o.discount !== 0 ? ( @@ -72,7 +72,7 @@ const VendorSearchSelect = (
{o.name}
- {o.phone && ( + {o.phone && showPhone && ( {o.phone} )} {o.discount && o.discount !== 0 ? ( From a2032553d936654adbb960a33367102aeee1da28 Mon Sep 17 00:00:00 2001 From: Patrick Fic <> Date: Thu, 3 Mar 2022 12:39:18 -0800 Subject: [PATCH 13/14] IO-1746 Smart Scheduling Dates to 10. --- server/scheduling/scheduling-job.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/scheduling/scheduling-job.js b/server/scheduling/scheduling-job.js index 95091e8e7..a314022c9 100644 --- a/server/scheduling/scheduling-job.js +++ b/server/scheduling/scheduling-job.js @@ -201,7 +201,7 @@ exports.job = async (req, res) => { load[startIsoFormat] = { blocked: true }; } }); - // //Propose the first 5 dates where we are below target. + // //Propose the first 10 dates where we are below target. const possibleDates = []; delete load.productionTotal; @@ -223,10 +223,10 @@ exports.job = async (req, res) => { possibleDates.push(new Date(loadKey).toISOString().substr(0, 10)); }); - if (possibleDates.length < 6) { + if (possibleDates.length < 11) { res.json(possibleDates); } else { - res.json(possibleDates.slice(0, 5)); + res.json(possibleDates.slice(0, 10)); } } catch (error) { logger.log("smart-scheduling-error", "ERROR", req.user.email, jobId, { From 12a5f17351e7d69b3857c861bbacb733b7da96c4 Mon Sep 17 00:00:00 2001 From: Patrick Fic <> Date: Fri, 4 Mar 2022 10:11:18 -0800 Subject: [PATCH 14/14] Add create user. --- server.js | 3 +-- server/firebase/firebase-handler.js | 37 +++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/server.js b/server.js index 55b06de89..4b9d076f0 100644 --- a/server.js +++ b/server.js @@ -149,6 +149,7 @@ app.post( fb.unsubscribe ); app.post("/adm/updateuser", fb.validateFirebaseIdToken, fb.updateUser); +app.post("/adm/createuser", fb.validateFirebaseIdToken, fb.createUser); //Stripe Processing var stripe = require("./server/stripe/payment"); @@ -180,7 +181,6 @@ app.post("/data/arms", data.arms); var taskHandler = require("./server/tasks/tasks"); app.post("/taskHandler", taskHandler.taskHandler); - var ioevent = require("./server/ioevent/ioevent"); app.post("/ioevent", ioevent.default); app.post("/newlog", (req, res) => { @@ -188,7 +188,6 @@ app.post("/newlog", (req, res) => { logger.log(message, type, user, record, object); }); - var cdkGetMake = require("./server/cdk/cdk-get-makes"); app.post("/cdk/getvehicles", fb.validateFirebaseIdToken, cdkGetMake.default); diff --git a/server/firebase/firebase-handler.js b/server/firebase/firebase-handler.js index 42e6f19a6..05a5e38aa 100644 --- a/server/firebase/firebase-handler.js +++ b/server/firebase/firebase-handler.js @@ -25,6 +25,43 @@ const adminEmail = [ "patrick@thinkimex.com", ]; +exports.createUser = (req, res) => { + logger.log("admin-create-user", "WARN", req.user.email, null, { + request: req.body, + }); + if (!adminEmail.includes(req.user.email)) { + logger.log( + "admin-create-user-unauthorized", + "ERROR", + req.user.email, + null, + { + request: req.body, + user: req.user, + } + ); + res.sendStatus(404); + } + const { email, displayName, password } = req.body; + admin + .auth() + .createUser({ email, displayName, password }) + .then((userRecord) => { + // See the UserRecord reference doc for the contents of userRecord. + + logger.log("admin-update-user-success", "DEBUG", req.user.email, null, { + userRecord, + }); + res.json(userRecord); + }) + .catch((error) => { + logger.log("admin-update-user-error", "ERROR", req.user.email, null, { + error, + }); + res.status(500).json(error); + }); +}; + exports.updateUser = (req, res) => { logger.log("admin-update-user", "WARN", req.user.email, null, { request: req.body,