diff --git a/bodyshop_translations.babel b/bodyshop_translations.babel
index 48c1d381a..0db803400 100644
--- a/bodyshop_translations.babel
+++ b/bodyshop_translations.babel
@@ -17651,6 +17651,69 @@
+
+ tax_lbr_rt
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
+
+ tax_levies_rt
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
+
+ tax_paint_mat_rt
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
tax_registration_number
false
@@ -17672,6 +17735,90 @@
+
+ tax_shop_mat_rt
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
+
+ tax_str_rt
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
+
+ tax_sub_rt
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
+
+ tax_tow_rt
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
towing_payable
false
diff --git a/client/src/components/contract-convert-to-ro/contract-convert-to-ro.component.jsx b/client/src/components/contract-convert-to-ro/contract-convert-to-ro.component.jsx
index ccd1dd4e5..7214f8eec 100644
--- a/client/src/components/contract-convert-to-ro/contract-convert-to-ro.component.jsx
+++ b/client/src/components/contract-convert-to-ro/contract-convert-to-ro.component.jsx
@@ -141,7 +141,7 @@ export function ContractConvertToRo({
local_tax_rate: bodyshop.bill_tax_rates.local_tax_rate / 100,
ins_co_nm: "CC",
converted: true,
- clm_no: `${contract.job.clm_no}-CC`,
+ clm_no: contract.job.clm_no ? `${contract.job.clm_no}-CC` : null,
ownr_fn: contract.job.owner.ownr_fn,
ownr_ln: contract.job.owner.ownr_ln,
ownr_co_nm: contract.job.owner.ownr_co_nm,
@@ -166,6 +166,62 @@ export function ContractConvertToRo({
data: billingLines,
},
parts_tax_rates: {
+ PAA: {
+ prt_type: "PAA",
+ prt_discp: 0,
+ prt_mktyp: false,
+ prt_mkupp: 0,
+ prt_tax_in: true,
+ prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100,
+ },
+ PAC: {
+ prt_type: "PAC",
+ prt_discp: 0,
+ prt_mktyp: false,
+ prt_mkupp: 0,
+ prt_tax_in: true,
+ prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100,
+ },
+ PAL: {
+ prt_type: "PAL",
+ prt_discp: 0,
+ prt_mktyp: false,
+ prt_mkupp: 0,
+ prt_tax_in: true,
+ prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100,
+ },
+ PAM: {
+ prt_type: "PAM",
+ prt_discp: 0,
+ prt_mktyp: false,
+ prt_mkupp: 0,
+ prt_tax_in: true,
+ prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100,
+ },
+ PAN: {
+ prt_type: "PAN",
+ prt_discp: 0,
+ prt_mktyp: false,
+ prt_mkupp: 0,
+ prt_tax_in: true,
+ prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100,
+ },
+ PAR: {
+ prt_type: "PAR",
+ prt_discp: 0,
+ prt_mktyp: false,
+ prt_mkupp: 0,
+ prt_tax_in: true,
+ prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100,
+ },
+ PAS: {
+ prt_type: "PAS",
+ prt_discp: 0,
+ prt_mktyp: false,
+ prt_mkupp: 0,
+ prt_tax_in: true,
+ prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100,
+ },
CCDR: {
prt_type: "CCDR",
prt_discp: 0,
@@ -295,7 +351,7 @@ export function ContractConvertToRo({
diff --git a/client/src/components/contract-form/contract-form.component.jsx b/client/src/components/contract-form/contract-form.component.jsx
index 74e6a59bc..0395dc701 100644
--- a/client/src/components/contract-form/contract-form.component.jsx
+++ b/client/src/components/contract-form/contract-form.component.jsx
@@ -176,6 +176,12 @@ export default function ContractFormComponent({
diff --git a/client/src/components/jobs-detail-rates/jobs-detail-rates.parts.component.jsx b/client/src/components/jobs-detail-rates/jobs-detail-rates.parts.component.jsx
index 213d815e8..46d4d1be7 100644
--- a/client/src/components/jobs-detail-rates/jobs-detail-rates.parts.component.jsx
+++ b/client/src/components/jobs-detail-rates/jobs-detail-rates.parts.component.jsx
@@ -296,6 +296,208 @@ export function JobsDetailRatesParts({ jobRO, expanded, required = true }) {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
);
diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json
index 2e47857e4..a9a9d0f92 100644
--- a/client/src/translations/en_us/common.json
+++ b/client/src/translations/en_us/common.json
@@ -1080,8 +1080,15 @@
"specialcoveragepolicy": "Special Coverage Policy",
"state_tax_rate": "State Tax Rate",
"status": "Job Status",
- "storage_payable": "Storage/PVRT",
+ "storage_payable": "Storage",
+ "tax_lbr_rt": "Labor Tax Rate",
+ "tax_levies_rt": "Levies Tax Rate",
+ "tax_paint_mat_rt": "Paint Material Tax Rate",
"tax_registration_number": "Tax Registration Number",
+ "tax_shop_mat_rt": "Shop Material Tax Rate",
+ "tax_str_rt": "Storage Tax Rate",
+ "tax_sub_rt": "Sublet Tax Rate",
+ "tax_tow_rt": "Towing Tax Rate",
"towing_payable": "Towing Payable",
"unitnumber": "Unit #",
"updated_at": "Updated At",
diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json
index 8c8d38dd3..18f5987ab 100644
--- a/client/src/translations/es/common.json
+++ b/client/src/translations/es/common.json
@@ -1080,8 +1080,15 @@
"specialcoveragepolicy": "Política de cobertura especial",
"state_tax_rate": "",
"status": "Estado del trabajo",
- "storage_payable": "Almacenamiento / PVRT",
+ "storage_payable": "Almacenamiento ",
+ "tax_lbr_rt": "",
+ "tax_levies_rt": "",
+ "tax_paint_mat_rt": "",
"tax_registration_number": "",
+ "tax_shop_mat_rt": "",
+ "tax_str_rt": "",
+ "tax_sub_rt": "",
+ "tax_tow_rt": "",
"towing_payable": "Remolque a pagar",
"unitnumber": "Unidad #",
"updated_at": "Actualizado en",
diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json
index 2d4bfdc8c..34b51fcb5 100644
--- a/client/src/translations/fr/common.json
+++ b/client/src/translations/fr/common.json
@@ -1080,8 +1080,15 @@
"specialcoveragepolicy": "Politique de couverture spéciale",
"state_tax_rate": "",
"status": "Statut de l'emploi",
- "storage_payable": "Stockage / PVRT",
+ "storage_payable": "Stockage",
+ "tax_lbr_rt": "",
+ "tax_levies_rt": "",
+ "tax_paint_mat_rt": "",
"tax_registration_number": "",
+ "tax_shop_mat_rt": "",
+ "tax_str_rt": "",
+ "tax_sub_rt": "",
+ "tax_tow_rt": "",
"towing_payable": "Remorquage à payer",
"unitnumber": "Unité #",
"updated_at": "Mis à jour à",
diff --git a/hasura/migrations/1614119149733_alter_table_public_cccontracts_alter_column_driver_dlexpiry/down.yaml b/hasura/migrations/1614119149733_alter_table_public_cccontracts_alter_column_driver_dlexpiry/down.yaml
new file mode 100644
index 000000000..871fce3cb
--- /dev/null
+++ b/hasura/migrations/1614119149733_alter_table_public_cccontracts_alter_column_driver_dlexpiry/down.yaml
@@ -0,0 +1,6 @@
+- args:
+ cascade: false
+ read_only: false
+ sql: ALTER TABLE "public"."cccontracts" ALTER COLUMN "driver_dlexpiry" SET NOT
+ NULL;
+ type: run_sql
diff --git a/hasura/migrations/1614119149733_alter_table_public_cccontracts_alter_column_driver_dlexpiry/up.yaml b/hasura/migrations/1614119149733_alter_table_public_cccontracts_alter_column_driver_dlexpiry/up.yaml
new file mode 100644
index 000000000..ffb9a1b6d
--- /dev/null
+++ b/hasura/migrations/1614119149733_alter_table_public_cccontracts_alter_column_driver_dlexpiry/up.yaml
@@ -0,0 +1,6 @@
+- args:
+ cascade: false
+ read_only: false
+ sql: ALTER TABLE "public"."cccontracts" ALTER COLUMN "driver_dlexpiry" DROP NOT
+ NULL;
+ type: run_sql
diff --git a/hasura/migrations/1614119154603_alter_table_public_cccontracts_alter_column_driver_dlnumber/down.yaml b/hasura/migrations/1614119154603_alter_table_public_cccontracts_alter_column_driver_dlnumber/down.yaml
new file mode 100644
index 000000000..99d2ab737
--- /dev/null
+++ b/hasura/migrations/1614119154603_alter_table_public_cccontracts_alter_column_driver_dlnumber/down.yaml
@@ -0,0 +1,6 @@
+- args:
+ cascade: false
+ read_only: false
+ sql: ALTER TABLE "public"."cccontracts" ALTER COLUMN "driver_dlnumber" SET NOT
+ NULL;
+ type: run_sql
diff --git a/hasura/migrations/1614119154603_alter_table_public_cccontracts_alter_column_driver_dlnumber/up.yaml b/hasura/migrations/1614119154603_alter_table_public_cccontracts_alter_column_driver_dlnumber/up.yaml
new file mode 100644
index 000000000..215836772
--- /dev/null
+++ b/hasura/migrations/1614119154603_alter_table_public_cccontracts_alter_column_driver_dlnumber/up.yaml
@@ -0,0 +1,6 @@
+- args:
+ cascade: false
+ read_only: false
+ sql: ALTER TABLE "public"."cccontracts" ALTER COLUMN "driver_dlnumber" DROP NOT
+ NULL;
+ type: run_sql
diff --git a/hasura/migrations/1614119265336_alter_table_public_cccontracts_alter_column_driver_addr1/down.yaml b/hasura/migrations/1614119265336_alter_table_public_cccontracts_alter_column_driver_addr1/down.yaml
new file mode 100644
index 000000000..ffa45a40b
--- /dev/null
+++ b/hasura/migrations/1614119265336_alter_table_public_cccontracts_alter_column_driver_addr1/down.yaml
@@ -0,0 +1,5 @@
+- args:
+ cascade: false
+ read_only: false
+ sql: ALTER TABLE "public"."cccontracts" ALTER COLUMN "driver_addr1" SET NOT NULL;
+ type: run_sql
diff --git a/hasura/migrations/1614119265336_alter_table_public_cccontracts_alter_column_driver_addr1/up.yaml b/hasura/migrations/1614119265336_alter_table_public_cccontracts_alter_column_driver_addr1/up.yaml
new file mode 100644
index 000000000..5858ac217
--- /dev/null
+++ b/hasura/migrations/1614119265336_alter_table_public_cccontracts_alter_column_driver_addr1/up.yaml
@@ -0,0 +1,5 @@
+- args:
+ cascade: false
+ read_only: false
+ sql: ALTER TABLE "public"."cccontracts" ALTER COLUMN "driver_addr1" DROP NOT NULL;
+ type: run_sql
diff --git a/hasura/migrations/1614119270671_alter_table_public_cccontracts_alter_column_driver_city/down.yaml b/hasura/migrations/1614119270671_alter_table_public_cccontracts_alter_column_driver_city/down.yaml
new file mode 100644
index 000000000..4557f1288
--- /dev/null
+++ b/hasura/migrations/1614119270671_alter_table_public_cccontracts_alter_column_driver_city/down.yaml
@@ -0,0 +1,5 @@
+- args:
+ cascade: false
+ read_only: false
+ sql: ALTER TABLE "public"."cccontracts" ALTER COLUMN "driver_city" SET NOT NULL;
+ type: run_sql
diff --git a/hasura/migrations/1614119270671_alter_table_public_cccontracts_alter_column_driver_city/up.yaml b/hasura/migrations/1614119270671_alter_table_public_cccontracts_alter_column_driver_city/up.yaml
new file mode 100644
index 000000000..ead788dc6
--- /dev/null
+++ b/hasura/migrations/1614119270671_alter_table_public_cccontracts_alter_column_driver_city/up.yaml
@@ -0,0 +1,5 @@
+- args:
+ cascade: false
+ read_only: false
+ sql: ALTER TABLE "public"."cccontracts" ALTER COLUMN "driver_city" DROP NOT NULL;
+ type: run_sql
diff --git a/hasura/migrations/1614119273681_alter_table_public_cccontracts_alter_column_driver_state/down.yaml b/hasura/migrations/1614119273681_alter_table_public_cccontracts_alter_column_driver_state/down.yaml
new file mode 100644
index 000000000..a9cadf9b0
--- /dev/null
+++ b/hasura/migrations/1614119273681_alter_table_public_cccontracts_alter_column_driver_state/down.yaml
@@ -0,0 +1,5 @@
+- args:
+ cascade: false
+ read_only: false
+ sql: ALTER TABLE "public"."cccontracts" ALTER COLUMN "driver_state" SET NOT NULL;
+ type: run_sql
diff --git a/hasura/migrations/1614119273681_alter_table_public_cccontracts_alter_column_driver_state/up.yaml b/hasura/migrations/1614119273681_alter_table_public_cccontracts_alter_column_driver_state/up.yaml
new file mode 100644
index 000000000..844d7d105
--- /dev/null
+++ b/hasura/migrations/1614119273681_alter_table_public_cccontracts_alter_column_driver_state/up.yaml
@@ -0,0 +1,5 @@
+- args:
+ cascade: false
+ read_only: false
+ sql: ALTER TABLE "public"."cccontracts" ALTER COLUMN "driver_state" DROP NOT NULL;
+ type: run_sql
diff --git a/hasura/migrations/1614119277215_alter_table_public_cccontracts_alter_column_driver_zip/down.yaml b/hasura/migrations/1614119277215_alter_table_public_cccontracts_alter_column_driver_zip/down.yaml
new file mode 100644
index 000000000..6c5534b0a
--- /dev/null
+++ b/hasura/migrations/1614119277215_alter_table_public_cccontracts_alter_column_driver_zip/down.yaml
@@ -0,0 +1,5 @@
+- args:
+ cascade: false
+ read_only: false
+ sql: ALTER TABLE "public"."cccontracts" ALTER COLUMN "driver_zip" SET NOT NULL;
+ type: run_sql
diff --git a/hasura/migrations/1614119277215_alter_table_public_cccontracts_alter_column_driver_zip/up.yaml b/hasura/migrations/1614119277215_alter_table_public_cccontracts_alter_column_driver_zip/up.yaml
new file mode 100644
index 000000000..82fe7fe99
--- /dev/null
+++ b/hasura/migrations/1614119277215_alter_table_public_cccontracts_alter_column_driver_zip/up.yaml
@@ -0,0 +1,5 @@
+- args:
+ cascade: false
+ read_only: false
+ sql: ALTER TABLE "public"."cccontracts" ALTER COLUMN "driver_zip" DROP NOT NULL;
+ type: run_sql
diff --git a/hasura/migrations/1614119281754_alter_table_public_cccontracts_alter_column_driver_ph1/down.yaml b/hasura/migrations/1614119281754_alter_table_public_cccontracts_alter_column_driver_ph1/down.yaml
new file mode 100644
index 000000000..ac2562ca4
--- /dev/null
+++ b/hasura/migrations/1614119281754_alter_table_public_cccontracts_alter_column_driver_ph1/down.yaml
@@ -0,0 +1,5 @@
+- args:
+ cascade: false
+ read_only: false
+ sql: ALTER TABLE "public"."cccontracts" ALTER COLUMN "driver_ph1" SET NOT NULL;
+ type: run_sql
diff --git a/hasura/migrations/1614119281754_alter_table_public_cccontracts_alter_column_driver_ph1/up.yaml b/hasura/migrations/1614119281754_alter_table_public_cccontracts_alter_column_driver_ph1/up.yaml
new file mode 100644
index 000000000..424f45250
--- /dev/null
+++ b/hasura/migrations/1614119281754_alter_table_public_cccontracts_alter_column_driver_ph1/up.yaml
@@ -0,0 +1,5 @@
+- args:
+ cascade: false
+ read_only: false
+ sql: ALTER TABLE "public"."cccontracts" ALTER COLUMN "driver_ph1" DROP NOT NULL;
+ type: run_sql
diff --git a/hasura/migrations/1614119286706_alter_table_public_cccontracts_alter_column_driver_dob/down.yaml b/hasura/migrations/1614119286706_alter_table_public_cccontracts_alter_column_driver_dob/down.yaml
new file mode 100644
index 000000000..3985cfd5a
--- /dev/null
+++ b/hasura/migrations/1614119286706_alter_table_public_cccontracts_alter_column_driver_dob/down.yaml
@@ -0,0 +1,5 @@
+- args:
+ cascade: false
+ read_only: false
+ sql: ALTER TABLE "public"."cccontracts" ALTER COLUMN "driver_dob" SET NOT NULL;
+ type: run_sql
diff --git a/hasura/migrations/1614119286706_alter_table_public_cccontracts_alter_column_driver_dob/up.yaml b/hasura/migrations/1614119286706_alter_table_public_cccontracts_alter_column_driver_dob/up.yaml
new file mode 100644
index 000000000..9f8ae5e3d
--- /dev/null
+++ b/hasura/migrations/1614119286706_alter_table_public_cccontracts_alter_column_driver_dob/up.yaml
@@ -0,0 +1,5 @@
+- args:
+ cascade: false
+ read_only: false
+ sql: ALTER TABLE "public"."cccontracts" ALTER COLUMN "driver_dob" DROP NOT NULL;
+ type: run_sql
diff --git a/server/job/job-totals.js b/server/job/job-totals.js
index da3aef8cc..58cd3202e 100644
--- a/server/job/job-totals.js
+++ b/server/job/job-totals.js
@@ -207,13 +207,27 @@ function IsAdditionalCost(jobLine) {
}
function CalculateAdditional(job) {
- return job.joblines
+ let ret = job.joblines
.filter((jl) => !jl.removed && IsAdditionalCost(jl))
.reduce((acc, val) => {
return acc.add(
- Dinero({ amount: Math.round((val.act_price || 0) * 100) })
+ Dinero({ amount: Math.round((val.act_price || 0) * 100) }).multiply(
+ val.part_qty || 1
+ )
);
}, Dinero());
+ ret = ret
+ .add(
+ Dinero({
+ amount: Math.round((job.towing_payable || 0) * 100),
+ })
+ )
+ .add(
+ Dinero({
+ amount: Math.round((job.storage_payable || 0) * 100),
+ })
+ );
+ return ret;
}
function CalculateTaxesTotals(job, otherTotals) {
@@ -236,17 +250,18 @@ function CalculateTaxesTotals(job, otherTotals) {
if (!!!val.tax_part || !!!val.part_type || IsAdditionalCost(val)) {
additionalItemsTax = additionalItemsTax.add(
Dinero({ amount: Math.round((val.act_price || 0) * 100) })
- .multiply(val.part_qty || 0)
+ .multiply(val.part_qty || 1)
.percentage(
- (job.parts_tax_rates &&
+ ((job.parts_tax_rates &&
job.parts_tax_rates["PAN"] &&
- job.parts_tax_rates["PAN"].prt_tax_rt) * 100
+ job.parts_tax_rates["PAN"].prt_tax_rt) ||
+ 0) * 100
)
);
} else {
statePartsTax = statePartsTax.add(
Dinero({ amount: Math.round((val.act_price || 0) * 100) })
- .multiply(val.part_qty || 0)
+ .multiply(val.part_qty || 1)
.percentage(
(job.parts_tax_rates &&
job.parts_tax_rates[val.part_type] &&
@@ -288,7 +303,7 @@ function CalculateTaxesTotals(job, otherTotals) {
other_customer_amount: Dinero({
amount: (job.other_amount_payable || 0) * 100,
}),
- dep_taxes: Dinero({ amount: job.depreciation_taxes || 0 }),
+ dep_taxes: Dinero({ amount: (job.depreciation_taxes || 0) * 100 }),
};
ret.custPayable.total = ret.custPayable.deductible