import Icon, {UploadOutlined} from "@ant-design/icons"; import {useApolloClient} from "@apollo/client"; import {useSplitTreatments} from "@splitsoftware/splitio-react"; import {Alert, Divider, Form, Input, Select, Space, Statistic, Switch, Upload,} from "antd"; import dayjs from "../../utils/day"; import React, {useEffect, useState} from "react"; import {useTranslation} from "react-i18next"; import {MdOpenInNew} from "react-icons/md"; import {connect} from "react-redux"; import {Link} from "react-router-dom"; import {createStructuredSelector} from "reselect"; import {CHECK_BILL_INVOICE_NUMBER} from "../../graphql/bills.queries"; import {selectBodyshop} from "../../redux/user/user.selectors"; import AlertComponent from "../alert/alert.component"; import BillFormLinesExtended from "../bill-form-lines-extended/bill-form-lines-extended.component"; import FormDatePicker from "../form-date-picker/form-date-picker.component"; import FormFieldsChanged from "../form-fields-changed-alert/form-fields-changed-alert.component"; import CurrencyInput from "../form-items-formatted/currency-form-item.component"; import JobSearchSelect from "../job-search-select/job-search-select.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; import VendorSearchSelect from "../vendor-search-select/vendor-search-select.component"; import BillFormLines from "./bill-form.lines.component"; import {CalculateBillTotal} from "./bill-form.totals.utility"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, }); const mapDispatchToProps = (dispatch) => ({}); export function BillFormComponent({ bodyshop, disabled, form, vendorAutoCompleteOptions, lineData, responsibilityCenters, loadLines, billEdit, disableInvNumber, job, loadOutstandingReturns, loadInventory, preferredMake }) { const {t} = useTranslation(); const client = useApolloClient(); const [discount, setDiscount] = useState(0); const {treatments: {Extended_Bill_Posting, ClosingPeriod}} = useSplitTreatments({ attributes: {}, names: ["Extended_Bill_Posting", "ClosingPeriod"], splitKey: bodyshop.imexshopid, }); const handleVendorSelect = (props, opt) => { setDiscount(opt.discount); opt && !billEdit && loadOutstandingReturns({ variables: { jobId: form.getFieldValue("jobid"), vendorId: opt.value, }, }); }; const handleFederalTaxExemptSwitchToggle = (checked) => { // Early gate if (!checked) return; const values = form.getFieldsValue("billlines"); // Gate bill lines if (!values?.billlines?.length) return; const billlines = values.billlines.map((b) => { b.applicable_taxes.federal = false; return b; }); form.setFieldsValue({billlines}); }; useEffect(() => { if (job) form.validateFields(["is_credit_memo"]); }, [job, form]); useEffect(() => { const vendorId = form.getFieldValue("vendorid"); if (vendorId && vendorAutoCompleteOptions) { const matchingVendors = vendorAutoCompleteOptions.filter( (v) => v.id === vendorId ); if (matchingVendors.length === 1) { setDiscount(matchingVendors[0].discount); } } const jobId = form.getFieldValue("jobid"); if (jobId) { loadLines({variables: {id: jobId}}); if (form.getFieldValue("is_credit_memo") && vendorId && !billEdit) { loadOutstandingReturns({ variables: { jobId: jobId, vendorId: vendorId, }, }); } } if (vendorId === bodyshop.inhousevendorid && !billEdit) { loadInventory(); } }, [ form, billEdit, loadOutstandingReturns, loadInventory, setDiscount, vendorAutoCompleteOptions, loadLines, bodyshop.inhousevendorid, ]); return (
{ if (form.getFieldValue("jobid") !== null) { loadLines({variables: {id: form.getFieldValue("jobid")}}); if (form.getFieldValue("vendorid") !== null) { loadOutstandingReturns({ variables: { jobId: form.getFieldValue("jobid"), vendorId: form.getFieldValue("vendorid"), }, }); } } }} /> ({ validator(rule, value) { if ( value && !getFieldValue(["isinhouse"]) && value === bodyshop.inhousevendorid ) { return Promise.reject(t("bills.validation.manualinhouse")); } return Promise.resolve(); }, }), ]} > {job && job.ious && job.ious.length > 0 && job.ious.map((iou) => ( {t("bills.labels.iouexists")} {iou.ro_number} } /> ))} ({ async validator(rule, value) { const vendorid = getFieldValue("vendorid"); if (vendorid && value) { const response = await client.query({ query: CHECK_BILL_INVOICE_NUMBER, variables: { invoice_number: value, vendorid: vendorid, }, }); if (response.data.bills_aggregate.aggregate.count === 0) { return Promise.resolve(); } else if ( response.data.bills_aggregate.nodes.length === 1 && response.data.bills_aggregate.nodes[0].id === form.getFieldValue("id") ) { return Promise.resolve(); } return Promise.reject( t("bills.validation.unique_invoice_number") ); } else { return Promise.resolve(); } }, }), ]} > ({ validator(rule, value) { if ( ClosingPeriod.treatment === "on" && bodyshop.accountingconfig.ClosingPeriod ) { if ( dayjs(value) .startOf("day") .isSameOrAfter( dayjs( bodyshop.accountingconfig.ClosingPeriod[0] ).startOf("day") ) && dayjs(value) .startOf("day") .isSameOrBefore( dayjs( bodyshop.accountingconfig.ClosingPeriod[1] ).endOf("day") ) ) { return Promise.resolve(); } else { return Promise.reject(t("bills.validation.closingperiod")); } } else { return Promise.resolve(); } }, }), ]} > ({ validator(rule, value) { if ( value === true && getFieldValue("jobid") && getFieldValue("vendorid") ) { //Removed as this would cause an additional reload when validating the form on submit and clear the values. // loadOutstandingReturns({ // variables: { // jobId: form.getFieldValue("jobid"), // vendorId: form.getFieldValue("vendorid"), // }, // }); } if ( !bodyshop.bill_allow_post_to_closed && job && (job.status === bodyshop.md_ro_statuses.default_invoiced || job.status === bodyshop.md_ro_statuses.default_exported || job.status === bodyshop.md_ro_statuses.default_void) && (value === false || !value) ) { return Promise.reject(t("bills.labels.onlycmforinvoiced")); } return Promise.resolve(); }, }), ]} > {!billEdit && ( )} {bodyshop.pbs_serialnumber || bodyshop.cdk_dealerid ? ( ) : null} {() => { const values = form.getFieldsValue([ "billlines", "total", "federal_tax_rate", "state_tax_rate", "local_tax_rate", ]); let totals; if ( !!values.total && !!values.billlines && values.billlines.length > 0 ) totals = CalculateBillTotal(values); if (!!totals) return (
{form.getFieldValue("is_credit_memo") ? ( ) : null}
); return null; }}
{t("bills.labels.bill_lines")} {Extended_Bill_Posting.treatment === "on" ? ( ) : ( )} { if (Array.isArray(e)) { return e; } return e && e.fileList; }} > false} listType="picture" > <>

Click or drag files to this area to upload.

); } export default connect(mapStateToProps, mapDispatchToProps)(BillFormComponent);