Added automatic reconciliation for jobs. BOD-406
This commit is contained in:
@@ -0,0 +1,106 @@
|
||||
import i18next from "i18next";
|
||||
import _ from "lodash";
|
||||
export const reconcileByAssocLine = (
|
||||
jobLines,
|
||||
jobLineState,
|
||||
billLines,
|
||||
billLineState,
|
||||
setErrors
|
||||
) => {
|
||||
const [selectedBillLines, setSelectedBillLines] = billLineState;
|
||||
const [selectedJobLines, setSelectedJobLines] = jobLineState;
|
||||
|
||||
const allJoblinesFromBills = billLines
|
||||
.filter((bl) => !!bl.joblineid)
|
||||
.map((bl) => bl.joblineid);
|
||||
|
||||
const duplicatedJobLinesbyInvoiceId = _.filter(
|
||||
allJoblinesFromBills,
|
||||
(val, i, iteratee) => _.includes(iteratee, val, i + 1)
|
||||
);
|
||||
|
||||
if (duplicatedJobLinesbyInvoiceId.length > 0)
|
||||
setErrors((errors) => [
|
||||
...errors,
|
||||
..._.uniqBy(duplicatedJobLinesbyInvoiceId).map((dupedId) =>
|
||||
i18next.t("jobs.labels.reconciliation.multiplebilllines", {
|
||||
line_desc: jobLines.find((j) => j.id === dupedId).line_desc,
|
||||
})
|
||||
),
|
||||
]);
|
||||
|
||||
setSelectedBillLines(
|
||||
_.union(
|
||||
selectedBillLines,
|
||||
billLines.filter((bl) => !!bl.joblineid).map((bl) => bl.id)
|
||||
)
|
||||
);
|
||||
|
||||
setSelectedJobLines(
|
||||
_.union(selectedJobLines, _.uniqBy(allJoblinesFromBills))
|
||||
);
|
||||
};
|
||||
|
||||
export const reconcileByPrice = (
|
||||
jobLines,
|
||||
jobLineState,
|
||||
billLines,
|
||||
billLineState,
|
||||
setErrors
|
||||
) => {
|
||||
const [selectedBillLines, setSelectedBillLines] = billLineState;
|
||||
const [selectedJobLines, setSelectedJobLines] = jobLineState;
|
||||
|
||||
const allActPricesFromJobs = jobLines.map((jl) => jl.act_price);
|
||||
const duplicateActPrices = _.filter(
|
||||
allActPricesFromJobs,
|
||||
(val, i, iteratee) => _.includes(iteratee, val, i + 1)
|
||||
);
|
||||
|
||||
if (duplicateActPrices.length > 0)
|
||||
setErrors((errors) => [
|
||||
...errors,
|
||||
..._.uniqBy(duplicateActPrices).map((dupeAp) =>
|
||||
i18next.t("jobs.labels.reconciliation.multipleactprices", {
|
||||
act_price: dupeAp,
|
||||
})
|
||||
),
|
||||
]);
|
||||
|
||||
const foundJobLines = [];
|
||||
var foundBillLines = [];
|
||||
const actPricesWithMoreThan1MatchingBill = [];
|
||||
|
||||
jobLines.forEach((jl) => {
|
||||
const matchingBillLineIds = billLines
|
||||
.filter((bl) => bl.actual_price === jl.act_price)
|
||||
.map((bl) => bl.id);
|
||||
|
||||
if (matchingBillLineIds.length > 1) {
|
||||
actPricesWithMoreThan1MatchingBill.push(jl.act_price);
|
||||
}
|
||||
|
||||
foundBillLines = [...foundBillLines, ...matchingBillLineIds];
|
||||
if (matchingBillLineIds.length > 0) {
|
||||
foundJobLines.push(jl.id);
|
||||
}
|
||||
});
|
||||
|
||||
setErrors((errors) => [
|
||||
...errors,
|
||||
..._.uniqBy(duplicateActPrices).map((dupeAp) =>
|
||||
i18next.t("jobs.labels.reconciliation.multipleactprices", {
|
||||
act_price: dupeAp,
|
||||
})
|
||||
),
|
||||
..._.uniqBy(actPricesWithMoreThan1MatchingBill).map((act_price) =>
|
||||
i18next.t("jobs.labels.reconciliation.multiplebillsforactprice", {
|
||||
act_price: act_price,
|
||||
})
|
||||
),
|
||||
]);
|
||||
|
||||
setSelectedBillLines(_.union(selectedBillLines, _.uniqBy(foundBillLines)));
|
||||
|
||||
setSelectedJobLines(_.union(selectedJobLines, _.uniqBy(foundJobLines)));
|
||||
};
|
||||
Reference in New Issue
Block a user