Merged in test-AIO (pull request #1387)
Rome Deployment & minor bug fixes for IO.
This commit is contained in:
@@ -132,7 +132,7 @@ jobs:
|
|||||||
name: Install Dependencies
|
name: Install Dependencies
|
||||||
command: npm i
|
command: npm i
|
||||||
|
|
||||||
- run: npm run build:rome
|
- run: npm run build:production:rome
|
||||||
|
|
||||||
- aws-cli/setup:
|
- aws-cli/setup:
|
||||||
aws_access_key_id: AWS_ACCESS_KEY_ID
|
aws_access_key_id: AWS_ACCESS_KEY_ID
|
||||||
@@ -144,6 +144,31 @@ jobs:
|
|||||||
to: "s3://rome-online-production/"
|
to: "s3://rome-online-production/"
|
||||||
arguments: "--exclude '*.map'"
|
arguments: "--exclude '*.map'"
|
||||||
|
|
||||||
|
promanager-app-build:
|
||||||
|
docker:
|
||||||
|
- image: cimg/node:18.18.2
|
||||||
|
|
||||||
|
working_directory: ~/repo/client
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- checkout:
|
||||||
|
path: ~/repo
|
||||||
|
- run:
|
||||||
|
name: Install Dependencies
|
||||||
|
command: npm i
|
||||||
|
|
||||||
|
- run: npm run build:production:promanager
|
||||||
|
|
||||||
|
- aws-cli/setup:
|
||||||
|
aws_access_key_id: AWS_ACCESS_KEY_ID
|
||||||
|
aws_secret_access_key: AWS_SECRET_ACCESS_KEY
|
||||||
|
region: AWS_REGION
|
||||||
|
|
||||||
|
- aws-s3/sync:
|
||||||
|
from: build
|
||||||
|
to: "s3://promanager-production/"
|
||||||
|
arguments: "--exclude '*.map'"
|
||||||
|
|
||||||
test-rome-hasura-migrate:
|
test-rome-hasura-migrate:
|
||||||
docker:
|
docker:
|
||||||
- image: cimg/node:18.18.2
|
- image: cimg/node:18.18.2
|
||||||
@@ -188,6 +213,31 @@ jobs:
|
|||||||
to: "s3://rome-online-test/"
|
to: "s3://rome-online-test/"
|
||||||
arguments: "--exclude '*.map'"
|
arguments: "--exclude '*.map'"
|
||||||
|
|
||||||
|
test-promanager-app-build:
|
||||||
|
docker:
|
||||||
|
- image: cimg/node:18.18.2
|
||||||
|
|
||||||
|
working_directory: ~/repo/client
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- checkout:
|
||||||
|
path: ~/repo
|
||||||
|
- run:
|
||||||
|
name: Install Dependencies
|
||||||
|
command: npm i
|
||||||
|
|
||||||
|
- run: npm run build:test:promanager
|
||||||
|
|
||||||
|
- aws-cli/setup:
|
||||||
|
aws_access_key_id: AWS_ACCESS_KEY_ID
|
||||||
|
aws_secret_access_key: AWS_SECRET_ACCESS_KEY
|
||||||
|
region: AWS_REGION
|
||||||
|
|
||||||
|
- aws-s3/sync:
|
||||||
|
from: dist
|
||||||
|
to: "s3://promanager-testing/"
|
||||||
|
arguments: "--exclude '*.map'"
|
||||||
|
|
||||||
test-hasura-migrate:
|
test-hasura-migrate:
|
||||||
docker:
|
docker:
|
||||||
- image: cimg/node:18.18.2
|
- image: cimg/node:18.18.2
|
||||||
@@ -307,16 +357,16 @@ workflows:
|
|||||||
- rome-api-deploy:
|
- rome-api-deploy:
|
||||||
filters:
|
filters:
|
||||||
branches:
|
branches:
|
||||||
only: rome/master
|
only: master-AIO
|
||||||
- rome-app-build:
|
- rome-app-build:
|
||||||
filters:
|
filters:
|
||||||
branches:
|
branches:
|
||||||
only: rome/master
|
only: master-AIO
|
||||||
- rome-hasura-migrate:
|
- rome-hasura-migrate:
|
||||||
secret: ${HASURA_PROD_SECRET}
|
secret: ${HASURA_PROD_SECRET}
|
||||||
filters:
|
filters:
|
||||||
branches:
|
branches:
|
||||||
only: rome/master
|
only: master-AIO
|
||||||
- imex-test-app-build:
|
- imex-test-app-build:
|
||||||
filters:
|
filters:
|
||||||
branches:
|
branches:
|
||||||
@@ -334,6 +384,14 @@ workflows:
|
|||||||
filters:
|
filters:
|
||||||
branches:
|
branches:
|
||||||
only: test-AIO
|
only: test-AIO
|
||||||
|
- test-promanager-app-build:
|
||||||
|
filters:
|
||||||
|
branches:
|
||||||
|
only: test-AIO
|
||||||
|
- promanager-app-build:
|
||||||
|
filters:
|
||||||
|
branches:
|
||||||
|
only: master-AIO
|
||||||
- test-rome-hasura-migrate:
|
- test-rome-hasura-migrate:
|
||||||
secret: ${HASURA_ROME_TEST_SECRET}
|
secret: ${HASURA_ROME_TEST_SECRET}
|
||||||
filters:
|
filters:
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<babeledit_project be_version="2.7.1" version="1.2">
|
<babeledit_project version="1.2" be_version="2.7.1">
|
||||||
<!--
|
<!--
|
||||||
|
|
||||||
BabelEdit project file
|
BabelEdit project file
|
||||||
@@ -27170,6 +27170,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>employee_csr_writer</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>
|
||||||
<concept_node>
|
<concept_node>
|
||||||
<name>employee_prep</name>
|
<name>employee_prep</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ const Eula = ({ currentEula, currentUser, acceptEula }) => {
|
|||||||
|
|
||||||
// Trim the values of the fields before submitting
|
// Trim the values of the fields before submitting
|
||||||
const trimmedFormValues = Object.entries(otherFormValues).reduce((acc, [key, value]) => {
|
const trimmedFormValues = Object.entries(otherFormValues).reduce((acc, [key, value]) => {
|
||||||
acc[key] = typeof value === "string" ? value.trim() : value;
|
acc[key] = typeof value === "string" ? value?.trim() : value;
|
||||||
return acc;
|
return acc;
|
||||||
}, {});
|
}, {});
|
||||||
|
|
||||||
@@ -140,7 +140,7 @@ const EulaFormComponent = ({ form, handleChange, onFinish, t }) => (
|
|||||||
{
|
{
|
||||||
required: true,
|
required: true,
|
||||||
validator: (_, value) =>
|
validator: (_, value) =>
|
||||||
value.trim() !== "" ? Promise.resolve() : Promise.reject(new Error(t("eula.messages.first_name")))
|
value?.trim() !== "" ? Promise.resolve() : Promise.reject(new Error(t("eula.messages.first_name")))
|
||||||
}
|
}
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
@@ -155,7 +155,7 @@ const EulaFormComponent = ({ form, handleChange, onFinish, t }) => (
|
|||||||
{
|
{
|
||||||
required: true,
|
required: true,
|
||||||
validator: (_, value) =>
|
validator: (_, value) =>
|
||||||
value.trim() !== "" ? Promise.resolve() : Promise.reject(new Error(t("eula.messages.last_name")))
|
value?.trim() !== "" ? Promise.resolve() : Promise.reject(new Error(t("eula.messages.last_name")))
|
||||||
}
|
}
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
@@ -172,7 +172,7 @@ const EulaFormComponent = ({ form, handleChange, onFinish, t }) => (
|
|||||||
{
|
{
|
||||||
required: true,
|
required: true,
|
||||||
validator: (_, value) =>
|
validator: (_, value) =>
|
||||||
value.trim() !== "" ? Promise.resolve() : Promise.reject(new Error(t("eula.messages.business_name")))
|
value?.trim() !== "" ? Promise.resolve() : Promise.reject(new Error(t("eula.messages.business_name")))
|
||||||
}
|
}
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ function FeatureWrapper({ bodyshop, featureName, noauth, children, ...restProps
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function HasFeatureAccess({ featureName, bodyshop }) {
|
export function HasFeatureAccess({ featureName, bodyshop }) {
|
||||||
return bodyshop?.features.allAccess || dayjs(bodyshop?.features[featureName]).isAfter(dayjs());
|
return bodyshop?.features?.allAccess || dayjs(bodyshop?.features[featureName]).isAfter(dayjs());
|
||||||
}
|
}
|
||||||
|
|
||||||
export default connect(mapStateToProps, null)(FeatureWrapper);
|
export default connect(mapStateToProps, null)(FeatureWrapper);
|
||||||
|
|||||||
@@ -431,7 +431,12 @@ export function JobLinesComponent({
|
|||||||
</Space>
|
</Space>
|
||||||
</Tag>
|
</Tag>
|
||||||
)}
|
)}
|
||||||
<JobLineDispatchButton selectedLines={selectedLines} setSelectedLines={setSelectedLines} job={job} />
|
<JobLineDispatchButton
|
||||||
|
selectedLines={selectedLines}
|
||||||
|
setSelectedLines={setSelectedLines}
|
||||||
|
job={job}
|
||||||
|
disabled={technician}
|
||||||
|
/>
|
||||||
{Enhanced_Payroll.treatment === "on" && (
|
{Enhanced_Payroll.treatment === "on" && (
|
||||||
<JobLineBulkAssignComponent selectedLines={selectedLines} setSelectedLines={setSelectedLines} job={job} />
|
<JobLineBulkAssignComponent selectedLines={selectedLines} setSelectedLines={setSelectedLines} job={job} />
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import { createStructuredSelector } from "reselect";
|
|||||||
import { selectJobReadOnly } from "../../redux/application/application.selectors";
|
import { selectJobReadOnly } from "../../redux/application/application.selectors";
|
||||||
import { selectBodyshop } from "../../redux/user/user.selectors";
|
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||||
import DataLabel from "../data-label/data-label.component";
|
import DataLabel from "../data-label/data-label.component";
|
||||||
|
import InstanceRenderManager from "../../utils/instanceRenderMgr";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop,
|
bodyshop: selectBodyshop,
|
||||||
@@ -153,7 +154,15 @@ export function JobEmployeeAssignments({
|
|||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</DataLabel>
|
</DataLabel>
|
||||||
<DataLabel label={t("jobs.fields.employee_csr")}>
|
<DataLabel
|
||||||
|
label={t(
|
||||||
|
InstanceRenderManager({
|
||||||
|
imex: "jobs.fields.employee_csr",
|
||||||
|
rome: "jobs.fields.employee_csr_writer",
|
||||||
|
promanager: "USE_ROME"
|
||||||
|
})
|
||||||
|
)}
|
||||||
|
>
|
||||||
{csr ? (
|
{csr ? (
|
||||||
<div>
|
<div>
|
||||||
<span>{`${csr.first_name || ""} ${csr.last_name || ""}`}</span>
|
<span>{`${csr.first_name || ""} ${csr.last_name || ""}`}</span>
|
||||||
|
|||||||
@@ -224,7 +224,7 @@ export function JobLifecycleComponent({ job, statuses, ...rest }) {
|
|||||||
<span style={{ fontWeight: "bold" }}>
|
<span style={{ fontWeight: "bold" }}>
|
||||||
{t("job_lifecycle.content.current_status_accumulated_time")} (
|
{t("job_lifecycle.content.current_status_accumulated_time")} (
|
||||||
{lifecycleData.lifecycle[0].value}):
|
{lifecycleData.lifecycle[0].value}):
|
||||||
</span>{" "}
|
</span>
|
||||||
{lifecycleData.durations.totalCurrentStatusDuration.humanReadable}
|
{lifecycleData.durations.totalCurrentStatusDuration.humanReadable}
|
||||||
</li>
|
</li>
|
||||||
)}
|
)}
|
||||||
@@ -250,6 +250,7 @@ export function JobLifecycleComponent({ job, statuses, ...rest }) {
|
|||||||
}}
|
}}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
dataSource={lifecycleData.lifecycle}
|
dataSource={lifecycleData.lifecycle}
|
||||||
|
rowKey="start"
|
||||||
/>
|
/>
|
||||||
</Card>
|
</Card>
|
||||||
</Space>
|
</Space>
|
||||||
|
|||||||
@@ -29,7 +29,8 @@ export function JobLineDispatchButton({
|
|||||||
bodyshop,
|
bodyshop,
|
||||||
jobRO,
|
jobRO,
|
||||||
job,
|
job,
|
||||||
currentUser
|
currentUser,
|
||||||
|
disabled
|
||||||
}) {
|
}) {
|
||||||
const [visible, setVisible] = useState(false);
|
const [visible, setVisible] = useState(false);
|
||||||
const [loading, setLoading] = useState(false);
|
const [loading, setLoading] = useState(false);
|
||||||
@@ -137,7 +138,7 @@ export function JobLineDispatchButton({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Popover open={visible} content={popMenu}>
|
<Popover open={visible} content={popMenu}>
|
||||||
<Button disabled={selectedLines.length === 0 || jobRO} loading={loading} onClick={() => setVisible(true)}>
|
<Button disabled={selectedLines.length === 0 || jobRO || disabled} loading={loading} onClick={() => setVisible(true)}>
|
||||||
{t("joblines.actions.dispatchparts", { count: selectedLines.length })}
|
{t("joblines.actions.dispatchparts", { count: selectedLines.length })}
|
||||||
</Button>
|
</Button>
|
||||||
</Popover>
|
</Popover>
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import { insertAuditTrail } from "../../redux/application/application.actions";
|
|||||||
import { selectJobReadOnly } from "../../redux/application/application.selectors";
|
import { selectJobReadOnly } from "../../redux/application/application.selectors";
|
||||||
import { selectBodyshop } from "../../redux/user/user.selectors";
|
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||||
import AuditTrailMapping from "../../utils/AuditTrailMappings";
|
import AuditTrailMapping from "../../utils/AuditTrailMappings";
|
||||||
|
import InstanceRenderManager from "../../utils/instanceRenderMgr";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
//currentUser: selectCurrentUser
|
//currentUser: selectCurrentUser
|
||||||
@@ -147,7 +148,13 @@ export function JobsConvertButton({ bodyshop, job, refetch, jobRO, insertAuditTr
|
|||||||
{bodyshop.enforce_conversion_csr && (
|
{bodyshop.enforce_conversion_csr && (
|
||||||
<Form.Item
|
<Form.Item
|
||||||
name={"employee_csr"}
|
name={"employee_csr"}
|
||||||
label={t("jobs.fields.employee_csr")}
|
label={t(
|
||||||
|
InstanceRenderManager({
|
||||||
|
imex: "jobs.fields.employee_csr",
|
||||||
|
rome: "jobs.fields.employee_csr_writer",
|
||||||
|
promanager: "USE_ROME"
|
||||||
|
})
|
||||||
|
)}
|
||||||
rules={[
|
rules={[
|
||||||
{
|
{
|
||||||
required: bodyshop.enforce_conversion_csr
|
required: bodyshop.enforce_conversion_csr
|
||||||
|
|||||||
@@ -118,8 +118,8 @@ export function JobsDetailHeader({ job, bodyshop, disabled }) {
|
|||||||
{job?.cccontracts?.length > 0 && (
|
{job?.cccontracts?.length > 0 && (
|
||||||
<DataLabel label={t("jobs.labels.contracts")}>
|
<DataLabel label={t("jobs.labels.contracts")}>
|
||||||
{job.cccontracts.map((c, index) => (
|
{job.cccontracts.map((c, index) => (
|
||||||
<Space wrap>
|
<Space key={c.id} wrap>
|
||||||
<Link key={c.id} to={`/manage/courtesycars/contracts/${c.id}`}>
|
<Link to={`/manage/courtesycars/contracts/${c.id}`}>
|
||||||
{`${c.agreementnumber} - ${c.courtesycar.fleetnumber} ${c.courtesycar.year} ${c.courtesycar.make} ${c.courtesycar.model}`}
|
{`${c.agreementnumber} - ${c.courtesycar.fleetnumber} ${c.courtesycar.year} ${c.courtesycar.make} ${c.courtesycar.model}`}
|
||||||
{index !== job.cccontracts.length - 1 ? "," : null}
|
{index !== job.cccontracts.length - 1 ? "," : null}
|
||||||
</Link>
|
</Link>
|
||||||
|
|||||||
@@ -306,7 +306,7 @@ export function PartsQueueListComponent({ bodyshop }) {
|
|||||||
onRow={(record, rowIndex) => {
|
onRow={(record, rowIndex) => {
|
||||||
return {
|
return {
|
||||||
onClick: (event) => {
|
onClick: (event) => {
|
||||||
handleOnRowClick(record);
|
// handleOnRowClick(record);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import ProductionListColumnStatus from "./production-list-columns.status.compone
|
|||||||
import ProductionlistColumnTouchTime from "./prodution-list-columns.touchtime.component";
|
import ProductionlistColumnTouchTime from "./prodution-list-columns.touchtime.component";
|
||||||
import { store } from "../../redux/store";
|
import { store } from "../../redux/store";
|
||||||
import { setModalContext } from "../../redux/modals/modals.actions";
|
import { setModalContext } from "../../redux/modals/modals.actions";
|
||||||
|
import InstanceRenderManager from "../../utils/instanceRenderMgr";
|
||||||
|
|
||||||
const r = ({ technician, state, activeStatuses, data, bodyshop, refetch, treatments }) => {
|
const r = ({ technician, state, activeStatuses, data, bodyshop, refetch, treatments }) => {
|
||||||
const { Enhanced_Payroll } = treatments;
|
const { Enhanced_Payroll } = treatments;
|
||||||
@@ -120,15 +121,13 @@ const r = ({ technician, state, activeStatuses, data, bodyshop, refetch, treatme
|
|||||||
sortOrder: state.sortedInfo.columnKey === "vehicle" && state.sortedInfo.order,
|
sortOrder: state.sortedInfo.columnKey === "vehicle" && state.sortedInfo.order,
|
||||||
render: (text, record) =>
|
render: (text, record) =>
|
||||||
technician ? (
|
technician ? (
|
||||||
<>{`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${
|
<>{`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${record.v_model_desc || ""} ${
|
||||||
record.v_model_desc || ""
|
|
||||||
} ${record.v_color || ""} ${record.plate_no || ""}`}</>
|
|
||||||
) : (
|
|
||||||
<Link to={`/manage/vehicles/${record.vehicleid}`}>{`${
|
|
||||||
record.v_model_yr || ""
|
|
||||||
} ${record.v_make_desc || ""} ${record.v_model_desc || ""} ${
|
|
||||||
record.v_color || ""
|
record.v_color || ""
|
||||||
} ${record.plate_no || ""}`}</Link>
|
} ${record.plate_no || ""}`}</>
|
||||||
|
) : (
|
||||||
|
<Link to={`/manage/vehicles/${record.vehicleid}`}>{`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${
|
||||||
|
record.v_model_desc || ""
|
||||||
|
} ${record.v_color || ""} ${record.plate_no || ""}`}</Link>
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -442,7 +441,13 @@ const r = ({ technician, state, activeStatuses, data, bodyshop, refetch, treatme
|
|||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: i18n.t("jobs.fields.employee_csr"),
|
title: i18n.t(
|
||||||
|
InstanceRenderManager({
|
||||||
|
imex: "jobs.fields.employee_csr",
|
||||||
|
rome: "jobs.fields.employee_csr_writer",
|
||||||
|
promanager: "USE_ROME"
|
||||||
|
})
|
||||||
|
),
|
||||||
dataIndex: "employee_csr",
|
dataIndex: "employee_csr",
|
||||||
key: "employee_csr",
|
key: "employee_csr",
|
||||||
sortOrder: state.sortedInfo.columnKey === "employee_csr" && state.sortedInfo.order,
|
sortOrder: state.sortedInfo.columnKey === "employee_csr" && state.sortedInfo.order,
|
||||||
|
|||||||
@@ -4019,30 +4019,38 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) {
|
|||||||
rome: <ShopInfoResponsibilitycentersTaxesComponent form={form} />
|
rome: <ShopInfoResponsibilitycentersTaxesComponent form={form} />
|
||||||
})}
|
})}
|
||||||
|
|
||||||
<Form.Item
|
{InstanceRenderManager({
|
||||||
label={t("bodyshop.fields.responsibilitycenters.itemexemptcode")}
|
rome: (
|
||||||
rules={[
|
<>
|
||||||
{
|
<Form.Item
|
||||||
required: true
|
label={t("bodyshop.fields.responsibilitycenters.itemexemptcode")}
|
||||||
//message: t("general.validation.required"),
|
rules={[
|
||||||
}
|
{
|
||||||
]}
|
required: true
|
||||||
name={["md_responsibility_centers", "taxes", "itemexemptcode"]}
|
//message: t("general.validation.required"),
|
||||||
>
|
}
|
||||||
<Input />
|
]}
|
||||||
</Form.Item>
|
name={["md_responsibility_centers", "taxes", "itemexemptcode"]}
|
||||||
<Form.Item
|
>
|
||||||
label={t("bodyshop.fields.responsibilitycenters.invoiceexemptcode")}
|
<Input />
|
||||||
rules={[
|
</Form.Item>
|
||||||
{
|
<Form.Item
|
||||||
required: true
|
label={t("bodyshop.fields.responsibilitycenters.invoiceexemptcode")}
|
||||||
//message: t("general.validation.required"),
|
rules={[
|
||||||
}
|
{
|
||||||
]}
|
required: true
|
||||||
name={["md_responsibility_centers", "taxes", "invoiceexemptcode"]}
|
//message: t("general.validation.required"),
|
||||||
>
|
}
|
||||||
<Input />
|
]}
|
||||||
</Form.Item>
|
name={["md_responsibility_centers", "taxes", "invoiceexemptcode"]}
|
||||||
|
>
|
||||||
|
<Input />
|
||||||
|
</Form.Item>
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
promanager: "USE_ROME"
|
||||||
|
})}
|
||||||
|
|
||||||
{/*<LayoutFormRow id="local_tax">*/}
|
{/*<LayoutFormRow id="local_tax">*/}
|
||||||
{/* <Form.Item*/}
|
{/* <Form.Item*/}
|
||||||
{/* label={t("bodyshop.fields.responsibilitycenters.local_tax")}*/}
|
{/* label={t("bodyshop.fields.responsibilitycenters.local_tax")}*/}
|
||||||
|
|||||||
@@ -93,18 +93,18 @@ export function TechSider({ technician, techLogout, bodyshop, setTimeTicketTaskC
|
|||||||
disabled: !!!technician,
|
disabled: !!!technician,
|
||||||
label: <Link to={`/tech/shiftclock`}>{t("menus.tech.shiftclockin")}</Link>
|
label: <Link to={`/tech/shiftclock`}>{t("menus.tech.shiftclockin")}</Link>
|
||||||
},
|
},
|
||||||
{
|
|
||||||
key: "5",
|
|
||||||
icon: <ScheduleOutlined />,
|
|
||||||
disabled: !!!technician,
|
|
||||||
label: <Link to={`/tech/list`}>{t("menus.tech.productionlist")}</Link>
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
key: "dispatchedparts",
|
key: "dispatchedparts",
|
||||||
disabled: !!!technician,
|
disabled: !!!technician,
|
||||||
icon: <CarOutlined />,
|
icon: <CarOutlined />,
|
||||||
label: <Link to={`/tech/dispatchedparts`}>{t("menus.tech.dispatchedparts")}</Link>
|
label: <Link to={`/tech/dispatchedparts`}>{t("menus.tech.dispatchedparts")}</Link>
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
key: "5",
|
||||||
|
icon: <ScheduleOutlined />,
|
||||||
|
disabled: !!!technician,
|
||||||
|
label: <Link to={`/tech/list`}>{t("menus.tech.productionlist")}</Link>
|
||||||
|
},
|
||||||
{
|
{
|
||||||
key: "6",
|
key: "6",
|
||||||
icon: <Icon component={BsKanban} />,
|
icon: <Icon component={BsKanban} />,
|
||||||
|
|||||||
@@ -207,74 +207,75 @@ export function TimeTicketList({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
title: t("timetickets.fields.created_by"),
|
]),
|
||||||
dataIndex: "created_by",
|
{
|
||||||
key: "created_by",
|
title: t("timetickets.fields.created_by"),
|
||||||
sorter: (a, b) => alphaSort(a.created_by, b.created_by),
|
dataIndex: "created_by",
|
||||||
sortOrder: state.sortedInfo.columnKey === "created_by" && state.sortedInfo.order,
|
key: "created_by",
|
||||||
render: (text, record) => record.created_by
|
sorter: (a, b) => alphaSort(a.created_by, b.created_by),
|
||||||
},
|
sortOrder: state.sortedInfo.columnKey === "created_by" && state.sortedInfo.order,
|
||||||
// {
|
render: (text, record) => record.created_by
|
||||||
// title: "Pay",
|
},
|
||||||
// dataIndex: "pay",
|
// {
|
||||||
// key: "pay",
|
// title: "Pay",
|
||||||
// render: (text, record) =>
|
// dataIndex: "pay",
|
||||||
// Dinero({ amount: Math.round(record.rate * 100) })
|
// key: "pay",
|
||||||
// .multiply(record.flat_rate ? record.productivehrs : record.actualhrs)
|
// render: (text, record) =>
|
||||||
// .toFormat("$0.00"),
|
// Dinero({ amount: Math.round(record.rate * 100) })
|
||||||
// },
|
// .multiply(record.flat_rate ? record.productivehrs : record.actualhrs)
|
||||||
{
|
// .toFormat("$0.00"),
|
||||||
title: t("general.labels.actions"),
|
// },
|
||||||
dataIndex: "actions",
|
{
|
||||||
key: "actions",
|
title: t("general.labels.actions"),
|
||||||
render: (text, record) => (
|
dataIndex: "actions",
|
||||||
<Space wrap>
|
key: "actions",
|
||||||
{techConsole && (
|
render: (text, record) => (
|
||||||
|
<Space wrap>
|
||||||
|
{techConsole && (
|
||||||
|
<TimeTicketEnterButton
|
||||||
|
actions={{ refetch }}
|
||||||
|
context={{ id: record.id, timeticket: record }}
|
||||||
|
disabled={!record.job || disabled}
|
||||||
|
>
|
||||||
|
<EditFilled />
|
||||||
|
</TimeTicketEnterButton>
|
||||||
|
)}
|
||||||
|
{!techConsole && (
|
||||||
|
<RbacWrapper
|
||||||
|
action="timetickets:edit"
|
||||||
|
noauth={() => {
|
||||||
|
return <div />;
|
||||||
|
}}
|
||||||
|
>
|
||||||
<TimeTicketEnterButton
|
<TimeTicketEnterButton
|
||||||
actions={{ refetch }}
|
actions={{ refetch }}
|
||||||
context={{ id: record.id, timeticket: record }}
|
context={{
|
||||||
disabled={!record.job || disabled}
|
id: record.id,
|
||||||
|
timeticket: record
|
||||||
|
}}
|
||||||
|
disabled={
|
||||||
|
HasRbacAccess({
|
||||||
|
bodyshop,
|
||||||
|
authLevel: authLevel,
|
||||||
|
action: "timetickets:editcommitted"
|
||||||
|
}) &&
|
||||||
|
HasRbacAccess({
|
||||||
|
bodyshop,
|
||||||
|
authLevel: authLevel,
|
||||||
|
action: "timetickets:shiftedit"
|
||||||
|
})
|
||||||
|
? disabled
|
||||||
|
: !record.jobid
|
||||||
|
}
|
||||||
>
|
>
|
||||||
<EditFilled />
|
<EditFilled />
|
||||||
</TimeTicketEnterButton>
|
</TimeTicketEnterButton>
|
||||||
)}
|
</RbacWrapper>
|
||||||
{!techConsole && (
|
)}
|
||||||
<RbacWrapper
|
</Space>
|
||||||
action="timetickets:edit"
|
)
|
||||||
noauth={() => {
|
}
|
||||||
return <div />;
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<TimeTicketEnterButton
|
|
||||||
actions={{ refetch }}
|
|
||||||
context={{
|
|
||||||
id: record.id,
|
|
||||||
timeticket: record
|
|
||||||
}}
|
|
||||||
disabled={
|
|
||||||
HasRbacAccess({
|
|
||||||
bodyshop,
|
|
||||||
authLevel: authLevel,
|
|
||||||
action: "timetickets:editcommitted"
|
|
||||||
}) &&
|
|
||||||
HasRbacAccess({
|
|
||||||
bodyshop,
|
|
||||||
authLevel: authLevel,
|
|
||||||
action: "timetickets:shiftedit"
|
|
||||||
})
|
|
||||||
? disabled
|
|
||||||
: !record.jobid
|
|
||||||
}
|
|
||||||
>
|
|
||||||
<EditFilled />
|
|
||||||
</TimeTicketEnterButton>
|
|
||||||
</RbacWrapper>
|
|
||||||
)}
|
|
||||||
</Space>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
])
|
|
||||||
];
|
];
|
||||||
|
|
||||||
const handleTableChange = (pagination, filters, sorter) => {
|
const handleTableChange = (pagination, filters, sorter) => {
|
||||||
|
|||||||
@@ -60,8 +60,8 @@ export function TimeTicketModalComponent({
|
|||||||
{item.cost_center === "timetickets.labels.shift"
|
{item.cost_center === "timetickets.labels.shift"
|
||||||
? t(item.cost_center)
|
? t(item.cost_center)
|
||||||
: bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || Enhanced_Payroll.treatment === "on"
|
: bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || Enhanced_Payroll.treatment === "on"
|
||||||
? t(`joblines.fields.lbr_types.${item.cost_center.toUpperCase()}`)
|
? t(`joblines.fields.lbr_types.${item.cost_center.toUpperCase()}`)
|
||||||
: item.cost_center}
|
: item.cost_center}
|
||||||
</Select.Option>
|
</Select.Option>
|
||||||
))}
|
))}
|
||||||
</Select>
|
</Select>
|
||||||
@@ -215,14 +215,6 @@ export function TimeTicketModalComponent({
|
|||||||
>
|
>
|
||||||
<InputNumber precision={1} />
|
<InputNumber precision={1} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
{
|
|
||||||
// <TimeTicketCalculatorComponent
|
|
||||||
// jobid={form.getFieldValue("jobid")}
|
|
||||||
// setProductiveHours={(productivehrs) =>
|
|
||||||
// form.setFieldsValue({productivehrs})
|
|
||||||
// }
|
|
||||||
// />
|
|
||||||
}
|
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ export function TimeTickeTaskModalContainer({
|
|||||||
toggleModalVisible
|
toggleModalVisible
|
||||||
}) {
|
}) {
|
||||||
const [form] = Form.useForm();
|
const [form] = Form.useForm();
|
||||||
const { context, visible, actions } = timeTicketTasksModal;
|
const { context, open, actions } = timeTicketTasksModal;
|
||||||
const [completedTasks, setCompletedTasks] = useState([]);
|
const [completedTasks, setCompletedTasks] = useState([]);
|
||||||
const [unassignedHours, setUnassignedHours] = useState(0);
|
const [unassignedHours, setUnassignedHours] = useState(0);
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
@@ -59,13 +59,13 @@ export function TimeTickeTaskModalContainer({
|
|||||||
[client]
|
[client]
|
||||||
);
|
);
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (visible) {
|
if (open) {
|
||||||
form.setFieldsValue({ ...context, task: null, timetickets: null });
|
form.setFieldsValue({ ...context, task: null, timetickets: null });
|
||||||
if (context.jobid) {
|
if (context.jobid) {
|
||||||
getCompletedTasks(context.jobid);
|
getCompletedTasks(context.jobid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, [context.jobid, visible, getCompletedTasks, form, context]);
|
}, [context.jobid, open, getCompletedTasks, form, context]);
|
||||||
|
|
||||||
async function handleValueChange(changedValues, allValues) {
|
async function handleValueChange(changedValues, allValues) {
|
||||||
if (changedValues.jobid) {
|
if (changedValues.jobid) {
|
||||||
@@ -118,7 +118,7 @@ export function TimeTickeTaskModalContainer({
|
|||||||
return (
|
return (
|
||||||
<Modal
|
<Modal
|
||||||
destroyOnClose
|
destroyOnClose
|
||||||
open={visible}
|
open={open}
|
||||||
onCancel={() => {
|
onCancel={() => {
|
||||||
toggleModalVisible();
|
toggleModalVisible();
|
||||||
form.resetFields();
|
form.resetFields();
|
||||||
|
|||||||
@@ -1640,6 +1640,7 @@
|
|||||||
"driveable": "Driveable",
|
"driveable": "Driveable",
|
||||||
"employee_body": "Body",
|
"employee_body": "Body",
|
||||||
"employee_csr": "Customer Service Rep.",
|
"employee_csr": "Customer Service Rep.",
|
||||||
|
"employee_csr_writer": "Writer",
|
||||||
"employee_prep": "Prep",
|
"employee_prep": "Prep",
|
||||||
"employee_refinish": "Refinish",
|
"employee_refinish": "Refinish",
|
||||||
"est_addr1": "Estimator Address",
|
"est_addr1": "Estimator Address",
|
||||||
|
|||||||
@@ -1640,6 +1640,7 @@
|
|||||||
"driveable": "",
|
"driveable": "",
|
||||||
"employee_body": "",
|
"employee_body": "",
|
||||||
"employee_csr": "Representante de servicio al cliente.",
|
"employee_csr": "Representante de servicio al cliente.",
|
||||||
|
"employee_csr_writer": "",
|
||||||
"employee_prep": "",
|
"employee_prep": "",
|
||||||
"employee_refinish": "",
|
"employee_refinish": "",
|
||||||
"est_addr1": "Dirección del tasador",
|
"est_addr1": "Dirección del tasador",
|
||||||
|
|||||||
@@ -1640,6 +1640,7 @@
|
|||||||
"driveable": "",
|
"driveable": "",
|
||||||
"employee_body": "",
|
"employee_body": "",
|
||||||
"employee_csr": "représentant du service à la clientèle",
|
"employee_csr": "représentant du service à la clientèle",
|
||||||
|
"employee_csr_writer": "",
|
||||||
"employee_prep": "",
|
"employee_prep": "",
|
||||||
"employee_refinish": "",
|
"employee_refinish": "",
|
||||||
"est_addr1": "Adresse de l'évaluateur",
|
"est_addr1": "Adresse de l'évaluateur",
|
||||||
|
|||||||
Reference in New Issue
Block a user