{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/store/index.ts","webpack:///./src/services/auth.service.ts","webpack:///./src/services/api.service.ts","webpack:///./src/services/api.client.ts","webpack:///./src/utils/calculations-invoice-merger.ts","webpack:///./src/models/Federation.ts","webpack:///./src/App.vue?db16","webpack:///./src/config/configProvider.ts","webpack:///./src/config/config.ts","webpack:///./src/authConfig.ts","webpack:///./src/utils/missing-calculations.ts","webpack:///./src/types/order-line-type.ts","webpack:///./src/utils/installCompositionApi.ts","webpack:///./src/App.vue?e38f","webpack:///./src/App.vue","webpack:///./src/App.vue?198c","webpack:///./src/App.vue?bb6c","webpack:///./src/registerServiceWorker.ts","webpack:///./src/router/index.ts","webpack:///./src/plugins/vuetify.ts","webpack:///./src/router/navigationClient.ts","webpack:///./src/plugins/msalPlugin.ts","webpack:///./src/main.ts","webpack:///./src/utils/format-currency.ts","webpack:///./src/utils/get-all-parent-nho-numbers.ts","webpack:///./src/utils/format-date.ts","webpack:///./src/utils/to-query-string.ts","webpack:///./src/utils/create-array.ts","webpack:///./src/utils/child-org-helper.ts","webpack:///./src/types/invoice-data.ts","webpack:///./src/models/Calculation.ts","webpack:///./src/types/contingent-offset.ts"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","installedCssChunks","jsonpScriptSrc","p","exports","module","l","e","promises","cssChunks","Promise","resolve","reject","href","fullhref","existingLinkTags","document","getElementsByTagName","tag","dataHref","getAttribute","rel","existingStyleTags","linkTag","createElement","type","onload","onerror","event","request","target","src","err","Error","code","parentNode","removeChild","head","appendChild","then","installedChunkData","promise","onScriptComplete","script","charset","timeout","nc","setAttribute","error","clearTimeout","chunk","errorType","realSrc","message","name","undefined","setTimeout","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","console","jsonpArray","window","oldJsonpFunction","slice","Getters","Mutations","Actions","Vue","use","Vuex","vuexLocal","VuexPersistence","storage","localStorage","reducer","state","openCalculation","Store","associations","calculations","toastMessages","openContingent","getters","getOpenContingent","mutations","setFederations","payload","setCalculations","setOpenCalculation","addToastMessage","setOpenContingent","actions","getContingent","input","commit","apiClient","year","nhoNumber","contingent","SET_OPEN_CONTINGENT","catch","includes","ADD_TOAST_MESSAGE","fetchFederations","GetFederations","federations","SET_FEDERATIONS","fetchCalculations","GetCalculations","SET_CALCULATIONS","copyCalculations","yearRange","dispatch","copiedCalculations","copiedInvoiceData","FETCH_CALCULATIONS","calcText","from","to","log","errorMessage","response","plugins","plugin","_token","ref","_adGroups","msGraphScopes","scopes","AuthService","config","auth","scope","split","parseJwt","token","parsedJwt","JSON","parse","atob","isTokenValid","tokenExpirationInMilliseconds","exp","isValid","Date","now","accounts","msalInstance","getAllAccounts","getActiveAccount","this","getAdGroups","isAdmin","isUser","acquireTokenSilent","account","msGraphToken","accessToken","url","fetch","method","headers","Accept","Authorization","ConsistencyLevel","groupResponse","json","map","group","id","tokenResponse","loginRedirect","logoutRedirect","setActiveAccount","_instance","APIService","baseURL","httpClient","axios","urlPath","getAccessToken","resp","status","statusText","post","delete","interceptors","authService","authToken","ApiService","api","Get","SaveCalculation","calculation","prepareForServer","GetCalculation","calculationType","membershipType","queryString","toQueryString","x","convertFromServer","calculateContingent","calculationFields","crmQueryString","calculationYear","endpoint","useCrmYearReport","getInvoiceData","addOrUpdateInvoiceData","item","InvoiceDataUtils","deleteInvoiceData","orderLineType","getContingentOffsets","offset","options","mock","recalculate","usePercentage","ContingentOffsetDataUtils","randomList","getOffsetDistributionPerMo","recalculateContingentOffset","recalculateContingentOffsets","nhoNumbers","mergeInvoiceDataAndCalculations","invoiceData","matchingCalc","filter","OrderLineTypeUtils","toCalculationType","isActive","randomItem","faker","datatype","uuid","toString","random","word","shortName","organizationType","organizationTypeValue","organizationNumber","federationParentNumber","max","createArray","customFilter","queryText","toLowerCase","number","searchText","indexOf","getOrganizationNumberByMo","find","org","AssociationUtils","dotenv","ConfigProvider","apiUri","clientId","idDomain","CONFIG","startsWith","envName","substr","envValue","process","Configuration","devServer","public","msalConfig","authority","redirectUri","postLogoutRedirectUri","cache","cacheLocation","PublicClientApplication","missingCalculations","CalculationUtils","checkExistance","contingentExists","serviceFeeExists","orgNumber","createUniqueItem","serviceFee","missingInvoiceData","federation","getOrderLineTypeFromCalculationType","orderLineTypeWithDiscountContingent","orderLineTypeWithoutDiscountContingent","itemWithoutDiscountContingent","itemWithDiscountContingent","orderLineTypeWithDiscountServiceFee","orderLineTypeWithoutDiscountServiceFee","itemWithoutDiscountServiceFee","itemWithDiscountServiceFee","OrderLineType","Contingent","ContingentDiscount","ServiceFee","ServiceFeeDiscount","VueCompositionApi","_vm","_h","$createElement","_c","_self","attrs","staticRenderFns","defineComponent","created","$store","watch","lastMessage","$toast","beforeUpdate","isAuthenticated","methods","mapActions","FETCH_FEDERATIONS","component","VApp","register","ready","registered","cached","updatefound","updated","offline","VueRouter","routes","path","meta","requireAuth","requireAdmin","props","router","base","beforeEach","_","next","handleRedirectPromise","login","matched","some","record","replace","Vuetify","icons","iconfont","theme","themes","light","primary","secondary","accent","warning","success","CustomNavigationClient","relativePath","location","origin","noHistory","NavigationClient","msalPlugin","vue","inProgress","InteractionStatus","Startup","reactive","instance","$msal","Toast","position","productionTip","$http","Axios","navigationClient","setNavigationClient","addEventCallback","eventType","EventType","LOGIN_SUCCESS","app","store","vuetify","render","h","App","$mount","anyWindow","Cypress","formatCurrency","val","hideCurrencyLabel","stringValue","float","parseFloat","formatter","Intl","NumberFormat","style","currency","maximumFractionDigits","formatResult","format","substring","getOrg","getAllParentNhoNumbers","currentOrg","formatDate","dateOrDateString","dateStringToDisplay","dateToDisplay","dateString","date","localeDate","toLocaleDateString","time","toLocaleTimeString","formattedTime","join","params","keys","arr","len","mapper","Array","fill","getChildFederations","organizations","childFederations","priorityClassGroupName","priorityClass","getSortedChildFederations","childCalculations","otherGroupName","anotherMotherGroupName","existingChildCalculations","otherChildCalculations","priorityClasses","forEach","childNhoNumber","childPriorityClass","sorted","Set","sort","reverse","header","childOrgNumbers","childrenCalculationsWithAnotherMother","calc","lastChanged","newItem","checkEquality","y","xn1","xn2","items","defaultItem","federationName","productNumber","project","department","filterInvoiceData","orderLineTypes","showOnlyMissingRows","filteredInvoiceData","invoice","fOrg","fName","trim","calculationTypes","contingentExistance","serviceFeeExistance","associationName","customCalculationText","hasUnsavedChanges","blocks","childOrganizationCalculations","hasChildCalculation","childMo","filterCalculations","filteredCalculations","types","membershipTypes","showDeactivated","parseInt","fCalcName","fCalcNumber","index","blockData","blockId","stringify","calculationDto","blockIndex","isExpanded","axContingent","difference","Math","abs","percentageDifference","associationsText","contingentTotal","axTotal","differenceAsPercentage","crmInvoice","contingentResponse","filterOffsets","offsets","filteredOffsets","nhoNumberTerms","getSearchTerms","isMatchOnMultipleTerms","moTerms","fAssociations","responseTerms","fContingentResponse","kontingent","tekst","terms","text","every","term","isSearchMatch","replaceAll","query","isNegativeSearch"],"mappings":"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","file":"js/app.bc6fe918.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded CSS chunks\n \tvar installedCssChunks = {\n \t\t\"app\": 0\n \t}\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"js/\" + ({}[chunkId]||chunkId) + \".\" + {\"chunk-d2401d20\":\"9126e740\",\"chunk-0f7b23c2\":\"97764f5c\",\"chunk-0ee0fc2d\":\"4e108a4d\",\"chunk-11d0a89a\":\"e172b524\",\"chunk-db2145ca\":\"f592cda9\",\"chunk-1fe872d0\":\"9a913205\",\"chunk-55c207d4\":\"83f17819\",\"chunk-609ea23a\":\"460e0454\",\"chunk-6ff44ec4\":\"33dcbb5a\",\"chunk-487a28fc\":\"fdc589cd\"}[chunkId] + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// mini-css-extract-plugin CSS loading\n \t\tvar cssChunks = {\"chunk-d2401d20\":1,\"chunk-0f7b23c2\":1,\"chunk-0ee0fc2d\":1,\"chunk-11d0a89a\":1,\"chunk-db2145ca\":1,\"chunk-1fe872d0\":1,\"chunk-55c207d4\":1,\"chunk-609ea23a\":1,\"chunk-6ff44ec4\":1,\"chunk-487a28fc\":1};\n \t\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n \t\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n \t\t\tpromises.push(installedCssChunks[chunkId] = new Promise(function(resolve, reject) {\n \t\t\t\tvar href = \"css/\" + ({}[chunkId]||chunkId) + \".\" + {\"chunk-d2401d20\":\"354aa519\",\"chunk-0f7b23c2\":\"e8debe4c\",\"chunk-0ee0fc2d\":\"74b05431\",\"chunk-11d0a89a\":\"d73cf0b4\",\"chunk-db2145ca\":\"f19534df\",\"chunk-1fe872d0\":\"1f63ce1f\",\"chunk-55c207d4\":\"eb5ec938\",\"chunk-609ea23a\":\"94bb2747\",\"chunk-6ff44ec4\":\"32afe619\",\"chunk-487a28fc\":\"d94188b4\"}[chunkId] + \".css\";\n \t\t\t\tvar fullhref = __webpack_require__.p + href;\n \t\t\t\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n \t\t\t\tfor(var i = 0; i < existingLinkTags.length; i++) {\n \t\t\t\t\tvar tag = existingLinkTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n \t\t\t\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return resolve();\n \t\t\t\t}\n \t\t\t\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n \t\t\t\tfor(var i = 0; i < existingStyleTags.length; i++) {\n \t\t\t\t\tvar tag = existingStyleTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\");\n \t\t\t\t\tif(dataHref === href || dataHref === fullhref) return resolve();\n \t\t\t\t}\n \t\t\t\tvar linkTag = document.createElement(\"link\");\n \t\t\t\tlinkTag.rel = \"stylesheet\";\n \t\t\t\tlinkTag.type = \"text/css\";\n \t\t\t\tlinkTag.onload = resolve;\n \t\t\t\tlinkTag.onerror = function(event) {\n \t\t\t\t\tvar request = event && event.target && event.target.src || fullhref;\n \t\t\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + request + \")\");\n \t\t\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n \t\t\t\t\terr.request = request;\n \t\t\t\t\tdelete installedCssChunks[chunkId]\n \t\t\t\t\tlinkTag.parentNode.removeChild(linkTag)\n \t\t\t\t\treject(err);\n \t\t\t\t};\n \t\t\t\tlinkTag.href = fullhref;\n\n \t\t\t\tvar head = document.getElementsByTagName(\"head\")[0];\n \t\t\t\thead.appendChild(linkTag);\n \t\t\t}).then(function() {\n \t\t\t\tinstalledCssChunks[chunkId] = 0;\n \t\t\t}));\n \t\t}\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import Vue from \"vue\";\nimport Vuex from \"vuex\";\nimport VuexPersistence from \"vuex-persist\";\nimport { Federation } from \"@/models/Federation\";\nimport { Calculation } from \"@/models/Calculation\";\nimport apiClient from \"@/services/api.client\";\nimport { AxiosError } from \"axios\";\nimport { YearRange } from \"@/types\";\nimport ContingentPayload from \"@/types/payloads/contingent-payload\";\nimport ContingentErrorResponse from \"@/types/responses/contingent-response\";\n\nVue.use(Vuex);\n\nexport enum Getters {\n ASSOCIATIONS = \"associations\",\n CALCULATIONS = \"calculations\",\n OPEN_CALCULATION = \"openCalculation\",\n TOAST_MESSAGES = \"toastMessages\",\n OPEN_CONTINGENT = \"getOpenContingent\",\n}\n\nexport enum Mutations {\n SET_OPEN_CALCULATION = \"setOpenCalculation\",\n SET_CALCULATIONS = \"setCalculations\",\n SET_FEDERATIONS = \"setFederations\",\n SET_OPEN_CONTINGENT = \"setOpenContingent\",\n ADD_TOAST_MESSAGE = \"addToastMessage\",\n}\n\nexport enum Actions {\n FETCH_FEDERATIONS = \"fetchFederations\",\n FETCH_CALCULATIONS = \"fetchCalculations\",\n COPY_CALCULATIONS = \"copyCalculations\",\n GET_CONTINGENT = \"getContingent\",\n}\n\nexport interface State {\n associations: Array | undefined;\n calculations: Array | undefined;\n openCalculation: Calculation | undefined;\n openContingent: ContingentErrorResponse | undefined;\n toastMessages: Array;\n}\n\nconst vuexLocal = new VuexPersistence({\n storage: window.localStorage,\n reducer: (state: State) => ({\n openCalculation: state.openCalculation,\n }), // This reducer will make sure that just user data is stored between sessions.\n});\n\nexport default new Vuex.Store({\n state: {\n associations: undefined,\n calculations: undefined,\n openCalculation: undefined,\n toastMessages: [],\n openContingent: undefined,\n } as State,\n getters: {\n associations: (state) => {\n return state.associations;\n },\n calculations: (state) => {\n return state.calculations;\n },\n openCalculation: (state) => {\n return state.openCalculation;\n },\n getOpenContingent: (state) => {\n return state.openContingent;\n },\n toastMessages: (state) => state.toastMessages,\n },\n // Mutations cannot be async\n mutations: {\n setFederations(state, payload) {\n state.associations = payload;\n },\n setCalculations(state, payload) {\n state.calculations = payload;\n },\n setOpenCalculation(state, payload) {\n state.openCalculation = payload;\n },\n addToastMessage(state, message) {\n state.toastMessages = [...state.toastMessages, message];\n },\n setOpenContingent(state, payload) {\n state.openContingent = payload;\n },\n },\n // Actions can be async\n actions: {\n getContingent({ commit }, input: ContingentPayload) {\n return new Promise((resolve) => {\n apiClient\n .getContingent(input.year, input.nhoNumber)\n .then((contingent) => {\n commit(Mutations.SET_OPEN_CONTINGENT, contingent);\n resolve(\"success\");\n })\n .catch((error) => {\n if (error.message.includes(\"404\")) {\n commit(\n Mutations.ADD_TOAST_MESSAGE,\n `Fant ingen kontingent for nhonr ${input.nhoNumber} i ${input.year}`\n );\n } else {\n commit(\n Mutations.ADD_TOAST_MESSAGE,\n \"Klarte ikke å hente kontingent\"\n );\n }\n });\n });\n },\n fetchFederations({ commit }) {\n apiClient\n .GetFederations()\n .then((federations) => commit(Mutations.SET_FEDERATIONS, federations))\n .catch(() =>\n commit(Mutations.ADD_TOAST_MESSAGE, \"Klarte ikke å hente foreninger\")\n );\n },\n fetchCalculations({ commit }) {\n return new Promise((resolve) => {\n apiClient\n .GetCalculations()\n .then((calculations) => {\n commit(Mutations.SET_CALCULATIONS, calculations);\n resolve(\"success\");\n })\n .catch(() =>\n commit(\n Mutations.ADD_TOAST_MESSAGE,\n \"Klarte ikke å hente kalkulasjoner\"\n )\n );\n });\n },\n copyCalculations({ dispatch }, yearRange: YearRange) {\n return new Promise((resolve, reject) => {\n apiClient\n .copyCalculations(yearRange)\n .then(({ copiedCalculations, copiedInvoiceData }) => {\n dispatch(Actions.FETCH_CALCULATIONS);\n if (copiedCalculations > 0 || copiedInvoiceData > 0) {\n const calcText =\n copiedCalculations === 1 ? \"kalkulasjon\" : \"kalkulasjoner\";\n resolve(\n `Kopierte ${copiedCalculations} ${calcText} og ${copiedInvoiceData} faktureringsdata fra ${yearRange.from} til ${yearRange.to}.`\n );\n } else {\n resolve(\n \"Ingen kalkulasjoner eller faktureringsdata ble kopiert da de allerede eksisterer.\"\n );\n }\n })\n .catch((error: AxiosError) => {\n console.log(error);\n const errorMessage =\n error.response?.data[0].errorMessage ??\n \"Klarte ikke å kopiere data.\";\n reject(errorMessage);\n });\n });\n },\n },\n plugins: [vuexLocal.plugin],\n});\n","import config from \"@/config/config\";\r\nimport { msalInstance } from \"@/authConfig\";\r\nimport { AccountInfo } from \"@azure/msal-browser\";\r\nimport { ref } from \"@vue/composition-api\";\r\n\r\nconst _token = ref(\"\");\r\nconst _adGroups = ref>([]);\r\nconst msGraphScopes = {\r\n scopes: [\"group.read.all\", \"user.read\", \"directory.accessasuser.all\"],\r\n};\r\n\r\nclass AuthService {\r\n private static _instance: AuthService;\r\n\r\n public static get Instance() {\r\n return this._instance || (this._instance = new this());\r\n }\r\n\r\n public scopes = {\r\n scopes: config.auth.scope.split(\" \"),\r\n };\r\n private parseJwt = (token: string) => {\r\n try {\r\n const parsedJwt = JSON.parse(atob(token.split(\".\")[1]));\r\n return parsedJwt;\r\n } catch (e) {\r\n return null;\r\n }\r\n };\r\n\r\n public isTokenValid = (token: string) => {\r\n const parsedJwt = this.parseJwt(token);\r\n if (!token || parsedJwt == null) {\r\n return false;\r\n }\r\n\r\n const tokenExpirationInMilliseconds = parsedJwt.exp * 1000;\r\n const isValid = tokenExpirationInMilliseconds > Date.now();\r\n\r\n return isValid;\r\n };\r\n\r\n public isAuthenticated(): boolean {\r\n const accounts = msalInstance.getAllAccounts();\r\n if (accounts.length > 0) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n public getUser(): AccountInfo | null {\r\n return msalInstance.getActiveAccount();\r\n }\r\n\r\n public async isAdmin(): Promise {\r\n await this.getAdGroups();\r\n if (!_adGroups || !_adGroups.value) {\r\n return false;\r\n }\r\n const isAdmin = _adGroups.value.includes(\r\n \"287e4ff2-acc7-4264-938d-b2b7ea75d9a0\"\r\n );\r\n return isAdmin;\r\n }\r\n\r\n public async isUser(): Promise {\r\n await this.getAdGroups();\r\n if (!_adGroups || !_adGroups.value) {\r\n return false;\r\n }\r\n const isUser = _adGroups.value.includes(\r\n \"d6b5277b-e0a8-4d09-ac90-9b1186a064d0\"\r\n );\r\n return isUser;\r\n }\r\n\r\n public async getAdGroups(): Promise {\r\n if (!_adGroups || !_adGroups.value || _adGroups.value.length === 0) {\r\n const msGraphToken = (\r\n await msalInstance.acquireTokenSilent({\r\n ...msGraphScopes,\r\n account: msalInstance.getActiveAccount() ?? undefined,\r\n })\r\n ).accessToken;\r\n\r\n const url = `https://graph.microsoft.com/v1.0/me/transitiveMemberOf/microsoft.graph.group?$top=200&$count=true&$filter=securityEnabled eq true`;\r\n const groupResponse = await fetch(url, {\r\n method: \"GET\",\r\n headers: {\r\n Accept: \"Application/json, */*\",\r\n Authorization: `Bearer ${msGraphToken}`,\r\n ConsistencyLevel: \"eventual\",\r\n },\r\n });\r\n const data = await groupResponse.json();\r\n _adGroups.value = data.value.map((group: any) => group.id);\r\n }\r\n }\r\n\r\n public async getAccessToken(): Promise {\r\n if (_token.value && this.isTokenValid(_token.value)) {\r\n return _token.value;\r\n }\r\n\r\n const tokenResponse = await msalInstance.acquireTokenSilent({\r\n scopes: config.auth.scope.split(\" \"),\r\n account: msalInstance.getActiveAccount() ?? undefined,\r\n });\r\n _token.value = tokenResponse.accessToken;\r\n return tokenResponse.accessToken;\r\n }\r\n public setToken(token: string): void {\r\n _token.value = token;\r\n }\r\n\r\n public async login(): Promise {\r\n return await msalInstance.loginRedirect(this.scopes);\r\n }\r\n\r\n public async logout(): Promise {\r\n return msalInstance.logoutRedirect().then(() => {\r\n msalInstance.setActiveAccount(null);\r\n });\r\n }\r\n}\r\n\r\nexport default AuthService.Instance;\r\n","/* eslint-disable no-mixed-spaces-and-tabs */\nimport axios, { AxiosInstance, AxiosResponse } from \"axios\";\nimport authService from \"./auth.service\";\n\nexport class APIService {\n public httpClient: AxiosInstance;\n public constructor(baseURL: string) {\n this.httpClient = axios.create({\n baseURL,\n });\n }\n\n public async Get(urlPath: string): Promise {\n await this.getAccessToken();\n const resp = await this.httpClient.get(urlPath);\n if (resp.status != 200)\n throw Error(\n `${resp.config.url} returned status code ${resp.status} with the following message: ${resp.statusText}`\n );\n\n return resp;\n }\n\n public async post

(urlPath: string, data: P): Promise {\n await this.getAccessToken();\n\n const resp = await this.httpClient.post(urlPath, data);\n if (resp.status != 200)\n throw Error(\n `${resp.config.url} returned status code ${resp.status} with the following message: ${resp.statusText}`\n );\n\n return resp;\n }\n\n public async delete(urlPath: string): Promise {\n await this.getAccessToken();\n\n const resp = await this.httpClient.delete(urlPath);\n if (resp.status != 200)\n throw Error(\n `${resp.config.url} returned status code ${resp.status} with the following message: ${resp.statusText}`\n );\n\n return resp;\n }\n private async getAccessToken(): Promise {\n this.httpClient.interceptors.request.use(\n async (config) => {\n const authToken = await authService.getAccessToken();\n config.headers.Authorization = `Bearer ${authToken}`;\n return config;\n },\n (err) => {\n console.log(\"Call failed with error: \", err);\n }\n );\n }\n}\n","import { APIService } from \"./api.service\";\nimport {\n CalculationDto,\n Calculation,\n convertFromServer,\n prepareForServer,\n} from \"@/models/Calculation\";\nimport config from \"@/config/config\";\nimport { Federation } from \"@/models/Federation\";\nimport {\n CalculationFields,\n ContingentOffset,\n CalculationResponse,\n InvoiceData,\n OrderLineType,\n YearRange,\n} from \"@/types\";\nimport { AxiosResponse } from \"axios\";\nimport { InvoiceDataUtils } from \"@/types/invoice-data\";\nimport { toQueryString } from \"@/utils\";\nimport { ContingentOffsetDataUtils } from \"@/types/contingent-offset\";\nimport ContingentResponse from \"@/types/responses/contingent-response\";\n\nconst ApiService = new APIService(config.api.url);\n\ntype Options = {\n mock: boolean;\n recalculate: boolean;\n usePercentage?: boolean;\n};\n\nexport default {\n async GetFederations(): Promise> {\n const response = await ApiService.Get(\"/api/federation\");\n return response.data;\n },\n async SaveCalculation(calculation: Calculation): Promise> {\n return ApiService.post(\"/api/calculation\", prepareForServer(calculation));\n },\n async GetCalculation(\n nhoNumber: number,\n year: string,\n calculationType: string,\n membershipType: number\n ): Promise {\n const queryString = toQueryString({\n nhoNumber: nhoNumber,\n year: year,\n type: calculationType,\n membershipType: membershipType,\n });\n const response = await ApiService.Get(\n `api/calculation/byyear?${queryString}`\n );\n return response.data;\n },\n async GetCalculations(): Promise> {\n const response = await ApiService.Get(\"/api/calculation/all\");\n return (response.data as Array).map((x) =>\n convertFromServer(x)\n );\n },\n async calculateContingent(\n calculationFields: CalculationFields\n ): Promise {\n const crmQueryString = toQueryString({\n year: calculationFields.calculationYear,\n nhoNumber: calculationFields.nhoNumber,\n });\n const endpoint = calculationFields.useCrmYearReport\n ? `/api/contingent/calculate-crm-report?${crmQueryString}`\n : \"/api/contingent\";\n\n const response = await ApiService.post(\n endpoint,\n calculationFields\n );\n return response.data;\n },\n async copyCalculations(yearRange: YearRange): Promise<{\n copiedCalculations: number;\n copiedInvoiceData: number;\n }> {\n const response = await ApiService.post(\"/api/calculation/copy\", yearRange);\n return response.data;\n },\n async getInvoiceData(): Promise {\n const response = await ApiService.Get(\"/api/InvoiceData/all\");\n return response.data;\n },\n async addOrUpdateInvoiceData(item: InvoiceData): Promise {\n const response = await ApiService.post(\n \"/api/InvoiceData\",\n InvoiceDataUtils.prepareForServer(item)\n );\n return response.data;\n },\n async deleteInvoiceData(\n nhoNumber: number,\n orderLineType: OrderLineType\n ): Promise {\n const queryString = toQueryString({\n nhoNumber: nhoNumber,\n orderLineType: orderLineType,\n });\n const urlPath = `/api/InvoiceData/delete?${queryString}`;\n const response = await ApiService.delete(urlPath);\n return response.data;\n },\n async getContingentOffsets(\n year: number,\n offset: number | string,\n options: Options = {\n mock: false,\n recalculate: false,\n usePercentage: false,\n }\n ): Promise {\n if (options.mock) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(ContingentOffsetDataUtils.randomList());\n }, 1000);\n });\n }\n const response = await ApiService.post(\n `/api/ContingentOffset/above?year=${year}&offset=${\n offset == \"\" ? 0 : offset\n }&usePercentage=${options.usePercentage}&recalculate=${\n options.recalculate\n }`,\n null\n );\n return response.data;\n },\n async getOffsetDistributionPerMo(\n year: number,\n offset: number | string,\n options: Options = {\n mock: false,\n recalculate: false,\n usePercentage: false,\n }\n ): Promise {\n const response = await ApiService.Get(\n `/api/ContingentOffset/offsets-per-mo?year=${year}&offset=${\n offset == \"\" ? 0 : offset\n }&usePercentage=${options.usePercentage}&recalculate=${\n options.recalculate\n }`\n );\n return response.data;\n },\n async recalculateContingentOffset(\n year: number,\n nhoNumber: number | null\n ): Promise {\n const response = await ApiService.post(\n `/api/ContingentOffset/recalculate?nhoNumber=${nhoNumber}&year=${year}`,\n null\n );\n return response.data;\n },\n async recalculateContingentOffsets(\n year: number,\n nhoNumbers: number[]\n ): Promise {\n const response = await ApiService.post(\n `/api/ContingentOffset/recalculate-multiple?year=${year}`,\n nhoNumbers\n );\n return response.data;\n },\n async getContingent(\n year: number,\n nhoNumber: number\n ): Promise {\n const response = await ApiService.Get(\n `/api/contingent?year=${year}&nhoNumber=${nhoNumber}`\n );\n return response.data;\n },\n};\n","import { Calculation } from \"@/models/Calculation\";\nimport { InvoiceData } from \"@/types\";\nimport { OrderLineTypeUtils } from \"@/types/order-line-type\";\n\nconst mergeInvoiceDataAndCalculations = (\n invoiceData: InvoiceData[],\n calculations: Calculation[]\n): InvoiceData[] => {\n return invoiceData.map((data: InvoiceData) => {\n const { nhoNumber, orderLineType } = data;\n\n const matchingCalc = calculations\n .filter(\n (c) =>\n c.nhoNumber === nhoNumber &&\n c.calculationType ===\n OrderLineTypeUtils.toCalculationType(orderLineType)\n )\n .shift();\n\n if (matchingCalc === undefined)\n return {\n ...data,\n isActive: true,\n };\n\n return {\n ...data,\n isActive: matchingCalc.isActive,\n };\n });\n};\n\nexport default mergeInvoiceDataAndCalculations;\n","import { createArray } from \"@/utils\";\nimport { faker } from \"@faker-js/faker\";\nimport { random } from \"lodash\";\n\nexport interface Federation {\n id: string;\n name: string;\n shortName?: string;\n organizationType?: string;\n organizationTypeValue?: number;\n nhoNumber: number;\n organizationNumber: number;\n federationParentNumber?: number;\n childFederations?: Array;\n}\n\nconst randomItem = (): Federation => ({\n id: faker.datatype.uuid.toString(),\n name: faker.random.word(),\n shortName: faker.random.word(),\n organizationType: faker.random.word(),\n organizationTypeValue: random(1, 10),\n nhoNumber: random(1000, 9999),\n organizationNumber: random(1000, 9999),\n federationParentNumber: random(1000, 9999),\n});\n\nconst randomList = (max = 5): number[] =>\n createArray(random(1, max), randomItem);\n\nconst customFilter = (item: Federation, queryText: string): boolean => {\n if (\n typeof item === \"undefined\" ||\n typeof item.name === \"undefined\" ||\n typeof item.nhoNumber === \"undefined\" ||\n typeof queryText === \"undefined\"\n ) {\n return false;\n }\n\n const name = item.name.toLowerCase();\n const number = item.nhoNumber.toString().toLowerCase();\n const searchText = queryText.toLowerCase();\n\n return name.indexOf(searchText) > -1 || number.indexOf(searchText) > -1;\n};\n\nconst getOrganizationNumberByMo = (\n associations: Federation[],\n nhoNumber: number\n): number =>\n associations.find((org: Federation) => org.nhoNumber == nhoNumber)\n ?.organizationNumber ?? -1;\n\nexport const AssociationUtils = {\n randomItem,\n randomList,\n customFilter,\n getOrganizationNumberByMo,\n};\n","export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../node_modules/cache-loader/dist/cjs.js??ref--1-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=scss&\"","import dotenv from \"dotenv\";\ndotenv.config();\n\nexport default class ConfigProvider {\n public static get CONFIG(): any {\n return {\n apiUri: \"$VUE_APP_API_URI\",\n clientId: \"$VUE_APP_CLIENT_ID\",\n idDomain: \"$VUE_APP_ID_DOMAIN\",\n scope: \"$VUE_APP_SCOPE\",\n };\n }\n\n public static value(name: string): string {\n if (!(name in this.CONFIG)) {\n return \"\";\n }\n\n const value = this.CONFIG[name];\n\n if (!value) {\n return \"\";\n }\n\n if (value.startsWith(\"$VUE_APP_\")) {\n const envName = value.substr(1);\n const envValue = process.env[envName];\n if (envValue) {\n return envValue;\n } else {\n return \"\";\n }\n } else {\n return value;\n }\n }\n}\n","import Configuration from \"./configProvider\";\n\nexport default {\n api: {\n url: Configuration.value(\"apiUri\"),\n },\n auth: {\n idDomain: Configuration.value(\"idDomain\"),\n clientId: Configuration.value(\"clientId\"),\n scope: Configuration.value(\"scope\"),\n },\n devServer: {\n public: \"localhost\",\n },\n};\n","import config from \"@/config/config\";\nimport { PublicClientApplication } from \"@azure/msal-browser\";\n\nexport const msalConfig = {\n auth: {\n clientId: config.auth.clientId,\n authority: config.auth.idDomain,\n redirectUri: \"/\",\n postLogoutRedirectUri: \"/\",\n },\n cache: {\n cacheLocation: \"localStorage\",\n },\n};\n\nexport const msalInstance = new PublicClientApplication(msalConfig);\n","import { Calculation, CalculationUtils } from \"@/models/Calculation\";\r\nimport { Federation, AssociationUtils } from \"@/models/Federation\";\r\nimport { InvoiceData } from \"@/types\";\r\nimport { InvoiceDataUtils } from \"@/types/invoice-data\";\r\n\r\nconst missingCalculations = (\r\n calculations: Calculation[],\r\n associations: Federation[],\r\n year: number\r\n): Calculation[] => {\r\n const result = [];\r\n\r\n for (const org of associations) {\r\n const [contingentExists, serviceFeeExists] =\r\n CalculationUtils.checkExistance(calculations, year, org);\r\n\r\n const orgNumber = AssociationUtils.getOrganizationNumberByMo(\r\n associations,\r\n org.nhoNumber\r\n );\r\n if (!contingentExists) {\r\n const contingent = CalculationUtils.createUniqueItem(\r\n year,\r\n org.nhoNumber,\r\n org.name,\r\n \"Contingent\",\r\n orgNumber\r\n );\r\n result.push(contingent);\r\n }\r\n\r\n if (!serviceFeeExists) {\r\n const serviceFee = CalculationUtils.createUniqueItem(\r\n year,\r\n org.nhoNumber,\r\n org.name,\r\n \"ServiceFee\",\r\n orgNumber\r\n );\r\n result.push(serviceFee);\r\n }\r\n }\r\n\r\n return result;\r\n};\r\n\r\nconst missingInvoiceData = (\r\n invoiceData: InvoiceData[],\r\n federations: Federation[]\r\n): InvoiceData[] => {\r\n const result = [];\r\n\r\n for (const federation of federations) {\r\n const { nhoNumber, name } = federation;\r\n\r\n const [\r\n orderLineTypeWithDiscountContingent,\r\n orderLineTypeWithoutDiscountContingent,\r\n ] = InvoiceDataUtils.getOrderLineTypeFromCalculationType(\"Contingent\");\r\n\r\n const itemWithoutDiscountContingent = InvoiceDataUtils.createUniqueItem(\r\n nhoNumber,\r\n name,\r\n orderLineTypeWithoutDiscountContingent,\r\n \"1000\"\r\n );\r\n const itemWithDiscountContingent = InvoiceDataUtils.createUniqueItem(\r\n nhoNumber,\r\n name,\r\n orderLineTypeWithDiscountContingent,\r\n \"1000\"\r\n );\r\n\r\n if (\r\n !InvoiceDataUtils.checkExistance(\r\n invoiceData,\r\n itemWithoutDiscountContingent\r\n )\r\n )\r\n result.push(itemWithoutDiscountContingent);\r\n if (\r\n !InvoiceDataUtils.checkExistance(invoiceData, itemWithDiscountContingent)\r\n )\r\n result.push(itemWithDiscountContingent);\r\n\r\n const [\r\n orderLineTypeWithDiscountServiceFee,\r\n orderLineTypeWithoutDiscountServiceFee,\r\n ] = InvoiceDataUtils.getOrderLineTypeFromCalculationType(\"ServiceFee\");\r\n\r\n const itemWithoutDiscountServiceFee = InvoiceDataUtils.createUniqueItem(\r\n nhoNumber,\r\n name,\r\n orderLineTypeWithoutDiscountServiceFee,\r\n \"1002\"\r\n );\r\n const itemWithDiscountServiceFee = InvoiceDataUtils.createUniqueItem(\r\n nhoNumber,\r\n name,\r\n orderLineTypeWithDiscountServiceFee,\r\n \"1002\"\r\n );\r\n\r\n if (\r\n !InvoiceDataUtils.checkExistance(\r\n invoiceData,\r\n itemWithoutDiscountServiceFee\r\n )\r\n )\r\n result.push(itemWithoutDiscountServiceFee);\r\n if (\r\n !InvoiceDataUtils.checkExistance(invoiceData, itemWithDiscountServiceFee)\r\n )\r\n result.push(itemWithDiscountServiceFee);\r\n }\r\n\r\n return result;\r\n};\r\n\r\nexport { missingCalculations, missingInvoiceData };\r\n","enum OrderLineType {\n Contingent = 0,\n ServiceFee = 1,\n ContingentDiscount = 2,\n ServiceFeeDiscount = 3,\n}\n\nconst toCalculationType = (orderLineType: OrderLineType) => {\n switch (orderLineType) {\n case OrderLineType.Contingent:\n return \"Contingent\";\n case OrderLineType.ContingentDiscount:\n return \"Contingent\";\n case OrderLineType.ServiceFee:\n return \"ServiceFee\";\n case OrderLineType.ServiceFeeDiscount:\n return \"ServiceFee\";\n default:\n throw new Error(\"Non-existant orderLineType in switch\");\n }\n};\n\nexport const OrderLineTypeUtils = {\n toCalculationType,\n};\n\nexport default OrderLineType;\n","import Vue from \"vue\";\nimport VueCompositionApi from \"@vue/composition-api\";\n\nVue.use(VueCompositionApi);\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-app',{attrs:{\"id\":\"app\"}},[_c('router-view')],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\nimport { defineComponent } from \"@vue/composition-api\";\nimport { Actions } from \"./store\";\nimport { mapActions } from \"vuex\";\nimport authService from \"@/services/auth.service\";\n\nexport default defineComponent({\n name: \"App\",\n created() {\n this.$store.watch(\n (state) => state.toastMessages,\n (toastMessages) => {\n const lastMessage = toastMessages.slice(-1)[0];\n this.$toast.error(lastMessage);\n }\n );\n },\n beforeUpdate() {\n if (authService.isAuthenticated()) {\n this.fetchFederations();\n }\n },\n methods: {\n ...mapActions([Actions.FETCH_FEDERATIONS]),\n },\n});\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--15-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/ts-loader/index.js??ref--15-3!../node_modules/cache-loader/dist/cjs.js??ref--1-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--15-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/ts-loader/index.js??ref--15-3!../node_modules/cache-loader/dist/cjs.js??ref--1-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=27f0f7ff&\"\nimport script from \"./App.vue?vue&type=script&lang=ts&\"\nexport * from \"./App.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VApp } from 'vuetify/lib/components/VApp';\ninstallComponents(component, {VApp})\n","/* eslint-disable no-console */\n\nimport { register } from \"register-service-worker\";\n\nif (process.env.NODE_ENV === \"production\") {\n register(`${process.env.BASE_URL}service-worker.js`, {\n ready() {\n console.log(\n \"App is being served from cache by a service worker.\\n\" +\n \"For more details, visit https://goo.gl/AFskqB\"\n );\n },\n registered() {\n console.log(\"Service worker has been registered.\");\n },\n cached() {\n console.log(\"Content has been cached for offline use.\");\n },\n updatefound() {\n console.log(\"New content is downloading.\");\n },\n updated() {\n console.log(\"New content is available; please refresh.\");\n },\n offline() {\n console.log(\n \"No internet connection found. App is running in offline mode.\"\n );\n },\n error(error) {\n console.error(\"Error during service worker registration:\", error);\n },\n });\n}\n","import Vue from \"vue\";\nimport VueRouter, { RouteConfig } from \"vue-router\";\nimport authService from \"@/services/auth.service\";\nimport { msalInstance } from \"@/authConfig\";\n\nVue.use(VueRouter);\n\nconst routes: Array = [\n {\n path: \"/\",\n name: \"CalculationList\",\n component: () => import(\"@/views/CalculationListView.vue\"),\n meta: {\n requireAuth: true,\n requireAdmin: true,\n },\n },\n {\n path: \"/calculation\",\n name: \"Calculation\",\n props: true,\n component: () => import(\"@/views/CalculationView.vue\"),\n meta: {\n requireAuth: true,\n requireAdmin: true,\n },\n },\n {\n path: \"/unauthorized\",\n name: \"Unauthorized\",\n props: true,\n component: () => import(\"@/views/Unauthorized.vue\"),\n meta: {\n requireAuth: true,\n },\n },\n {\n path: \"/calculator\",\n name: \"Calculator\",\n component: () => import(\"@/views/CalculatorView.vue\"),\n meta: {\n requireAuth: true,\n },\n },\n {\n path: \"/invoice\",\n name: \"Invoice\",\n component: () => import(\"@/views/InvoiceView.vue\"),\n meta: {\n requireAuth: true,\n requireAdmin: true,\n },\n },\n {\n path: \"/contingent-offset\",\n name: \"Offset\",\n component: () => import(\"@/views/ContingentOffsetView.vue\"),\n meta: {\n requireAuth: true,\n requireAdmin: true,\n },\n },\n {\n path: \"/contingent\",\n name: \"Contingent\",\n component: () => import(\"@/views/ContingentView.vue\"),\n meta: {\n requireAuth: true,\n },\n },\n];\n\nconst router = new VueRouter({\n mode: \"history\",\n base: process.env.BASE_URL,\n routes,\n});\n\nrouter.beforeEach(async (to, _, next) => {\n await msalInstance.handleRedirectPromise();\n const accounts = msalInstance.getAllAccounts();\n const isAuthenticated = accounts.length > 0;\n if (!isAuthenticated) {\n await authService.login();\n }\n const isAdmin = await authService.isAdmin();\n const isUser = await authService.isUser();\n\n if (isAuthenticated && isAdmin) {\n next();\n } else if (isUser && !to.matched.some((record) => record.meta.requireAdmin)) {\n next();\n } else if (isAuthenticated) {\n if (to.path === \"/unauthorized\") {\n next();\n } else if (isUser) {\n next({\n path: \"/calculator\",\n replace: true,\n });\n } else {\n next({\n path: \"/unauthorized\",\n replace: true,\n });\n }\n } else if (to.matched.some((record) => record.meta.requireAuth)) {\n await authService.login();\n } else {\n next();\n }\n});\n\nexport default router;\n","import Vue from \"vue\";\nimport Vuetify from \"vuetify/lib/framework\";\nimport \"@mdi/font/css/materialdesignicons.css\";\n\nVue.use(Vuetify);\n\nexport default new Vuetify({\n icons: {\n iconfont: \"mdi\",\n },\n theme: {\n themes: {\n light: {\n primary: \"#0079b5\",\n secondary: \"#607d8b\",\n accent: \"#03a9f4\",\n error: \"#f44336\",\n warning: \"#ff9800\",\n success: \"#4caf50\",\n },\n },\n },\n});\n","import { NavigationClient, NavigationOptions } from \"@azure/msal-browser\";\nimport VueRouter from \"vue-router\";\n\n/**\n * This is an example for overriding the default function MSAL uses to navigate to other urls in your webpage\n */\nexport class CustomNavigationClient extends NavigationClient {\n private router: VueRouter;\n\n constructor(router: VueRouter) {\n super();\n this.router = router;\n }\n\n /**\n * Navigates to other pages within the same web application\n * You can use the useHistory hook provided by react-router-dom to take advantage of client-side routing\n * @param url\n * @param options\n */\n async navigateInternal(url: string, options: NavigationOptions) {\n const relativePath = url.replace(window.location.origin, \"\");\n if (options.noHistory) {\n this.router.replace(relativePath);\n } else {\n this.router.push(relativePath);\n }\n\n return false;\n }\n}\n","import Vue from \"vue\";\nimport {\n InteractionStatus,\n PublicClientApplication,\n} from \"@azure/msal-browser\";\nimport { reactive } from \"@vue/composition-api\";\n\nexport function msalPlugin(\n vue: typeof Vue,\n msalInstance: PublicClientApplication\n): void {\n const inProgress = InteractionStatus.Startup;\n const accounts = msalInstance.getAllAccounts();\n const state = reactive({\n instance: msalInstance,\n inProgress: inProgress,\n accounts: accounts,\n });\n vue.prototype.$msal = state;\n}\n","import \"./utils/installCompositionApi.ts\";\nimport Vue from \"vue\";\nimport App from \"./App.vue\";\nimport \"./registerServiceWorker\";\nimport router from \"./router\";\nimport store from \"./store\";\nimport vuetify from \"./plugins/vuetify\";\nimport Axios from \"axios\";\nimport Toast from \"vue-toastification\";\nimport \"vue-toastification/dist/index.css\";\nimport { AuthenticationResult, EventType } from \"@azure/msal-browser\";\nimport { msalInstance } from \"./authConfig\";\nimport { CustomNavigationClient } from \"./router/navigationClient\";\nimport { msalPlugin } from \"./plugins/msalPlugin\";\n\nVue.use(Toast, {\n position: \"bottom-right\",\n timeout: 10000,\n});\n\nVue.config.productionTip = false;\nVue.prototype.$http = Axios;\n\nconst navigationClient = new CustomNavigationClient(router);\nmsalInstance.setNavigationClient(navigationClient);\n\nconst accounts = msalInstance.getAllAccounts();\nif (accounts.length > 0) {\n msalInstance.setActiveAccount(accounts[0]);\n}\nmsalInstance.addEventCallback((event) => {\n if (event.eventType === EventType.LOGIN_SUCCESS && event.payload) {\n const payload = event.payload as AuthenticationResult;\n const account = payload.account;\n msalInstance.setActiveAccount(account);\n }\n});\nmsalInstance.handleRedirectPromise().then(() => {\n const accounts = msalInstance.getAllAccounts();\n\n if (accounts.length > 0) {\n msalInstance.setActiveAccount(accounts[0]);\n\n const request = {\n scopes: [\"openid\", \"profile\"],\n account: accounts[0],\n };\n\n msalInstance\n .acquireTokenSilent(request)\n .then((tokenResponse) => {\n return tokenResponse;\n })\n .catch((e) => {\n console.error(e);\n return;\n });\n } else {\n return;\n }\n});\n\nVue.use(msalPlugin, msalInstance);\n\nconst app = new Vue({\n router,\n store,\n vuetify,\n render: (h) => h(App),\n});\napp.$mount(\"#app\");\n// inflexibility of typescript\nconst anyWindow = window as any;\n// expose app (and thus vuex) if tests are being run\nif (anyWindow.Cypress) {\n anyWindow.app = app;\n}\n","function formatCurrency(\r\n val: string | number,\r\n hideCurrencyLabel = false\r\n): string {\r\n const stringValue = val.toString().replace(\"−\", \"-\");\r\n const float = parseFloat(stringValue);\r\n const formatter = new Intl.NumberFormat(\"nb-NO\", {\r\n style: \"currency\",\r\n currency: \"NOK\",\r\n maximumFractionDigits: 0,\r\n });\r\n\r\n const formatResult = formatter.format(float).toString();\r\n\r\n if (hideCurrencyLabel) return formatResult.substring(3);\r\n return formatResult;\r\n}\r\n\r\nexport default formatCurrency;\r\n","import { Federation } from \"@/models/Federation\";\n\nconst getOrg = (\n id: number,\n associations: Array\n): Federation | undefined => associations.find((org) => org.nhoNumber === id);\n\nconst getAllParentNhoNumbers = (\n id: number,\n associations: Array\n): Array => {\n const nhoNumbers = [];\n let currentOrg = getOrg(id, associations);\n\n while (currentOrg) {\n nhoNumbers.push(currentOrg.nhoNumber);\n\n if (currentOrg.federationParentNumber) {\n currentOrg = getOrg(currentOrg.federationParentNumber, associations);\n } else {\n break;\n }\n }\n\n return nhoNumbers;\n};\n\nexport default getAllParentNhoNumbers;\n","//Formats date to hh:mm dd.MM.yyyy string\r\nconst formatDate = (dateOrDateString: Date | string): string => {\r\n if (typeof dateOrDateString === \"string\") {\r\n if (dateOrDateString === \"\") return \"\";\r\n return dateStringToDisplay(dateOrDateString);\r\n } else {\r\n return dateToDisplay(dateOrDateString);\r\n }\r\n};\r\n\r\nconst dateStringToDisplay = (dateString: string) => {\r\n const date = new Date(dateString);\r\n return dateToDisplay(date);\r\n};\r\n\r\nconst dateToDisplay = (date: Date) => {\r\n const localeDate = date.toLocaleDateString(\"no-NB\");\r\n const time = date.toLocaleTimeString(\"no-NB\");\r\n const formattedTime = time.split(\":\").slice(0, 2).join(\":\");\r\n return `${localeDate} ${formattedTime}`;\r\n};\r\n\r\nexport default formatDate;\r\n","import { KeyValuePair } from \"@/types\";\n\nconst toQueryString = (params: KeyValuePair): string => {\n return Object.keys(params)\n .map((key) => `${key}=${params[key]}`)\n .join(\"&\");\n};\n\nexport default toQueryString;\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nconst arr = (len: number, mapper: () => any): any[] =>\r\n new Array(len).fill(undefined).map(mapper);\r\n\r\nexport default arr;\r\n","import { Calculation } from \"@/models/Calculation\";\nimport { Federation } from \"@/models/Federation\";\n\nconst getChildFederations = (\n organizations: Federation[],\n nhoNumber: number\n): Federation[] => {\n return (\n organizations?.find((org) => org.nhoNumber === nhoNumber)\n ?.childFederations ?? []\n );\n};\n\nconst priorityClassGroupName = (priorityClass: number): string =>\n `Prioritetsklasse ${priorityClass}`;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst getSortedChildFederations = (\n childFederations: Federation[],\n childCalculations: Calculation[],\n organizations: Federation[]\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any[] => {\n const otherGroupName = \"Døtre uten egen kalkulasjon\";\n const anotherMotherGroupName = \"Egen kalkulasjon, men annen mor\";\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const existingChildCalculations: any[] = [];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const otherChildCalculations: any[] = [];\n let priorityClasses: number[] = [];\n\n childFederations?.forEach((org) => {\n const calculation = childCalculations.find((calculation) => {\n return calculation.childNhoNumber === org.nhoNumber;\n });\n if (calculation != undefined) {\n existingChildCalculations.push({\n ...org,\n group: priorityClassGroupName(calculation.childPriorityClass),\n });\n priorityClasses.push(calculation.childPriorityClass);\n } else otherChildCalculations.push({ ...org, group: otherGroupName });\n });\n\n const sorted = [];\n\n priorityClasses = [...new Set(priorityClasses)].sort().reverse();\n\n priorityClasses.forEach((priorityClass) => {\n const header = priorityClassGroupName(priorityClass);\n sorted.push({ header });\n sorted.push(...existingChildCalculations.filter((x) => x.group == header));\n });\n\n sorted.push({ header: otherGroupName });\n sorted.push(...otherChildCalculations);\n\n const childOrgNumbers = childFederations?.map((org) => org.nhoNumber);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const childrenCalculationsWithAnotherMother: any[] = childCalculations\n .filter((x) => !childOrgNumbers.includes(x.childNhoNumber))\n .map((calc) => {\n const org = organizations?.find(\n (org) => org.nhoNumber == calc.childNhoNumber\n );\n return { ...org, group: anotherMotherGroupName };\n });\n\n if (childrenCalculationsWithAnotherMother.length) {\n sorted.splice(0, 0, { header: anotherMotherGroupName });\n sorted.splice(1, 0, ...childrenCalculationsWithAnotherMother);\n }\n\n return sorted;\n};\n\nconst childCalculationExists = (\n nhoNumber: number,\n childCalculations: Calculation[]\n): boolean => {\n return childCalculations.some((calculation) => {\n return calculation.childNhoNumber === nhoNumber;\n });\n};\n\nexport {\n getChildFederations,\n getSortedChildFederations,\n childCalculationExists,\n};\n","import { Calculation } from \"@/models/Calculation\";\nimport { Federation } from \"@/models/Federation\";\nimport mergeInvoiceDataAndCalculations from \"@/utils/calculations-invoice-merger\";\nimport { missingInvoiceData } from \"@/utils/missing-calculations\";\nimport OrderLineType from \"./order-line-type\";\n\ntype InvoiceData = {\n nhoNumber: number;\n federationName: string;\n orderLineType: OrderLineType;\n productNumber: string;\n project: number;\n department: number;\n lastChanged?: string;\n};\n\nconst prepareForServer = (item: InvoiceData): InvoiceData => {\n const { lastChanged, ...newItem } = item;\n return newItem;\n};\n\nconst checkEquality = (x: InvoiceData, y: InvoiceData): boolean => {\n const xn1 = x.nhoNumber;\n const xn2 = y.nhoNumber;\n if (xn1 === xn2 && x.orderLineType === y.orderLineType) {\n return true;\n }\n return false;\n};\n\nconst checkExistance = (items: InvoiceData[], x: InvoiceData): boolean =>\n items.some((item) => checkEquality(item, x));\n\nconst defaultItem: InvoiceData = {\n federationName: \"\",\n nhoNumber: 0,\n orderLineType: OrderLineType.Contingent,\n productNumber: \"1000\",\n project: 0,\n department: 0,\n lastChanged: \"\",\n};\n\nconst createUniqueItem = (\n nhoNumber: number,\n federationName: string,\n orderLineType: OrderLineType,\n productNumber: string\n): InvoiceData => ({\n nhoNumber,\n orderLineType,\n federationName: federationName,\n productNumber: productNumber,\n project: defaultItem.project,\n department: defaultItem.department,\n lastChanged: defaultItem.lastChanged,\n});\n\nconst getOrderLineTypeFromCalculationType = (\n calculationType: string\n): [OrderLineType, OrderLineType] => {\n switch (calculationType) {\n case \"Contingent\":\n return [OrderLineType.Contingent, OrderLineType.ContingentDiscount];\n case \"ServiceFee\":\n return [OrderLineType.ServiceFee, OrderLineType.ServiceFeeDiscount];\n default:\n return [OrderLineType.Contingent, OrderLineType.ContingentDiscount];\n }\n};\n\nconst filterInvoiceData = (\n invoiceData: InvoiceData[],\n calculations: Calculation[],\n federations: Federation[],\n filter: {\n name: string;\n orderLineTypes: string[];\n showOnlyMissingRows: boolean;\n }\n): InvoiceData[] => {\n const { name, orderLineTypes, showOnlyMissingRows } = filter;\n\n let filteredInvoiceData = mergeInvoiceDataAndCalculations(\n invoiceData,\n calculations\n );\n\n // FILTER showOnlyMissingRows - Only show missing rows\n if (showOnlyMissingRows) {\n filteredInvoiceData = missingInvoiceData(invoiceData, federations);\n }\n\n //FILTER name/number\n if (name !== \"\") {\n filteredInvoiceData = filteredInvoiceData.filter((invoice: InvoiceData) => {\n const fOrg = invoice.nhoNumber.toString();\n const fName = invoice.federationName.toLowerCase().trim();\n return fOrg.includes(name) || fName.includes(name);\n });\n }\n\n //FILTER orderLine\n if (orderLineTypes.length > 0) {\n filteredInvoiceData = filteredInvoiceData.filter((invoice: InvoiceData) => {\n return orderLineTypes.includes(invoice.orderLineType.toString());\n });\n }\n\n return filteredInvoiceData;\n};\n\nexport const InvoiceDataUtils = {\n prepareForServer,\n defaultItem,\n checkEquality,\n checkExistance,\n createUniqueItem,\n getOrderLineTypeFromCalculationType,\n filterInvoiceData,\n};\n\nexport default InvoiceData;\n","import { missingCalculations } from \"@/utils\";\nimport { Federation } from \"./Federation\";\n\nexport interface CalculationBase {\n nhoNumber: number;\n childNhoNumber: number;\n childPriorityClass: number;\n associationName: string;\n customCalculationText: string;\n year: number;\n isActive: boolean;\n organizationNumber: number;\n}\n\nexport interface Calculation extends CalculationBase {\n blocks: Array;\n calculationType: string;\n membershipType: number;\n hasUnsavedChanges?: boolean;\n childOrganizationCalculations: Array;\n}\n\nexport interface CalculationDto extends CalculationBase {\n blocks: string;\n calculationType: number;\n membershipType: number;\n childOrganizationCalculations: Array;\n}\n\nexport interface CalculationBlock {\n type: string;\n displayName?: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data: any;\n blockId: number;\n isDirty: boolean;\n isExpanded: boolean;\n}\n\nconst calculationTypes = [\"Contingent\", \"ServiceFee\"];\n\nconst checkEquality = (\n calc: Calculation,\n year: number,\n nhoNumber: number,\n calculationType: string,\n membershipType: number\n): boolean =>\n calc.nhoNumber === nhoNumber &&\n calc.year === year &&\n calc.calculationType === calculationType &&\n calc.membershipType === membershipType;\n\nconst checkExistance = (\n calculations: Calculation[],\n year: number,\n org: Federation\n): [boolean, boolean] => {\n const contingentExistance = calculations.some((calc) =>\n checkEquality(calc, year, org.nhoNumber, \"Contingent\", 0)\n );\n const serviceFeeExistance = calculations.some((calc) =>\n checkEquality(calc, year, org.nhoNumber, \"ServiceFee\", 0)\n );\n\n return [contingentExistance, serviceFeeExistance];\n};\n\nconst createUniqueItem = (\n year: number,\n nhoNumber: number,\n associationName: string,\n calculationType: string,\n organizationNumber: number\n): Calculation => ({\n year,\n associationName,\n childNhoNumber: 0,\n nhoNumber,\n organizationNumber,\n calculationType,\n customCalculationText: \"\",\n childPriorityClass: 0,\n isActive: true,\n hasUnsavedChanges: false,\n membershipType: 0,\n blocks: [],\n childOrganizationCalculations: [],\n});\n\nconst hasChildCalculation = (calculations: Calculation[], childMo: number) => {\n return calculations.some((calculation) => {\n return calculation.childNhoNumber === childMo;\n });\n};\n\nexport const CalculationUtils = {\n checkExistance,\n createUniqueItem,\n hasChildCalculation,\n};\n\nexport function filterCalculations(\n calculations: Calculation[],\n filter: {\n name: string;\n types: string[];\n membershipTypes: number[];\n year: string;\n showDeactivated: boolean;\n showOnlyMissingRows: boolean;\n },\n associations: Federation[]\n): Calculation[] {\n let filteredCalculations = calculations;\n const {\n name,\n types,\n membershipTypes,\n year,\n showDeactivated,\n showOnlyMissingRows,\n } = filter;\n\n //Show only missing rows - this disabled all other filters\n if (showOnlyMissingRows) {\n filteredCalculations = missingCalculations(\n calculations,\n associations,\n parseInt(year, 10)\n );\n return filteredCalculations;\n }\n\n //FILTER NAME\n if (name !== \"\") {\n filteredCalculations = filteredCalculations.filter(\n (calculation: Calculation) => {\n const fName = name.toLowerCase().trim();\n const fCalcName =\n calculation.associationName?.toLowerCase()?.trim() ?? \"\";\n const fCalcNumber = calculation.nhoNumber?.toString() ?? \"\";\n\n return fCalcName.includes(fName) || fCalcNumber.includes(fName);\n }\n );\n }\n\n //FILTER CALCULATION TYPES\n if (types.length > 0) {\n filteredCalculations = filteredCalculations.filter(\n (calculation: Calculation) => {\n return types.includes(calculation.calculationType);\n }\n );\n }\n\n //FILTER MEMBERSHIP TYPES\n if (membershipTypes.length > 0) {\n filteredCalculations = filteredCalculations.filter(\n (calculation: Calculation) => {\n return membershipTypes.includes(calculation.membershipType);\n }\n );\n }\n\n //FILTER YEAR\n if (year !== \"\") {\n filteredCalculations = filteredCalculations.filter(\n (calculation: Calculation) => {\n return calculation.year.toString().includes(year);\n }\n );\n }\n\n //Filter deactivated calculations\n if (!showDeactivated) {\n filteredCalculations = filteredCalculations.filter(\n (calculation: Calculation) => calculation.isActive\n );\n }\n\n return filteredCalculations;\n}\n\nexport function prepareForServer(calculation: Calculation): CalculationDto {\n const blocks = calculation.blocks.map((x, index) => {\n const blockData = x.data;\n blockData.blockId = index;\n return blockData;\n });\n\n return {\n blocks: JSON.stringify(blocks),\n calculationType: calculationTypes.indexOf(calculation.calculationType),\n nhoNumber: calculation.nhoNumber,\n organizationNumber: calculation.organizationNumber,\n childNhoNumber: calculation.childNhoNumber,\n childPriorityClass: calculation.childPriorityClass,\n associationName: calculation.associationName,\n customCalculationText: calculation.customCalculationText,\n year: calculation.year,\n membershipType: calculation.membershipType,\n isActive: calculation.isActive,\n childOrganizationCalculations: [], //only the submitted calculation will be updated\n };\n}\n\nexport function convertFromServer(calculationDto: CalculationDto): Calculation {\n let blockIndex = 0;\n return {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n blocks: JSON.parse(calculationDto.blocks).map((x: any) => {\n return {\n data: x,\n type: x.type,\n blockId: blockIndex++,\n isExpanded: false,\n } as CalculationBlock;\n }),\n calculationType: calculationTypes[calculationDto.calculationType],\n year: calculationDto.year,\n nhoNumber: calculationDto.nhoNumber,\n customCalculationText: calculationDto.customCalculationText,\n organizationNumber: calculationDto.organizationNumber,\n childNhoNumber: calculationDto.childNhoNumber,\n childPriorityClass: calculationDto.childPriorityClass,\n associationName: calculationDto.associationName,\n hasUnsavedChanges: false,\n isActive: calculationDto.isActive,\n membershipType: calculationDto.membershipType,\n childOrganizationCalculations:\n calculationDto.childOrganizationCalculations?.map(convertFromServer) ??\n [],\n };\n}\n","import { createArray } from \"@/utils\";\nimport { random } from \"lodash\";\nimport { AssociationUtils } from \"../models/Federation\";\n\ntype ContingentOffset = {\n nhoNumber: number;\n associations: number[];\n associationsText: string;\n contingentTotal: number;\n axTotal: number;\n difference: number;\n differenceAsPercentage: number;\n crmInvoice: any;\n contingentResponse: any;\n lastChanged?: string;\n};\n\nconst randomItem = (): ContingentOffset => {\n const contingent = random(1000000, 10000000);\n const axContingent = random(1000000, 10000000);\n const difference = Math.abs(contingent - axContingent);\n const percentageDifference = Math.abs(contingent - axContingent);\n\n return {\n nhoNumber: random(10000, 99999),\n associations: AssociationUtils.randomList(),\n associationsText: AssociationUtils.randomList().join(\" (Nelfo),\"),\n contingentTotal: contingent,\n axTotal: axContingent,\n difference: difference,\n differenceAsPercentage: percentageDifference,\n crmInvoice: {},\n contingentResponse: {},\n };\n};\n\nconst randomList = (max = 50): ContingentOffset[] =>\n createArray(random(20, max), randomItem);\n\nconst filterOffsets = (\n offsets: ContingentOffset[],\n filter: {\n nhoNumber: string;\n associations: string;\n contingentResponse: string;\n }\n): ContingentOffset[] => {\n let filteredOffsets = offsets;\n const { nhoNumber, associations, contingentResponse } = filter;\n\n //FILTER nhoNumber\n if (nhoNumber !== \"\") {\n const nhoNumberTerms = getSearchTerms(nhoNumber);\n filteredOffsets = filteredOffsets.filter((offset: ContingentOffset) => {\n const fOrg = offset.nhoNumber.toString();\n return isMatchOnMultipleTerms(nhoNumberTerms, fOrg);\n });\n }\n\n //FILTER associations\n if (associations !== \"\") {\n const moTerms = getSearchTerms(associations);\n filteredOffsets = filteredOffsets.filter((offset: ContingentOffset) => {\n const fAssociations = offset.associationsText;\n return isMatchOnMultipleTerms(moTerms, fAssociations);\n });\n }\n\n //FILTER contingentResponse\n if (contingentResponse !== \"\") {\n const responseTerms = getSearchTerms(contingentResponse);\n filteredOffsets = filteredOffsets.filter((offset: ContingentOffset) => {\n const fContingentResponse = offset.contingentResponse.kontingent\n .map((kontingent: any) => kontingent.tekst)\n .join();\n return isMatchOnMultipleTerms(responseTerms, fContingentResponse);\n });\n }\n\n return filteredOffsets;\n};\n\nconst isMatchOnMultipleTerms = (terms: string[], text: string): boolean => {\n return terms.every((term) => isSearchMatch(term, text));\n};\n\nconst getSearchTerms = (searchText: string): string[] => {\n return searchText.split(\"&\");\n};\n\nconst format = (text: string): string => {\n return text.replaceAll(\" \", \" \").replaceAll(\"−\", \"-\").toLowerCase().trim();\n};\n\nconst isSearchMatch = (query: string, text: string): boolean => {\n if (query === \"\" || query === \"!\") return true;\n\n const isNegativeSearch = query.startsWith(\"!\");\n\n if (isNegativeSearch) query = query.substring(1);\n\n query = format(query);\n text = format(text);\n\n return isNegativeSearch ? !text.includes(query) : text.includes(query);\n};\n\nexport const ContingentOffsetDataUtils = {\n randomItem,\n randomList,\n filterOffsets,\n};\n\nexport default ContingentOffset;\n"],"sourceRoot":""}