Fixed bugs on parts allocations + added totals BOD-131
This commit is contained in:
@@ -215,7 +215,6 @@ function CalculateRatesTotals(ratesList, shoprates) {
|
|||||||
function CalculatePartsTotals(jobLines) {
|
function CalculatePartsTotals(jobLines) {
|
||||||
const ret = jobLines.reduce(
|
const ret = jobLines.reduce(
|
||||||
(acc, value) => {
|
(acc, value) => {
|
||||||
console.log("Parts Calc", value.act_price, value.part_qty, value);
|
|
||||||
switch (value.part_type) {
|
switch (value.part_type) {
|
||||||
case "PAA":
|
case "PAA":
|
||||||
case "PAC":
|
case "PAC":
|
||||||
|
|||||||
@@ -22,10 +22,12 @@ export function JobsCloseLabmatAllocationButton({
|
|||||||
const [visible, setVisible] = useState(false);
|
const [visible, setVisible] = useState(false);
|
||||||
const [state, setState] = useState({ center: "", amount: 0 });
|
const [state, setState] = useState({ center: "", amount: 0 });
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const handleAllocate = () => {
|
const handleAllocate = () => {
|
||||||
const existingIndex = allocation.allocations.findIndex(
|
const existingIndex = allocation.allocations.findIndex(
|
||||||
(e) => e.center === state.center
|
(e) => e.center === state.center
|
||||||
);
|
);
|
||||||
|
console.log("handleAllocate -> existingIndex", existingIndex);
|
||||||
|
|
||||||
const newAllocations = allocation.allocations.slice(0);
|
const newAllocations = allocation.allocations.slice(0);
|
||||||
if (existingIndex > -1) {
|
if (existingIndex > -1) {
|
||||||
@@ -41,6 +43,7 @@ export function JobsCloseLabmatAllocationButton({
|
|||||||
amount: Dinero({ amount: state.amount * 100 }),
|
amount: Dinero({ amount: state.amount * 100 }),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
setAllocations((labMatState) => {
|
setAllocations((labMatState) => {
|
||||||
return {
|
return {
|
||||||
...labMatState,
|
...labMatState,
|
||||||
|
|||||||
@@ -1,28 +1,18 @@
|
|||||||
|
import Dinero from "dinero.js";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import AllocationButton from "../jobs-close-allocation-button/jobs-close-allocation-button.component";
|
import AllocationButton from "../jobs-close-allocation-button/jobs-close-allocation-button.component";
|
||||||
import Dinero from "dinero.js";
|
|
||||||
import AllocationTags from "../jobs-close-allocation-tags/jobs-close-allocation-tags.component";
|
import AllocationTags from "../jobs-close-allocation-tags/jobs-close-allocation-tags.component";
|
||||||
|
|
||||||
import { List } from "antd";
|
|
||||||
|
|
||||||
export default function JobCloseLabMatAllocation({
|
export default function JobCloseLabMatAllocation({
|
||||||
labmatAllocations,
|
labmatAllocations,
|
||||||
setLabmatAllocations,
|
setLabmatAllocations,
|
||||||
|
labMatTotalAllocation
|
||||||
}) {
|
}) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const allocatedTotalsArray = Object.keys(labmatAllocations)
|
|
||||||
.filter((i) => !i.includes("subtotal"))
|
|
||||||
.map((i) => labmatAllocations[i].allocations)
|
|
||||||
.flat();
|
|
||||||
|
|
||||||
const allocatedTotal = Dinero({
|
|
||||||
amount: allocatedTotalsArray.reduce((acc, val) => {
|
|
||||||
console.log("acc", acc);
|
|
||||||
return (acc = acc + val.amount.getAmount());
|
|
||||||
}, 0),
|
|
||||||
});
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div style={{ display: "flex" }}>
|
<div style={{ display: "flex" }}>
|
||||||
@@ -81,22 +71,12 @@ export default function JobCloseLabMatAllocation({
|
|||||||
<tr>
|
<tr>
|
||||||
<td></td>
|
<td></td>
|
||||||
<td>{labmatAllocations.subtotal.toFormat()}</td>
|
<td>{labmatAllocations.subtotal.toFormat()}</td>
|
||||||
<td>{allocatedTotal.toFormat()}</td>
|
<td>{labMatTotalAllocation.toFormat()}</td>
|
||||||
<td></td>
|
<td></td>
|
||||||
<td></td>
|
<td></td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<div>
|
|
||||||
<List>
|
|
||||||
{allocatedTotalsArray.map((i, idx) => (
|
|
||||||
<List.Item key={idx}>{`${
|
|
||||||
i.center
|
|
||||||
} ${i.amount.toFormat()}`}</List.Item>
|
|
||||||
))}
|
|
||||||
</List>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import AllocationTags from "../jobs-close-allocation-tags/jobs-close-allocation-
|
|||||||
export default function JobsClosePartsAllocation({
|
export default function JobsClosePartsAllocation({
|
||||||
partsAllocations,
|
partsAllocations,
|
||||||
setPartsAllocations,
|
setPartsAllocations,
|
||||||
|
partsAllocatedTotal,
|
||||||
}) {
|
}) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
@@ -65,8 +66,15 @@ export default function JobsClosePartsAllocation({
|
|||||||
})}
|
})}
|
||||||
<tr>
|
<tr>
|
||||||
<td></td>
|
<td></td>
|
||||||
<td></td>
|
<td>
|
||||||
<td></td>
|
{Dinero({
|
||||||
|
amount: Object.keys(partsAllocations).reduce((acc, val) => {
|
||||||
|
return (acc =
|
||||||
|
acc + partsAllocations[val].total.getAmount());
|
||||||
|
}, 0),
|
||||||
|
}).toFormat()}
|
||||||
|
</td>
|
||||||
|
<td>{partsAllocatedTotal.toFormat()}</td>
|
||||||
<td></td>
|
<td></td>
|
||||||
<td></td>
|
<td></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|||||||
@@ -0,0 +1,60 @@
|
|||||||
|
import { Descriptions, Statistic } from "antd";
|
||||||
|
import React from "react";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
export default function JobsCloseTotals({
|
||||||
|
jobTotals,
|
||||||
|
labMatTotal,
|
||||||
|
partsTotal,
|
||||||
|
}) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<Descriptions
|
||||||
|
bordered
|
||||||
|
size="small"
|
||||||
|
//column={1}
|
||||||
|
title={t("jobs.labels.totals")}
|
||||||
|
>
|
||||||
|
<Descriptions.Item label={t("jobs.labels.partstotal")}>
|
||||||
|
<Statistic
|
||||||
|
value={jobTotals.parts.parts.total.toFormat()}
|
||||||
|
suffix={`(${jobTotals.parts.parts.subtotal.toFormat()} ± ${jobTotals.parts.parts.adjustments.toFormat()})`}
|
||||||
|
/>
|
||||||
|
</Descriptions.Item>
|
||||||
|
<Descriptions.Item label={t("jobs.labels.subletstotal")}>
|
||||||
|
<Statistic
|
||||||
|
value={jobTotals.parts.sublets.total.toFormat()}
|
||||||
|
suffix={`(${jobTotals.parts.sublets.subtotal.toFormat()} ± ${jobTotals.parts.sublets.adjustments.toFormat()})`}
|
||||||
|
/>
|
||||||
|
</Descriptions.Item>
|
||||||
|
<Descriptions.Item label={t("jobs.labels.subtotal")}>
|
||||||
|
<Statistic value={jobTotals.totals.subtotal.toFormat()} />
|
||||||
|
</Descriptions.Item>
|
||||||
|
<Descriptions.Item label={t("jobs.labels.federal_tax_amt")}>
|
||||||
|
<Statistic value={jobTotals.totals.federal_tax.toFormat()} />
|
||||||
|
</Descriptions.Item>
|
||||||
|
<Descriptions.Item label={t("jobs.labels.state_tax_amt")}>
|
||||||
|
<Statistic value={jobTotals.totals.state_tax.toFormat()} />
|
||||||
|
</Descriptions.Item>
|
||||||
|
<Descriptions.Item label={t("jobs.labels.local_tax_amt")}>
|
||||||
|
<Statistic value={jobTotals.totals.local_tax.toFormat()} />
|
||||||
|
</Descriptions.Item>
|
||||||
|
</Descriptions>
|
||||||
|
<Statistic
|
||||||
|
title={t("jobs.labels.total_repairs")}
|
||||||
|
value={jobTotals.totals.total_repairs.toFormat()}
|
||||||
|
/>
|
||||||
|
<Statistic
|
||||||
|
title={t("jobs.labels.net_repairs")}
|
||||||
|
value={jobTotals.totals.net_repairs.toFormat()}
|
||||||
|
/>
|
||||||
|
<Statistic
|
||||||
|
title={t("jobs.labels.suspense")}
|
||||||
|
value={jobTotals.totals.subtotal
|
||||||
|
.subtract(labMatTotal)
|
||||||
|
.subtract(partsTotal)
|
||||||
|
.toFormat()}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
import { DeleteFilled } from "@ant-design/icons";
|
import { DeleteFilled } from "@ant-design/icons";
|
||||||
import { Button, Form, Input, Select, Row, Col } from "antd";
|
import { Button, Form, Input, Select } from "antd";
|
||||||
import React, { useState } from "react";
|
import React, { useState } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import styled from "styled-components";
|
import styled from "styled-components";
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ import { createStructuredSelector } from "reselect";
|
|||||||
import JobsCloseLaborMaterialAllocation from "../../components/jobs-close-labmat-allocation/jobs-close-labmat-allocation.component";
|
import JobsCloseLaborMaterialAllocation from "../../components/jobs-close-labmat-allocation/jobs-close-labmat-allocation.component";
|
||||||
import { selectBodyshop } from "../../redux/user/user.selectors";
|
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||||
import JobsClosePartsAllocation from "../../components/jobs-close-parts-allocation/jobs-close-parts-allocation.component";
|
import JobsClosePartsAllocation from "../../components/jobs-close-parts-allocation/jobs-close-parts-allocation.component";
|
||||||
|
import Dinero from "dinero.js";
|
||||||
|
import JobsCloseTotals from "../../components/jobs-close-totals/jobs-close-totals.component";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
//currentUser: selectCurrentUser
|
//currentUser: selectCurrentUser
|
||||||
@@ -20,24 +22,59 @@ export function JobsCloseComponent({ job, bodyshop, jobTotals }) {
|
|||||||
return acc;
|
return acc;
|
||||||
}, {})
|
}, {})
|
||||||
);
|
);
|
||||||
|
console.log("JobsCloseComponent -> labmatAllocations", labmatAllocations);
|
||||||
|
|
||||||
const [partsAllocations, setPartsAllocations] = useState(
|
const [partsAllocations, setPartsAllocations] = useState({
|
||||||
Object.keys(jobTotals.parts.parts.list).reduce((acc, val) => {
|
...Object.keys(jobTotals.parts.parts.list).reduce((acc, val) => {
|
||||||
acc[val] = { ...jobTotals.parts.parts.list[val], allocations: [] };
|
acc[val] = { ...jobTotals.parts.parts.list[val], allocations: [] };
|
||||||
|
|
||||||
return acc;
|
return acc;
|
||||||
}, {})
|
}, {}),
|
||||||
);
|
sublet: {
|
||||||
|
...jobTotals.parts.sublets,
|
||||||
|
allocations: [],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log("JobsCloseComponent -> partsAllocations", partsAllocations);
|
||||||
|
|
||||||
|
const labmatAllocatedTotalsArray = Object.keys(labmatAllocations)
|
||||||
|
.filter((i) => !i.includes("subtotal"))
|
||||||
|
.map((i) => labmatAllocations[i].allocations)
|
||||||
|
.flat();
|
||||||
|
|
||||||
|
const labmatAllocatedTotal = Dinero({
|
||||||
|
amount: labmatAllocatedTotalsArray.reduce((acc, val) => {
|
||||||
|
return (acc = acc + val.amount.getAmount());
|
||||||
|
}, 0),
|
||||||
|
});
|
||||||
|
|
||||||
|
const partsAllocatedTotalsArray = Object.keys(partsAllocations)
|
||||||
|
.map((i) => partsAllocations[i].allocations)
|
||||||
|
.flat();
|
||||||
|
|
||||||
|
const partsAllocatedTotal = Dinero({
|
||||||
|
amount: partsAllocatedTotalsArray.reduce((acc, val) => {
|
||||||
|
return (acc = acc + val.amount.getAmount());
|
||||||
|
}, 0),
|
||||||
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
|
<JobsCloseTotals
|
||||||
|
jobTotals={jobTotals}
|
||||||
|
labMatTotal={labmatAllocatedTotal}
|
||||||
|
partsTotal={partsAllocatedTotal}
|
||||||
|
/>
|
||||||
<JobsCloseLaborMaterialAllocation
|
<JobsCloseLaborMaterialAllocation
|
||||||
labmatAllocations={labmatAllocations}
|
labmatAllocations={labmatAllocations}
|
||||||
setLabmatAllocations={setLabmatAllocations}
|
setLabmatAllocations={setLabmatAllocations}
|
||||||
|
labMatTotalAllocation={labmatAllocatedTotal}
|
||||||
/>
|
/>
|
||||||
<JobsClosePartsAllocation
|
<JobsClosePartsAllocation
|
||||||
partsAllocations={partsAllocations}
|
partsAllocations={partsAllocations}
|
||||||
setPartsAllocations={setPartsAllocations}
|
setPartsAllocations={setPartsAllocations}
|
||||||
|
partsAllocatedTotal={partsAllocatedTotal}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -50,7 +50,6 @@ export function JobsCloseContainer({ setBreadcrumbs, bodyshop }) {
|
|||||||
]);
|
]);
|
||||||
}, [setBreadcrumbs, t, jobId, data]);
|
}, [setBreadcrumbs, t, jobId, data]);
|
||||||
|
|
||||||
console.log("Container rerender");
|
|
||||||
if (loading) return <LoadingSpinner />;
|
if (loading) return <LoadingSpinner />;
|
||||||
if (error) return <AlertComponent message={error.message} type="error" />;
|
if (error) return <AlertComponent message={error.message} type="error" />;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user