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 (
{(formInput && formInput(record, record.name)) || children}
{additional && additional(record, record.name)}
|
);
if (wrapper)
return (
{(formInput && formInput(record, record.name)) || children}
|
);
return (
{(formInput && formInput(record, record.name)) || children}
|
);
};