Improved bill totals reconciliation IO-583

This commit is contained in:
Patrick Fic
2021-01-20 14:08:26 -08:00
parent bb51d510cd
commit 0287830e73
18 changed files with 455 additions and 13 deletions

View File

@@ -1971,6 +1971,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>billcmtotal</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>bills</name> <name>bills</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -1992,6 +2013,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>dedfromlbr</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>discrepancy</name> <name>discrepancy</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -2013,6 +2055,48 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>discrepwithcms</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>
<name>discrepwithlbradj</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>entered_total</name> <name>entered_total</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -18328,6 +18412,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>rosaletotal</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>sale_labor</name> <name>sale_labor</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -21964,6 +22069,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>return</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>status</name> <name>status</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>

View File

@@ -74,6 +74,7 @@ function BillEnterModalContainer({
} }
return { return {
...restI, ...restI,
deductedfromlbr: deductfromlabor,
joblineid: i.joblineid === "noline" ? null : i.joblineid, joblineid: i.joblineid === "noline" ? null : i.joblineid,
}; };
}), }),

View File

@@ -17,16 +17,33 @@ export default function JobBillsTotalComponent({ loading, bills, jobTotals }) {
const totals = jobTotals; const totals = jobTotals;
let billTotals = Dinero({ amount: 0 }); let billTotals = Dinero();
let billCms = Dinero();
let lbrAdjustments = Dinero();
bills.forEach((i) => bills.forEach((i) =>
i.billlines.forEach((il) => { i.billlines.forEach((il) => {
billTotals = billTotals.add( if (!i.is_credit_memo) {
Dinero({ billTotals = billTotals.add(
amount: Math.round( Dinero({
(il.actual_cost || 0) * (i.is_credit_memo ? -1 : 1) * 100 amount: Math.round((il.actual_price || 0) * 100),
), }).multiply(il.quantity)
}).multiply(il.quantity) );
); } else {
billCms = billCms.add(
Dinero({
amount: Math.round((il.actual_price || 0) * -100),
}).multiply(il.quantity)
);
}
if (il.deductedfromlbr) {
console.log(i, "Deducting from labor.");
lbrAdjustments = lbrAdjustments.add(
Dinero({
amount: Math.round((il.actual_price || 0) * 100),
}).multiply(il.quantity)
);
}
}) })
); );
@@ -35,10 +52,13 @@ export default function JobBillsTotalComponent({ loading, bills, jobTotals }) {
); );
const discrepancy = totalPartsSublet.subtract(billTotals); const discrepancy = totalPartsSublet.subtract(billTotals);
const discrepWithLbrAdj = discrepancy.add(lbrAdjustments);
const discrepWithCms = discrepWithLbrAdj.subtract(billCms);
return ( return (
<div className="job-bills-totals-container"> <div className="job-bills-totals-container">
<Statistic <Statistic
title={t("jobs.labels.partstotal")} title={t("jobs.labels.rosaletotal")}
value={totalPartsSublet.toFormat()} value={totalPartsSublet.toFormat()}
/> />
<Statistic <Statistic
@@ -52,6 +72,28 @@ export default function JobBillsTotalComponent({ loading, bills, jobTotals }) {
}} }}
value={discrepancy.toFormat()} value={discrepancy.toFormat()}
/> />
<Statistic
title={t("bills.labels.dedfromlbr")}
value={lbrAdjustments.toFormat()}
/>
<Statistic
title={t("bills.labels.discrepwithlbradj")}
valueStyle={{
color: discrepWithLbrAdj.getAmount === 0 ? "green" : "red",
}}
value={discrepWithLbrAdj.toFormat()}
/>
<Statistic
title={t("bills.labels.billcmtotal")}
value={billCms.toFormat()}
/>
<Statistic
title={t("bills.labels.discrepwithcms")}
valueStyle={{
color: discrepWithCms.getAmount === 0 ? "green" : "red",
}}
value={discrepWithCms.toFormat()}
/>
</div> </div>
); );
} }

View File

@@ -1,5 +1,5 @@
import { MailFilled, PrinterFilled, SyncOutlined } from "@ant-design/icons"; import { MailFilled, PrinterFilled, SyncOutlined } from "@ant-design/icons";
import { Button, Input, Space, Table, Typography } from "antd"; import { Button, Checkbox, Input, Space, Table, Typography } from "antd";
import queryString from "query-string"; import queryString from "query-string";
import React, { useState } from "react"; import React, { useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
@@ -76,6 +76,15 @@ export function PartsOrderListTableComponent({
<DateFormatter>{record.order_date}</DateFormatter> <DateFormatter>{record.order_date}</DateFormatter>
), ),
}, },
{
title: t("parts_orders.fields.return"),
dataIndex: "return",
key: "return",
sorter: (a, b) => a.return - b.return,
sortOrder:
state.sortedInfo.columnKey === "return" && state.sortedInfo.order,
render: (text, record) => <Checkbox checked={record.return} />,
},
{ {
title: t("parts_orders.fields.deliver_by"), title: t("parts_orders.fields.deliver_by"),
dataIndex: "deliver_by", dataIndex: "deliver_by",
@@ -104,11 +113,13 @@ export function PartsOrderListTableComponent({
job: job, job: job,
bill: { bill: {
vendorid: record.vendor.id, vendorid: record.vendor.id,
is_credit_memo: record.return,
billlines: record.parts_order_lines.map((pol) => { billlines: record.parts_order_lines.map((pol) => {
return { return {
joblineid: pol.job_line_id, joblineid: pol.job_line_id,
line_desc: pol.line_desc, line_desc: pol.line_desc,
quantity: pol.quantity, quantity: pol.quantity,
actual_price: pol.act_price, actual_price: pol.act_price,
cost_center: pol.jobline.part_type cost_center: pol.jobline.part_type
? responsibilityCenters.defaults.costs[ ? responsibilityCenters.defaults.costs[

View File

@@ -82,6 +82,7 @@ export function PartsOrderModalContainer({
...values, ...values,
jobid: jobId, jobid: jobId,
user_email: currentUser.email, user_email: currentUser.email,
return: isReturn,
status: bodyshop.md_order_statuses.default_ordered || "Ordered*", status: bodyshop.md_order_statuses.default_ordered || "Ordered*",
}, },
], ],

View File

@@ -70,6 +70,7 @@ export const QUERY_BILLS_BY_JOBID = gql`
} }
order_date order_date
deliver_by deliver_by
return
parts_order_lines { parts_order_lines {
id id
act_price act_price
@@ -114,6 +115,7 @@ export const QUERY_BILLS_BY_JOBID = gql`
joblineid joblineid
line_desc line_desc
applicable_taxes applicable_taxes
deductedfromlbr
} }
} }
} }

View File

@@ -137,8 +137,12 @@
"actions": "Actions", "actions": "Actions",
"bill_lines": "Bill Lines", "bill_lines": "Bill Lines",
"bill_total": "Bill Total Amount", "bill_total": "Bill Total Amount",
"billcmtotal": "Retail Total of Credit Memos",
"bills": "Bills", "bills": "Bills",
"dedfromlbr": "Deducted from Labor",
"discrepancy": "Discrepancy", "discrepancy": "Discrepancy",
"discrepwithcms": "Discrepancy including Credit Memos",
"discrepwithlbradj": "Discrepancy including Lbr. Adj.",
"entered_total": "Total of Entered Lines", "entered_total": "Total of Entered Lines",
"enteringcreditmemo": "You are entering a credit memo. Please ensure you are also entering positive values.", "enteringcreditmemo": "You are entering a credit memo. Please ensure you are also entering positive values.",
"federal_tax": "Federal Tax", "federal_tax": "Federal Tax",
@@ -1115,6 +1119,7 @@
"multiplebillsforactprice": "Found more than 1 bill matching ${{act_price}} retail price." "multiplebillsforactprice": "Found more than 1 bill matching ${{act_price}} retail price."
}, },
"reconciliationheader": "Parts & Sublet Reconciliation", "reconciliationheader": "Parts & Sublet Reconciliation",
"rosaletotal": "Total RO Sale",
"sale_labor": "Sales - Labor", "sale_labor": "Sales - Labor",
"sale_parts": "Sales - Parts", "sale_parts": "Sales - Parts",
"sales": "Sales", "sales": "Sales",
@@ -1341,6 +1346,7 @@
"order_date": "Order Date", "order_date": "Order Date",
"order_number": "Order Number", "order_number": "Order Number",
"quantity": "Qty.", "quantity": "Qty.",
"return": "Return",
"status": "Status" "status": "Status"
}, },
"labels": { "labels": {

View File

@@ -137,8 +137,12 @@
"actions": "", "actions": "",
"bill_lines": "", "bill_lines": "",
"bill_total": "", "bill_total": "",
"billcmtotal": "",
"bills": "", "bills": "",
"dedfromlbr": "",
"discrepancy": "", "discrepancy": "",
"discrepwithcms": "",
"discrepwithlbradj": "",
"entered_total": "", "entered_total": "",
"enteringcreditmemo": "", "enteringcreditmemo": "",
"federal_tax": "", "federal_tax": "",
@@ -1115,6 +1119,7 @@
"multiplebillsforactprice": "" "multiplebillsforactprice": ""
}, },
"reconciliationheader": "", "reconciliationheader": "",
"rosaletotal": "",
"sale_labor": "", "sale_labor": "",
"sale_parts": "", "sale_parts": "",
"sales": "", "sales": "",
@@ -1341,6 +1346,7 @@
"order_date": "", "order_date": "",
"order_number": "", "order_number": "",
"quantity": "", "quantity": "",
"return": "",
"status": "" "status": ""
}, },
"labels": { "labels": {

View File

@@ -137,8 +137,12 @@
"actions": "", "actions": "",
"bill_lines": "", "bill_lines": "",
"bill_total": "", "bill_total": "",
"billcmtotal": "",
"bills": "", "bills": "",
"dedfromlbr": "",
"discrepancy": "", "discrepancy": "",
"discrepwithcms": "",
"discrepwithlbradj": "",
"entered_total": "", "entered_total": "",
"enteringcreditmemo": "", "enteringcreditmemo": "",
"federal_tax": "", "federal_tax": "",
@@ -1115,6 +1119,7 @@
"multiplebillsforactprice": "" "multiplebillsforactprice": ""
}, },
"reconciliationheader": "", "reconciliationheader": "",
"rosaletotal": "",
"sale_labor": "", "sale_labor": "",
"sale_parts": "", "sale_parts": "",
"sales": "", "sales": "",
@@ -1341,6 +1346,7 @@
"order_date": "", "order_date": "",
"order_number": "", "order_number": "",
"quantity": "", "quantity": "",
"return": "",
"status": "" "status": ""
}, },
"labels": { "labels": {

View File

@@ -0,0 +1,5 @@
- args:
cascade: false
read_only: false
sql: ALTER TABLE "public"."billlines" DROP COLUMN "deductedfromlbr";
type: run_sql

View File

@@ -0,0 +1,6 @@
- args:
cascade: false
read_only: false
sql: ALTER TABLE "public"."billlines" ADD COLUMN "deductedfromlbr" boolean NOT
NULL DEFAULT false;
type: run_sql

View File

@@ -0,0 +1,37 @@
- args:
role: user
table:
name: billlines
schema: public
type: drop_insert_permission
- args:
permission:
check:
bill:
job:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
columns:
- actual_cost
- actual_price
- applicable_taxes
- cost_center
- created_at
- id
- billid
- joblineid
- line_desc
- quantity
- updated_at
set: {}
role: user
table:
name: billlines
schema: public
type: create_insert_permission

View File

@@ -0,0 +1,38 @@
- args:
role: user
table:
name: billlines
schema: public
type: drop_insert_permission
- args:
permission:
check:
bill:
job:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
columns:
- actual_cost
- actual_price
- applicable_taxes
- billid
- cost_center
- created_at
- deductedfromlbr
- id
- joblineid
- line_desc
- quantity
- updated_at
set: {}
role: user
table:
name: billlines
schema: public
type: create_insert_permission

View File

@@ -0,0 +1,38 @@
- args:
role: user
table:
name: billlines
schema: public
type: drop_select_permission
- args:
permission:
allow_aggregations: false
columns:
- actual_cost
- actual_price
- applicable_taxes
- cost_center
- created_at
- id
- billid
- joblineid
- line_desc
- quantity
- updated_at
computed_fields: []
filter:
bill:
job:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
role: user
table:
name: billlines
schema: public
type: create_select_permission

View File

@@ -0,0 +1,39 @@
- args:
role: user
table:
name: billlines
schema: public
type: drop_select_permission
- args:
permission:
allow_aggregations: false
columns:
- actual_cost
- actual_price
- applicable_taxes
- billid
- cost_center
- created_at
- deductedfromlbr
- id
- joblineid
- line_desc
- quantity
- updated_at
computed_fields: []
filter:
bill:
job:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
role: user
table:
name: billlines
schema: public
type: create_select_permission

View File

@@ -0,0 +1,37 @@
- args:
role: user
table:
name: billlines
schema: public
type: drop_update_permission
- args:
permission:
columns:
- actual_cost
- actual_price
- applicable_taxes
- cost_center
- created_at
- id
- billid
- joblineid
- line_desc
- quantity
- updated_at
filter:
bill:
job:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
set: {}
role: user
table:
name: billlines
schema: public
type: create_update_permission

View File

@@ -0,0 +1,38 @@
- args:
role: user
table:
name: billlines
schema: public
type: drop_update_permission
- args:
permission:
columns:
- actual_cost
- actual_price
- applicable_taxes
- billid
- cost_center
- created_at
- deductedfromlbr
- id
- joblineid
- line_desc
- quantity
- updated_at
filter:
bill:
job:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
set: {}
role: user
table:
name: billlines
schema: public
type: create_update_permission

View File

@@ -385,10 +385,11 @@ tables:
- actual_cost - actual_cost
- actual_price - actual_price
- applicable_taxes - applicable_taxes
- billid
- cost_center - cost_center
- created_at - created_at
- deductedfromlbr
- id - id
- billid
- joblineid - joblineid
- line_desc - line_desc
- quantity - quantity
@@ -400,10 +401,11 @@ tables:
- actual_cost - actual_cost
- actual_price - actual_price
- applicable_taxes - applicable_taxes
- billid
- cost_center - cost_center
- created_at - created_at
- deductedfromlbr
- id - id
- billid
- joblineid - joblineid
- line_desc - line_desc
- quantity - quantity
@@ -426,10 +428,11 @@ tables:
- actual_cost - actual_cost
- actual_price - actual_price
- applicable_taxes - applicable_taxes
- billid
- cost_center - cost_center
- created_at - created_at
- deductedfromlbr
- id - id
- billid
- joblineid - joblineid
- line_desc - line_desc
- quantity - quantity