From c11f182f83fece43d37870b91374598d0160acc1 Mon Sep 17 00:00:00 2001
From: Patrick Fic <>
Date: Thu, 2 Sep 2021 16:25:07 -0700
Subject: [PATCH] IO-1342 Resolve negative parts discount for negatives.
---
bodyshop_translations.babel | 472 +++++++++++++++++++
client/src/translations/en_us/common.json | 34 +-
client/src/translations/es/common.json | 32 +-
client/src/translations/fr/common.json | 32 +-
server/accounting/qbxml/qbxml-receivables.js | 4 +-
server/job/job-costing.js | 2 +
server/job/job-totals.js | 3 +
7 files changed, 568 insertions(+), 11 deletions(-)
diff --git a/bodyshop_translations.babel b/bodyshop_translations.babel
index c14c8cf59..3e26652fd 100644
--- a/bodyshop_translations.babel
+++ b/bodyshop_translations.babel
@@ -3578,6 +3578,27 @@
dms
+
+ cashierid
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
default_journal
false
@@ -3641,6 +3662,27 @@
+
+ generic_customer_number
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
mappingname
false
@@ -3662,6 +3704,27 @@
+
+ srcco
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
@@ -17050,6 +17113,137 @@
+
+ dms
+
+
+ addpayer
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
+
+ createnewcustomer
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
+
+ getmakes
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
+
+ post
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
+
+ usegeneric
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
+
+ useselected
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
+
+
dmsautoallocate
false
@@ -18659,6 +18853,27 @@
dms
+
+ address
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
center
false
@@ -18722,6 +18937,48 @@
+
+ dms_make
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
+
+ dms_model
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
dms_wip_acctnumber
false
@@ -18743,6 +19000,158 @@
+
+ journal
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
+
+ name1
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
+
+ payer
+
+
+ amount
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
+
+ control_type
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
+
+ controlnumber
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
+
+ dms_acctnumber
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
+
+ name
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
+
+
sale
false
@@ -18785,6 +19194,27 @@
+
+ story
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
@@ -23077,6 +23507,48 @@
+
+ notallocated
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
+
+ totalallocated
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json
index a4e8aacd9..e774da4d5 100644
--- a/client/src/translations/en_us/common.json
+++ b/client/src/translations/en_us/common.json
@@ -232,10 +232,13 @@
"templates": "Delivery Templates"
},
"dms": {
+ "cashierid": "Cashier ID",
"default_journal": "Default Journal",
"dms_acctnumber": "DMS Account #",
"dms_wip_acctnumber": "DMS W.I.P. Account #",
- "mappingname": "DMS Mapping Name"
+ "generic_customer_number": "Generic Customer Number",
+ "mappingname": "DMS Mapping Name",
+ "srcco": "Source Company #/Dealer #"
},
"email": "General Shop Email",
"enforce_class": "Enforce Class on Conversion?",
@@ -1070,6 +1073,14 @@
"changestatus": "Change Status",
"convert": "Convert",
"deliver": "Deliver",
+ "dms": {
+ "addpayer": "Add Payer",
+ "createnewcustomer": "Create New Customer",
+ "getmakes": "Get Makes",
+ "post": "Post",
+ "usegeneric": "Use Generic Customer",
+ "useselected": "Use Selected Customer"
+ },
"dmsautoallocate": "DMS Auto Allocate",
"export": "Export",
"exportcustdata": "Export Customer Data",
@@ -1151,12 +1162,25 @@
"ded_status": "Deductible Status",
"depreciation_taxes": "Depreciation/Taxes",
"dms": {
+ "address": "Customer Address",
"center": "Center",
"cost": "Cost",
"cost_dms_acctnumber": "Cost DMS Acct #",
+ "dms_make": "DMS Make",
+ "dms_model": "DMS Model",
"dms_wip_acctnumber": "Cost WIP DMS Acct #",
+ "journal": "Journal #",
+ "name1": "Customer Name",
+ "payer": {
+ "amount": "Amount",
+ "control_type": "Control Type",
+ "controlnumber": "Control Number",
+ "dms_acctnumber": "DMS Account #",
+ "name": "Payer Name"
+ },
"sale": "Sale",
- "sale_dms_acctnumber": "Sale DMS Acct #"
+ "sale_dms_acctnumber": "Sale DMS Acct #",
+ "story": "Story"
},
"driveable": "Driveable",
"employee_body": "Body",
@@ -1378,7 +1402,9 @@
"difference": "Difference",
"diskscan": "Scan Disk for Estimates",
"dms": {
- "kmoutnotgreaterthankmin": "Mileage out must be greater than mileage in."
+ "kmoutnotgreaterthankmin": "Mileage out must be greater than mileage in.",
+ "notallocated": "Not Allocated",
+ "totalallocated": "Total Amount Allocated"
},
"documents": "Documents",
"documents-images": "Images",
@@ -1427,7 +1453,7 @@
"partstotal": "This is the total of all parts and sublet amounts on the vehicle (some of these may require an in-house invoice).
\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."
},
- "prt_dsmk_total": "Line Item Markup",
+ "prt_dsmk_total": "Line Item Adjustment",
"rates": "Rates",
"rates_subtotal": "All Rates Subtotal",
"reconciliation": {
diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json
index 2d4cafac5..6022fc6ef 100644
--- a/client/src/translations/es/common.json
+++ b/client/src/translations/es/common.json
@@ -232,10 +232,13 @@
"templates": ""
},
"dms": {
+ "cashierid": "",
"default_journal": "",
"dms_acctnumber": "",
"dms_wip_acctnumber": "",
- "mappingname": ""
+ "generic_customer_number": "",
+ "mappingname": "",
+ "srcco": ""
},
"email": "",
"enforce_class": "",
@@ -1070,6 +1073,14 @@
"changestatus": "Cambiar Estado",
"convert": "Convertir",
"deliver": "",
+ "dms": {
+ "addpayer": "",
+ "createnewcustomer": "",
+ "getmakes": "",
+ "post": "",
+ "usegeneric": "",
+ "useselected": ""
+ },
"dmsautoallocate": "",
"export": "",
"exportcustdata": "",
@@ -1151,12 +1162,25 @@
"ded_status": "Estado deducible",
"depreciation_taxes": "Depreciación / Impuestos",
"dms": {
+ "address": "",
"center": "",
"cost": "",
"cost_dms_acctnumber": "",
+ "dms_make": "",
+ "dms_model": "",
"dms_wip_acctnumber": "",
+ "journal": "",
+ "name1": "",
+ "payer": {
+ "amount": "",
+ "control_type": "",
+ "controlnumber": "",
+ "dms_acctnumber": "",
+ "name": ""
+ },
"sale": "",
- "sale_dms_acctnumber": ""
+ "sale_dms_acctnumber": "",
+ "story": ""
},
"driveable": "",
"employee_body": "",
@@ -1378,7 +1402,9 @@
"difference": "",
"diskscan": "",
"dms": {
- "kmoutnotgreaterthankmin": ""
+ "kmoutnotgreaterthankmin": "",
+ "notallocated": "",
+ "totalallocated": ""
},
"documents": "documentos",
"documents-images": "",
diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json
index c5969b6d8..207262cc3 100644
--- a/client/src/translations/fr/common.json
+++ b/client/src/translations/fr/common.json
@@ -232,10 +232,13 @@
"templates": ""
},
"dms": {
+ "cashierid": "",
"default_journal": "",
"dms_acctnumber": "",
"dms_wip_acctnumber": "",
- "mappingname": ""
+ "generic_customer_number": "",
+ "mappingname": "",
+ "srcco": ""
},
"email": "",
"enforce_class": "",
@@ -1070,6 +1073,14 @@
"changestatus": "Changer le statut",
"convert": "Convertir",
"deliver": "",
+ "dms": {
+ "addpayer": "",
+ "createnewcustomer": "",
+ "getmakes": "",
+ "post": "",
+ "usegeneric": "",
+ "useselected": ""
+ },
"dmsautoallocate": "",
"export": "",
"exportcustdata": "",
@@ -1151,12 +1162,25 @@
"ded_status": "Statut de franchise",
"depreciation_taxes": "Amortissement / taxes",
"dms": {
+ "address": "",
"center": "",
"cost": "",
"cost_dms_acctnumber": "",
+ "dms_make": "",
+ "dms_model": "",
"dms_wip_acctnumber": "",
+ "journal": "",
+ "name1": "",
+ "payer": {
+ "amount": "",
+ "control_type": "",
+ "controlnumber": "",
+ "dms_acctnumber": "",
+ "name": ""
+ },
"sale": "",
- "sale_dms_acctnumber": ""
+ "sale_dms_acctnumber": "",
+ "story": ""
},
"driveable": "",
"employee_body": "",
@@ -1378,7 +1402,9 @@
"difference": "",
"diskscan": "",
"dms": {
- "kmoutnotgreaterthankmin": ""
+ "kmoutnotgreaterthankmin": "",
+ "notallocated": "",
+ "totalallocated": ""
},
"documents": "Les documents",
"documents-images": "",
diff --git a/server/accounting/qbxml/qbxml-receivables.js b/server/accounting/qbxml/qbxml-receivables.js
index 8e2d05685..dd49732f8 100644
--- a/server/accounting/qbxml/qbxml-receivables.js
+++ b/server/accounting/qbxml/qbxml-receivables.js
@@ -257,7 +257,9 @@ const generateInvoiceQbxml = (
if (jobline.prt_dsmk_p && jobline.prt_dsmk_p !== 0) {
// console.log("Have a part discount", jobline);
DineroAmount = DineroAmount.add(
- DineroAmount.percentage(Math.abs(jobline.prt_dsmk_p || 0))
+ DineroAmount.percentage(Math.abs(jobline.prt_dsmk_p || 0)).multiply(
+ jobline.prt_dsmk_p > 0 ? 1 : -1
+ )
);
}
const account = responsibilityCenters.profits.find(
diff --git a/server/job/job-costing.js b/server/job/job-costing.js
index 235e0fcd7..3b466c6d1 100644
--- a/server/job/job-costing.js
+++ b/server/job/job-costing.js
@@ -302,6 +302,7 @@ function GenerateCostingData(job) {
})
.multiply(val.part_qty || 0)
.percentage(Math.abs(val.prt_dsmk_p || 0))
+ .multiply(val.prt_dsmk_p > 0 ? 1 : -1)
);
if (!acc.parts[partsProfitCenter])
acc.parts[partsProfitCenter] = Dinero();
@@ -331,6 +332,7 @@ function GenerateCostingData(job) {
})
.multiply(val.part_qty || 0)
.percentage(Math.abs(val.prt_dsmk_p || 0))
+ .multiply(val.prt_dsmk_p > 0 ? 1 : -1)
);
if (!acc.parts[partsProfitCenter])
diff --git a/server/job/job-totals.js b/server/job/job-totals.js
index aafd6b955..54b94f5e1 100644
--- a/server/job/job-totals.js
+++ b/server/job/job-totals.js
@@ -259,6 +259,7 @@ function CalculatePartsTotals(jobLines) {
})
.multiply(value.part_qty || 0)
.percentage(Math.abs(value.prt_dsmk_p || 0))
+ .multiply(value.prt_dsmk_p > 0 ? 1 : -1)
),
list: {
...acc.parts.list,
@@ -290,6 +291,7 @@ function CalculatePartsTotals(jobLines) {
})
.multiply(value.part_qty || 0)
.percentage(Math.abs(value.prt_dsmk_p || 0))
+ .multiply(value.prt_dsmk_p > 0 ? 1 : -1)
),
},
};
@@ -426,6 +428,7 @@ function CalculateTaxesTotals(job, otherTotals) {
})
.multiply(val.part_qty || 0)
.percentage(Math.abs(val.prt_dsmk_p || 0))
+ .multiply(val.prt_dsmk_p > 0 ? 1 : -1)
)
.percentage(
((job.parts_tax_rates &&