import { DeleteFilled, DollarCircleFilled } from "@ant-design/icons"; import { useSplitTreatments } from "@splitsoftware/splitio-react"; import { Button, Checkbox, Form, Input, InputNumber, Select, Space, Switch, Table, Tooltip } from "antd"; import React from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import { selectBodyshop } from "../../redux/user/user.selectors"; import CiecaSelect from "../../utils/Ciecaselect"; import BillLineSearchSelect from "../bill-line-search-select/bill-line-search-select.component"; import BilllineAddInventory from "../billline-add-inventory/billline-add-inventory.component"; import CurrencyInput from "../form-items-formatted/currency-form-item.component"; import InstanceRenderManager from "../../utils/instanceRenderMgr"; const mapStateToProps = createStructuredSelector({ //currentUser: selectCurrentUser bodyshop: selectBodyshop }); const mapDispatchToProps = (dispatch) => ({ //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export function BillEnterModalLinesComponent({ bodyshop, disabled, lineData, discount, form, responsibilityCenters, billEdit, billid }) { const { t } = useTranslation(); const { setFieldsValue, getFieldsValue, getFieldValue } = form; const { treatments: { Simple_Inventory, Enhanced_Payroll } } = useSplitTreatments({ attributes: {}, names: ["Simple_Inventory", "Enhanced_Payroll"], splitKey: bodyshop && bodyshop.imexshopid }); const columns = (remove) => { return [ { title: t("billlines.fields.jobline"), dataIndex: "joblineid", editable: true, width: "20rem", formItemProps: (field) => { return { key: `${field.index}joblinename`, name: [field.name, "joblineid"], label: t("billlines.fields.jobline"), rules: [ { required: true //message: t("general.validation.required"), } ] }; }, wrapper: (props) => ( prev.is_credit_memo !== cur.is_credit_memo}> {() => { return props.children; }} ), formInput: (record, index) => ( { setFieldsValue({ billlines: getFieldsValue(["billlines"]).billlines.map((item, idx) => { if (idx === index) { return { ...item, line_desc: opt.line_desc, quantity: opt.part_qty || 1, actual_price: opt.cost, original_actual_price: opt.cost, cost_center: opt.part_type ? bodyshop.pbs_serialnumber || bodyshop.cdk_dealerid ? opt.part_type !== "PAE" ? opt.part_type : null : responsibilityCenters.defaults && (responsibilityCenters.defaults.costs[opt.part_type] || null) : null }; } return item; }) }); }} /> ) }, { title: t("billlines.fields.line_desc"), dataIndex: "line_desc", editable: true, formItemProps: (field) => { return { key: `${field.index}line_desc`, name: [field.name, "line_desc"], label: t("billlines.fields.line_desc"), rules: [ { required: true //message: t("general.validation.required"), } ] }; }, formInput: (record, index) => }, { title: t("billlines.fields.quantity"), dataIndex: "quantity", editable: true, width: "4rem", formItemProps: (field) => { return { key: `${field.index}quantity`, name: [field.name, "quantity"], label: t("billlines.fields.quantity"), rules: [ { required: true //message: t("general.validation.required"), }, ({ getFieldValue }) => ({ validator(rule, value) { if (value && getFieldValue("billlines")[field.fieldKey]?.inventories?.length > value) { return Promise.reject( t("bills.validation.inventoryquantity", { number: getFieldValue("billlines")[field.fieldKey]?.inventories?.length }) ); } return Promise.resolve(); } }) ] }; }, formInput: (record, index) => }, { title: t("billlines.fields.actual_price"), dataIndex: "actual_price", width: "8rem", editable: true, formItemProps: (field) => { return { key: `${field.index}actual_price`, name: [field.name, "actual_price"], label: t("billlines.fields.actual_price"), rules: [ { required: true //message: t("general.validation.required"), } ] }; }, formInput: (record, index) => ( { setFieldsValue({ billlines: getFieldsValue("billlines").billlines.map((item, idx) => { if (idx === index) { return { ...item, actual_cost: !!item.actual_cost ? item.actual_cost : Math.round((parseFloat(e.target.value) * (1 - discount) + Number.EPSILON) * 100) / 100 }; } return item; }) }); }} /> ), additional: (record, index) => InstanceRenderManager({ rome: ( {() => { const billLine = getFieldValue(["billlines", record.name]); const jobLine = lineData.find((line) => line.id === billLine?.joblineid); if (!billEdit && billLine && jobLine && billLine?.actual_price !== jobLine?.act_price) { return ( {t("joblines.fields.create_ppc")} ); } else { return null; } }} ) //Do not need to set for promanager as it will default to Rome. }) }, { title: t("billlines.fields.actual_cost"), dataIndex: "actual_cost", editable: true, width: "8rem", formItemProps: (field) => { return { key: `${field.index}actual_cost`, name: [field.name, "actual_cost"], label: t("billlines.fields.actual_cost"), rules: [ { required: true //message: t("general.validation.required"), } ] }; }, formInput: (record, index) => ( {() => { const line = getFieldsValue(["billlines"]).billlines[index]; if (!!!line) return null; let lineDiscount = 1 - line.actual_cost / line.actual_price; if (isNaN(lineDiscount)) lineDiscount = 0; return ( 0.005 ? lineDiscount > discount ? "orange" : "red" : "green" }} /> ); }} } /> ) // additional: (record, index) => ( // // {() => { // const line = getFieldsValue(["billlines"]).billlines[index]; // if (!!!line) return null; // const lineDiscount = ( // 1 - // Math.round((line.actual_cost / line.actual_price) * 100) / 100 // ).toPrecision(2); // return ( // // // // ); // }} // // ), }, { title: t("billlines.fields.cost_center"), dataIndex: "cost_center", editable: true, formItemProps: (field) => { return { key: `${field.index}cost_center`, name: [field.name, "cost_center"], label: t("billlines.fields.cost_center"), valuePropName: "value", rules: [ { required: true //message: t("general.validation.required"), } ] }; }, formInput: (record, index) => ( ) }, ...(billEdit ? [] : [ { title: t("billlines.fields.location"), dataIndex: "location", editable: true, label: t("billlines.fields.location"), formItemProps: (field) => { return { key: `${field.index}location`, name: [field.name, "location"] }; }, formInput: (record, index) => ( ) } ]), { title: t("billlines.labels.deductedfromlbr"), dataIndex: "deductedfromlbr", editable: true, formItemProps: (field) => { return { valuePropName: "checked", key: `${field.index}deductedfromlbr`, name: [field.name, "deductedfromlbr"] }; }, formInput: (record, index) => , additional: (record, index) => ( {() => { const price = getFieldValue(["billlines", record.name, "actual_price"]); const adjustmentRate = getFieldValue(["billlines", record.name, "lbr_adjustment", "rate"]); const billline = getFieldValue(["billlines", record.name]); const jobline = lineData.find((line) => line.id === billline?.joblineid); const employeeTeamName = bodyshop.employee_teams.find((team) => team.id === jobline?.assigned_team); if (getFieldValue(["billlines", record.name, "deductedfromlbr"])) return (
{Enhanced_Payroll.treatment === "on" ? ( {t("joblines.fields.assigned_team", { name: employeeTeamName?.name })} {`${jobline.mod_lb_hrs} units/${t(`joblines.fields.lbr_types.${jobline.mod_lbr_ty}`)}`} ) : null} {Enhanced_Payroll.treatment === "on" ? ( ) : ( )} {price && adjustmentRate && `${(price / adjustmentRate).toFixed(1)} hrs`}
); return <>; }}
) }, ...InstanceRenderManager({ rome: [], promanager: [], imex: [ { title: t("billlines.fields.federal_tax_applicable"), dataIndex: "applicable_taxes.federal", editable: true, formItemProps: (field) => { return { key: `${field.index}fedtax`, valuePropName: "checked", initialValue: InstanceRenderManager({ imex: true, rome: false, promanager: false }), name: [field.name, "applicable_taxes", "federal"] }; }, formInput: (record, index) => } ] }), { title: t("billlines.fields.state_tax_applicable"), dataIndex: "applicable_taxes.state", editable: true, formItemProps: (field) => { return { key: `${field.index}statetax`, valuePropName: "checked", name: [field.name, "applicable_taxes", "state"] }; }, formInput: (record, index) => }, ...InstanceRenderManager({ rome: [], promanager: [], imex: [ { title: t("billlines.fields.local_tax_applicable"), dataIndex: "applicable_taxes.local", editable: true, formItemProps: (field) => { return { key: `${field.index}localtax`, valuePropName: "checked", name: [field.name, "applicable_taxes", "local"] }; }, formInput: (record, index) => } ] }), { title: t("general.labels.actions"), dataIndex: "actions", render: (text, record) => ( {() => ( {Simple_Inventory.treatment === "on" && ( )} )} ) } ]; }; const mergedColumns = (remove) => columns(remove).map((col) => { if (!col.editable) return col; return { ...col, onCell: (record) => ({ record, formItemProps: col.formItemProps, formInput: col.formInput, additional: col.additional, dataIndex: col.dataIndex, title: col.title }) }; }); return ( { if (!billlines || billlines.length < 1) { return Promise.reject(new Error(t("billlines.validation.atleastone"))); } } } ]} > {(fields, { add, remove, move }) => { return ( <> ); }} ); } export default connect(mapStateToProps, mapDispatchToProps)(BillEnterModalLinesComponent); const EditableCell = ({ dataIndex, title, inputType, record, index, children, formInput, formItemProps, additional, wrapper, ...restProps }) => { if (additional) return ( ); if (wrapper) return ( ); return ( ); };
{(formInput && formInput(record, record.name)) || children} {additional && additional(record, record.name)}
{(formInput && formInput(record, record.name)) || children} {(formInput && formInput(record, record.name)) || children}