import { DeleteFilled, DollarCircleFilled } from "@ant-design/icons"; import { Button, 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 CurrencyInput from "../form-items-formatted/currency-form-item.component"; import BilllineAddInventory from "../billline-add-inventory/billline-add-inventory.component"; import { useTreatments } from "@splitsoftware/splitio-react"; 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 { Simple_Inventory } = useTreatments( ["Simple_Inventory"], {}, 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, 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; } ), }); }} /> ), }, { 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) => ( ), }, { 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", ]); if (getFieldValue(["billlines", record.name, "deductedfromlbr"])) return (
{price && adjustmentRate && `${(price / adjustmentRate).toFixed(1)} hrs`}
); return <>; }}
), }, { title: t("billlines.fields.federal_tax_applicable"), dataIndex: "applicable_taxes.federal", editable: true, formItemProps: (field) => { return { key: `${field.index}fedtax`, valuePropName: "checked", initialValue: true, 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) => , }, { 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 ( {(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}