diff --git a/bodyshop_translations.babel b/bodyshop_translations.babel index 3a852e2e8..57c7a23e9 100644 --- a/bodyshop_translations.babel +++ b/bodyshop_translations.babel @@ -967,6 +967,27 @@ + + severalerrorsfound + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + smartscheduling false @@ -40880,6 +40901,69 @@ + + gsr_by_atp + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + gsr_by_ats + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + gsr_by_category + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + gsr_by_csr false diff --git a/client/src/components/schedule-calendar-wrapper/schedule-calendar-header-graph.component.js b/client/src/components/schedule-calendar-wrapper/schedule-calendar-header-graph.component.js index 4d8887128..82d1c9281 100644 --- a/client/src/components/schedule-calendar-wrapper/schedule-calendar-header-graph.component.js +++ b/client/src/components/schedule-calendar-wrapper/schedule-calendar-header-graph.component.js @@ -22,10 +22,6 @@ const mapDispatchToProps = (dispatch) => ({ }); export function ScheduleCalendarHeaderGraph({ bodyshop, loadData }) { - console.log( - "🚀 ~ file: schedule-calendar-header-graph.component.js:23 ~ ScheduleCalendarHeaderGraph ~ loadData", - loadData - ); const { ssbuckets } = bodyshop; const { t } = useTranslation(); const data = useMemo(() => { diff --git a/client/src/components/schedule-calendar-wrapper/schedule-calendar-header.component.js b/client/src/components/schedule-calendar-wrapper/schedule-calendar-header.component.js index e312ebe03..732bcc2c2 100644 --- a/client/src/components/schedule-calendar-wrapper/schedule-calendar-header.component.js +++ b/client/src/components/schedule-calendar-wrapper/schedule-calendar-header.component.js @@ -66,8 +66,8 @@ export function ScheduleCalendarHeaderComponent({
e.stopPropagation()}> - {loadData && loadData.jobsOut ? ( - loadData.jobsOut.map((j) => ( + {loadData && loadData.allJobsOut ? ( + loadData.allJobsOut.map((j) => (
{j.ro_number} @@ -102,11 +102,12 @@ export function ScheduleCalendarHeaderComponent({
e.stopPropagation()}> - {loadData && loadData.jobsIn ? ( - loadData.jobsIn.map((j) => ( + {loadData && loadData.allJobsIn ? ( + loadData.allJobsIn.map((j) => (
{j.ro_number} + {j.status} @@ -142,7 +143,7 @@ export function ScheduleCalendarHeaderComponent({ title={t("appointments.labels.arrivingjobs")} > - {(loadData.hoursIn || 0) && loadData.hoursIn.toFixed(2)} + {(loadData.allHoursIn || 0) && loadData.allHoursIn.toFixed(2)} - {(loadData.hoursOut || 0) && loadData.hoursOut.toFixed(2)} + {(loadData.allHoursOut || 0) && loadData.allHoursOut.toFixed(2)} diff --git a/client/src/components/schedule-calendar-wrapper/scheduler-calendar-wrapper.component.jsx b/client/src/components/schedule-calendar-wrapper/scheduler-calendar-wrapper.component.jsx index 95f825c6e..837f5cbbe 100644 --- a/client/src/components/schedule-calendar-wrapper/scheduler-calendar-wrapper.component.jsx +++ b/client/src/components/schedule-calendar-wrapper/scheduler-calendar-wrapper.component.jsx @@ -11,7 +11,7 @@ import HeaderComponent from "./schedule-calendar-header.component"; import "./schedule-calendar.styles.scss"; import JobDetailCards from "../job-detail-cards/job-detail-cards.component"; import { selectProblemJobs } from "../../redux/application/application.selectors"; -import { Alert } from "antd"; +import { Alert, Collapse } from "antd"; import { useTranslation } from "react-i18next"; const mapStateToProps = createStructuredSelector({ @@ -53,7 +53,28 @@ export function ScheduleCalendarWrapperComponent({ return ( <> - {problemJobs && + {problemJobs && problemJobs.length > 2 ? ( + + + {t("appointments.labels.severalerrorsfound")} + + } + > + {problemJobs.map((problem) => ( + + ))} + + + ) : ( problemJobs.map((problem) => ( - ))} + )) + )} ({ //setUserLanguage: language => dispatch(setUserLanguage(language)) + calculateScheduleLoad: (endDate) => dispatch(calculateScheduleLoad(endDate)), }); export function ScheduleJobModalComponent({ @@ -36,6 +38,7 @@ export function ScheduleJobModalComponent({ existingAppointments, lbrHrsData, jobId, + calculateScheduleLoad, }) { const { t } = useTranslation(); const [loading, setLoading] = useState(false); @@ -57,6 +60,7 @@ export function ScheduleJobModalComponent({ const handleDateBlur = () => { const values = form.getFieldsValue(); + if (lbrHrsData) { const totalHours = lbrHrsData.jobs_by_pk.labhrs.aggregate.sum.mod_lb_hrs + @@ -130,7 +134,12 @@ export function ScheduleJobModalComponent({ className="imex-flex-row__margin" key={idx} onClick={() => { - form.setFieldsValue({ start: new moment(d).add(8, "hours") }); + const ssDate = moment(d); + if (ssDate.isBefore(moment())) { + form.setFieldsValue({ start: moment() }); + } else { + form.setFieldsValue({ start: moment(d).add(8, "hours") }); + } handleDateBlur(); }} > @@ -191,6 +200,9 @@ export function ScheduleJobModalComponent({ prev.start !== cur.start}> {() => { const values = form.getFieldsValue(); + if (values.start) { + calculateScheduleLoad(values.start); + } return (
diff --git a/client/src/components/schedule-job-modal/schedule-job-modal.scss b/client/src/components/schedule-job-modal/schedule-job-modal.scss index 40c831662..6c2c42694 100644 --- a/client/src/components/schedule-job-modal/schedule-job-modal.scss +++ b/client/src/components/schedule-job-modal/schedule-job-modal.scss @@ -1,5 +1,6 @@ .schedule-job-modal { height: 70vh; + overflow-y: auto; .rbc-calendar { .rbc-toolbar { .rbc-btn-group { diff --git a/client/src/graphql/appointments.queries.js b/client/src/graphql/appointments.queries.js index 6a95864d8..01399b81a 100644 --- a/client/src/graphql/appointments.queries.js +++ b/client/src/graphql/appointments.queries.js @@ -294,6 +294,12 @@ export const QUERY_SCHEDULE_LOAD_DATA = gql` where: { inproduction: { _eq: true }, suspended: { _eq: false } } ) { id + actual_in + scheduled_in + actual_completion + scheduled_completion + inproduction + ro_number labhrs: joblines_aggregate( where: { mod_lbr_ty: { _neq: "LAR" }, removed: { _eq: false } } ) { @@ -327,12 +333,15 @@ export const QUERY_SCHEDULE_LOAD_DATA = gql` } ) { id + status ro_number scheduled_completion actual_completion + scheduled_in ownr_fn ownr_ln ownr_co_nm + inproduction labhrs: joblines_aggregate( where: { mod_lbr_ty: { _neq: "LAR" }, removed: { _eq: false } } ) { @@ -360,11 +369,16 @@ export const QUERY_SCHEDULE_LOAD_DATA = gql` ) { id scheduled_in + actual_in + scheduled_completion ro_number ownr_fn ownr_ln ownr_co_nm alt_transport + actual_completion + inproduction + status labhrs: joblines_aggregate( where: { mod_lbr_ty: { _neq: "LAR" }, removed: { _eq: false } } ) { diff --git a/client/src/redux/application/application.sagas.js b/client/src/redux/application/application.sagas.js index a768b3b93..02e86c6cc 100644 --- a/client/src/redux/application/application.sagas.js +++ b/client/src/redux/application/application.sagas.js @@ -37,7 +37,7 @@ export function* calculateScheduleLoad({ payload: end }) { productionTotal: {}, productionHours: 0, }; - + let problemJobs = []; //Set the current load. buckets.forEach((bucket) => { load.productionTotal[bucket.id] = { count: 0, label: bucket.label }; @@ -45,6 +45,32 @@ export function* calculateScheduleLoad({ payload: end }) { prodJobs.forEach((item) => { //Add all of the jobs currently in production to the buckets so that we have a starting point. + if ( + !item.actual_completion && + moment(item.scheduled_completion).isBefore(moment().startOf("day")) + ) { + problemJobs.push({ + ...item, + code: "Job was scheduled to go, but it has not been completed. Update the scheduled completion date to correct projections", + }); + } + + if ( + item.actual_completion && + moment(item.actual_completion).isBefore(moment().startOf("day")) + ) { + problemJobs.push({ + ...item, + code: "Job is already marked as completed, but it is still in production. This job should be removed from production", + }); + } + if (!(item.actual_completion || item.scheduled_completion)) { + problemJobs.push({ + ...item, + code: "Job does not have a scheduled or actual completion date. Update the scheduled or actual completion dates to correct projections", + }); + } + const bucketId = CheckJobBucket(buckets, item); load.productionHours = load.productionHours + @@ -59,77 +85,120 @@ export function* calculateScheduleLoad({ payload: end }) { }); arrJobs.forEach((item) => { - if (!item.scheduled_in) + if (!item.scheduled_in) { console.log("JOB HAS NO SCHEDULED IN DATE.", item); - const itemDate = moment(item.scheduled_in).format("yyyy-MM-DD"); + problemJobs.push({ + ...item, + code: "Job has no scheduled in date", + }); + } + if(!item.actual_completion && item.actual_in && !item.inproduction){ + problemJobs.push({ + ...item, + code: "Job has an actual in date, but no actual completion date and is not marked as in production", + }); + } + if (item.actual_in && moment(item.actual_in).isAfter(moment())) { + problemJobs.push({ + ...item, + code: "Job has an actual in date set in the future", + }); + } + if ( + item.actual_completion && + moment(item.actual_completion).isAfter(moment()) + ) { + problemJobs.push({ + ...item, + code: "Job has an actual completion date set in the future", + }); + } + if (item.actual_completion && item.inproduction) { + problemJobs.push({ + ...item, + code: "Job has an actual completion date but it is still marked in production", + }); + } + + const itemDate = moment(item.actual_in || item.scheduled_in).format( + "yyyy-MM-DD" + ); + + const AddJobForSchedulingCalc = !item.inproduction; + if (!!load[itemDate]) { - load[itemDate].hoursIn = - (load[itemDate].hoursIn || 0) + + load[itemDate].allHoursIn = + (load[itemDate].allHoursIn || 0) + item.labhrs.aggregate.sum.mod_lb_hrs + item.larhrs.aggregate.sum.mod_lb_hrs; - load[itemDate].jobsIn.push(item); + + //If the job hasn't already arrived, add it to the jobs in list. + // Make sure it also hasn't already been completed, or isn't an in and out job. + //This prevents the duplicate counting. + load[itemDate].allJobsIn.push(item); + if (AddJobForSchedulingCalc) { + load[itemDate].jobsIn.push(item); + load[itemDate].hoursIn = + (load[itemDate].hoursIn || 0) + + item.labhrs.aggregate.sum.mod_lb_hrs + + item.larhrs.aggregate.sum.mod_lb_hrs; + } } else { load[itemDate] = { - jobsIn: [item], + allJobsIn: [item], + jobsIn: AddJobForSchedulingCalc ? [item] : [], //Same as above, only add it if it isn't already in production. jobsOut: [], - hoursIn: + allJobsOut: [], + allHoursIn: item.labhrs.aggregate.sum.mod_lb_hrs + item.larhrs.aggregate.sum.mod_lb_hrs, + hoursIn: AddJobForSchedulingCalc + ? item.labhrs.aggregate.sum.mod_lb_hrs + + item.larhrs.aggregate.sum.mod_lb_hrs + : 0, }; } }); - let problemJobs = []; compJobs.forEach((item) => { if (!(item.actual_completion || item.scheduled_completion)) - console.log("JOB HAS NO COMPLETION DATE.", item); + console.warn("JOB HAS NO COMPLETION DATE.", item); const inProdJobs = prodJobs.find((p) => p.id === item.id); const inArrJobs = arrJobs.find((p) => p.id === item.id); - if (!(inProdJobs || inArrJobs)) { - //Job isn't found in production or coming in. - //is it going today or scheduled to go today? - if ( - moment(item.actual_completion || item.scheduled_completion).isSame( - moment(), - "day" - ) - ) { - console.log("Job is going today anyways, ignore it.", item); - return; - } - - if ( - moment(item.actual_completion || item.scheduled_completion).isBefore( - moment(), - "day" - ) - ) { - console.log("Job should have already gone. Ignoring it.", item); - return; - } - - problemJobs.push({ - ...item, - code: "Job is scheduled for completion, but it is not marked in production nor is it an arriving job in this period. Check the scheduled in and completion dates", - }); - return; - } + const AddJobForSchedulingCalc = inProdJobs || inArrJobs; const itemDate = moment( item.actual_completion || item.scheduled_completion ).format("yyyy-MM-DD"); + //Skip it, it's already completed. + if (!!load[itemDate]) { - load[itemDate].hoursOut = - (load[itemDate].hoursOut || 0) + + load[itemDate].allHoursOut = + (load[itemDate].allHoursOut || 0) + item.labhrs.aggregate.sum.mod_lb_hrs + item.larhrs.aggregate.sum.mod_lb_hrs; - load[itemDate].jobsOut.push(item); + //Add only the jobs that are still in production to get rid of. + //If it's not in production, we'd subtract unnecessarily. + load[itemDate].allJobsOut.push(item); + + if (AddJobForSchedulingCalc) { + load[itemDate].jobsOut.push(item); + load[itemDate].hoursOut = + (load[itemDate].hoursOut || 0) + + item.labhrs.aggregate.sum.mod_lb_hrs + + item.larhrs.aggregate.sum.mod_lb_hrs; + } } else { load[itemDate] = { - jobsOut: [item], - hoursOut: + allJobsOut: [item], + jobsOut: AddJobForSchedulingCalc ? [item] : [], //Same as above. + hoursOut: AddJobForSchedulingCalc + ? item.labhrs.aggregate.sum.mod_lb_hrs + + item.larhrs.aggregate.sum.mod_lb_hrs + : 0, + allHoursOut: item.labhrs.aggregate.sum.mod_lb_hrs + item.larhrs.aggregate.sum.mod_lb_hrs, }; @@ -137,6 +206,7 @@ export function* calculateScheduleLoad({ payload: end }) { }); //Propagate the expected load to each day. + const range = Math.round(moment.duration(end.diff(today)).asDays()); for (var day = 0; day < range; day++) { const current = moment(today).add(day, "days").format("yyyy-MM-DD"); @@ -146,6 +216,7 @@ export function* calculateScheduleLoad({ payload: end }) { if (!!!load[current]) { load[current] = {}; } + if (day === 0) { //Starting on day 1. The load is current. load[current].expectedLoad = CalculateLoad( diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index d8e7bc391..332f350fd 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -49,7 +49,7 @@ "blocked": "Blocked", "cancelledappointment": "Canceled appointment for: ", "completingjobs": "Completing Jobs", - "dataconsistency": "{{ro_number}} has a data consistency issue. It has been excluded for scheduling purposes. CODE: {{code}}.", + "dataconsistency": "{{ro_number}} has a data consistency issue. It may have been excluded for scheduling purposes. CODE: {{code}}.", "expectedjobs": "Expected Jobs in Production: ", "expectedprodhrs": "Expected Production Hours:", "history": "History", @@ -61,6 +61,7 @@ "priorappointments": "Previous Appointments", "reminder": "This is {{shopname}} reminding you about an appointment on {{date}} at {{time}}. Please let us know if you are not able to make the appointment. We look forward to seeing you soon. ", "scheduledfor": "Scheduled appointment for: ", + "severalerrorsfound": "Several jobs have issues which may prevent accurate smart scheduling. Click to expand.", "smartscheduling": "Smart Scheduling", "suggesteddates": "Suggested Dates" }, @@ -2425,6 +2426,9 @@ "export_payables": "Export Log - Payables", "export_payments": "Export Log - Payments", "export_receivables": "Export Log - Receivables", + "gsr_by_atp": "", + "gsr_by_ats": "Gross Sales by ATS", + "gsr_by_category": "Gross Sales by Category", "gsr_by_csr": "Gross Sales by CSR", "gsr_by_delivery_date": "Gross Sales by Delivery Date", "gsr_by_estimator": "Gross Sales by Estimator", diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json index 359d844a2..2b7c7391b 100644 --- a/client/src/translations/es/common.json +++ b/client/src/translations/es/common.json @@ -61,6 +61,7 @@ "priorappointments": "Nombramientos previos", "reminder": "", "scheduledfor": "Cita programada para:", + "severalerrorsfound": "", "smartscheduling": "", "suggesteddates": "" }, @@ -2425,6 +2426,9 @@ "export_payables": "", "export_payments": "", "export_receivables": "", + "gsr_by_atp": "", + "gsr_by_ats": "", + "gsr_by_category": "", "gsr_by_csr": "", "gsr_by_delivery_date": "", "gsr_by_estimator": "", diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json index 78f2d8777..381fe267b 100644 --- a/client/src/translations/fr/common.json +++ b/client/src/translations/fr/common.json @@ -61,6 +61,7 @@ "priorappointments": "Rendez-vous précédents", "reminder": "", "scheduledfor": "Rendez-vous prévu pour:", + "severalerrorsfound": "", "smartscheduling": "", "suggesteddates": "" }, @@ -2425,6 +2426,9 @@ "export_payables": "", "export_payments": "", "export_receivables": "", + "gsr_by_atp": "", + "gsr_by_ats": "", + "gsr_by_category": "", "gsr_by_csr": "", "gsr_by_delivery_date": "", "gsr_by_estimator": "", diff --git a/client/src/utils/TemplateConstants.js b/client/src/utils/TemplateConstants.js index a53040f0f..9ae638b2f 100644 --- a/client/src/utils/TemplateConstants.js +++ b/client/src/utils/TemplateConstants.js @@ -1343,6 +1343,32 @@ export const TemplateList = (type, context) => { }, group: "sales", }, + gsr_by_category: { + title: i18n.t("reportcenter.templates.gsr_by_category"), + description: "", + subject: i18n.t("reportcenter.templates.gsr_by_category"), + key: "gsr_by_category", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, + gsr_by_ats: { + title: i18n.t("reportcenter.templates.gsr_by_ats"), + description: "", + subject: i18n.t("reportcenter.templates.gsr_by_ats"), + key: "gsr_by_ats", + //idtype: "vendor", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_invoiced"), + }, + group: "sales", + }, gsr_labor_only: { title: i18n.t("reportcenter.templates.gsr_labor_only"), description: "", diff --git a/server/email/sendemail.js b/server/email/sendemail.js index 68c57a38d..28c0adf5d 100644 --- a/server/email/sendemail.js +++ b/server/email/sendemail.js @@ -23,6 +23,7 @@ let transporter = nodemailer.createTransport({ }); exports.sendServerEmail = async function ({ subject, text }) { + if (process.env.NODE_ENV === undefined) return; try { transporter.sendMail( { diff --git a/server/graphql-client/queries.js b/server/graphql-client/queries.js index 14bd8cd17..88ff022ac 100644 --- a/server/graphql-client/queries.js +++ b/server/graphql-client/queries.js @@ -536,7 +536,16 @@ exports.QUERY_UPCOMING_APPOINTMENTS = `query QUERY_UPCOMING_APPOINTMENTS($now: t arrJobs: jobs(where: {scheduled_in: {_gte: $now}, suspended: {_eq: false}}) { id scheduled_in + actual_in + scheduled_completion ro_number + ownr_fn + ownr_ln + ownr_co_nm + alt_transport + actual_completion + inproduction + status labhrs: joblines_aggregate(where: {mod_lbr_ty: {_neq: "LAR"}, removed: {_eq: false}}) { aggregate { sum { @@ -554,9 +563,15 @@ exports.QUERY_UPCOMING_APPOINTMENTS = `query QUERY_UPCOMING_APPOINTMENTS($now: t } compJobs: jobs(where: {_and: [{suspended: {_eq: false}}, {_or: [{scheduled_completion: {_gte: $now}}, {actual_completion: {_gte: $now}}]}]}) { id + status ro_number scheduled_completion actual_completion + scheduled_in + ownr_fn + ownr_ln + ownr_co_nm + inproduction labhrs: joblines_aggregate(where: {mod_lbr_ty: {_neq: "LAR"}, removed: {_eq: false}}) { aggregate { sum { @@ -574,15 +589,20 @@ exports.QUERY_UPCOMING_APPOINTMENTS = `query QUERY_UPCOMING_APPOINTMENTS($now: t } prodJobs: jobs(where: {inproduction: {_eq: true}, suspended: {_eq: false}}) { id + actual_in + scheduled_in + actual_completion scheduled_completion - labhrs: joblines_aggregate(where: {_and: [{mod_lbr_ty: {_neq: "LAR"}}, {removed: {_eq: false}}]}) { + inproduction + ro_number + labhrs: joblines_aggregate(where: {mod_lbr_ty: {_neq: "LAR"}, removed: {_eq: false}}) { aggregate { sum { mod_lb_hrs } } } - larhrs: joblines_aggregate(where: {_and: [{mod_lbr_ty: {_eq: "LAR"}}, {removed: {_eq: false}}]}) { + larhrs: joblines_aggregate(where: {mod_lbr_ty: {_eq: "LAR"}, removed: {_eq: false}}) { aggregate { sum { mod_lb_hrs @@ -590,7 +610,8 @@ exports.QUERY_UPCOMING_APPOINTMENTS = `query QUERY_UPCOMING_APPOINTMENTS($now: t } } } -}`; +} +`; exports.QUERY_EMPLOYEE_PIN = `query QUERY_EMPLOYEE_PIN($shopId: uuid!, $employeeId: String!) { employees(where: {_and: {shopid: {_eq: $shopId}, employee_number: {_eq: $employeeId}}}) { diff --git a/server/scheduling/scheduling-job.js b/server/scheduling/scheduling-job.js index dc26046dd..e906c866e 100644 --- a/server/scheduling/scheduling-job.js +++ b/server/scheduling/scheduling-job.js @@ -41,9 +41,9 @@ exports.job = async (req, res) => { (bucket) => bucket.gte <= jobHrs && (!!bucket.lt ? bucket.lt > jobHrs : true) )[0]; - const load = { productionTotal: {}, + productionHours: 0, }; //Set the current load. ssbuckets.forEach((bucket) => { @@ -70,27 +70,6 @@ exports.job = async (req, res) => { // ); const filteredArrJobs = []; - // filteredArrJobs.forEach((item) => { - // const itemDate = moment(item.scheduled_in) - // .tz(timezone) - // .format("yyyy-MM-DD"); - // if (!!load[itemDate]) { - // load[itemDate].hoursIn = - // (load[itemDate].hoursIn || 0) + - // item.labhrs.aggregate.sum.mod_lb_hrs + - // item.larhrs.aggregate.sum.mod_lb_hrs; - // load[itemDate].jobsIn.push(item); - // } else { - // load[itemDate] = { - // jobsIn: [item], - // jobsOut: [], - // hoursIn: - // item.labhrs.aggregate.sum.mod_lb_hrs + - // item.larhrs.aggregate.sum.mod_lb_hrs, - // }; - // } - // }); - arrJobs.forEach((item) => { let isSameBucket = false; if (JobBucket.id === CheckJobBucket(ssbuckets, item)) { @@ -102,21 +81,27 @@ exports.job = async (req, res) => { item.labhrs.aggregate.sum.mod_lb_hrs + item.larhrs.aggregate.sum.mod_lb_hrs; - const itemDate = moment(item.scheduled_in) + const AddJobForSchedulingCalc = !item.inproduction; + + const itemDate = moment(item.actual_in || item.scheduled_in) .tz(timezone) .format("yyyy-MM-DD"); if (isSameBucket) { if (!!load[itemDate]) { - load[itemDate].hoursIn = (load[itemDate].hoursIn || 0) + jobHours; - load[itemDate].jobsIn.push(item); + load[itemDate].hoursIn = + (load[itemDate].hoursIn || 0) + AddJobForSchedulingCalc + ? jobHours + : 0; + if (AddJobForSchedulingCalc) load[itemDate].jobsIn.push(item); } else { load[itemDate] = { - jobsIn: [item], + jobsIn: AddJobForSchedulingCalc ? [item] : [], jobsOut: [], - hoursIn: jobHours, + hoursIn: AddJobForSchedulingCalc ? jobHours : 0, }; } } + if (!load[itemDate]) { load[itemDate] = { jobsIn: [], @@ -139,52 +124,28 @@ exports.job = async (req, res) => { const inProdJobs = filteredProdJobsList.find((p) => p.id === item.id); const inArrJobs = filteredArrJobs.find((p) => p.id === item.id); - if (!(inProdJobs || inArrJobs)) { - //Job isn't found in production or coming in. - //is it going today or scheduled to go today? - if ( - moment(item.actual_completion || item.scheduled_completion) - .tz(timezone) - .isSame(moment().tz(timezone), "day") - ) { - console.log("Job is going today anyways, ignore it.", item); - return; - } + const AddJobForSchedulingCalc = inProdJobs || inArrJobs; - if ( - 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; - } - console.log("PROBLEM JOB", item); - problemJobs.push({ - ...item, - code: "Job is scheduled for completion, but it is not marked in production nor is it an arriving job in this period. Check the scheduled in and completion dates", - }); - return; + const itemDate = moment( + item.actual_completion || item.scheduled_completion + ) + .tz(timezone) + .format("yyyy-MM-DD"); + if (!!load[itemDate]) { + load[itemDate].hoursOut = + (load[itemDate].hoursOut || 0) + AddJobForSchedulingCalc + ? item.labhrs.aggregate.sum.mod_lb_hrs + + item.larhrs.aggregate.sum.mod_lb_hrs + : 0; + if (AddJobForSchedulingCalc) load[itemDate].jobsOut.push(item); } else { - const itemDate = moment( - item.actual_completion || item.scheduled_completion - ) - .tz(timezone) - .format("yyyy-MM-DD"); - if (!!load[itemDate]) { - load[itemDate].hoursOut = - (load[itemDate].hoursOut || 0) + - item.labhrs.aggregate.sum.mod_lb_hrs + - item.larhrs.aggregate.sum.mod_lb_hrs; - load[itemDate].jobsOut.push(item); - } else { - load[itemDate] = { - jobsOut: [item], - hoursOut: - item.labhrs.aggregate.sum.mod_lb_hrs + - item.larhrs.aggregate.sum.mod_lb_hrs, - }; - } + load[itemDate] = { + jobsOut: AddJobForSchedulingCalc ? [item] : [], + hoursOut: AddJobForSchedulingCalc + ? item.labhrs.aggregate.sum.mod_lb_hrs + + item.larhrs.aggregate.sum.mod_lb_hrs + : 0, + }; } });