diff --git a/package.json b/package.json index 35f5f5f86..36054c692 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "lodash": "^4.17.21", "moment": "^2.29.3", "moment-timezone": "^0.5.34", + "multer": "^1.4.4", "node-mailjet": "^3.3.10", "node-quickbooks": "^2.0.39", "nodemailer": "^6.7.3", @@ -50,6 +51,7 @@ "stripe": "^8.217.0", "twilio": "^3.76.1", "uuid": "^8.3.2", + "xml2js": "^0.4.23", "xmlbuilder2": "^3.0.2" }, "devDependencies": { diff --git a/server.js b/server.js index d36a18e05..952d1cc67 100644 --- a/server.js +++ b/server.js @@ -7,7 +7,8 @@ const twilio = require("twilio"); const logger = require("./server/utils/logger"); var fb = require("./server/firebase/firebase-handler"); var cookieParser = require("cookie-parser"); - +const multer = require("multer"); +const upload = multer(); //var enforce = require("express-sslify"); require("dotenv").config({ @@ -186,6 +187,15 @@ app.post("/data/arms", data.arms); var taskHandler = require("./server/tasks/tasks"); app.post("/taskHandler", taskHandler.taskHandler); +var mixdataUpload = require("./server/mixdata/mixdata"); + +app.post( + "/mixdata/upload", + fb.validateFirebaseIdToken, + upload.any(), + mixdataUpload.mixdataUpload +); + var ioevent = require("./server/ioevent/ioevent"); app.post("/ioevent", ioevent.default); app.post("/newlog", (req, res) => { diff --git a/server/mixdata/PPGSampleData.json b/server/mixdata/PPGSampleData.json new file mode 100644 index 000000000..c647a6ec6 --- /dev/null +++ b/server/mixdata/PPGSampleData.json @@ -0,0 +1,206 @@ +{ + "PPG": { + "Header": { + "Protocol": { + "Message": "MixDataInterface", + "Name": "PPG", + "Version": "1.3.0" + }, + "Transaction": { + "TransactionID": "3F2504E0-4F89-11D3-9A0C-0305E82C3301", + "TransactionDate": "2006-06-06T15:00:00" + }, + "ShopInfo": { + "ShopID": "SomeShopID", + "ShopName": "Some Body Shop" + } + }, + "DataExportInterface": { + "ROData": { + "ROCount": "2", + "RepairOrders": { + "RO": [ + { + "ROCounter": "1", + "RONumber": "27187", + "Notes": "This is a painter note", + "Undercoat": "False", + "Clearcoat": "False", + "Basecoat": "True", + "TotalLiquidCost": "133.26", + "TotalSundryCost": "47.12", + "MixCount": "2", + "Mixes": { + "Mix": [ + { + "MixCounter": "1", + "MixRONumber": "27187", + "MixedDate": "2008-09-17T00:00:00", + "MixedBy": "Tony Blair", + "MixedByEmployeeID": "5>", + "PPGBrandCode": "ABC", + "MixCost": "83.49", + "FormulaType": "Standard", + "ComponentCount": "5", + "Components": { + "Component": [ + { + "ComponentCounter": "1", + "ComponentRONumber": "27187", + "ComponentCode": "P425-900", + "ComponentDescription": "F3550 CLEAR", + "ComponentCost": "44.84", + "ComponentWeightApplied": "521.5347", + "ComponentWeightTarget": "525.4023", + "ComponentDensity": "1.311" + }, + { + "ComponentCounter": "2", + "ComponentRONumber": "27187", + "ComponentCode": "P425-948", + "ComponentDescription": "H/S BLACK", + "ComponentCost": "13.77", + "ComponentWeightApplied": "118.5779", + "ComponentWeightTarget": "118.5832", + "ComponentDensity": "0.971" + }, + { + "ComponentCounter": "3", + "ComponentRONumber": "27187", + "ComponentCode": "P425-921", + "ComponentDescription": "H/S CLARET", + "ComponentCost": "0.24", + "ComponentWeightApplied": "2.082", + "ComponentWeightTarget": "2.1022", + "ComponentDensity": "0.976" + }, + { + "ComponentCounter": "4", + "ComponentRONumber": "27187", + "ComponentCode": "P425-937", + "ComponentDescription": "PALE YELLOW", + "ComponentCost": "2.85", + "ComponentWeightApplied": "20.4412", + "ComponentWeightTarget": "20.4888", + "ComponentDensity": "1.136" + }, + { + "ComponentCounter": "5", + "ComponentRONumber": "27187", + "ComponentCode": "P425-948", + "ComponentDescription": "Matting Agent", + "ComponentCost": "21.79", + "ComponentWeightApplied": "414.8808", + "ComponentWeightTarget": "414.8798", + "ComponentDensity": "0.987" + } + ] + } + }, + { + "MixCounter": "2", + "MixRONumber": "27187", + "MixedDate": "2008-09-17T00:00:00", + "MixedBy": "Bill Clinton", + "MixedByEmployeeID": "42>", + "PPGBrandCode": "DEF", + "MixCost": "49.76", + "FormulaType": "RFU", + "ComponentCount": "2", + "Components": { + "Component": [ + { + "ComponentCounter": "1", + "ComponentRONumber": "27187", + "ComponentCode": "P850-1401", + "ComponentDescription": "Fade-Out Thinner", + "ComponentCost": "17.34", + "ComponentWeightApplied": "837.1649", + "ComponentWeightTarget": "838.2232", + "ComponentDensity": "0.8716" + }, + { + "ComponentCounter": "2", + "ComponentRONumber": "27187", + "ComponentCode": "P190-478", + "ComponentDescription": "Ultraclear", + "ComponentCost": "32.42", + "ComponentWeightApplied": "862.5329", + "ComponentWeightTarget": "870.3238", + "ComponentDensity": "0.898" + } + ] + } + } + ] + }, + "SundryCount": "1", + "Sundries": { + "Sundry": { + "SundryCounter": "1", + "SundryRONumber": "27187", + "SundryAddedDate": "2008-09-17T00:00:00", + "SundryAddedBy": "Tony Blair", + "SundryCode": "Sundry1", + "SundryDescription": "Bumper Prep Kit", + "SundryCost": "23.56", + "SundryQuantity": "2", + "SundryQuantityUOM": "Each" + } + } + }, + { + "ROCounter": "2", + "RONumber": "27320", + "Notes": "This is a painter note too", + "Undercoat": "True", + "Clearcoat": "False", + "Basecoat": "False", + "TotalLiquidCost": "9.59", + "TotalSundryCost": "0.0", + "MixCount": "1", + "Mixes": { + "Mix": { + "MixCounter": "1", + "MixRONumber": "27320", + "MixedDate": "2008-12-03T00:00:00", + "MixedBy": "Jerry Primer", + "MixedByEmployeeID": "87>", + "PPGBrandCode": "GHI", + "MixCost": "9.59", + "FormulaType": "Standard", + "ComponentCount": "2", + "Components": { + "Component": [ + { + "ComponentCounter": "1", + "ComponentRONumber": "27320", + "ComponentCode": "P565-957", + "ComponentDescription": "Long Life Etch", + "ComponentCost": "5.31", + "ComponentWeightApplied": "117.8754", + "ComponentWeightTarget": "116.0129", + "ComponentDensity": "0.9808" + }, + { + "ComponentCounter": "2", + "ComponentRONumber": "27320", + "ComponentCode": "P275-61", + "ComponentDescription": "Acitvator For Long Life", + "ComponentCost": "4.28", + "ComponentWeightApplied": "103.4325", + "ComponentWeightTarget": "101.3950", + "ComponentDensity": "0.8571" + } + ] + } + } + }, + "SundryCount": "0" + } + ] + } + } + } + } +} diff --git a/server/mixdata/mixdata.js b/server/mixdata/mixdata.js new file mode 100644 index 000000000..bd761ce3f --- /dev/null +++ b/server/mixdata/mixdata.js @@ -0,0 +1,65 @@ +const path = require("path"); +const _ = require("lodash"); +const logger = require("../utils/logger"); +const xml2js = require("xml2js"); + +require("dotenv").config({ + path: path.resolve( + process.cwd(), + `.env.${process.env.NODE_ENV || "development"}` + ), +}); + +exports.mixdataUpload = async (req, res) => { + const { bodyshopid } = req.body; + logger.log("media-bulk-download", "DEBUG", req.user.email, ids, null); + const BearerToken = req.headers.authorization; + logger.log("job-mixdata-upload", "DEBUG", req.user.email, null, null); + const client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, { + headers: { + Authorization: BearerToken, + }, + }); + + try { + req.files.forEach(async (element) => { + const b = Buffer.from(element.buffer); + console.log(b.toString()); + + const inboundRequest = await xml2js.parseStringPromise(b.toString(), { + explicitArray: false, + }); + + const ScaleType = DetermineScaleType(inboundRequest); + const ROList = GetListOfRos(inboundRequest, ScaleType); + + //Query the list of ROs based on the RO number. + + console.log(ROList); + }); + res.sendStatus(200); + } catch (error) { + res.status(500).JSON(error); + } +}; + +function DetermineScaleType(inboundRequest) { + const ret = { type: "", verson: 0 }; + + //PPG Mix Data + if (inboundRequest.PPG && inboundRequest.PPG.Header.Protocol.Name === "PPG") { + return { + type: inboundRequest.PPG.Header.Protocol.Name, + company: "PPG", + version: inboundRequest.PPG.Header.Protocol.Version, + }; + } +} + +function GetListOfRos(inboundRequest, ScaleType) { + if (ScaleType.company === "PPG" && ScaleType.version === "1.3.0") { + return inboundRequest.PPG.DataExportInterface.ROData.RepairOrders.RO.map( + (r) => r.RONumber + ); + } +} diff --git a/yarn.lock b/yarn.lock index a2d2f3ca8..7a615ca92 100644 --- a/yarn.lock +++ b/yarn.lock @@ -548,6 +548,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +append-field@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56" + integrity sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY= + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -804,6 +809,14 @@ buildcheck@0.0.3: resolved "https://registry.yarnpkg.com/buildcheck/-/buildcheck-0.0.3.tgz#70451897a95d80f7807e68fc412eb2e7e35ff4d5" integrity sha512-pziaA+p/wdVImfcbsZLNF32EiWyujlQLwolMqUQE8xpKNOH7KmZQaY8sXN7DGOEzPAElo9QTaeNRfGnf3iOJbA== +busboy@^0.2.11: + version "0.2.14" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453" + integrity sha1-bCpiLvz0fFe7vh4qnDetNseSVFM= + dependencies: + dicer "0.2.5" + readable-stream "1.1.x" + bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" @@ -992,7 +1005,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.4.7: +concat-stream@^1.4.7, concat-stream@^1.5.2: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -1285,6 +1298,14 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +dicer@0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f" + integrity sha1-WZbAhrszIYyBLAkL3cCc0S+stw8= + dependencies: + readable-stream "1.1.x" + streamsearch "0.1.2" + dicer@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.3.0.tgz#eacd98b3bfbf92e8ab5c2fdb71aaac44bb06b872" @@ -2853,6 +2874,11 @@ minimist@^1.2.5: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== +minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + mkdirp@^0.5.1: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" @@ -2860,6 +2886,13 @@ mkdirp@^0.5.1: dependencies: minimist "^1.2.5" +mkdirp@^0.5.4: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + moment-timezone@^0.5.34: version "0.5.34" resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.34.tgz#a75938f7476b88f155d3504a9343f7519d9a405c" @@ -2892,6 +2925,20 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +multer@^1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.4.tgz#e2bc6cac0df57a8832b858d7418ccaa8ebaf7d8c" + integrity sha512-2wY2+xD4udX612aMqMcB8Ws2Voq6NIUPEtD1be6m411T4uDH/VtL9i//xvcyFlTVfRdaBsk7hV5tgrGQqhuBiw== + dependencies: + append-field "^1.0.0" + busboy "^0.2.11" + concat-stream "^1.5.2" + mkdirp "^0.5.4" + object-assign "^4.1.1" + on-finished "^2.3.0" + type-is "^1.6.4" + xtend "^4.0.0" + nan@^2.15.0: version "2.15.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" @@ -2975,7 +3022,7 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4: +object-assign@^4, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -2990,7 +3037,7 @@ object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== -on-finished@2.4.1: +on-finished@2.4.1, on-finished@^2.3.0: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== @@ -4174,7 +4221,7 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -type-is@~1.6.18: +type-is@^1.6.4, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== @@ -4409,6 +4456,14 @@ xml2js@0.4.19: sax ">=0.6.0" xmlbuilder "~9.0.1" +xml2js@^0.4.23: + version "0.4.23" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + xmlbuilder2@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/xmlbuilder2/-/xmlbuilder2-3.0.2.tgz#fc499688b35a916f269e7b459c2fa02bb5c0822a" @@ -4425,6 +4480,11 @@ xmlbuilder@^13.0.2: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-13.0.2.tgz#02ae33614b6a047d1c32b5389c1fdacb2bce47a7" integrity sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ== +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + xmlbuilder@~9.0.1: version "9.0.7" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" @@ -4445,6 +4505,11 @@ xregexp@2.0.0: resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM= +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"