Added sublets tracking to production board. BOD-415

This commit is contained in:
Patrick Fic
2020-09-29 10:15:06 -07:00
parent 6b6d052e74
commit fef95be5a3
26 changed files with 688 additions and 131 deletions

View File

@@ -21884,6 +21884,27 @@
</translation>
</translations>
</concept_node>
<concept_node>
<name>sublets</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>

View File

@@ -1,35 +0,0 @@
-----BEGIN CERTIFICATE-----
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
-----END CERTIFICATE-----

View File

@@ -37,7 +37,6 @@
"query-string": "^6.13.2",
"react": "^16.13.1",
"react-apollo": "^3.1.5",
"react-barcode": "^1.4.0",
"react-big-calendar": "^0.28.0",
"react-codemirror2": "^7.2.1",
"react-color": "^2.18.1",

View File

@@ -6,7 +6,6 @@ import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { Link, useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import { selectJobReadOnly } from "../../redux/application/application.selectors";
import { setModalContext } from "../../redux/modals/modals.actions";
import CurrencyFormatter from "../../utils/CurrencyFormatter";
import { DateFormatter } from "../../utils/DateFormatter";

View File

@@ -7,6 +7,7 @@ import { Link } from "react-router-dom";
import "./production-board-card.styles.scss";
import ProductionRemoveButton from "../production-remove-button/production-remove-button.component";
import { useTranslation } from "react-i18next";
import ProductionSubletsManageComponent from "../production-sublets-manage/production-sublets-manage.component";
export default function ProductionBoardCard(card) {
const { t } = useTranslation();
@@ -77,8 +78,9 @@ export default function ProductionBoardCard(card) {
</Row>
<div className="imex-flex-row imex-flex-row__flex-space-around">
<ProductionAlert record={card} key="alert" />
<ProductionSubletsManageComponent subletJobLines={card.subletLines} />
<Link to={`/manage/jobs/${card.id}`}>
<EyeFilled key="setting" />
<EyeFilled />
</Link>
</div>
</Card>

View File

@@ -5,12 +5,13 @@ import CurrencyFormatter from "../../utils/CurrencyFormatter";
import { DateFormatter } from "../../utils/DateFormatter";
import PhoneFormatter from "../../utils/PhoneFormatter";
import { alphaSort } from "../../utils/sorters";
import ProductionSubletsManageComponent from "../production-sublets-manage/production-sublets-manage.component";
import ProductionListColumnAlert from "./production-list-columns.alert.component";
import ProductionListColumnBodyPriority from "./production-list-columns.bodypriority.component";
import ProductionListColumnPaintPriority from "./production-list-columns.paintpriority.component";
import ProductionListColumnStatus from "./production-list-columns.status.component";
import ProductionListColumnNote from "./production-list-columns.productionnote.component";
import ProductionListColumnStatus from "./production-list-columns.status.component";
import ProductionlistColumnTouchTime from "./prodution-list-columns.touchtime.component";
export default [
{
@@ -19,7 +20,9 @@ export default [
key: "viewdetail",
ellipsis: true,
render: (text, record) => (
<Link to={{search:`?selected=${record.id}`}} >{i18n.t("general.labels.view")}</Link>
<Link to={{ search: `?selected=${record.id}` }}>
{i18n.t("general.labels.view")}
</Link>
),
},
{
@@ -179,16 +182,8 @@ export default [
title: i18n.t("production.labels.cycletime"),
dataIndex: "ct",
key: "ct",
render: (text, record) => {
let ct = 0;
if (!!record.actual_in) {
const totalHrs = record.larhrs + record.labhrs;
const Difference_In_Time = new Date() - new Date(record.actual_in);
const Difference_In_Days = Difference_In_Time / (1000 * 3600 * 24);
ct = (totalHrs / Difference_In_Days).toFixed(2);
}
return <span>{ct || 0}</span>;
return <ProductionlistColumnTouchTime job={record} />;
},
},
{
@@ -215,4 +210,12 @@ export default [
<ProductionListColumnPaintPriority record={record} />
),
},
{
title: i18n.t("production.labels.sublets"),
dataIndex: "sublets",
key: "sublets",
render: (text, record) => (
<ProductionSubletsManageComponent subletJobLines={record.subletLines} />
),
},
];

View File

@@ -0,0 +1,22 @@
import moment from "moment";
import React, { useMemo } from "react";
export default function ProductionlistColumnTouchTime({ job }) {
let ct = useMemo(() => {
if (!!job.actual_in) {
const totalHrs =
(job.larhrs.aggregate.sum.mod_lb_hrs || 0) +
(job.labhrs.aggregate.sum.mod_lb_hrs || 0);
const Difference_In_Days = moment().diff(
moment(job.actual_in),
"days",
true
);
return (totalHrs / Difference_In_Days).toFixed(2);
}
return 0;
}, [job]);
return <span>{ct}</span>;
}

View File

@@ -1,13 +1,12 @@
import React from "react";
import { Descriptions, Drawer } from "antd";
import queryString from "query-string";
import React from "react";
import { useTranslation } from "react-i18next";
import { useHistory, useLocation } from "react-router-dom";
import CurrencyFormatter from "../../utils/CurrencyFormatter";
import { DateFormatter } from "../../utils/DateFormatter";
import PartsStatusPie from "../parts-status-pie/parts-status-pie.component";
import Barcode from "react-barcode";
import ProductionRemoveButton from "../production-remove-button/production-remove-button.component";
import queryString from "query-string";
import { useHistory, useLocation } from "react-router-dom";
export default function ProductionListDetail({ jobs }) {
const search = queryString.parse(useLocation().search);
@@ -31,13 +30,6 @@ export default function ProductionListDetail({ jobs }) {
visible={!!selected}
>
<div>
<Barcode
value={theJob.id || ""}
background="transparent"
displayValue={false}
width={1}
height={15}
/>
<Descriptions bordered size="small" column={1}>
<Descriptions.Item label={t("jobs.fields.ro_number")}>
{theJob.ro_number || ""}

View File

@@ -0,0 +1,97 @@
import { CheckCircleFilled, EyeInvisibleFilled } from "@ant-design/icons";
import { Button, List, notification, Popover } from "antd";
import React, { useMemo, useState } from "react";
import { useMutation } from "react-apollo";
import { useTranslation } from "react-i18next";
import { UPDATE_JOB_LINE } from "../../graphql/jobs-lines.queries";
export default function ProductionSubletsManageComponent({ subletJobLines }) {
const { t } = useTranslation();
const [updateJobLine] = useMutation(UPDATE_JOB_LINE);
const [loading, setLoading] = useState(false);
const subletCount = useMemo(() => {
return {
total: subletJobLines.filter((s) => !s.sublet_ignored).length,
outstanding: subletJobLines.filter(
(s) => !s.sublet_ignored && !s.sublet_completed
).length,
};
}, [subletJobLines]);
const handleSubletMark = async (sublet, action) => {
setLoading(true);
const result = await updateJobLine({
variables: {
lineId: sublet.id,
line: {
sublet_completed:
action === "complete" ? !sublet.sublet_completed : false,
sublet_ignored: action === "ignore" ? !sublet.sublet_ignored : false,
},
},
});
if (!!result.errors) {
notification["error"]({
message: t("joblines.errors.updating", {
message: JSON.stringify(result.errors),
}),
});
} else {
notification["success"]({
message: t("joblines.successes.updated"),
});
}
setLoading(false);
};
const popContent = (
<div style={{ minWidth: "20rem" }}>
<List
size="small"
onClick={(e) => e.stopPropagation()}
dataSource={subletJobLines}
renderItem={(s) => (
<List.Item
actions={[
<Button
key="complete"
loading={loading}
onClick={() => handleSubletMark(s, "complete")}
type={s.sublet_completed ? "primary" : "ghost"}
>
<CheckCircleFilled
color={s.sublet_completed ? "green" : null}
/>
</Button>,
<Button
key="sublet"
loading={loading}
onClick={() => handleSubletMark(s, "ignore")}
type={s.sublet_ignored ? "primary" : "ghost"}
>
<EyeInvisibleFilled
color={s.sublet_ignored ? "tomato" : null}
/>
</Button>,
]}
>
<List.Item.Meta title={s.line_desc} />
</List.Item>
)}
/>
</div>
);
return (
<Popover
trigger={["click"]}
content={popContent}
style={{ cursor: "pointer" }}
placement="bottom"
title={t("production.labels.sublets")}
>
<span>{`${subletCount.outstanding} / ${subletCount.total} rem.`}</span>
</Popover>
);
}

View File

@@ -173,6 +173,17 @@ export const SUBSCRIPTION_JOBS_IN_PRODUCTION = gql`
}
}
}
subletLines: joblines(
where: {
_and: { part_type: { _in: ["PAS", "PASL"] }, removed: { _eq: false } }
}
order_by: { line_no: asc }
) {
id
line_desc
sublet_ignored
sublet_completed
}
}
}
`;

View File

@@ -1345,7 +1345,8 @@
"jobdetail": "Job Details",
"note": "Production Note",
"paintpriority": "P/P",
"refinishhours": "R"
"refinishhours": "R",
"sublets": "Sublets"
},
"successes": {
"removed": "Job removed from production."

View File

@@ -1345,7 +1345,8 @@
"jobdetail": "",
"note": "",
"paintpriority": "",
"refinishhours": ""
"refinishhours": "",
"sublets": ""
},
"successes": {
"removed": ""

View File

@@ -1345,7 +1345,8 @@
"jobdetail": "",
"note": "",
"paintpriority": "",
"refinishhours": ""
"refinishhours": "",
"sublets": ""
},
"successes": {
"removed": ""

View File

@@ -7930,11 +7930,6 @@ js-yaml@^3.13.1:
argparse "^1.0.7"
esprima "^4.0.0"
jsbarcode@^3.8.0:
version "3.11.0"
resolved "https://registry.yarnpkg.com/jsbarcode/-/jsbarcode-3.11.0.tgz#20623e008b101ef45d0cce9c8022cdf49be28547"
integrity sha512-/ozCd7wsa+VIHo9sUc03HneVEQrH7cVWfJolUT/WOW1m8mJ2e3iYZje6C9X3LFHdczlesqFHRpxLtbVsNtjyow==
jsbn@~0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
@@ -11327,14 +11322,6 @@ react-app-polyfill@^1.0.6:
regenerator-runtime "^0.13.3"
whatwg-fetch "^3.0.0"
react-barcode@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/react-barcode/-/react-barcode-1.4.0.tgz#ebc85ff1b8b49ac4b947b7f3745d684c6c363902"
integrity sha512-xDxIc9WUTQPMcwc3kbCVsjh03WiPyynms9OSdsNSh2AAgB6XqMiy9hYWkCNHgdNdvurkvKB6hm25AZHXyQfvlQ==
dependencies:
jsbarcode "^3.8.0"
prop-types "^15.6.2"
react-beautiful-dnd@^13.0.0:
version "13.0.0"
resolved "https://registry.yarnpkg.com/react-beautiful-dnd/-/react-beautiful-dnd-13.0.0.tgz#f70cc8ff82b84bc718f8af157c9f95757a6c3b40"

View File

@@ -0,0 +1,5 @@
- args:
cascade: false
read_only: false
sql: ALTER TABLE "public"."joblines" DROP COLUMN "sublet_ignored";
type: run_sql

View File

@@ -0,0 +1,6 @@
- args:
cascade: false
read_only: false
sql: ALTER TABLE "public"."joblines" ADD COLUMN "sublet_ignored" bool NOT NULL
DEFAULT false;
type: run_sql

View File

@@ -0,0 +1,5 @@
- args:
cascade: false
read_only: false
sql: ALTER TABLE "public"."joblines" DROP COLUMN "sublet_completed";
type: run_sql

View File

@@ -0,0 +1,6 @@
- args:
cascade: false
read_only: false
sql: ALTER TABLE "public"."joblines" ADD COLUMN "sublet_completed" bool NOT NULL
DEFAULT false;
type: run_sql

View File

@@ -0,0 +1,79 @@
- args:
role: user
table:
name: joblines
schema: public
type: drop_insert_permission
- args:
permission:
check:
job:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
columns:
- act_price
- alt_co_id
- alt_overrd
- alt_part_i
- alt_partm
- alt_partno
- bett_amt
- bett_pctg
- bett_tax
- bett_type
- cert_part
- created_at
- db_hrs
- db_price
- db_ref
- est_seq
- glass_flag
- id
- jobid
- lbr_amt
- lbr_hrs_j
- lbr_inc
- lbr_op
- lbr_op_j
- lbr_tax
- lbr_typ_j
- line_desc
- line_ind
- line_no
- line_ref
- location
- misc_amt
- misc_sublt
- misc_tax
- mod_lb_hrs
- mod_lbr_ty
- notes
- oem_partno
- op_code_desc
- paint_stg
- paint_tone
- part_qty
- part_type
- price_inc
- price_j
- profitcenter_labor
- profitcenter_part
- prt_dsmk_m
- prt_dsmk_p
- removed
- status
- tax_part
- unq_seq
- updated_at
set: {}
role: user
table:
name: joblines
schema: public
type: create_insert_permission

View File

@@ -0,0 +1,81 @@
- args:
role: user
table:
name: joblines
schema: public
type: drop_insert_permission
- args:
permission:
check:
job:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
columns:
- act_price
- alt_co_id
- alt_overrd
- alt_part_i
- alt_partm
- alt_partno
- bett_amt
- bett_pctg
- bett_tax
- bett_type
- cert_part
- created_at
- db_hrs
- db_price
- db_ref
- est_seq
- glass_flag
- id
- jobid
- lbr_amt
- lbr_hrs_j
- lbr_inc
- lbr_op
- lbr_op_j
- lbr_tax
- lbr_typ_j
- line_desc
- line_ind
- line_no
- line_ref
- location
- misc_amt
- misc_sublt
- misc_tax
- mod_lb_hrs
- mod_lbr_ty
- notes
- oem_partno
- op_code_desc
- paint_stg
- paint_tone
- part_qty
- part_type
- price_inc
- price_j
- profitcenter_labor
- profitcenter_part
- prt_dsmk_m
- prt_dsmk_p
- removed
- status
- sublet_completed
- sublet_ignored
- tax_part
- unq_seq
- updated_at
set: {}
role: user
table:
name: joblines
schema: public
type: create_insert_permission

View File

@@ -0,0 +1,80 @@
- args:
role: user
table:
name: joblines
schema: public
type: drop_select_permission
- args:
permission:
allow_aggregations: true
columns:
- act_price
- alt_co_id
- alt_overrd
- alt_part_i
- alt_partm
- alt_partno
- bett_amt
- bett_pctg
- bett_tax
- bett_type
- cert_part
- created_at
- db_hrs
- db_price
- db_ref
- est_seq
- glass_flag
- id
- jobid
- lbr_amt
- lbr_hrs_j
- lbr_inc
- lbr_op
- lbr_op_j
- lbr_tax
- lbr_typ_j
- line_desc
- line_ind
- line_no
- line_ref
- location
- misc_amt
- misc_sublt
- misc_tax
- mod_lb_hrs
- mod_lbr_ty
- notes
- oem_partno
- op_code_desc
- paint_stg
- paint_tone
- part_qty
- part_type
- price_inc
- price_j
- profitcenter_labor
- profitcenter_part
- prt_dsmk_m
- prt_dsmk_p
- removed
- status
- tax_part
- unq_seq
- updated_at
computed_fields: []
filter:
job:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
role: user
table:
name: joblines
schema: public
type: create_select_permission

View File

@@ -0,0 +1,82 @@
- args:
role: user
table:
name: joblines
schema: public
type: drop_select_permission
- args:
permission:
allow_aggregations: true
columns:
- act_price
- alt_co_id
- alt_overrd
- alt_part_i
- alt_partm
- alt_partno
- bett_amt
- bett_pctg
- bett_tax
- bett_type
- cert_part
- created_at
- db_hrs
- db_price
- db_ref
- est_seq
- glass_flag
- id
- jobid
- lbr_amt
- lbr_hrs_j
- lbr_inc
- lbr_op
- lbr_op_j
- lbr_tax
- lbr_typ_j
- line_desc
- line_ind
- line_no
- line_ref
- location
- misc_amt
- misc_sublt
- misc_tax
- mod_lb_hrs
- mod_lbr_ty
- notes
- oem_partno
- op_code_desc
- paint_stg
- paint_tone
- part_qty
- part_type
- price_inc
- price_j
- profitcenter_labor
- profitcenter_part
- prt_dsmk_m
- prt_dsmk_p
- removed
- status
- sublet_completed
- sublet_ignored
- tax_part
- unq_seq
- updated_at
computed_fields: []
filter:
job:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
role: user
table:
name: joblines
schema: public
type: create_select_permission

View File

@@ -0,0 +1,79 @@
- args:
role: user
table:
name: joblines
schema: public
type: drop_update_permission
- args:
permission:
columns:
- act_price
- alt_co_id
- alt_overrd
- alt_part_i
- alt_partm
- alt_partno
- bett_amt
- bett_pctg
- bett_tax
- bett_type
- cert_part
- created_at
- db_hrs
- db_price
- db_ref
- est_seq
- glass_flag
- id
- jobid
- lbr_amt
- lbr_hrs_j
- lbr_inc
- lbr_op
- lbr_op_j
- lbr_tax
- lbr_typ_j
- line_desc
- line_ind
- line_no
- line_ref
- location
- misc_amt
- misc_sublt
- misc_tax
- mod_lb_hrs
- mod_lbr_ty
- notes
- oem_partno
- op_code_desc
- paint_stg
- paint_tone
- part_qty
- part_type
- price_inc
- price_j
- profitcenter_labor
- profitcenter_part
- prt_dsmk_m
- prt_dsmk_p
- removed
- status
- tax_part
- unq_seq
- updated_at
filter:
job:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
set: {}
role: user
table:
name: joblines
schema: public
type: create_update_permission

View File

@@ -0,0 +1,81 @@
- args:
role: user
table:
name: joblines
schema: public
type: drop_update_permission
- args:
permission:
columns:
- act_price
- alt_co_id
- alt_overrd
- alt_part_i
- alt_partm
- alt_partno
- bett_amt
- bett_pctg
- bett_tax
- bett_type
- cert_part
- created_at
- db_hrs
- db_price
- db_ref
- est_seq
- glass_flag
- id
- jobid
- lbr_amt
- lbr_hrs_j
- lbr_inc
- lbr_op
- lbr_op_j
- lbr_tax
- lbr_typ_j
- line_desc
- line_ind
- line_no
- line_ref
- location
- misc_amt
- misc_sublt
- misc_tax
- mod_lb_hrs
- mod_lbr_ty
- notes
- oem_partno
- op_code_desc
- paint_stg
- paint_tone
- part_qty
- part_type
- price_inc
- price_j
- profitcenter_labor
- profitcenter_part
- prt_dsmk_m
- prt_dsmk_p
- removed
- status
- sublet_completed
- sublet_ignored
- tax_part
- unq_seq
- updated_at
filter:
job:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
set: {}
role: user
table:
name: joblines
schema: public
type: create_update_permission

View File

@@ -1778,6 +1778,8 @@ tables:
- prt_dsmk_p
- removed
- status
- sublet_completed
- sublet_ignored
- tax_part
- unq_seq
- updated_at
@@ -1836,6 +1838,8 @@ tables:
- prt_dsmk_p
- removed
- status
- sublet_completed
- sublet_ignored
- tax_part
- unq_seq
- updated_at
@@ -1905,6 +1909,8 @@ tables:
- prt_dsmk_p
- removed
- status
- sublet_completed
- sublet_ignored
- tax_part
- unq_seq
- updated_at

54
key.pem
View File

@@ -1,54 +0,0 @@
-----BEGIN ENCRYPTED PRIVATE KEY-----
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
lprkK8/B3YTkfi7ZmfapZA==
-----END ENCRYPTED PRIVATE KEY-----