IO-1152 Add in part mark up for BC Economical claims.

This commit is contained in:
Patrick Fic
2021-05-26 09:06:05 -07:00
parent 6ae9de7df3
commit e8b7e2f0b9
11 changed files with 147 additions and 50 deletions

View File

@@ -22179,6 +22179,27 @@
</concept_node> </concept_node>
</children> </children>
</folder_node> </folder_node>
<concept_node>
<name>prt_dsmk_total</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node> <concept_node>
<name>rates</name> <name>rates</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>

View File

@@ -155,7 +155,14 @@ export function JobLinesComponent({
state.sortedInfo.columnKey === "act_price" && state.sortedInfo.order, state.sortedInfo.columnKey === "act_price" && state.sortedInfo.order,
ellipsis: true, ellipsis: true,
render: (text, record) => ( render: (text, record) => (
<CurrencyFormatter>{record.act_price}</CurrencyFormatter> <>
<CurrencyFormatter>{record.act_price}</CurrencyFormatter>
{record.prt_dsmk_p !== 0 && (
<span
style={{ marginLeft: ".2rem" }}
>{`(${record.prt_dsmk_p}%)`}</span>
)}
</>
), ),
}, },
{ {

View File

@@ -69,17 +69,28 @@ export default function JobTotalsTableParts({ job }) {
x: true, x: true,
}} }}
summary={() => ( summary={() => (
<Table.Summary.Row> <>
<Table.Summary.Cell> <Table.Summary.Row>
<strong>{t("jobs.labels.partstotal")}</strong> <Table.Summary.Cell>
</Table.Summary.Cell> {t("jobs.labels.prt_dsmk_total")}
</Table.Summary.Cell>
<Table.Summary.Cell align="right"> <Table.Summary.Cell align="right">
<strong> {Dinero(job.job_totals.parts.parts.prt_dsmk_total).toFormat()}
{Dinero(job.job_totals.parts.parts.total).toFormat()} </Table.Summary.Cell>
</strong> </Table.Summary.Row>
</Table.Summary.Cell> <Table.Summary.Row>
</Table.Summary.Row> <Table.Summary.Cell>
<strong>{t("jobs.labels.partstotal")}</strong>
</Table.Summary.Cell>
<Table.Summary.Cell align="right">
<strong>
{Dinero(job.job_totals.parts.parts.total).toFormat()}
</strong>
</Table.Summary.Cell>
</Table.Summary.Row>
</>
)} )}
/> />
); );

View File

@@ -528,6 +528,7 @@ export const GET_JOB_BY_PK = gql`
tax_part tax_part
db_ref db_ref
manual_line manual_line
prt_dsmk_p
billlines(limit: 1, order_by: { bill: { date: desc } }) { billlines(limit: 1, order_by: { bill: { date: desc } }) {
id id
quantity quantity

View File

@@ -1316,6 +1316,7 @@
"partstotal": "This is the total of all parts and sublet amounts on the vehicle (some of these may require an in-house invoice).<br/>\nItems such as shop and paint materials, labor online lines, etc. are not included in this total.", "partstotal": "This is the total of all parts and sublet amounts on the vehicle (some of these may require an in-house invoice).<br/>\nItems such as shop and paint materials, labor online lines, etc. are not included in this total.",
"totalreturns": "The total amount of returns created for this job." "totalreturns": "The total amount of returns created for this job."
}, },
"prt_dsmk_total": "Line Item Markup",
"rates": "Rates", "rates": "Rates",
"rates_subtotal": "All Rates Subtotal", "rates_subtotal": "All Rates Subtotal",
"reconciliation": { "reconciliation": {

View File

@@ -1316,6 +1316,7 @@
"partstotal": "", "partstotal": "",
"totalreturns": "" "totalreturns": ""
}, },
"prt_dsmk_total": "",
"rates": "Tarifas", "rates": "Tarifas",
"rates_subtotal": "", "rates_subtotal": "",
"reconciliation": { "reconciliation": {

View File

@@ -1316,6 +1316,7 @@
"partstotal": "", "partstotal": "",
"totalreturns": "" "totalreturns": ""
}, },
"prt_dsmk_total": "",
"rates": "Les taux", "rates": "Les taux",
"rates_subtotal": "", "rates_subtotal": "",
"reconciliation": { "reconciliation": {

View File

@@ -203,7 +203,8 @@ const generateInvoiceQbxml = (
//Create the invoice lines mapping. //Create the invoice lines mapping.
jobs_by_pk.joblines.map((jobline) => { jobs_by_pk.joblines.map((jobline) => {
//Parts Lines //Parts Lines
if (jobline.db_ref === "936008") { //If either of these DB REFs change, they also need to change in job-totals calculations. if (jobline.db_ref === "936008") {
//If either of these DB REFs change, they also need to change in job-totals calculations.
hasMapaLine = true; hasMapaLine = true;
} }
if (jobline.db_ref === "936007") { if (jobline.db_ref === "936007") {
@@ -213,7 +214,15 @@ const generateInvoiceQbxml = (
if (jobline.profitcenter_part && jobline.act_price) { if (jobline.profitcenter_part && jobline.act_price) {
const DineroAmount = Dinero({ const DineroAmount = Dinero({
amount: Math.round(jobline.act_price * 100), amount: Math.round(jobline.act_price * 100),
}).multiply(jobline.part_qty || 1); })
.multiply(jobline.part_qty || 1)
.add(
Dinero({
amount: Math.round((jobline.act_price || 0) * 100),
})
.multiply(jobline.part_qty || 0)
.percentage(jobline.prt_dsmk_p)
);
const account = responsibilityCenters.profits.find( const account = responsibilityCenters.profits.find(
(i) => jobline.profitcenter_part.toLowerCase() === i.name.toLowerCase() (i) => jobline.profitcenter_part.toLowerCase() === i.name.toLowerCase()
); );

View File

@@ -566,6 +566,7 @@ exports.GET_JOB_BY_PK = ` query GET_JOB_BY_PK($id: uuid!) {
tax_part tax_part
db_ref db_ref
manual_line manual_line
prt_dsmk_p
parts_order_lines { parts_order_lines {
id id
parts_order { parts_order {

View File

@@ -122,27 +122,34 @@ async function JobCostingMulti(req, res) {
}); });
//Add all summary data. //Add all summary data.
multiSummary.summaryData.totalPartsSales = multiSummary.summaryData.totalPartsSales.add( multiSummary.summaryData.totalPartsSales =
costingData.summaryData.totalPartsSales multiSummary.summaryData.totalPartsSales.add(
); costingData.summaryData.totalPartsSales
multiSummary.summaryData.totalSales = multiSummary.summaryData.totalSales.add( );
costingData.summaryData.totalSales multiSummary.summaryData.totalSales =
); multiSummary.summaryData.totalSales.add(
multiSummary.summaryData.totalLaborCost = multiSummary.summaryData.totalLaborCost.add( costingData.summaryData.totalSales
costingData.summaryData.totalLaborCost );
); multiSummary.summaryData.totalLaborCost =
multiSummary.summaryData.totalLaborSales = multiSummary.summaryData.totalLaborSales.add( multiSummary.summaryData.totalLaborCost.add(
costingData.summaryData.totalLaborSales costingData.summaryData.totalLaborCost
); );
multiSummary.summaryData.totalPartsCost = multiSummary.summaryData.totalPartsCost.add( multiSummary.summaryData.totalLaborSales =
costingData.summaryData.totalPartsCost multiSummary.summaryData.totalLaborSales.add(
); costingData.summaryData.totalLaborSales
multiSummary.summaryData.totalCost = multiSummary.summaryData.totalCost.add( );
costingData.summaryData.totalCost multiSummary.summaryData.totalPartsCost =
); multiSummary.summaryData.totalPartsCost.add(
multiSummary.summaryData.gpdollars = multiSummary.summaryData.gpdollars.add( costingData.summaryData.totalPartsCost
costingData.summaryData.gpdollars );
); multiSummary.summaryData.totalCost =
multiSummary.summaryData.totalCost.add(
costingData.summaryData.totalCost
);
multiSummary.summaryData.gpdollars =
multiSummary.summaryData.gpdollars.add(
costingData.summaryData.gpdollars
);
console.timeEnd(`SummaryOfCostingData-${job.id}`); console.timeEnd(`SummaryOfCostingData-${job.id}`);
//Take the summary data & add it to total summary data. //Take the summary data & add it to total summary data.
}); });
@@ -220,9 +227,8 @@ function GenerateCostingData(job) {
}).multiply(val.mod_lb_hrs || 0); }).multiply(val.mod_lb_hrs || 0);
if (!acc.labor[laborProfitCenter]) if (!acc.labor[laborProfitCenter])
acc.labor[laborProfitCenter] = Dinero(); acc.labor[laborProfitCenter] = Dinero();
acc.labor[laborProfitCenter] = acc.labor[laborProfitCenter].add( acc.labor[laborProfitCenter] =
laborAmount acc.labor[laborProfitCenter].add(laborAmount);
);
if (val.mod_lbr_ty === "LAR") { if (val.mod_lbr_ty === "LAR") {
if (!acc.labor[defaultProfits["MAPA"]]) if (!acc.labor[defaultProfits["MAPA"]])
@@ -265,12 +271,19 @@ function GenerateCostingData(job) {
); );
const partsAmount = Dinero({ const partsAmount = Dinero({
amount: Math.round((val.act_price || 0) * 100), amount: Math.round((val.act_price || 0) * 100),
}).multiply(val.part_qty || 1); })
.multiply(val.part_qty || 1)
.add(
Dinero({
amount: Math.round((val.act_price || 0) * 100),
})
.multiply(val.part_qty || 0)
.percentage(val.prt_dsmk_p)
);
if (!acc.parts[partsProfitCenter]) if (!acc.parts[partsProfitCenter])
acc.parts[partsProfitCenter] = Dinero(); acc.parts[partsProfitCenter] = Dinero();
acc.parts[partsProfitCenter] = acc.parts[partsProfitCenter].add( acc.parts[partsProfitCenter] =
partsAmount acc.parts[partsProfitCenter].add(partsAmount);
);
} }
//To deal with additional costs. //To deal with additional costs.
@@ -287,7 +300,15 @@ function GenerateCostingData(job) {
} else { } else {
const partsAmount = Dinero({ const partsAmount = Dinero({
amount: Math.round((val.act_price || 0) * 100), amount: Math.round((val.act_price || 0) * 100),
}).multiply(val.part_qty || 1); })
.multiply(val.part_qty || 1)
.add(
Dinero({
amount: Math.round((val.act_price || 0) * 100),
})
.multiply(val.part_qty || 0)
.percentage(val.prt_dsmk_p)
);
console.log( console.log(
`*** partsAmount`, `*** partsAmount`,
val.line_desc, val.line_desc,
@@ -296,9 +317,8 @@ function GenerateCostingData(job) {
); );
if (!acc.parts[partsProfitCenter]) if (!acc.parts[partsProfitCenter])
acc.parts[partsProfitCenter] = Dinero(); acc.parts[partsProfitCenter] = Dinero();
acc.parts[partsProfitCenter] = acc.parts[partsProfitCenter].add( acc.parts[partsProfitCenter] =
partsAmount acc.parts[partsProfitCenter].add(partsAmount);
);
} }
} }

View File

@@ -86,6 +86,7 @@ async function Totals(req, res) {
res.status(400).send(JSON.stringify(error)); res.status(400).send(JSON.stringify(error));
} }
} }
function CalculateRatesTotals(ratesList) { function CalculateRatesTotals(ratesList) {
const jobLines = ratesList.joblines.filter((jl) => !jl.removed); const jobLines = ratesList.joblines.filter((jl) => !jl.removed);
@@ -211,6 +212,13 @@ function CalculatePartsTotals(jobLines) {
...acc, ...acc,
parts: { parts: {
...acc.parts, ...acc.parts,
prt_dsmk_total: acc.parts.prt_dsmk_total.add(
Dinero({
amount: Math.round((value.act_price || 0) * 100),
})
.multiply(value.part_qty || 0)
.percentage(value.prt_dsmk_p)
),
list: { list: {
...acc.parts.list, ...acc.parts.list,
[value.part_type]: [value.part_type]:
@@ -229,11 +237,19 @@ function CalculatePartsTotals(jobLines) {
}).multiply(value.part_qty || 0), }).multiply(value.part_qty || 0),
}, },
}, },
subtotal: acc.parts.subtotal.add( subtotal: acc.parts.subtotal
Dinero({ .add(
amount: Math.round(value.act_price * 100), Dinero({
}).multiply(value.part_qty || 0) amount: Math.round(value.act_price * 100),
), }).multiply(value.part_qty || 0)
)
.add(
Dinero({
amount: Math.round((value.act_price || 0) * 100),
})
.multiply(value.part_qty || 0)
.percentage(value.prt_dsmk_p)
),
}, },
}; };
} }
@@ -241,6 +257,7 @@ function CalculatePartsTotals(jobLines) {
{ {
parts: { parts: {
list: {}, list: {},
prt_dsmk_total: Dinero(),
subtotal: Dinero({ amount: 0 }), subtotal: Dinero({ amount: 0 }),
total: Dinero({ amount: 0 }), total: Dinero({ amount: 0 }),
}, },
@@ -360,6 +377,13 @@ function CalculateTaxesTotals(job, otherTotals) {
statePartsTax = statePartsTax.add( statePartsTax = statePartsTax.add(
Dinero({ amount: Math.round((val.act_price || 0) * 100) }) Dinero({ amount: Math.round((val.act_price || 0) * 100) })
.multiply(val.part_qty || 1) .multiply(val.part_qty || 1)
.add(
Dinero({
amount: Math.round((val.act_price || 0) * 100),
})
.multiply(val.part_qty || 0)
.percentage(val.prt_dsmk_p)
)
.percentage( .percentage(
((job.parts_tax_rates && ((job.parts_tax_rates &&
job.parts_tax_rates[val.part_type] && job.parts_tax_rates[val.part_type] &&