import { useLazyQuery } from "@apollo/client"; import { useSplitTreatments } from "@splitsoftware/splitio-react"; import { Card, Form, Input, InputNumber, Select, Space, Switch } from "antd"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import { GET_LINE_TICKET_BY_PK } from "../../graphql/jobs-lines.queries"; import { selectAuthLevel, selectBodyshop } from "../../redux/user/user.selectors"; import EmployeeSearchSelect from "../employee-search-select/employee-search-select.component"; import { default as DateTimePicker, default as FormDateTimePicker } from "../form-date-time-picker/form-date-time-picker.component"; import JobSearchSelect from "../job-search-select/job-search-select.component"; import LaborAllocationsTable from "../labor-allocations-table/labor-allocations-table.component"; import { CalculateAllocationsTotals } from "../labor-allocations-table/labor-allocations-table.utility"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component"; import { HasRbacAccess } from "../rbac-wrapper/rbac-wrapper.component"; import TimeTicketList from "../time-ticket-list/time-ticket-list.component"; import JobEmployeeAssignmentsContainer from "./../job-employee-assignments/job-employee-assignments.container"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, authLevel: selectAuthLevel }); const mapDispatchToProps = (dispatch) => ({}); export default connect(mapStateToProps, mapDispatchToProps)(TimeTicketModalComponent); export function TimeTicketModalComponent({ form, bodyshop, authLevel, employeeAutoCompleteOptions, isEdit, disabled, employeeSelectDisabled }) { const { t } = useTranslation(); const { treatments: { Enhanced_Payroll } } = useSplitTreatments({ attributes: {}, names: ["Enhanced_Payroll"], splitKey: bodyshop.imexshopid }); const [loadLineTicketData, { called, loading, data: lineTicketData }] = useLazyQuery(GET_LINE_TICKET_BY_PK, { fetchPolicy: "network-only", nextFetchPolicy: "network-only" }); const CostCenterSelect = ({ emps, value, ...props }) => { return ( ); }; const MemoInput = ({ value, ...props }) => { return ; }; return (
{() => ( )} { const emps = employeeAutoCompleteOptions && employeeAutoCompleteOptions.filter((e) => e.id === value)[0]; form.setFieldsValue({ flat_rate: emps && emps.flat_rate }); }} /> prev.employeeid !== cur.employeeid}> {() => { const employeeId = form.getFieldValue("employeeid"); const emps = employeeAutoCompleteOptions && employeeAutoCompleteOptions.filter((e) => e.id === employeeId)[0]; return ( ); }} {() => ( <> ({ validator(rule, value) { if (!bodyshop.tt_enforce_hours_for_tech_console) { return Promise.resolve(); } if (!value || getFieldValue("cost_center") === null || !lineTicketData) return Promise.resolve(); //Check the cost center, const totals = CalculateAllocationsTotals( bodyshop, lineTicketData.joblines, lineTicketData.timetickets, lineTicketData.jobs_by_pk.lbr_adjustments ); const fieldTypeToCheck = bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber ? "mod_lbr_ty" : "cost_center"; const costCenterDiff = Math.round( totals.find((total) => total[fieldTypeToCheck] === getFieldValue("cost_center"))?.difference * 10 ) / 10; if (value > costCenterDiff) return Promise.reject(t("timetickets.validation.hoursenteredmorethanavailable")); else { return Promise.resolve(); } } }), { required: form.getFieldValue("cost_center") !== "timetickets.labels.shift" //message: t("general.validation.required"), } ]} > )} ({ async validator(rule, value) { if (value) { const prodHrs = getFieldValue("productivehrs"); if (prodHrs < 0 && value !== 0) return Promise.reject(t("timetickets.labels.zeroactualnegativeprod")); else { return Promise.resolve(); } } else { return Promise.resolve(); } } }) ]} > { <> ({ validator(rule, value) { const clockon = getFieldValue("clockon"); if (!value) return Promise.resolve(); if (!clockon && value) return Promise.reject(t("timetickets.validation.clockoffwithoutclockon")); // TODO - Verify this exists if (value && value.isSameOrAfter && !value.isSameOrAfter(clockon)) return Promise.reject(t("timetickets.validation.clockoffmustbeafterclockon")); return Promise.resolve(); } }) ]} > } {() => ( )} {() => { const jobid = form.getFieldValue("jobid"); if ((!called && jobid) || (jobid && lineTicketData?.jobs_by_pk?.id !== jobid && !loading)) { loadLineTicketData({ variables: { id: jobid } }); } return ; }}
); } export function LaborAllocationContainer({ jobid, loading, lineTicketData, hideTimeTickets = false }) { const { t } = useTranslation(); if (loading) return ; if (!lineTicketData) return null; if (!jobid) return null; return ( {!hideTimeTickets && ( )} ); }