import { ClockCircleOutlined } from "@ant-design/icons"; import { useApolloClient } from "@apollo/client/react"; import { Button, Card, Form, Popover, Select, Space, Tooltip } from "antd"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import { logImEXEvent } from "../../firebase/firebase.utils"; import { QUERY_JOB_LBR_ADJUSTMENTS, UPDATE_JOB } from "../../graphql/jobs.queries"; import _ from "lodash"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import { UPDATE_JOB_LINE } from "../../graphql/jobs-lines.queries"; import { insertAuditTrail } from "../../redux/application/application.actions"; import { selectTechnician } from "../../redux/tech/tech.selectors"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; import { useNotification } from "../../contexts/Notifications/notificationContext.jsx"; import { selectIsPartsEntry } from "../../redux/application/application.selectors.js"; const mapStateToProps = createStructuredSelector({ technician: selectTechnician, isPartsEntry: selectIsPartsEntry }); const mapDispatchToProps = (dispatch) => ({ insertAuditTrail: ({ jobid, operation, type }) => dispatch(insertAuditTrail({ jobid, operation, type })) }); export default connect(mapStateToProps, mapDispatchToProps)(JobLineConvertToLabor); export function JobLineConvertToLabor({ children, jobline, job, insertAuditTrail, technician, isPartsEntry, ...otherBtnProps }) { const { t } = useTranslation(); const [loading, setLoading] = useState(false); const [form] = Form.useForm(); const [visibility, setVisibility] = useState(false); const client = useApolloClient(); const notification = useNotification(); const handleFinish = async (values) => { const { mod_lbr_ty } = values; logImEXEvent("job_convert_dollar_to_labor"); setLoading(true); const existingAdjustments = await client.query({ query: QUERY_JOB_LBR_ADJUSTMENTS, variables: { id: job.id } }); const newAdjustments = _.cloneDeep(existingAdjustments.data.jobs_by_pk.lbr_adjustments); const adjustment = calculateAdjustment({ mod_lbr_ty, job, jobline }); newAdjustments[mod_lbr_ty] = (newAdjustments[mod_lbr_ty] || 0) + adjustment; const jobUpdate = client.mutate({ mutation: UPDATE_JOB, variables: { jobId: job.id, job: { lbr_adjustments: newAdjustments } } }); const lineUpdate = client.mutate({ mutation: UPDATE_JOB_LINE, variables: { lineId: jobline.id, line: { convertedtolbr: true, convertedtolbr_data: { mod_lbr_ty: mod_lbr_ty, mod_lb_hrs: adjustment } } } }); if (jobUpdate.errors) { notification.error({ title: t("jobs.errors.saving", { message: JSON.stringify(jobUpdate.errors) }) }); return; } if (lineUpdate.errors) { notification.error({ title: t("joblines.errors.saving", { message: JSON.stringify(lineUpdate.errors) }) }); return; } insertAuditTrail({ jobid: job.id, operation: AuditTrailMapping.jobmodifylbradj({ hours: calculateAdjustment({ mod_lbr_ty, job, jobline }).toFixed(1), mod_lbr_ty }), type: "jobmodifylbradj" }); setLoading(false); setVisibility(false); }; const overlay = (