{"version":3,"sources":["rules.js","Client/rules/kinetic-client.ts","Client/rules/kpromise.ts","Client/rules/oracle-cpq-client.ts","Client/rules/rule-utils.ts","Client/rules/rest-client.ts","Client/rules/salesforce-client.ts","_rules-shim.js"],"names":["rules","exports","_models","_tools","KineticClient","e","this","prototype","updateExternalSalesOrder","company","custNum","orderNum","poNum","partNum","kbmaxConfiguredProductId","orderHed","orderDtl","kineticUpdateSalesOrder","then","resp","statusCode","body","JSON","parse","parameters","ds","quoteToSalesOrder","quote","kineticQuoteToSalesOrder","attach","source","filePath","idQuote","idTag","idQuoteProduct","kineticDocumentType","attachFileToKinetic","attachMedia","mediaPath","attachByTag","attachQuoteProduct","KPromise","value","$isKPromise","onFulfill","onReject","FluentIf","promise","elseIf","condition","_cb","else","finally","res","undefined","Loop","isAsync","i","max","check","Error","concat","OracleCpqClient","createTransaction","model","callOracleCpq","operation","eOracleCpqOperation","params","transactionId","documentNumber","variableName","processVarName","attachFileToOracle","_tableDb","_globalVariables","padStringLeft","str","padChars","substring","toString","length","getLocation","href","match","protocol","host","hostname","port","pathname","search","hash","toQueryString","obj","prefix","p","hasOwnProperty","k","v","push","encodeURIComponent","join","getPrecision","num","Math","floor","split","ClientLogger","msg","window","console","String","type","error","message","warn","info","log","RestClient","_this","defaultPortNum","cookies","processResponse","response","_loop_1","key","existingCookie","find","c","name","remove","makeCall","headers","map","h","baseUrl","url","l","ruleUtils.getLocation","contentType","stringify","ruleUtils.toQueryString","basicAuthUser","authentication","username","password","basicAuthPass","callRestService","restResponse","SalesForceClient","insert","callSfdc","id","update","Id","delete","query","records","modelId","attachFileToSfdc","_dowhile","_break","_for","initial","each","_if","_while","btoa","input","block","charCode","idx","output","charAt","charCodeAt","capitalize","clearTableCache","convertLikeToRegex","sqlLike","notLike","regexLike","replace","finalRegex","RegExp","dateAdd","date","units","amount","newDate","Date","getTime","eDateUnit","setDate","getDate","fullYear","setFullYear","getFullYear","hours","setHours","getHours","minutes","setMinutes","getMinutes","month","setMonth","getMonth","seconds","setSeconds","getSeconds","declareGlobalVariable","defaultValue","equalsAny","o","list","_i","list_1","factorial","result","formatDate","d","format","fullMonths","fullDays","keys","fullDate","longDate","mediumDate","shortDate","mediumTime","shortTime","medium","short","getTimezoneOffset","substr","getDay","getCharCodeAt","subject","index","getGlobalVariable","getNestedConfigurator","config","kom","getByName","getQuoteProductFieldValue","quoteProduct","fieldName","cp","configuredProduct","field","fields","f","stringValue","numberValue","objectValue","dateValue","booleanValue","getTables","args","ids","every","tables","forEach","t","dateCols","columns","filter","eColumnType","data","row","dateCol","dateColName","getUploadFieldUrl","path","indexOf","haystack","needle","isNumeric","isNaN","parseFloat","isFinite","moveItemInArray","array","item","splice","navigateToUrl","newWindow","open","location","objToString","r","roundNumber","interval","mode","roundedNum","ceil","round","toFixed","setGlobalVariable","setQuoteProductFieldValue","uploadValue","strMatch","strReplace","replaceWith","useRegex","esc","rgx","stringLength","stringSubstring","start","end","toLowerCase","toTitleCase","toPascalCase","toUpperCase","translateTemplateLiteral","tmpltStr","propsArr","Object","getOwnPropertyNames","interpolatedStr","propName","trim","models","tools","handle","sleep"],"mappings":"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","file":"rules.min.js","sourcesContent":["var rules = (function (exports, _models, _tools) {\n 'use strict';\n\n var KineticClient = /** @class */ (function () {\n function KineticClient(e) {\n this.e = e;\n }\n KineticClient.prototype.updateExternalSalesOrder = function (company, custNum, orderNum, poNum, partNum, kbmaxConfiguredProductId, orderHed, orderDtl) {\n return this.e.kineticUpdateSalesOrder({ company: company, custNum: custNum, orderNum: orderNum, poNum: poNum, partNum: partNum, kbmaxConfiguredProductId: kbmaxConfiguredProductId, orderHed: orderHed, orderDtl: orderDtl }).then(function (resp) {\n if (resp.statusCode >= 200 && resp.statusCode < 400) {\n var body = JSON.parse(resp.body);\n if (body)\n body = body.parameters;\n if (body)\n body = body.ds;\n return body;\n }\n throw resp.body;\n });\n };\n KineticClient.prototype.quoteToSalesOrder = function (quote, company, custNum, orderNum, poNum) {\n return this.e.kineticQuoteToSalesOrder({\n quote: quote,\n company: company,\n custNum: custNum,\n orderNum: orderNum,\n poNum: poNum\n }).then(function (resp) {\n if (resp.statusCode >= 200 && resp.statusCode < 400) {\n var body = JSON.parse(resp.body);\n if (body)\n body = body.parameters;\n if (body)\n body = body.ds;\n return body;\n }\n throw resp.body;\n });\n };\n KineticClient.prototype.attach = function (source, filePath, idQuote, idTag, idQuoteProduct, kineticDocumentType) {\n return this.e.attachFileToKinetic({\n source: source,\n filePath: filePath,\n idQuote: idQuote,\n idTag: idTag,\n idQuoteProduct: idQuoteProduct,\n kineticDocumentType: kineticDocumentType\n }).then(function (resp) {\n if (resp.statusCode >= 200 && resp.statusCode < 400) {\n var body = JSON.parse(resp.body);\n if (body)\n body = body.parameters;\n if (body)\n body = body.ds;\n return body;\n }\n throw resp.body;\n });\n };\n KineticClient.prototype.attachMedia = function (mediaPath) {\n return this.e.attachFileToKinetic({\n source: 0,\n filePath: mediaPath\n });\n };\n KineticClient.prototype.attachByTag = function (idQuote, idTag) {\n return this.e.attachFileToKinetic({\n source: 1,\n idQuote: idQuote,\n idTag: idTag\n });\n };\n KineticClient.prototype.attachQuoteProduct = function (idQuote, idTag, idQuoteProduct) {\n return this.e.attachFileToKinetic({\n source: 1,\n idQuote: idQuote,\n idTag: idTag,\n idQuoteProduct: idQuoteProduct\n });\n };\n return KineticClient;\n }());\n\n // A more performant implementaion of Q promises that is agnostic to async vs. sync\n // functions. In Q, a promise is always performed one frame afterwards, whereas here,\n // if the wrapped function or value is actually synchronous, it will perform synchronously.\n // The side-effect is the exact ordering of operations will be dependent on whether the\n // passed value is synchronous or not. With Q, all operations will always be performed\n // after the promise is created/returned and other synchronous code is executed. Here,\n // synchronous code will be performed BEFORE the sync operations after the promise is\n // created, whereas asynchronous code will be performed AFTER.\n //\n // In other words, any code contained in the promise resolution should NOT assume sync\n // code after promise creation has taken effect.\n var KPromise = /** @class */ (function () {\n function KPromise(value) {\n this.$isKPromise = true;\n this.then = function (onFulfill, onReject) {\n if (value && !value.$isKPromise && typeof value.then === \"function\") {\n return value.then(onFulfill, onReject);\n }\n else if (value && value.$isKPromise) {\n return value.then(onFulfill, onReject);\n }\n else {\n return new KPromise(onFulfill(value));\n }\n };\n }\n return KPromise;\n }());\n var FluentIf = /** @class */ (function () {\n function FluentIf(promise) {\n this.promise = promise;\n }\n FluentIf.prototype.elseIf = function (condition, _cb) {\n // If there is an existing promise, then it means a prior\n // condition was true, so we ignore this one unconditionally.\n if (!this.promise && condition) {\n this.promise = new KPromise(_cb());\n }\n return this;\n };\n FluentIf.prototype.else = function (_cb) {\n if (!this.promise) {\n this.promise = new KPromise(_cb());\n }\n return this;\n };\n // Callback is called after promise is resolved from\n // whatever condition passed.\n FluentIf.prototype.finally = function (_cb) {\n if (!this.promise) { // if no condition was met\n // need to new up a KbPromise so that the consumer can treat the if block like a promise\n if (_cb)\n return new KPromise(_cb());\n }\n else { // a condition was met\n return this.promise.then(function (res) {\n // we assume that if the result of the condition is something other than undefined,\n // then the return block was hit. So we just return that value.\n // we can assume this because our snap return block is set to generate\n // something like 'return val || null'\n if (res !== undefined) {\n return res;\n }\n else {\n if (_cb) {\n return _cb();\n }\n }\n });\n }\n };\n return FluentIf;\n }());\n // Special if implementation which is promise-friendly. Especially useful in\n // snap code where we are sort of simulating \"await\" functionality. Used in\n // conjunction with KPromise\n function _if(condition, _cb) {\n var promise;\n if (condition)\n promise = new KPromise(_cb());\n return new FluentIf(promise);\n }\n // Special while implementation which is promise-friendly. Note that this function\n // uses recursion, so the while loop is effectively limited to the stack size limit\n // for the browser. Tests have shown that the latest browsers have a limit exceeding\n // 20,000, so these loops are limited to 20,000 iterations or so (not accounting for\n // the base stack overhead, which I imagine should be less than 20 or so).\n //\n // http://stackoverflow.com/questions/17217736/while-loop-with-promises\n //\n // http://stackoverflow.com/questions/7826992/browser-javascript-stack-size-limit\n function _while(condition, _cb) {\n var promise;\n if (condition())\n promise = new KPromise(_cb());\n else\n return new KPromise(null);\n return promise.then(function (_break) {\n if (_break)\n return;\n return _while(condition, _cb);\n });\n }\n // Promise-friendly do-while loop. Uses same recusive plan as _while() above.\n function _dowhile(condition, _cb) {\n var promise = new KPromise(_cb());\n if (!condition()) {\n return promise;\n }\n else {\n return promise.then(function (_break) {\n if (_break)\n return;\n return _dowhile(condition, _cb);\n });\n }\n }\n // Promise-friendly for loop. Uses same recusive method as _while() above.\n function _for(initial, condition, each, _cb) {\n initial();\n var promise = new KPromise(null);\n if (condition())\n promise = new KPromise(_cb());\n else\n return promise;\n return promise.then(function (_break) {\n if (_break) {\n return;\n }\n each();\n return _for(function () { }, condition, each, _cb);\n });\n }\n /**\n * used by while and for loops in snap to make sure we don't end up with an infinite loop\n */\n var Loop = /** @class */ (function () {\n function Loop(isAsync) {\n if (isAsync === void 0) { isAsync = false; }\n this.isAsync = isAsync;\n this.i = 0;\n this.max = isAsync ? 10000 : 1000000; // we allow far less iterations for async loops\n }\n Loop.prototype.check = function () {\n this.i++;\n if (this.i > this.max) {\n // tslint:disable-next-line:max-line-length\n throw new Error(\"Infinite loop detected. A maximum of \".concat(this.max, \" iterations is allowed for \").concat(this.isAsync ? \"an async\" : \"a\", \" loop\"));\n }\n };\n return Loop;\n }());\n\n var OracleCpqClient = /** @class */ (function () {\n function OracleCpqClient(e) {\n this.e = e;\n }\n OracleCpqClient.prototype.createTransaction = function (model) {\n return this.e.callOracleCpq({\n operation: _models.eOracleCpqOperation.createTransaction,\n params: model\n });\n };\n OracleCpqClient.prototype.attachByTag = function (transactionId, documentNumber, variableName, processVarName, idQuote, idTag) {\n return this.e.attachFileToOracle({\n source: 0,\n transactionId: transactionId,\n documentNumber: documentNumber,\n variableName: variableName,\n processVarName: processVarName,\n idQuote: idQuote,\n idTag: idTag\n });\n };\n OracleCpqClient.prototype.attachMedia = function (transactionId, documentNumber, variableName, processVarName, mediaPath) {\n return this.e.attachFileToOracle({\n source: 1,\n transactionId: transactionId,\n documentNumber: documentNumber,\n variableName: variableName,\n processVarName: processVarName,\n filePath: mediaPath\n });\n };\n return OracleCpqClient;\n }());\n\n /*\n The js in this file is included with every rule that is run (on client and server and clara plugin).\n Only put stuff in here that every rule relies on!\n */\n var _tableDb = {};\n function getTables(e, args) {\n _tableDb = _tableDb || {};\n if (args.ids.every(function (id) { return _tableDb[id] != null; })) {\n return new KPromise(args.ids.map(function (id) { return _tableDb[id]; }));\n }\n else {\n return e.getTables(args).then(function (tables) {\n tables.forEach(function (t, i) {\n var dateCols = t.columns.filter(function (c) { return (c.type || c[\"Type\"]) == _models.eColumnType.date; });\n if (dateCols.length) {\n t.data.forEach(function (row) {\n dateCols.forEach(function (dateCol) {\n var dateColName = dateCol.name || dateCol[\"Name\"];\n row[dateColName] = new Date(row[dateColName] + \"T00:00:00.000Z\");\n });\n });\n }\n _tableDb[args.ids[i]] = t.data;\n });\n return tables.map(function (t) { return t.data; });\n });\n }\n }\n function getUploadFieldUrl(e, field) {\n var value = field.value;\n return e.baseUrl + \"/api/quotes/filefromconfiguratorfield/\" + value.path;\n }\n function clearTableCache() {\n _tableDb = {};\n }\n function r(v) {\n if (v === undefined)\n v = null;\n return v;\n }\n var _globalVariables = {};\n function declareGlobalVariable(variableName, defaultValue) {\n if (typeof (_globalVariables[variableName]) === \"undefined\") {\n _globalVariables[variableName] = defaultValue;\n }\n }\n function setGlobalVariable(variableName, value) {\n _globalVariables[variableName] = value;\n }\n function getGlobalVariable(variableName) {\n return _globalVariables[variableName];\n }\n function indexOf(haystack, needle) {\n if (!haystack)\n return -1;\n return haystack.indexOf(needle);\n }\n function moveItemInArray(array, item, index) {\n var idx = array.indexOf(item);\n if (idx < 0)\n return;\n array.splice(idx, 1);\n array.splice(index, 0, item);\n }\n function stringLength(str) {\n if (!str)\n return 0;\n return str.length;\n }\n function strReplace(search, replaceWith, subject, useRegex) {\n if (useRegex === void 0) { useRegex = true; }\n if (!search)\n search = \"\";\n if (!replaceWith)\n replaceWith = \"\";\n if (!subject)\n subject = \"\";\n if (useRegex) {\n return subject.replace(new RegExp(search, \"gi\"), replaceWith);\n }\n else {\n var esc = search.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n var rgx = new RegExp(esc, 'ig');\n return subject.replace(rgx, replaceWith);\n }\n }\n function translateTemplateLiteral(tmpltStr, obj) {\n // If there are no properties in the object don't bother interpolating \n if (!obj)\n return tmpltStr;\n var propsArr = Object.getOwnPropertyNames(obj);\n var interpolatedStr = tmpltStr;\n propsArr.forEach(function (propName) {\n interpolatedStr = interpolatedStr.replace(new RegExp(\"\\\\${\" + propName + \"}\", \"gi\"), obj[propName]);\n });\n return interpolatedStr;\n }\n /*\n Strmatches is a simplified version of JS's str.match function. Instead of returning an\n array of matches, it simply returns true/false depending on if a match is found.\n */\n function strMatch(search, subject) {\n if (!search)\n search = \"\";\n if (!subject)\n subject = \"\";\n var match = subject.match(search);\n return match != null && match.length > 0;\n }\n function getCharCodeAt(subject, index) {\n if (!subject)\n subject = \"\";\n return subject.charCodeAt(index);\n }\n function toUpperCase(str) {\n if (!str)\n return \"\";\n return str.toUpperCase();\n }\n function toLowerCase(str) {\n if (!str)\n return \"\";\n return str.toLowerCase();\n }\n function capitalize(str) {\n if (!str)\n return \"\";\n return str.capitalize();\n }\n function toTitleCase(str) {\n if (!str)\n return \"\";\n return str.toPascalCase();\n }\n function trim(str) {\n if (!str)\n return \"\";\n return str.trim();\n }\n function objToString(v) {\n if (typeof v == \"undefined\" || v === null)\n return \"\";\n return v.toString();\n }\n function stringSubstring(str, start, end) {\n if (!str)\n return \"\";\n return str.substring(start, end);\n }\n function isNumeric(obj) {\n // Need to check for empty strings and trim the object because isNaN() \"incorrectly\" returns false for\n // empty strings, whitespace, and arrays.\n return !isNaN(parseFloat(obj)) && isFinite(obj);\n }\n // export function sleep(time: number): Q.IPromise {\n // let d = Q.defer();\n // setTimeout(() => {\n // d.resolve(null);\n // }, time);\n // return d.promise;\n // }\n function getQuoteProductFieldValue(quoteProduct, fieldName) {\n var cp = quoteProduct.configuredProduct;\n if (!cp)\n return null;\n var field = cp.fields.find(function (f) { return f.name == fieldName; });\n if (!field)\n return null;\n if (field.stringValue)\n return field.stringValue;\n if (field.numberValue)\n return field.numberValue;\n if (field.objectValue)\n return field.objectValue;\n if (field.dateValue)\n return field.dateValue;\n return field.booleanValue;\n }\n function setQuoteProductFieldValue(args) {\n var cp = args.quoteProduct.configuredProduct;\n if (cp) {\n var field = cp.fields.find(function (f) { return f.name == args.fieldName; });\n if (field) {\n if (field.hasOwnProperty(\"stringValue\")) {\n field.stringValue = args.value;\n }\n else if (field.hasOwnProperty(\"numberValue\")) {\n field.numberValue = args.value;\n }\n else if (field.hasOwnProperty(\"booleanValue\")) {\n field.booleanValue = args.value;\n }\n else if (field.hasOwnProperty(\"dateValue\")) {\n field.dateValue = args.value;\n }\n else if (field.hasOwnProperty(\"uploadValue\")) {\n field.uploadValue = args.value;\n }\n else if (field.hasOwnProperty(\"objectValue\")) {\n field.objectValue = args.value;\n }\n }\n }\n }\n function factorial(value) {\n var result = 1;\n for (var i = 2; i <= value; i++) {\n result = result * i;\n }\n return result;\n }\n function padStringLeft(str, padChars) {\n return padChars.substring(str.toString().length) + str;\n }\n // Returns a new date with the added amount\n function dateAdd(date, units, amount) {\n var newDate = new Date(date.getTime());\n if (units == _tools.eDateUnit.date) {\n newDate.setDate(newDate.getDate() + amount);\n }\n else if (units == _tools.eDateUnit.fullYear) {\n newDate.setFullYear(newDate.getFullYear() + amount);\n }\n else if (units == _tools.eDateUnit.hours) {\n newDate.setHours(newDate.getHours() + amount);\n }\n else if (units == _tools.eDateUnit.minutes) {\n newDate.setMinutes(newDate.getMinutes() + amount);\n }\n else if (units == _tools.eDateUnit.month) {\n newDate.setMonth(newDate.getMonth() + amount);\n }\n else if (units == _tools.eDateUnit.seconds) {\n newDate.setSeconds(newDate.getSeconds() + amount);\n }\n return newDate;\n }\n function formatDate(d, format) {\n // Very simple implementation\n var date;\n if (typeof d == \"object\") {\n date = d;\n }\n else if (typeof d == \"string\") {\n date = new Date(Date.parse(d));\n }\n else if (typeof d == \"number\") {\n date = new Date(d);\n }\n else {\n throw new Error(\"Date is in invalid format: \" + (typeof d));\n }\n if (format == null)\n format = \"short\";\n var fullMonths = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\"\n ];\n var fullDays = [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\"\n ];\n var keys = {\n \"fullDate\": function (date) { return \"$EEEE, $MMMM $d, $yyyy\"; },\n \"longDate\": function (date) { return \"$MMMM $d, $yyyy\"; },\n \"mediumDate\": function (date) { return \"$MMM $d, $yyyy\"; },\n \"shortDate\": function (date) { return \"$M/$d/$yy\"; },\n \"mediumTime\": function (date) { return \"$h:$mm:$ss $a\"; },\n \"shortTime\": function (date) { return \"$h:$mm $a\"; },\n \"medium\": function (date) { return \"$MMM $d, $yy $h:$mm:$ss $a\"; },\n \"short\": function (date) { return \"$M/$d/$yy $h:$mm $a\"; },\n \"\\\\$yyyy\": function (date) { return date.getFullYear(); },\n \"\\\\$yy\": function (date) { return date.getFullYear() - 2000; },\n \"\\\\$dd\": function (date) { return padStringLeft(date.getDate(), \"00\"); },\n \"\\\\$d\": function (date) { return date.getDate(); },\n \"\\\\$HH\": function (date) { return padStringLeft(date.getHours(), \"00\"); },\n \"\\\\$H\": function (date) { return date.getHours(); },\n \"\\\\$hh\": function (date) { return padStringLeft(date.getHours() ? date.getHours() % 12 : 12, \"00\"); },\n \"\\\\$h\": function (date) { return date.getHours() ? date.getHours() % 12 : 12; },\n \"\\\\$mm\": function (date) { return padStringLeft(date.getMinutes(), \"00\"); },\n \"\\\\$m\": function (date) { return date.getMinutes(); },\n \"\\\\$ss\": function (date) { return padStringLeft(date.getSeconds(), \"00\"); },\n \"\\\\$s\": function (date) { return date.getSeconds(); },\n \"\\\\$Z\": function (date) { return date.getTimezoneOffset(); },\n \"\\\\$a\": function (date) { return date.getHours() > 12 ? \"PM\" : \"AM\"; },\n \"\\\\$MMMM\": function (date) { return fullMonths[date.getMonth() % 12]; },\n \"\\\\$MMM\": function (date) { return fullMonths[date.getMonth() % 12].substr(0, 3); },\n \"\\\\$MM\": function (date) { return padStringLeft(date.getMonth() + 1, \"00\"); },\n \"\\\\$M\": function (date) { return date.getMonth() + 1; },\n \"\\\\$EEEE\": function (date) { return fullDays[date.getDay()]; },\n \"\\\\$EEE\": function (date) { return fullDays[date.getDay()].substr(0, 3); }\n };\n for (var key in keys) {\n format = format.replace(new RegExp(key, \"g\"), keys[key](date));\n }\n return format;\n }\n // http://stackoverflow.com/questions/736513/how-do-i-parse-a-url-into-hostname-and-path-in-javascript\n function getLocation(href) {\n var match = href.match(/^(https?\\:)\\/\\/(([^:\\/?#]*)(?:\\:([0-9]+))?)(\\/[^?#]*)(\\?[^#]*|)(#.*|)$/);\n if (match) {\n return {\n protocol: match[1],\n host: match[2],\n hostname: match[3],\n port: match[4],\n pathname: match[5],\n search: match[6],\n hash: match[7]\n };\n }\n return null;\n }\n function getNestedConfigurator(config, e) {\n if (typeof config == \"string\") {\n return e.kom.getByName(config);\n }\n return config;\n }\n // http://stackoverflow.com/questions/1714786/querystring-encoding-of-a-javascript-object\n function toQueryString(obj, prefix) {\n var str = [];\n for (var p in obj) {\n if (obj.hasOwnProperty(p)) {\n var k = prefix ? prefix + \"[\" + p + \"]\" : p;\n var v = obj[p];\n str.push(typeof v == \"object\" ?\n toQueryString(v, k) :\n encodeURIComponent(k) + \"=\" + encodeURIComponent(v));\n }\n }\n return str.join(\"&\");\n }\n function roundNumber(num, interval, mode) {\n var roundedNum;\n if (mode == \"Math.ceil\")\n roundedNum = Math.ceil(num / interval);\n else if (mode == \"Math.floor\")\n roundedNum = Math.floor(num / interval);\n else\n roundedNum = Math.round(num / interval);\n return parseFloat((interval * roundedNum).toFixed(getPrecision(interval)));\n }\n function getPrecision(num) {\n if (Math.floor(num) === num)\n return 0;\n return num.toString().split(\".\")[1].length || 0;\n }\n var ClientLogger = /** @class */ (function () {\n function ClientLogger() {\n }\n ClientLogger.prototype.push = function (msg) {\n if (typeof window !== \"undefined\" && window.console) {\n if (String(msg.type) === 'error') {\n window.console.error(msg.message);\n }\n else if (String(msg.type) === 'warning') {\n window.console.warn(msg.message);\n }\n else if (String(msg.type) === 'info') {\n window.console.info(msg.message);\n }\n else {\n window.console.log(msg.message);\n }\n }\n };\n return ClientLogger;\n }());\n function btoa(input) {\n if (typeof window !== \"undefined\" && window.btoa) {\n return window.btoa(input);\n }\n var str = String(input);\n var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n for (var block, charCode, idx = 0, map = chars, output = ''; str.charAt(idx | 0) || (map = '=', idx % 1); output += map.charAt(63 & block >> 8 - idx % 1 * 8)) {\n charCode = str.charCodeAt(idx += 3 / 4);\n if (charCode > 0xFF) {\n throw \"'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.\";\n }\n block = block << 8 | charCode;\n }\n return output;\n }\n function equalsAny(o, list) {\n for (var _i = 0, list_1 = list; _i < list_1.length; _i++) {\n var n = list_1[_i];\n if (o == n)\n return true;\n }\n return false;\n }\n function navigateToUrl(url, newWindow) {\n if (newWindow) {\n window.open(url, \"_blank\");\n }\n else {\n window.location.href = url;\n }\n }\n function convertLikeToRegex(sqlLike, notLike) {\n // Escape special regex characters\n // const escapedLike = sqlLike.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n var escapedLike = sqlLike.replace(/[.*+?${}()|\\\\]/g, '\\\\$&');\n // Replace SQL wildcards with regex equivalents\n var regexLike = escapedLike.replace(/%/g, '.*').replace(/_/g, '.');\n // Add regex anchors to match the entire string\n var finalRegex = \"^\".concat(regexLike, \"$\");\n return new RegExp(finalRegex);\n }\n\n var RestClient = /** @class */ (function () {\n function RestClient(e) {\n var _this = this;\n this.e = e;\n this.defaultPortNum = 0; // If 0 then use 80 for http and 443 for https\n this.cookies = [];\n this.processResponse = function (response) {\n if (response.cookies) {\n var _loop_1 = function (key) {\n var existingCookie = _this.cookies.find(function (c) { return c.name == key; });\n if (existingCookie)\n _this.cookies.remove(existingCookie);\n _this.cookies.push({\n name: key,\n value: response.cookies[key]\n });\n };\n for (var key in response.cookies) {\n _loop_1(key);\n }\n }\n };\n }\n RestClient.prototype.makeCall = function (params) {\n var _this = this;\n if (this.cookies.length) {\n if (!params.headers) {\n params.headers = [];\n }\n params.headers.push({\n name: \"Cookie\",\n value: this.cookies.map(function (c) { return c.name + \"=\" + c.value; }).join(\"; \")\n });\n }\n if (!params.headers.find(function (h) { return h.name == \"Connection\"; })) {\n params.headers.push({\n name: \"Connection\",\n value: \"keep-alive\"\n });\n }\n params.headers.push({\n name: \"User-Agent\",\n value: \"KBMax v3\"\n });\n if (this.baseUrl) {\n params.url = this.baseUrl + params.url;\n }\n if (!params.headers.find(function (h) { return h.name == \"Host\"; })) {\n var l = getLocation(params.url);\n if (l) {\n params.headers.push({\n name: \"Host\",\n value: l.hostname\n });\n }\n }\n var contentType = params.headers.find(function (h) { return h.name == \"Content-Type\"; });\n if (!contentType) {\n contentType = {\n name: \"Content-Type\",\n value: \"application/text\"\n };\n params.headers.push(contentType);\n }\n if (typeof params.body != \"string\") {\n if (contentType.value == \"application/json\") {\n params.body = JSON.stringify(params.body);\n }\n if (contentType.value == \"application/x-www-form-urlencoded\") {\n params.body = toQueryString(params.body);\n }\n }\n params.headers.push({\n name: \"Accept\",\n value: contentType.value + \", text/plain, */*\"\n });\n if (this.basicAuthUser && !params.authentication) {\n params.authentication = {\n username: this.basicAuthUser,\n password: this.basicAuthPass\n };\n }\n if (this.defaultPortNum && !params.port) {\n params.port = this.defaultPortNum;\n }\n return this.e.callRestService(params).then(function (restResponse) {\n _this.processResponse(restResponse);\n return restResponse;\n });\n };\n return RestClient;\n }());\n\n var SalesForceClient = /** @class */ (function () {\n function SalesForceClient(e) {\n this.e = e;\n }\n SalesForceClient.prototype.insert = function (model) {\n return this.e.callSfdc({\n operation: \"insert\",\n params: model\n }).then(function (resp) {\n if (resp.statusCode >= 200 && resp.statusCode < 400) {\n return JSON.parse(resp.body).id;\n }\n throw resp.body;\n });\n };\n SalesForceClient.prototype.update = function (model) {\n return this.e.callSfdc({\n operation: \"update\",\n params: model\n }).then(function (resp) {\n if (resp.statusCode >= 200 && resp.statusCode < 400) {\n return model.Id;\n }\n throw resp.body;\n });\n };\n SalesForceClient.prototype.delete = function (model) {\n return this.e.callSfdc({\n operation: \"delete\",\n params: model\n }).then(function (resp) {\n if (resp.statusCode >= 200 && resp.statusCode < 400) {\n return model.Id;\n }\n throw resp.body;\n });\n };\n SalesForceClient.prototype.query = function (query) {\n return this.e.callSfdc({\n operation: \"query\",\n query: query\n }).then(function (resp) {\n if (resp.statusCode >= 200 && resp.statusCode < 400) {\n return JSON.parse(resp.body).records;\n }\n throw resp.body;\n });\n };\n SalesForceClient.prototype.attachByTag = function (modelId, idQuote, idTag) {\n return this.e.attachFileToSfdc({\n source: 0,\n id: modelId,\n idQuote: idQuote,\n idTag: idTag\n });\n };\n SalesForceClient.prototype.attachMedia = function (modelId, mediaPath) {\n return this.e.attachFileToSfdc({\n source: 1,\n id: modelId,\n filePath: mediaPath\n });\n };\n SalesForceClient.prototype.attachQuoteProduct = function (modelId, idQuote, idTag, idQuoteProduct) {\n return this.e.attachFileToSfdc({\n source: 2,\n id: modelId,\n idQuote: idQuote,\n idTag: idTag,\n idQuoteProduct: idQuoteProduct\n });\n };\n return SalesForceClient;\n }());\n\n exports.ClientLogger = ClientLogger;\n exports.FluentIf = FluentIf;\n exports.KPromise = KPromise;\n exports.KineticClient = KineticClient;\n exports.Loop = Loop;\n exports.OracleCpqClient = OracleCpqClient;\n exports.RestClient = RestClient;\n exports.SalesForceClient = SalesForceClient;\n exports._dowhile = _dowhile;\n exports._for = _for;\n exports._if = _if;\n exports._while = _while;\n exports.btoa = btoa;\n exports.capitalize = capitalize;\n exports.clearTableCache = clearTableCache;\n exports.convertLikeToRegex = convertLikeToRegex;\n exports.dateAdd = dateAdd;\n exports.declareGlobalVariable = declareGlobalVariable;\n exports.equalsAny = equalsAny;\n exports.factorial = factorial;\n exports.formatDate = formatDate;\n exports.getCharCodeAt = getCharCodeAt;\n exports.getGlobalVariable = getGlobalVariable;\n exports.getLocation = getLocation;\n exports.getNestedConfigurator = getNestedConfigurator;\n exports.getPrecision = getPrecision;\n exports.getQuoteProductFieldValue = getQuoteProductFieldValue;\n exports.getTables = getTables;\n exports.getUploadFieldUrl = getUploadFieldUrl;\n exports.indexOf = indexOf;\n exports.isNumeric = isNumeric;\n exports.moveItemInArray = moveItemInArray;\n exports.navigateToUrl = navigateToUrl;\n exports.objToString = objToString;\n exports.padStringLeft = padStringLeft;\n exports.r = r;\n exports.roundNumber = roundNumber;\n exports.setGlobalVariable = setGlobalVariable;\n exports.setQuoteProductFieldValue = setQuoteProductFieldValue;\n exports.strMatch = strMatch;\n exports.strReplace = strReplace;\n exports.stringLength = stringLength;\n exports.stringSubstring = stringSubstring;\n exports.toLowerCase = toLowerCase;\n exports.toQueryString = toQueryString;\n exports.toTitleCase = toTitleCase;\n exports.toUpperCase = toUpperCase;\n exports.translateTemplateLiteral = translateTemplateLiteral;\n exports.trim = trim;\n\n return exports;\n\n}({}, models, tools));\n\n\n/*\r\n This file is a shim to make rule utilities available globally. We concat it with the bundle\r\n after the bundle is already made.\r\n*/\r\nvar handle = rules.handle;\r\nvar getTables = rules.getTables;\r\nvar r = rules.r;\r\nvar indexOf = rules.indexOf;\r\nvar stringLength = rules.stringLength;\r\nvar strReplace = rules.strReplace;\r\nvar getCharCodeAt = rules.getCharCodeAt;\r\nvar toUpperCase = rules.toUpperCase;\r\nvar toLowerCase = rules.toLowerCase;\r\nvar capitalize = rules.capitalize;\r\nvar toTitleCase = rules.toTitleCase;\r\nvar trim = rules.trim;\r\nvar objToString = rules.objToString;\r\nvar stringSubstring = rules.stringSubstring;\r\nvar isNumeric = rules.isNumeric;\r\nvar sleep = rules.sleep;\r\nvar getQuoteProductFieldValue = rules.getQuoteProductFieldValue;\r\nvar setQuoteProductFieldValue = rules.setQuoteProductFieldValue;\r\nvar factorial = rules.factorial;\r\nvar padStringLeft = rules.padStringLeft;\r\nvar dateAdd = rules.dateAdd;\r\nvar formatDate = rules.formatDate;\r\nvar getLocation = rules.getLocation;\r\nvar getNestedConfigurator = rules.getNestedConfigurator;\r\nvar toQueryString = rules.toQueryString;\r\n\r\nvar _if = rules._if;\r\nvar _while = rules._while;\r\nvar _for = rules._for;\r\nvar Loop = rules.Loop;\r\n\r\nvar RestClient = rules.RestClient;\r\nvar OracleCpqClient = rules.OracleCpqClient;\r\nvar SalesForceClient = rules.SalesForceClient;\r\nvar KineticClient = rules.KineticClient;\n//# sourceMappingURL=rules.js.map\n","import { IQuote } from \"../models\";\r\n\r\nexport class KineticClient {\r\n constructor(private e: any) {\r\n }\r\n\r\n public updateExternalSalesOrder(\r\n company: string,\r\n custNum: number,\r\n orderNum: number,\r\n poNum: number,\r\n partNum: string,\r\n kbmaxConfiguredProductId: number,\r\n orderHed: any,\r\n orderDtl: any) {\r\n return this.e.kineticUpdateSalesOrder({ company: company, custNum: custNum, orderNum: orderNum, poNum: poNum, partNum: partNum, kbmaxConfiguredProductId: kbmaxConfiguredProductId, orderHed: orderHed, orderDtl: orderDtl}).then(resp => {\r\n if (resp.statusCode >= 200 && resp.statusCode < 400) {\r\n let body = JSON.parse(resp.body);\r\n if (body) body = body.parameters;\r\n if (body) body = body.ds;\r\n return body;\r\n }\r\n throw resp.body;\r\n });\r\n }\r\n\r\n public quoteToSalesOrder(\r\n quote: IQuote,\r\n company: string,\r\n custNum: number,\r\n orderNum: number,\r\n poNum: number) {\r\n return this.e.kineticQuoteToSalesOrder({\r\n quote: quote,\r\n company: company,\r\n custNum: custNum,\r\n orderNum: orderNum,\r\n poNum: poNum\r\n }).then(resp => {\r\n if (resp.statusCode >= 200 && resp.statusCode < 400) {\r\n let body = JSON.parse(resp.body);\r\n if (body) body = body.parameters;\r\n if (body) body = body.ds;\r\n return body;\r\n }\r\n throw resp.body;\r\n });\r\n }\r\n\r\n public attach(\r\n source,\r\n filePath,\r\n idQuote,\r\n idTag,\r\n idQuoteProduct,\r\n kineticDocumentType) {\r\n return this.e.attachFileToKinetic({\r\n source: source,\r\n filePath: filePath,\r\n idQuote: idQuote,\r\n idTag: idTag,\r\n idQuoteProduct: idQuoteProduct,\r\n kineticDocumentType: kineticDocumentType\r\n }).then(resp => {\r\n if (resp.statusCode >= 200 && resp.statusCode < 400) {\r\n let body = JSON.parse(resp.body);\r\n if (body) body = body.parameters;\r\n if (body) body = body.ds;\r\n return body;\r\n }\r\n throw resp.body;\r\n });\r\n }\r\n\r\n public attachMedia(\r\n mediaPath: string\r\n ) {\r\n return this.e.attachFileToKinetic({\r\n source: 0,\r\n filePath: mediaPath\r\n });\r\n }\r\n\r\n public attachByTag(\r\n idQuote: number,\r\n idTag: number\r\n ) {\r\n return this.e.attachFileToKinetic({\r\n source: 1,\r\n idQuote,\r\n idTag\r\n });\r\n }\r\n\r\n public attachQuoteProduct(\r\n idQuote: number,\r\n idTag: number,\r\n idQuoteProduct: number\r\n ) {\r\n return this.e.attachFileToKinetic({\r\n source: 1,\r\n idQuote,\r\n idTag,\r\n idQuoteProduct\r\n });\r\n }\r\n}","// A more performant implementaion of Q promises that is agnostic to async vs. sync\r\n// functions. In Q, a promise is always performed one frame afterwards, whereas here,\r\n// if the wrapped function or value is actually synchronous, it will perform synchronously.\r\n// The side-effect is the exact ordering of operations will be dependent on whether the\r\n// passed value is synchronous or not. With Q, all operations will always be performed\r\n// after the promise is created/returned and other synchronous code is executed. Here,\r\n// synchronous code will be performed BEFORE the sync operations after the promise is\r\n// created, whereas asynchronous code will be performed AFTER.\r\n//\r\n// In other words, any code contained in the promise resolution should NOT assume sync\r\n// code after promise creation has taken effect.\r\nexport class KPromise implements Q.IPromise {\r\n \r\n constructor(value: T) {\r\n this.then = (onFulfill, onReject) => {\r\n if (value && !(value as any).$isKPromise && typeof (value as any).then === \"function\") {\r\n return (value as any).then(onFulfill, onReject);\r\n } else if (value && (value as any).$isKPromise) {\r\n return (value as any).then(onFulfill, onReject);\r\n } else {\r\n return new KPromise(onFulfill(value));\r\n }\r\n };\r\n }\r\n public $isKPromise = true;\r\n public then: (\r\n onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null,\r\n onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null\r\n ) => PromiseLike;\r\n // public then: (onFulfill: (value: T) => any, onReject?: (reason: any) => any) => Q.IPromise;\r\n}\r\n\r\nexport class FluentIf {\r\n constructor(private promise: Q.IPromise) {\r\n }\r\n\r\n public elseIf(condition: boolean, _cb: () => any): FluentIf {\r\n // If there is an existing promise, then it means a prior\r\n // condition was true, so we ignore this one unconditionally.\r\n if (!this.promise && condition) {\r\n this.promise = new KPromise(_cb());\r\n }\r\n return this;\r\n }\r\n\r\n public else(_cb: () => any): FluentIf {\r\n if (!this.promise) {\r\n this.promise = new KPromise(_cb());\r\n }\r\n return this;\r\n }\r\n \r\n // Callback is called after promise is resolved from\r\n // whatever condition passed.\r\n public finally(_cb: () => any): Q.IPromise {\r\n if (!this.promise) {// if no condition was met\r\n // need to new up a KbPromise so that the consumer can treat the if block like a promise\r\n if (_cb) return new KPromise(_cb());\r\n } else { // a condition was met\r\n return this.promise.then(res => {\r\n // we assume that if the result of the condition is something other than undefined,\r\n // then the return block was hit. So we just return that value.\r\n // we can assume this because our snap return block is set to generate\r\n // something like 'return val || null'\r\n if (res !== undefined) {\r\n return res;\r\n } else {\r\n if (_cb) {\r\n return _cb();\r\n }\r\n }\r\n });\r\n }\r\n }\r\n}\r\n\r\n// Special if implementation which is promise-friendly. Especially useful in\r\n// snap code where we are sort of simulating \"await\" functionality. Used in\r\n// conjunction with KPromise\r\nexport function _if(condition: boolean, _cb: () => any) {\r\n let promise: Q.IPromise;\r\n if (condition) promise = new KPromise(_cb());\r\n return new FluentIf(promise);\r\n}\r\n\r\n// Special while implementation which is promise-friendly. Note that this function\r\n// uses recursion, so the while loop is effectively limited to the stack size limit\r\n// for the browser. Tests have shown that the latest browsers have a limit exceeding\r\n// 20,000, so these loops are limited to 20,000 iterations or so (not accounting for\r\n// the base stack overhead, which I imagine should be less than 20 or so).\r\n//\r\n// http://stackoverflow.com/questions/17217736/while-loop-with-promises\r\n//\r\n// http://stackoverflow.com/questions/7826992/browser-javascript-stack-size-limit\r\n\r\nexport function _while(condition: () => boolean, _cb: () => any) {\r\n let promise: Q.IPromise;\r\n if (condition()) promise = new KPromise(_cb());\r\n else return new KPromise(null);\r\n return promise.then(_break => {\r\n if (_break) return;\r\n return _while(condition, _cb);\r\n });\r\n}\r\n\r\n// Promise-friendly do-while loop. Uses same recusive plan as _while() above.\r\n\r\nexport function _dowhile(condition: () => boolean, _cb: () => any) {\r\n let promise: Q.IPromise = new KPromise(_cb());\r\n if (!condition()) {\r\n return promise;\r\n }\r\n else {\r\n return promise.then(_break => {\r\n if (_break) return;\r\n return _dowhile(condition, _cb);\r\n });\r\n }\r\n}\r\n\r\n// Promise-friendly for loop. Uses same recusive method as _while() above.\r\n\r\nexport function _for(initial: () => void, condition: () => boolean, each: () => void, _cb: () => any) {\r\n initial();\r\n let promise: Q.IPromise = new KPromise(null);\r\n if (condition()) promise = new KPromise(_cb());\r\n else return promise;\r\n return promise.then(_break => {\r\n if (_break) {\r\n return;\r\n }\r\n each();\r\n return _for(() => { }, condition, each, _cb);\r\n });\r\n}\r\n\r\n/**\r\n * used by while and for loops in snap to make sure we don't end up with an infinite loop\r\n */\r\nexport class Loop {\r\n constructor(private isAsync = false) {\r\n this.max = isAsync ? 10000 : 1000000; // we allow far less iterations for async loops\r\n }\r\n private max: number;\r\n private i: number = 0;\r\n\r\n public check() {\r\n this.i++;\r\n if (this.i > this.max) {\r\n // tslint:disable-next-line:max-line-length\r\n throw new Error(`Infinite loop detected. A maximum of ${this.max} iterations is allowed for ${this.isAsync ? \"an async\" : \"a\"} loop`);\r\n }\r\n }\r\n}\r\n","import { ICallOracleCpqRuleArgs, IOracleCpqParams, eOracleCpqOperation } from \"@models\";\r\n\r\nexport class OracleCpqClient {\r\n constructor(private e: any) {\r\n }\r\n\r\n public createTransaction(model: IOracleCpqParams) {\r\n return this.e.callOracleCpq({\r\n operation: eOracleCpqOperation.createTransaction,\r\n params: model\r\n } as ICallOracleCpqRuleArgs);\r\n }\r\n\r\n public attachByTag(\r\n transactionId: string,\r\n documentNumber: number,\r\n variableName: string,\r\n processVarName: string,\r\n idQuote: number,\r\n idTag: number\r\n ) {\r\n return this.e.attachFileToOracle({\r\n source: 0,\r\n transactionId,\r\n documentNumber,\r\n variableName,\r\n processVarName,\r\n idQuote,\r\n idTag\r\n });\r\n }\r\n\r\n public attachMedia(\r\n transactionId: string,\r\n documentNumber: number,\r\n variableName: string,\r\n processVarName: string,\r\n mediaPath: string\r\n ) {\r\n return this.e.attachFileToOracle({\r\n source: 1,\r\n transactionId,\r\n documentNumber,\r\n variableName,\r\n processVarName,\r\n filePath: mediaPath\r\n });\r\n }\r\n}\r\n","import { eColumnType, IBooleanFieldRecording, IClientLogger, IColumnDefinition, IDateFieldRecording, IField, IGetTableRuleArgs, ILogMessage, INumberFieldRecording, IObjectFieldRecording, IQuoteProduct, IRuleArgs, ISetQuoteProductFieldValueArgs, IStringFieldRecording, IUploadFieldRecording, IUploadValue } from \"@models\";\r\nimport { KPromise } from \"@rules/kpromise\";\r\nimport { eDateUnit } from \"@tools\";\r\n\r\n/*\r\n The js in this file is included with every rule that is run (on client and server and clara plugin).\r\n Only put stuff in here that every rule relies on!\r\n*/\r\n\r\n\r\nlet _tableDb: { [id: string]: any[] } = {};\r\nexport function getTables(e: IRuleArgs, args: IGetTableRuleArgs): Q.IPromise {\r\n _tableDb = _tableDb || {};\r\n if (args.ids.every(id => _tableDb[id] != null)) {\r\n return new KPromise(args.ids.map(id => _tableDb[id]));\r\n } else {\r\n return e.getTables(args).then(tables => {\r\n tables.forEach((t, i) => {\r\n var dateCols: IColumnDefinition[] = t.columns.filter(c => (c.type || c[\"Type\"]) == eColumnType.date);\r\n if (dateCols.length) {\r\n t.data.forEach(row => {\r\n dateCols.forEach(dateCol => {\r\n var dateColName = dateCol.name || dateCol[\"Name\"];\r\n row[dateColName] = new Date(row[dateColName] + \"T00:00:00.000Z\");\r\n });\r\n });\r\n }\r\n _tableDb[args.ids[i]] = t.data;\r\n });\r\n return tables.map(t => t.data);\r\n }) as any;\r\n }\r\n}\r\n\r\nexport function getUploadFieldUrl(e: IRuleArgs, field: IField) {\r\n let value: IUploadValue = field.value;\r\n return e.baseUrl + \"/api/quotes/filefromconfiguratorfield/\" + value.path;\r\n}\r\n\r\nexport function clearTableCache() {\r\n _tableDb = {};\r\n}\r\n\r\nexport function r(v) {\r\n if (v === undefined) v = null;\r\n return v;\r\n}\r\n\r\nlet _globalVariables = {};\r\nexport function declareGlobalVariable(variableName: string, defaultValue: any) {\r\n if (typeof (_globalVariables[variableName]) === \"undefined\") {\r\n _globalVariables[variableName] = defaultValue;\r\n }\r\n}\r\n\r\nexport function setGlobalVariable(variableName: string, value: any) {\r\n _globalVariables[variableName] = value;\r\n}\r\n\r\nexport function getGlobalVariable(variableName: string): any {\r\n return _globalVariables[variableName];\r\n}\r\n\r\nexport function indexOf(haystack: string, needle: string): number {\r\n if (!haystack) return -1;\r\n return haystack.indexOf(needle);\r\n}\r\n\r\nexport function moveItemInArray(array: any[], item: any, index: number) {\r\n let idx = array.indexOf(item);\r\n if (idx < 0) return;\r\n array.splice(idx, 1);\r\n array.splice(index, 0, item);\r\n}\r\n\r\nexport function stringLength(str: string): number {\r\n if (!str) return 0;\r\n return str.length;\r\n}\r\n\r\nexport function strReplace(search: string, replaceWith: string, subject: string, useRegex: boolean = true): string {\r\n if (!search) search = \"\";\r\n if (!replaceWith) replaceWith = \"\";\r\n if (!subject) subject = \"\";\r\n if (useRegex) {\r\n return subject.replace(new RegExp(search, \"gi\"), replaceWith);\r\n }\r\n else {\r\n var esc = search.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\r\n var rgx = new RegExp(esc, 'ig');\r\n return subject.replace(rgx, replaceWith);\r\n }\r\n}\r\n\r\nexport function translateTemplateLiteral(tmpltStr: string, obj: any): string {\r\n // If there are no properties in the object don't bother interpolating \r\n if (!obj) return tmpltStr;\r\n const propsArr = Object.getOwnPropertyNames(obj);\r\n let interpolatedStr = tmpltStr;\r\n propsArr.forEach(propName => {\r\n interpolatedStr = interpolatedStr.replace(\r\n new RegExp(\"\\\\${\" + propName + \"}\", \"gi\"),\r\n obj[propName]\r\n );\r\n });\r\n return interpolatedStr;\r\n}\r\n\r\n\r\n/*\r\n Strmatches is a simplified version of JS's str.match function. Instead of returning an\r\n array of matches, it simply returns true/false depending on if a match is found.\r\n*/\r\nexport function strMatch(search: string, subject: string): boolean {\r\n if (!search) search = \"\";\r\n if (!subject) subject = \"\";\r\n var match = subject.match(search);\r\n return match != null && match.length > 0;\r\n}\r\n\r\nexport function getCharCodeAt(subject: string, index: number): number {\r\n if (!subject) subject = \"\";\r\n return subject.charCodeAt(index);\r\n}\r\n\r\nexport function toUpperCase(str: string): string {\r\n if (!str) return \"\";\r\n return str.toUpperCase();\r\n}\r\n\r\nexport function toLowerCase(str: string): string {\r\n if (!str) return \"\";\r\n return str.toLowerCase();\r\n}\r\n\r\nexport function capitalize(str: string): string {\r\n if (!str) return \"\";\r\n return str.capitalize();\r\n}\r\n\r\nexport function toTitleCase(str: string): string {\r\n if (!str) return \"\";\r\n return str.toPascalCase();\r\n}\r\n\r\nexport function trim(str: string): string {\r\n if (!str) return \"\";\r\n return str.trim();\r\n}\r\n\r\nexport function objToString(v: any): string {\r\n if (typeof v == \"undefined\" || v === null) return \"\";\r\n return v.toString();\r\n}\r\n\r\nexport function stringSubstring(str: string, start: number, end?: number): string {\r\n if (!str) return \"\";\r\n return str.substring(start, end);\r\n}\r\n\r\nexport function isNumeric(obj) {\r\n // Need to check for empty strings and trim the object because isNaN() \"incorrectly\" returns false for\r\n // empty strings, whitespace, and arrays.\r\n return !isNaN(parseFloat(obj)) && isFinite(obj);\r\n}\r\n\r\n// export function sleep(time: number): Q.IPromise {\r\n// let d = Q.defer();\r\n// setTimeout(() => {\r\n// d.resolve(null);\r\n// }, time);\r\n// return d.promise;\r\n// }\r\n\r\nexport function getQuoteProductFieldValue(quoteProduct: IQuoteProduct, fieldName: string) {\r\n let cp = quoteProduct.configuredProduct;\r\n if (!cp) return null;\r\n let field: any = cp.fields.find(f => f.name == fieldName);\r\n if (!field) return null;\r\n if (field.stringValue) return field.stringValue;\r\n if (field.numberValue) return field.numberValue;\r\n if (field.objectValue) return field.objectValue;\r\n if (field.dateValue) return field.dateValue;\r\n return field.booleanValue;\r\n}\r\n\r\n\r\nexport function setQuoteProductFieldValue(args: ISetQuoteProductFieldValueArgs) {\r\n let cp = args.quoteProduct.configuredProduct;\r\n if (cp) {\r\n let field = cp.fields.find(f => f.name == args.fieldName);\r\n if (field) {\r\n if (field.hasOwnProperty(\"stringValue\")) {\r\n (field as IStringFieldRecording).stringValue = args.value;\r\n } else if (field.hasOwnProperty(\"numberValue\")) {\r\n (field as INumberFieldRecording).numberValue = args.value;\r\n } else if (field.hasOwnProperty(\"booleanValue\")) {\r\n (field as IBooleanFieldRecording).booleanValue = args.value;\r\n } else if (field.hasOwnProperty(\"dateValue\")) {\r\n (field as IDateFieldRecording).dateValue = args.value;\r\n } else if (field.hasOwnProperty(\"uploadValue\")) {\r\n (field as IUploadFieldRecording).uploadValue = args.value;\r\n } else if (field.hasOwnProperty(\"objectValue\")) {\r\n (field as IObjectFieldRecording).objectValue = args.value;\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function factorial(value: number): number {\r\n let result = 1;\r\n\r\n for (let i = 2; i <= value; i++) {\r\n result = result * i;\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function padStringLeft(str: any, padChars: string) {\r\n return padChars.substring(str.toString().length) + str;\r\n}\r\n\r\n// Returns a new date with the added amount\r\nexport function dateAdd(date: Date, units: eDateUnit, amount: number): Date {\r\n let newDate = new Date(date.getTime());\r\n if (units == eDateUnit.date) {\r\n newDate.setDate(newDate.getDate() + amount);\r\n } else if (units == eDateUnit.fullYear) {\r\n newDate.setFullYear(newDate.getFullYear() + amount);\r\n } else if (units == eDateUnit.hours) {\r\n newDate.setHours(newDate.getHours() + amount);\r\n } else if (units == eDateUnit.minutes) {\r\n newDate.setMinutes(newDate.getMinutes() + amount);\r\n } else if (units == eDateUnit.month) {\r\n newDate.setMonth(newDate.getMonth() + amount);\r\n } else if (units == eDateUnit.seconds) {\r\n newDate.setSeconds(newDate.getSeconds() + amount);\r\n }\r\n return newDate;\r\n}\r\n\r\nexport function formatDate(d: any, format: string): string {\r\n // Very simple implementation\r\n\r\n let date: Date;\r\n if (typeof d == \"object\") {\r\n date = d;\r\n } else if (typeof d == \"string\") {\r\n date = new Date(Date.parse(d));\r\n } else if (typeof d == \"number\") {\r\n date = new Date(d);\r\n } else {\r\n throw new Error(\"Date is in invalid format: \" + (typeof d));\r\n }\r\n\r\n if (format == null) format = \"short\";\r\n\r\n let fullMonths = [\r\n \"January\",\r\n \"February\",\r\n \"March\",\r\n \"April\",\r\n \"May\",\r\n \"June\",\r\n \"July\",\r\n \"August\",\r\n \"September\",\r\n \"October\",\r\n \"November\",\r\n \"December\"];\r\n \r\n let fullDays = [\r\n \"Sunday\",\r\n \"Monday\",\r\n \"Tuesday\",\r\n \"Wednesday\",\r\n \"Thursday\",\r\n \"Friday\",\r\n \"Saturday\"\r\n ];\r\n\r\n let keys = {\r\n \"fullDate\": (date: Date) => \"$EEEE, $MMMM $d, $yyyy\",\r\n \"longDate\": (date: Date) => \"$MMMM $d, $yyyy\",\r\n \"mediumDate\": (date: Date) => \"$MMM $d, $yyyy\",\r\n \"shortDate\": (date: Date) => \"$M/$d/$yy\",\r\n \"mediumTime\": (date: Date) => \"$h:$mm:$ss $a\",\r\n \"shortTime\": (date: Date) => \"$h:$mm $a\",\r\n \"medium\": (date: Date) => \"$MMM $d, $yy $h:$mm:$ss $a\",\r\n \"short\": (date: Date) => \"$M/$d/$yy $h:$mm $a\",\r\n\r\n \"\\\\$yyyy\": (date: Date) => date.getFullYear(),\r\n \"\\\\$yy\": (date: Date) => date.getFullYear() - 2000,\r\n \"\\\\$dd\": (date: Date) => padStringLeft(date.getDate(), \"00\"),\r\n \"\\\\$d\": (date: Date) => date.getDate(),\r\n \"\\\\$HH\": (date: Date) => padStringLeft(date.getHours(), \"00\"),\r\n \"\\\\$H\": (date: Date) => date.getHours(),\r\n \"\\\\$hh\": (date: Date) => padStringLeft(date.getHours() ? date.getHours() % 12 : 12, \"00\"),\r\n \"\\\\$h\": (date: Date) => date.getHours() ? date.getHours() % 12 : 12,\r\n \"\\\\$mm\": (date: Date) => padStringLeft(date.getMinutes(), \"00\"),\r\n \"\\\\$m\": (date: Date) => date.getMinutes(),\r\n \"\\\\$ss\": (date: Date) => padStringLeft(date.getSeconds(), \"00\"),\r\n \"\\\\$s\": (date: Date) => date.getSeconds(),\r\n \"\\\\$Z\": (date: Date) => date.getTimezoneOffset(),\r\n \"\\\\$a\": (date: Date) => date.getHours() > 12 ? \"PM\" : \"AM\",\r\n \"\\\\$MMMM\": (date: Date) => fullMonths[date.getMonth() % 12],\r\n \"\\\\$MMM\": (date: Date) => fullMonths[date.getMonth() % 12].substr(0, 3),\r\n \"\\\\$MM\": (date: Date) => padStringLeft(date.getMonth() + 1, \"00\"),\r\n \"\\\\$M\": (date: Date) => date.getMonth() + 1,\r\n \"\\\\$EEEE\": (date: Date) => fullDays[date.getDay()],\r\n \"\\\\$EEE\": (date: Date) => fullDays[date.getDay()].substr(0, 3)\r\n };\r\n\r\n for (let key in keys) {\r\n format = format.replace(new RegExp(key, \"g\"), keys[key](date));\r\n }\r\n return format;\r\n}\r\n\r\n// http://stackoverflow.com/questions/736513/how-do-i-parse-a-url-into-hostname-and-path-in-javascript\r\nexport function getLocation(href) {\r\n let match = href.match(/^(https?\\:)\\/\\/(([^:\\/?#]*)(?:\\:([0-9]+))?)(\\/[^?#]*)(\\?[^#]*|)(#.*|)$/);\r\n if (match) {\r\n return {\r\n protocol: match[1],\r\n host: match[2],\r\n hostname: match[3],\r\n port: match[4],\r\n pathname: match[5],\r\n search: match[6],\r\n hash: match[7]\r\n };\r\n }\r\n return null;\r\n}\r\n\r\nexport function getNestedConfigurator(config, e) {\r\n if (typeof config == \"string\") {\r\n return e.kom.getByName(config);\r\n }\r\n\r\n return config;\r\n}\r\n\r\n// http://stackoverflow.com/questions/1714786/querystring-encoding-of-a-javascript-object\r\nexport function toQueryString(obj: any, prefix?: string): string {\r\n let str = [];\r\n for (let p in obj) {\r\n if (obj.hasOwnProperty(p)) {\r\n let k = prefix ? prefix + \"[\" + p + \"]\" : p;\r\n let v = obj[p];\r\n str.push(typeof v == \"object\" ?\r\n toQueryString(v, k) :\r\n encodeURIComponent(k) + \"=\" + encodeURIComponent(v));\r\n }\r\n }\r\n return str.join(\"&\");\r\n}\r\n\r\nexport function roundNumber(num: number, interval: number, mode: string): number {\r\n let roundedNum;\r\n if (mode == \"Math.ceil\") roundedNum = Math.ceil(num / interval);\r\n else if (mode == \"Math.floor\") roundedNum = Math.floor(num / interval);\r\n else roundedNum = Math.round(num / interval);\r\n return parseFloat((interval * roundedNum).toFixed(getPrecision(interval)));\r\n}\r\n\r\nexport function getPrecision(num: number): number {\r\n if(Math.floor(num) === num) return 0;\r\n return num.toString().split(\".\")[1].length || 0;\r\n}\r\n\r\nexport class ClientLogger implements IClientLogger {\r\n public push(msg: ILogMessage) {\r\n if (typeof window !== \"undefined\" && window.console) {\r\n if (String(msg.type) === 'error') {\r\n window.console.error(msg.message);\r\n } else if (String(msg.type) === 'warning') {\r\n window.console.warn(msg.message);\r\n } else if (String(msg.type) === 'info') {\r\n window.console.info(msg.message);\r\n } else {\r\n window.console.log(msg.message);\r\n }\r\n }\r\n }\r\n}\r\nexport function btoa(input: string): string {\r\n\r\n if (typeof window !== \"undefined\" && window.btoa) {\r\n return window.btoa(input);\r\n }\r\n\r\n let str = String (input);\r\n let chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\r\n\r\n for (\r\n var block, charCode, idx = 0, map = chars, output = '';\r\n str.charAt (idx | 0) || (map = '=', idx % 1);\r\n output += map.charAt (63 & block >> 8 - idx % 1 * 8)\r\n ) {\r\n charCode = str.charCodeAt (idx += 3 / 4);\r\n\r\n if (charCode > 0xFF) {\r\n throw \"'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.\";\r\n }\r\n\r\n block = block << 8 | charCode;\r\n }\r\n\r\n return output;\r\n};\r\n\r\nexport function equalsAny(o: any, list: Array): boolean{\r\n for(let n of list){\r\n if (o == n) return true;\r\n }\r\n return false;\r\n}\r\n\r\nexport function navigateToUrl(url: string, newWindow: boolean) {\r\n if (newWindow) {\r\n window.open(url, \"_blank\");\r\n }\r\n else {\r\n window.location.href = url;\r\n }\r\n}\r\n\r\nexport function convertLikeToRegex(sqlLike: string, notLike: boolean) {\r\n // Escape special regex characters\r\n // const escapedLike = sqlLike.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n const escapedLike = sqlLike.replace(/[.*+?${}()|\\\\]/g, '\\\\$&');\r\n \r\n // Replace SQL wildcards with regex equivalents\r\n const regexLike = escapedLike.replace(/%/g, '.*').replace(/_/g, '.');\r\n \r\n // Add regex anchors to match the entire string\r\n const finalRegex = `^${regexLike}$`;\r\n \r\n return new RegExp(finalRegex);\r\n}","import { ICookie } from \"@models\";\r\nimport * as ruleUtils from \"@rules/rule-utils\";\r\n\r\nexport class RestClient {\r\n constructor(private e: any) {\r\n }\r\n \r\n public defaultPortNum = 0; // If 0 then use 80 for http and 443 for https\r\n public basicAuthUser: string;\r\n public basicAuthPass: string;\r\n public baseUrl: string;\r\n public cookies: ICookie[] = [];\r\n\r\n protected processResponse = response => {\r\n if (response.cookies) {\r\n for (let key in response.cookies) {\r\n let existingCookie = this.cookies.find(c => c.name == key);\r\n if (existingCookie) this.cookies.remove(existingCookie);\r\n this.cookies.push({\r\n name: key,\r\n value: response.cookies[key]\r\n });\r\n }\r\n }\r\n }\r\n\r\n public makeCall(params: any) {\r\n if (this.cookies.length) {\r\n if (!params.headers) {\r\n params.headers = [];\r\n }\r\n\r\n params.headers.push({\r\n name: \"Cookie\",\r\n value: this.cookies.map(c => c.name + \"=\" + c.value).join(\"; \")\r\n });\r\n }\r\n\r\n if (!params.headers.find(h => h.name == \"Connection\")) {\r\n params.headers.push({\r\n name: \"Connection\",\r\n value: \"keep-alive\"\r\n });\r\n }\r\n\r\n params.headers.push({\r\n name: \"User-Agent\",\r\n value: \"KBMax v3\"\r\n });\r\n\r\n if (this.baseUrl) {\r\n params.url = this.baseUrl + params.url;\r\n }\r\n\r\n if (!params.headers.find(h => h.name == \"Host\")) {\r\n let l = ruleUtils.getLocation(params.url);\r\n if (l) {\r\n params.headers.push({\r\n name: \"Host\",\r\n value: l.hostname\r\n });\r\n }\r\n }\r\n\r\n let contentType = params.headers.find(h => h.name == \"Content-Type\");\r\n if (!contentType) {\r\n contentType = {\r\n name: \"Content-Type\",\r\n value: \"application/text\"\r\n };\r\n params.headers.push(contentType);\r\n }\r\n if (typeof params.body != \"string\") {\r\n if (contentType.value == \"application/json\") {\r\n params.body = JSON.stringify(params.body);\r\n }\r\n if (contentType.value == \"application/x-www-form-urlencoded\") {\r\n params.body = ruleUtils.toQueryString(params.body);\r\n }\r\n }\r\n\r\n params.headers.push({\r\n name: \"Accept\",\r\n value: contentType.value + \", text/plain, */*\"\r\n });\r\n\r\n if (this.basicAuthUser && !params.authentication) {\r\n params.authentication = {\r\n username: this.basicAuthUser,\r\n password: this.basicAuthPass\r\n };\r\n }\r\n\r\n if (this.defaultPortNum && !params.port) {\r\n params.port = this.defaultPortNum;\r\n }\r\n\r\n return this.e.callRestService(params).then(restResponse => {\r\n this.processResponse(restResponse);\r\n return restResponse;\r\n });\r\n }\r\n}\r\n","export class SalesForceClient {\r\n constructor(private e: any) {\r\n }\r\n\r\n public insert(model: any) {\r\n return this.e.callSfdc({\r\n operation: \"insert\",\r\n params: model\r\n }).then(resp => {\r\n if (resp.statusCode >= 200 && resp.statusCode < 400) {\r\n return JSON.parse(resp.body).id;\r\n }\r\n throw resp.body;\r\n });\r\n }\r\n\r\n public update(model: any) {\r\n return this.e.callSfdc({\r\n operation: \"update\",\r\n params: model\r\n }).then(resp => {\r\n if (resp.statusCode >= 200 && resp.statusCode < 400) {\r\n return model.Id;\r\n }\r\n throw resp.body;\r\n });\r\n }\r\n\r\n public delete(model: any) {\r\n return this.e.callSfdc({\r\n operation: \"delete\",\r\n params: model\r\n }).then(resp => {\r\n if (resp.statusCode >= 200 && resp.statusCode < 400) {\r\n return model.Id;\r\n }\r\n throw resp.body;\r\n });\r\n }\r\n\r\n public query(query: string) {\r\n return this.e.callSfdc({\r\n operation: \"query\",\r\n query\r\n }).then(resp => {\r\n if (resp.statusCode >= 200 && resp.statusCode < 400) {\r\n return JSON.parse(resp.body).records;\r\n }\r\n throw resp.body;\r\n });\r\n }\r\n\r\n public attachByTag(modelId: string, idQuote: number, idTag: number) {\r\n return this.e.attachFileToSfdc({\r\n source: 0,\r\n id: modelId,\r\n idQuote,\r\n idTag\r\n });\r\n }\r\n\r\n public attachMedia(modelId: string, mediaPath: string) {\r\n return this.e.attachFileToSfdc({\r\n source: 1,\r\n id: modelId,\r\n filePath: mediaPath\r\n });\r\n }\r\n\r\n public attachQuoteProduct(modelId: string, idQuote: number, idTag: number, idQuoteProduct: number) {\r\n return this.e.attachFileToSfdc({\r\n source: 2,\r\n id: modelId,\r\n idQuote,\r\n idTag,\r\n idQuoteProduct\r\n });\r\n }\r\n}\r\n","/*\r\n This file is a shim to make rule utilities available globally. We concat it with the bundle\r\n after the bundle is already made.\r\n*/\r\nvar handle = rules.handle;\r\nvar getTables = rules.getTables;\r\nvar r = rules.r;\r\nvar indexOf = rules.indexOf;\r\nvar stringLength = rules.stringLength;\r\nvar strReplace = rules.strReplace;\r\nvar getCharCodeAt = rules.getCharCodeAt;\r\nvar toUpperCase = rules.toUpperCase;\r\nvar toLowerCase = rules.toLowerCase;\r\nvar capitalize = rules.capitalize;\r\nvar toTitleCase = rules.toTitleCase;\r\nvar trim = rules.trim;\r\nvar objToString = rules.objToString;\r\nvar stringSubstring = rules.stringSubstring;\r\nvar isNumeric = rules.isNumeric;\r\nvar sleep = rules.sleep;\r\nvar getQuoteProductFieldValue = rules.getQuoteProductFieldValue;\r\nvar setQuoteProductFieldValue = rules.setQuoteProductFieldValue;\r\nvar factorial = rules.factorial;\r\nvar padStringLeft = rules.padStringLeft;\r\nvar dateAdd = rules.dateAdd;\r\nvar formatDate = rules.formatDate;\r\nvar getLocation = rules.getLocation;\r\nvar getNestedConfigurator = rules.getNestedConfigurator;\r\nvar toQueryString = rules.toQueryString;\r\n\r\nvar _if = rules._if;\r\nvar _while = rules._while;\r\nvar _for = rules._for;\r\nvar Loop = rules.Loop;\r\n\r\nvar RestClient = rules.RestClient;\r\nvar OracleCpqClient = rules.OracleCpqClient;\r\nvar SalesForceClient = rules.SalesForceClient;\r\nvar KineticClient = rules.KineticClient;"]}