import { useLazyQuery } from "@apollo/client"; import { Form, Input, InputNumber, Select, Switch } from "antd"; import React from "react"; 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 FormDatePicker from "../form-date-picker/form-date-picker.component"; import 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"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, authLevel: selectAuthLevel, }); const mapDispatchToProps = (dispatch) => ({}); export default connect( mapStateToProps, mapDispatchToProps )(TimeTicketModalComponent); export function TimeTicketModalComponent({ form, bodyshop, authLevel, employeeAutoCompleteOptions, isEdit, employeeSelectDisabled, }) { const { t } = useTranslation(); 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") ); 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 }) { if (loading) return ; if (!lineTicketData) return null; return (
); }