IO-1789 Incoming hours cap

This commit is contained in:
Patrick Fic
2022-03-21 11:47:25 -06:00
parent d9beee7f2f
commit 592b47b5d4
11 changed files with 124 additions and 18 deletions

View File

@@ -7280,6 +7280,32 @@
</concept_node>
</children>
</folder_node>
<folder_node>
<name>ss_configuration</name>
<children>
<concept_node>
<name>dailyhrslimit</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
</children>
</folder_node>
<folder_node>
<name>ssbuckets</name>
<children>

View File

@@ -70,6 +70,12 @@ export default function ShopInfoSchedulingComponent({ form }) {
>
<Select mode="tags" />
</Form.Item>
<Form.Item
name={["ss_configuration", "dailyhrslimit"]}
label={t("bodyshop.fields.ss_configuration.dailyhrslimit")}
>
<InputNumber min={0} />
</Form.Item>
</LayoutFormRow>
<Divider orientation="left">{t("bodyshop.labels.workingdays")}</Divider>
<Space wrap size="large">

View File

@@ -101,6 +101,7 @@ export const QUERY_BODYSHOP = gql`
md_filehandlers
md_email_cc
timezone
ss_configuration
employees {
user_email
id
@@ -199,6 +200,7 @@ export const UPDATE_SHOP = gql`
md_filehandlers
md_email_cc
timezone
ss_configuration
employees {
id
first_name
@@ -266,7 +268,6 @@ export const QUERY_DELIVER_CHECKLIST = gql`
ro_number
actual_completion
actual_delivery
}
}
`;

View File

@@ -455,6 +455,9 @@
"label": "Label",
"templates": "Templates"
},
"ss_configuration": {
"dailyhrslimit": "Daily Incoming Hours Limit"
},
"ssbuckets": {
"gte": "Greater Than/Equal to (hrs)",
"id": "ID",

View File

@@ -455,6 +455,9 @@
"label": "",
"templates": ""
},
"ss_configuration": {
"dailyhrslimit": ""
},
"ssbuckets": {
"gte": "",
"id": "",

View File

@@ -455,6 +455,9 @@
"label": "",
"templates": ""
},
"ss_configuration": {
"dailyhrslimit": ""
},
"ssbuckets": {
"gte": "",
"id": "",

View File

@@ -860,6 +860,7 @@
- shopname
- shoprates
- speedprint
- ss_configuration
- ssbuckets
- state
- state_tax_id
@@ -938,6 +939,7 @@
- shopname
- shoprates
- speedprint
- ss_configuration
- ssbuckets
- state
- state_tax_id

View File

@@ -0,0 +1,4 @@
-- Could not auto-generate a down migration.
-- Please write an appropriate down migration for the SQL below:
-- alter table "public"."bodyshops" add column "ss_configuration" jsonb
-- null default jsonb_build_object();

View File

@@ -0,0 +1,2 @@
alter table "public"."bodyshops" add column "ss_configuration" jsonb
null default jsonb_build_object();

View File

@@ -464,6 +464,7 @@ exports.QUERY_UPCOMING_APPOINTMENTS = `query QUERY_UPCOMING_APPOINTMENTS($now: t
jobs_by_pk(id: $jobId) {
bodyshop {
ssbuckets
ss_configuration
target_touchtime
workingdays
timezone

View File

@@ -5,6 +5,7 @@ const Dinero = require("dinero.js");
const moment = require("moment-timezone");
const logger = require("../utils/logger");
const _ = require("lodash");
const { filter } = require("lodash");
require("dotenv").config({
path: path.resolve(
process.cwd(),
@@ -32,7 +33,8 @@ exports.job = async (req, res) => {
});
const { jobs_by_pk, blockedDays, prodJobs, arrJobs, compJobs } = result;
const { ssbuckets, workingdays, timezone } = result.jobs_by_pk.bodyshop;
const { ssbuckets, workingdays, timezone, ss_configuration } =
result.jobs_by_pk.bodyshop;
const jobHrs = result.jobs_by_pk.jobhrs.aggregate.sum.mod_lb_hrs;
const JobBucket = ssbuckets.filter(
@@ -63,29 +65,68 @@ exports.job = async (req, res) => {
}
});
const filteredArrJobs = arrJobs.filter(
(j) => JobBucket.id === CheckJobBucket(ssbuckets, j)
);
// const filteredArrJobs = arrJobs.filter(
// (j) => JobBucket.id === CheckJobBucket(ssbuckets, j)
// );
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)) {
filteredArrJobs.push(item);
isSameBucket = true;
}
let jobHours =
item.labhrs.aggregate.sum.mod_lb_hrs +
item.larhrs.aggregate.sum.mod_lb_hrs;
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 {
if (isSameBucket) {
if (!!load[itemDate]) {
load[itemDate].hoursIn = (load[itemDate].hoursIn || 0) + jobHours;
load[itemDate].jobsIn.push(item);
} else {
load[itemDate] = {
jobsIn: [item],
jobsOut: [],
hoursIn: jobHours,
};
}
}
if (!load[itemDate]) {
load[itemDate] = {
jobsIn: [item],
jobsIn: [],
jobsOut: [],
hoursIn:
item.labhrs.aggregate.sum.mod_lb_hrs +
item.larhrs.aggregate.sum.mod_lb_hrs,
hoursIn: 0,
hoursInTotal: 0,
};
}
load[itemDate].hoursInTotal =
(load[itemDate].hoursInTotal || 0) + jobHours;
});
//Get the completing jobs.
@@ -214,11 +255,25 @@ exports.job = async (req, res) => {
(workingdays[dayOfWeekMapper(moment(loadKey).day())] || false) &&
!load[loadKey].blocked;
let isUnderDailyTotalLimit = true;
if (
ss_configuration &&
ss_configuration.dailyhrslimit &&
ss_configuration.dailyhrslimit > 0 &&
load[loadKey] &&
load[loadKey].hoursInTotal &&
load[loadKey].hoursInTotal > ss_configuration.dailyhrslimit
) {
isUnderDailyTotalLimit = false;
}
if (
load[loadKey].expectedLoad &&
load[loadKey].expectedLoad[JobBucket.id] &&
JobBucket.target > load[loadKey].expectedLoad[JobBucket.id].count &&
isShopOpen
isShopOpen &&
isUnderDailyTotalLimit
)
possibleDates.push(new Date(loadKey).toISOString().substr(0, 10));
});