{"version":3,"file":"js/app.f8744338.js","mappings":"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","sources":["webpack://anser/./src/assets/css/variables.module.scss","webpack://anser/./node_modules/moment/locale/ sync ^\\.\\/.*$","webpack://anser/./src/i18n.js","webpack://anser/./src/js/dn-agent-event.js","webpack://anser/./src/js/dn-call-statistics.js","webpack://anser/./src/js/dn-colors.js","webpack://anser/./src/js/dn-email-helper.js","webpack://anser/./src/js/dn-employee-helper.js","webpack://anser/./src/js/dn-event-bus.js","webpack://anser/./src/js/dn-fetch-employee.js","webpack://anser/./src/js/dn-fetch-schedule.js","webpack://anser/./src/js/dn-fetch.js","webpack://anser/./src/js/dn-forecast.js","webpack://anser/./src/js/dn-helper.js","webpack://anser/./src/js/dn-localStorage.js","webpack://anser/./src/js/dn-schedule-helper.js","webpack://anser/./src/js/dn-simulation-model.js","webpack://anser/./src/js/dn-simulation.js","webpack://anser/./src/js/dn-uihelper.js","webpack://anser/./src/js/dn-undo.js","webpack://anser/./src/js/dn-variables.js","webpack://anser/./src/App.vue","webpack://anser/./src/components/Navigation/Header.vue","webpack://anser/./src/components/Settings/AvatarSelector.vue","webpack://anser/./src/components/Settings/AvatarSelector.vue?9a1e","webpack://anser/./src/components/Navigation/Header.vue?9061","webpack://anser/./src/components/Navigation/Footer.vue","webpack://anser/./src/components/Navigation/MobileNavbarFooter.vue","webpack://anser/./src/components/Navigation/MobileNavbarItem.vue","webpack://anser/./src/components/Navigation/MobileNavbarItem.vue?ee72","webpack://anser/./src/components/Navigation/MobileNavbarFooter.vue?567d","webpack://anser/./src/components/Navigation/Footer.vue?7987","webpack://anser/./src/components/Settings/Guide.vue","webpack://anser/./src/components/Settings/Guide.vue?79de","webpack://anser/./src/App.vue?7ccd","webpack://anser/./src/stores/dn-store.js","webpack://anser/./src/router.js","webpack://anser/./src/main.js","webpack://anser/./src/model/dn-affinity.js","webpack://anser/./src/model/dn-availability-request.js","webpack://anser/./src/model/dn-availability.js","webpack://anser/./src/model/dn-bo.js","webpack://anser/./src/model/dn-break-settings.js","webpack://anser/./src/model/dn-callcenter.js","webpack://anser/./src/model/dn-callgroup.js","webpack://anser/./src/model/dn-custom-shift.js","webpack://anser/./src/model/dn-customer.js","webpack://anser/./src/model/dn-daytype.js","webpack://anser/./src/model/dn-invoice.js","webpack://anser/./src/model/dn-login.js","webpack://anser/./src/model/dn-optimizable-shift.js","webpack://anser/./src/model/dn-request-item.js","webpack://anser/./src/model/dn-rotation.js","webpack://anser/./src/model/dn-schedule-request.js","webpack://anser/./src/model/dn-setting.js","webpack://anser/./src/model/dn-shift.js","webpack://anser/./src/model/dn-skill.js","webpack://anser/./src/model/dn-switch.js","webpack://anser/./src/model/dn-tag.js","webpack://anser/./src/model/dn-user.js","webpack://anser/./src/shared/dn-agreement.js","webpack://anser/./src/shared/dn-date-interval.js","webpack://anser/./src/shared/dn-employee-schedule.js","webpack://anser/./src/shared/dn-employee.js","webpack://anser/./src/shared/dn-model-object.js","webpack://anser/./src/shared/dn-shared-helper.js","webpack://anser/./src/shared/dn-task.js","webpack://anser/./src/shared/dn-tasktype.js","webpack://anser/./src/shared/dn-timezone.js","webpack://anser/./src/model/dn-employee-cc.js","webpack://anser/./src/model/dn-initial-data.js","webpack://anser/./src/js/dn-fetch-data.js","webpack://anser/./src/stores/dataStore.js","webpack://anser/./src/stores/dn-forecast-ai-data.js","webpack://anser/./src/stores/dn-forecast-data.js","webpack://anser/./src/stores/dn-simulation-data.js","webpack://anser/./src/stores/dn-special-day-data.js","webpack://anser/./src/js/dn-genesis.js","webpack://anser/./src/js/dn-import-calls.js","webpack://anser/./src/stores/fileImportStore.js","webpack://anser/./src/stores/forecastStore.js","webpack://anser/./src/stores/portfolioStore.js","webpack://anser/./src/stores/reportStore.js","webpack://anser/./src/model/dn-break-optimization-settings.js","webpack://anser/./src/model/dn-employee-context.js","webpack://anser/./src/model/dn-employee-list.js","webpack://anser/./src/model/dn-schedule-task.js","webpack://anser/./src/stores/scheduleStore.js","webpack://anser/./src/components/Account/UserAuthConfig.vue","webpack://anser/./src/components/Account/UserAuthConfig.vue?93c6","webpack://anser/./src/components/Base/Avatar.vue","webpack://anser/./src/components/Base/Avatar.vue?8d1a","webpack://anser/./src/components/Base/Button.vue","webpack://anser/./src/components/Base/Button.vue?15bc","webpack://anser/./src/components/Base/Icon.vue","webpack://anser/./src/components/Base/Icon.vue?fdd4","webpack://anser/./src/components/Base/Modal.vue","webpack://anser/./src/components/Base/Modal.vue?f44a","webpack://anser/./src/components/Base/RawData.vue","webpack://anser/./src/components/Base/RawData.vue?f5ee","webpack://anser/./src/components/Settings/ColorIndicator.vue","webpack://anser/./src/components/Settings/ColorIndicator.vue?c550","webpack://anser/./src/locales/ lazy ^\\.\\/.*\\.json$ namespace object","webpack://anser/webpack/bootstrap","webpack://anser/webpack/runtime/chunk loaded","webpack://anser/webpack/runtime/compat get default export","webpack://anser/webpack/runtime/create fake namespace object","webpack://anser/webpack/runtime/define property getters","webpack://anser/webpack/runtime/ensure chunk","webpack://anser/webpack/runtime/get javascript chunk filename","webpack://anser/webpack/runtime/get mini-css chunk filename","webpack://anser/webpack/runtime/global","webpack://anser/webpack/runtime/hasOwnProperty shorthand","webpack://anser/webpack/runtime/load script","webpack://anser/webpack/runtime/make namespace object","webpack://anser/webpack/runtime/node module decorator","webpack://anser/webpack/runtime/publicPath","webpack://anser/webpack/runtime/css loading","webpack://anser/webpack/runtime/jsonp chunk loading","webpack://anser/webpack/startup"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"availability\":\"#d7d7d7\",\"availabilityOtherCC\":\"#d6aeae\",\"white\":\"#fff\",\"black\":\"#000\",\"grey\":\"#d3d3d3\",\"light\":\"#f5f6fa\",\"lightgrey\":\"#ededee\",\"midGrey\":\"#838383\",\"dark\":\"#5b5659\",\"lightsuccess\":\"#b9fff0\",\"lightdanger\":\"#ffbabf\",\"lightinfo\":\"#fcf5cc\",\"darksuccess\":\"#086c56\",\"darkdanger\":\"#6f4144\",\"primary\":\"#7600ed\",\"success\":\"#4ca687\",\"info\":\"#f6de5b\",\"warning\":\"#f58b22\",\"danger\":\"#e73542\",\"primarydark\":\"#50009f\",\"hot\":\"#f2af61\",\"veryHot\":\"#bf2c26\",\"cold\":\"#8dc4eb\",\"veryCold\":\"#2164d9\",\"stroke1\":\"#2164d9\",\"stroke2\":\"#ffc000\",\"stroke3\":\"#ed7d31\",\"stroke4\":\"#70ad47\",\"stroke5\":\"#a5a5a5\",\"stroke6\":\"#5b9bd5\",\"stroke7\":\"#26442f\",\"stroke8\":\"#9e480e\",\"stroke9\":\"#4472c4\",\"free\":\"#97383e\",\"red\":\"#911c12\",\"selected\":\"#e8f0fe\",\"selectedfocus\":\"#cdd8f2\",\"primarySelected\":\"#4f84ef\",\"pvInfo\":\"#0ea5e9\"};","var map = {\n\t\"./af\": 25177,\n\t\"./af.js\": 25177,\n\t\"./ar\": 61509,\n\t\"./ar-dz\": 41488,\n\t\"./ar-dz.js\": 41488,\n\t\"./ar-kw\": 58676,\n\t\"./ar-kw.js\": 58676,\n\t\"./ar-ly\": 42353,\n\t\"./ar-ly.js\": 42353,\n\t\"./ar-ma\": 24496,\n\t\"./ar-ma.js\": 24496,\n\t\"./ar-ps\": 6947,\n\t\"./ar-ps.js\": 6947,\n\t\"./ar-sa\": 82682,\n\t\"./ar-sa.js\": 82682,\n\t\"./ar-tn\": 89756,\n\t\"./ar-tn.js\": 89756,\n\t\"./ar.js\": 61509,\n\t\"./az\": 95533,\n\t\"./az.js\": 95533,\n\t\"./be\": 28959,\n\t\"./be.js\": 28959,\n\t\"./bg\": 47777,\n\t\"./bg.js\": 47777,\n\t\"./bm\": 54903,\n\t\"./bm.js\": 54903,\n\t\"./bn\": 61290,\n\t\"./bn-bd\": 17357,\n\t\"./bn-bd.js\": 17357,\n\t\"./bn.js\": 61290,\n\t\"./bo\": 31545,\n\t\"./bo.js\": 31545,\n\t\"./br\": 11470,\n\t\"./br.js\": 11470,\n\t\"./bs\": 44429,\n\t\"./bs.js\": 44429,\n\t\"./ca\": 7306,\n\t\"./ca.js\": 7306,\n\t\"./cs\": 56464,\n\t\"./cs.js\": 56464,\n\t\"./cv\": 73635,\n\t\"./cv.js\": 73635,\n\t\"./cy\": 64226,\n\t\"./cy.js\": 64226,\n\t\"./da\": 93601,\n\t\"./da.js\": 93601,\n\t\"./de\": 77853,\n\t\"./de-at\": 26111,\n\t\"./de-at.js\": 26111,\n\t\"./de-ch\": 54697,\n\t\"./de-ch.js\": 54697,\n\t\"./de.js\": 77853,\n\t\"./dv\": 60708,\n\t\"./dv.js\": 60708,\n\t\"./el\": 54691,\n\t\"./el.js\": 54691,\n\t\"./en-au\": 53872,\n\t\"./en-au.js\": 53872,\n\t\"./en-ca\": 28298,\n\t\"./en-ca.js\": 28298,\n\t\"./en-gb\": 56195,\n\t\"./en-gb.js\": 56195,\n\t\"./en-ie\": 66584,\n\t\"./en-ie.js\": 66584,\n\t\"./en-il\": 65543,\n\t\"./en-il.js\": 65543,\n\t\"./en-in\": 9033,\n\t\"./en-in.js\": 9033,\n\t\"./en-nz\": 79402,\n\t\"./en-nz.js\": 79402,\n\t\"./en-sg\": 43004,\n\t\"./en-sg.js\": 43004,\n\t\"./eo\": 32934,\n\t\"./eo.js\": 32934,\n\t\"./es\": 97650,\n\t\"./es-do\": 20838,\n\t\"./es-do.js\": 20838,\n\t\"./es-mx\": 17730,\n\t\"./es-mx.js\": 17730,\n\t\"./es-us\": 56575,\n\t\"./es-us.js\": 56575,\n\t\"./es.js\": 97650,\n\t\"./et\": 3035,\n\t\"./et.js\": 3035,\n\t\"./eu\": 3508,\n\t\"./eu.js\": 3508,\n\t\"./fa\": 119,\n\t\"./fa.js\": 119,\n\t\"./fi\": 90527,\n\t\"./fi.js\": 90527,\n\t\"./fil\": 95995,\n\t\"./fil.js\": 95995,\n\t\"./fo\": 52477,\n\t\"./fo.js\": 52477,\n\t\"./fr\": 85498,\n\t\"./fr-ca\": 26435,\n\t\"./fr-ca.js\": 26435,\n\t\"./fr-ch\": 37892,\n\t\"./fr-ch.js\": 37892,\n\t\"./fr.js\": 85498,\n\t\"./fy\": 37071,\n\t\"./fy.js\": 37071,\n\t\"./ga\": 41734,\n\t\"./ga.js\": 41734,\n\t\"./gd\": 70217,\n\t\"./gd.js\": 70217,\n\t\"./gl\": 77329,\n\t\"./gl.js\": 77329,\n\t\"./gom-deva\": 32124,\n\t\"./gom-deva.js\": 32124,\n\t\"./gom-latn\": 93383,\n\t\"./gom-latn.js\": 93383,\n\t\"./gu\": 95050,\n\t\"./gu.js\": 95050,\n\t\"./he\": 11713,\n\t\"./he.js\": 11713,\n\t\"./hi\": 43861,\n\t\"./hi.js\": 43861,\n\t\"./hr\": 26308,\n\t\"./hr.js\": 26308,\n\t\"./hu\": 90609,\n\t\"./hu.js\": 90609,\n\t\"./hy-am\": 17160,\n\t\"./hy-am.js\": 17160,\n\t\"./id\": 74063,\n\t\"./id.js\": 74063,\n\t\"./is\": 89374,\n\t\"./is.js\": 89374,\n\t\"./it\": 88383,\n\t\"./it-ch\": 21827,\n\t\"./it-ch.js\": 21827,\n\t\"./it.js\": 88383,\n\t\"./ja\": 23827,\n\t\"./ja.js\": 23827,\n\t\"./jv\": 89722,\n\t\"./jv.js\": 89722,\n\t\"./ka\": 41794,\n\t\"./ka.js\": 41794,\n\t\"./kk\": 27088,\n\t\"./kk.js\": 27088,\n\t\"./km\": 96870,\n\t\"./km.js\": 96870,\n\t\"./kn\": 84451,\n\t\"./kn.js\": 84451,\n\t\"./ko\": 63164,\n\t\"./ko.js\": 63164,\n\t\"./ku\": 98174,\n\t\"./ku-kmr\": 6181,\n\t\"./ku-kmr.js\": 6181,\n\t\"./ku.js\": 98174,\n\t\"./ky\": 78474,\n\t\"./ky.js\": 78474,\n\t\"./lb\": 79680,\n\t\"./lb.js\": 79680,\n\t\"./lo\": 15867,\n\t\"./lo.js\": 15867,\n\t\"./lt\": 45766,\n\t\"./lt.js\": 45766,\n\t\"./lv\": 69532,\n\t\"./lv.js\": 69532,\n\t\"./me\": 58076,\n\t\"./me.js\": 58076,\n\t\"./mi\": 41848,\n\t\"./mi.js\": 41848,\n\t\"./mk\": 30306,\n\t\"./mk.js\": 30306,\n\t\"./ml\": 73739,\n\t\"./ml.js\": 73739,\n\t\"./mn\": 99053,\n\t\"./mn.js\": 99053,\n\t\"./mr\": 86169,\n\t\"./mr.js\": 86169,\n\t\"./ms\": 73386,\n\t\"./ms-my\": 92297,\n\t\"./ms-my.js\": 92297,\n\t\"./ms.js\": 73386,\n\t\"./mt\": 77075,\n\t\"./mt.js\": 77075,\n\t\"./my\": 72264,\n\t\"./my.js\": 72264,\n\t\"./nb\": 22274,\n\t\"./nb.js\": 22274,\n\t\"./ne\": 8235,\n\t\"./ne.js\": 8235,\n\t\"./nl\": 92572,\n\t\"./nl-be\": 43784,\n\t\"./nl-be.js\": 43784,\n\t\"./nl.js\": 92572,\n\t\"./nn\": 54566,\n\t\"./nn.js\": 54566,\n\t\"./oc-lnc\": 69330,\n\t\"./oc-lnc.js\": 69330,\n\t\"./pa-in\": 29849,\n\t\"./pa-in.js\": 29849,\n\t\"./pl\": 94418,\n\t\"./pl.js\": 94418,\n\t\"./pt\": 79834,\n\t\"./pt-br\": 48303,\n\t\"./pt-br.js\": 48303,\n\t\"./pt.js\": 79834,\n\t\"./ro\": 24457,\n\t\"./ro.js\": 24457,\n\t\"./ru\": 82271,\n\t\"./ru.js\": 82271,\n\t\"./sd\": 1221,\n\t\"./sd.js\": 1221,\n\t\"./se\": 33478,\n\t\"./se.js\": 33478,\n\t\"./si\": 17538,\n\t\"./si.js\": 17538,\n\t\"./sk\": 5784,\n\t\"./sk.js\": 5784,\n\t\"./sl\": 46637,\n\t\"./sl.js\": 46637,\n\t\"./sq\": 86794,\n\t\"./sq.js\": 86794,\n\t\"./sr\": 45719,\n\t\"./sr-cyrl\": 3322,\n\t\"./sr-cyrl.js\": 3322,\n\t\"./sr.js\": 45719,\n\t\"./ss\": 56000,\n\t\"./ss.js\": 56000,\n\t\"./sv\": 41011,\n\t\"./sv.js\": 41011,\n\t\"./sw\": 40748,\n\t\"./sw.js\": 40748,\n\t\"./ta\": 11025,\n\t\"./ta.js\": 11025,\n\t\"./te\": 11885,\n\t\"./te.js\": 11885,\n\t\"./tet\": 28861,\n\t\"./tet.js\": 28861,\n\t\"./tg\": 86571,\n\t\"./tg.js\": 86571,\n\t\"./th\": 55802,\n\t\"./th.js\": 55802,\n\t\"./tk\": 59527,\n\t\"./tk.js\": 59527,\n\t\"./tl-ph\": 29231,\n\t\"./tl-ph.js\": 29231,\n\t\"./tlh\": 31052,\n\t\"./tlh.js\": 31052,\n\t\"./tr\": 85096,\n\t\"./tr.js\": 85096,\n\t\"./tzl\": 79846,\n\t\"./tzl.js\": 79846,\n\t\"./tzm\": 81765,\n\t\"./tzm-latn\": 97711,\n\t\"./tzm-latn.js\": 97711,\n\t\"./tzm.js\": 81765,\n\t\"./ug-cn\": 48414,\n\t\"./ug-cn.js\": 48414,\n\t\"./uk\": 16618,\n\t\"./uk.js\": 16618,\n\t\"./ur\": 57777,\n\t\"./ur.js\": 57777,\n\t\"./uz\": 57609,\n\t\"./uz-latn\": 72475,\n\t\"./uz-latn.js\": 72475,\n\t\"./uz.js\": 57609,\n\t\"./vi\": 21135,\n\t\"./vi.js\": 21135,\n\t\"./x-pseudo\": 64051,\n\t\"./x-pseudo.js\": 64051,\n\t\"./yo\": 82218,\n\t\"./yo.js\": 82218,\n\t\"./zh-cn\": 52648,\n\t\"./zh-cn.js\": 52648,\n\t\"./zh-hk\": 1632,\n\t\"./zh-hk.js\": 1632,\n\t\"./zh-mo\": 31541,\n\t\"./zh-mo.js\": 31541,\n\t\"./zh-tw\": 50304,\n\t\"./zh-tw.js\": 50304\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 35358;","\nimport { createI18n } from 'vue-i18n';\nimport messages from '@/locales/en.json';\nimport { getLanguage } from \"@/js/dn-localStorage\";\n\nconst SUPORTED_LANGUAGES = Object.freeze(['en', 'sv', 'de']);\nconst loadedLanguages = ['en'];\n\nexport const i18n = createI18n({\n locale: 'en',\n fallbackLocale: 'en',\n messages: { 'en': messages }, \n})\n\nloadSelectedLang();\n\nfunction getBrowserDefaultLanguage() {\n const languages = navigator.languages;\n if (languages) {\n for (const lang of languages) {\n const shortCode = getISO639Code(lang);\n if (SUPORTED_LANGUAGES.includes(shortCode)) {\n return lang;\n }\n }\n }\n return 'en-US';\n}\n\n/**\n * @param {string} code\n */\nfunction getISO639Code(code) {\n if(code){\n const splitted = code.split('-');\n return splitted[0];\n}else{return undefined}\n}\n\nexport function getLanguageCode() {\n //get selected lang from local storage\n const lang = getLanguage();\n if (lang) { return lang; }\n\n //if not get default from browser\n const browserLang=getBrowserDefaultLanguage();\n //check if browser lang is supported \n //else return undefined\n if(loadedLanguages.includes(browserLang)){\n return browserLang\n }else{return undefined}\n}\n\nexport function getSupportedCultures() {\n return ['en-US', 'en-GB', 'sv-SE', 'de-DE'];\n}\n\nfunction loadSelectedLang() {\n //if no getLanguageCode load en language\n //languageCode remains undefined and forces time/date settings from browser\n const languageCode=getLanguageCode()\n let lang ='en'\n if(languageCode){lang = getISO639Code(languageCode)}\n if (lang !== 'en') {\n loadLanguageAsync(lang)\n }\n}\n\n/**\n * @param {string} languague\n */\nexport async function loadLanguageAsync(languague) {\n const lang = getISO639Code(languague);\n if (i18n.global.locale === lang) {\n return Promise.resolve(setI18nLanguage(lang))\n }\n\n if (loadedLanguages.includes(lang)) {\n return Promise.resolve(setI18nLanguage(lang))\n }\n\n return import(`@/locales/${lang}.json`).then(\n messages => {\n i18n.global.setLocaleMessage(lang, messages.default)\n loadedLanguages.push(lang)\n return setI18nLanguage(lang)\n }\n )\n}\n\n/**\n * @param {string} lang\n */\nfunction setI18nLanguage(lang) {\n // @ts-ignore\n i18n.global.locale = lang\n // document.querySelector('html').setAttribute('lang', lang)\n return lang\n}","\r\nimport { fetchAndCheckJson } from '@/js/dn-fetch.js';\r\n\r\n/**\r\n * @typedef {{employeeSwitchId:string, kind:number, timestamp:string, reasonCode?:string }} AgentEventDto\r\n */\r\n\r\n/**\r\n * @param {Date} st\r\n * @param {Date} fi\r\n * @param {number} switchId\r\n */\r\nexport async function deleteAgentEvents(st, fi, switchId) {\r\n const agentEvents = await fetchAndCheckJson(`agent-event?st=${st.toISOString()}&fi=${fi.toISOString()}&switchId=${switchId}`, 'DELETE');\r\n return agentEvents;\r\n}\r\n\r\n/**\r\n * @param {number} limit\r\n * @param {number} switchId\r\n */\r\nexport async function getAgentEvents(limit, switchId) {\r\n /** @type {AgentEventDto[]} */\r\n const agentEvents = await fetchAndCheckJson(`agent-event?limit=${limit}&switchId=${switchId}`, 'GET');\r\n return agentEvents;\r\n}\r\n\r\n/**\r\n * @param {AgentEventDto[]} data\r\n * @param {number} switchId\r\n */\r\nasync function postAgentEvents(data, switchId) {\r\n return await fetchAndCheckJson(`agent-event?file=1&switchId=${switchId}`, 'POST', data);\r\n}\r\n\r\n/**\r\n * @param {string[]} lines\r\n * @param {number} switchId\r\n * @param {{ (progress: any): void; (arg0: number): void; }} updateProgress\r\n */\r\nexport async function importAgentEventsCsv(lines, switchId, updateProgress) {\r\n let startIndex = 0;\r\n if (lines[0].toLowerCase().startsWith('timestamp;kind;employeeswitchid'))\r\n startIndex = 1;\r\n\r\n let data = [];\r\n for (let i = startIndex; i < lines.length; i++) {\r\n const rowData = lines[i].split(';');\r\n if (rowData.length === 1)\r\n continue;\r\n\r\n if (rowData.length < 3 || rowData.length > 4) {\r\n throw new Error(`Number of fields error on line ${i}`);\r\n }\r\n\r\n /** @type {AgentEventDto} */\r\n const dto = { timestamp: rowData[0].trim(), kind: parseInt(rowData[1].trim()), employeeSwitchId: rowData[2].trim() };\r\n if (rowData.length > 3 && rowData[3]) {\r\n const reasonCode = rowData[3].trim();\r\n if (reasonCode) {\r\n dto.reasonCode = reasonCode;\r\n }\r\n }\r\n\r\n if (isNaN(Date.parse(dto.timestamp))) {\r\n throw new Error(`Bad formatting of timestamp on line ${i}`);\r\n }\r\n\r\n if (dto.kind < 0 || dto.kind > 3) {\r\n throw new Error(`kind expects 0,1,2 or 3 error on line ${i}`);\r\n }\r\n\r\n data.push(dto)\r\n }\r\n\r\n if (data.length === 0)\r\n throw new Error('No agent events to import found');\r\n\r\n const batchSize = 10000;\r\n let result;\r\n const total = data.length;\r\n let left = data.length;\r\n do {\r\n let batch;\r\n if (left <= batchSize) {\r\n batch = data;\r\n left = 0;\r\n } else {\r\n batch = data.splice(0, batchSize);\r\n left = data.length;\r\n }\r\n\r\n result = await postAgentEvents(batch, switchId);\r\n updateProgress(1 - left / total);\r\n } while (left > 0);\r\n\r\n return result;\r\n}","import { fetchAndCheckJson } from '@/js/dn-fetch.js';\n\n/** @typedef {{startTimeUTC?:Date;quarters?:number;intervals?:{st:Date;quarters:number}[];ipoa:number}} CallStatisticsPost */\n\n/** @typedef {{cgId:number;noc:number[];ht:number[]}[]} CallStatisticsData */\n\n/** @typedef {{data?:CallStatisticsData;list?:{st:Date;data:CallStatisticsData}[];isCalculating: boolean}} CallStatisticsResult */\n\n/**\n * @param {CallStatisticsPost} data\n */\nexport async function getCallStatistics(data) {\n /** @type {CallStatisticsResult} */\n const result = await fetchAndCheckJson(`call-statistics`, 'POST', data);\n return result;\n}\n\nexport async function recalculateCallGroups() {\n await fetchAndCheckJson(`call-statistics?recalc=1`, 'POST');\n}\n","// @ts-check\nexport const COLORS = createColorEnum();\n\nfunction createColorEnum() {\n /** @type {string[]} */\n const colorArray = [];\n const colors = {\n stroke1: 'stroke1',\n stroke2: 'stroke2',\n stroke3: 'stroke3',\n stroke4: 'stroke4',\n stroke5: 'stroke5',\n stroke6: 'stroke6',\n stroke7: 'stroke7',\n stroke8: 'stroke8',\n stroke9: 'stroke9',\n primary: 'primary',\n lightdanger: 'lightdanger',\n lightinfo: 'lightinfo',\n dark: 'dark',\n byId: byId,\n idBySchemecolor: idBySchemecolor\n };\n\n colorArray[1] = colors.stroke1;\n colorArray[2] = colors.stroke2;\n colorArray[3] = colors.stroke3;\n colorArray[4] = colors.stroke4;\n colorArray[5] = colors.stroke5;\n colorArray[6] = colors.stroke6;\n colorArray[7] = colors.primary;\n colorArray[8] = colors.stroke8;\n colorArray[9] = colors.dark;\n colorArray[10] = colors.lightdanger;\n colorArray[11] = colors.lightinfo;\n return Object.freeze(colors);\n function byId(id) {\n return colorArray[id];\n }\n /**\n * @param {string} name\n */\n function idBySchemecolor(name) {\n return colorArray.findIndex(x => x === name)\n }\n}\n\nexport function getSelectableColors() {\n return [COLORS.stroke1, COLORS.stroke2, COLORS.stroke3, COLORS.stroke4, COLORS.stroke5, COLORS.stroke6, COLORS.stroke7, COLORS.stroke8, COLORS.lightinfo, COLORS.lightdanger, COLORS.primary, COLORS.dark];\n}\n","import { fetchAndCheckJson } from '@/js/dn-fetch.js';\n\nexport const EMAIL_KIND = createEmailKind();\nexport const NOTIFY_KIND = createNotifyKind();\n\nfunction createEmailKind() {\n const enumObject = {\n message: 0,\n invoiceReminder: 1,\n customerInfo: 2,\n resetPassword: 3,\n invoiceReport: 4,\n emailVerification: 5,\n scheduleNotification: 6,\n invoicePDF: 7,\n };\n return Object.freeze(enumObject);\n}\n\nfunction createNotifyKind() {\n const enumObject = {\n email: 0,\n sms: 1\n };\n\n return Object.freeze(enumObject);\n\n}\n\nexport async function sendEmail(kind, eMailObject) {\n const result = await fetchAndCheckJson('email-send', 'POST', { kind: kind, eMailObject: eMailObject });\n return result;\n}\n\nexport async function sendSMS(smsObject) {\n let x = smsObject.to\n\n //Remove invalid charecters\n let correctedPhone = ''\n for (let c = 0; c < x.length; c++) {\n const code = x[c].charCodeAt(0);\n if (code == 43 || (code >= 48 && code <= 57)) { correctedPhone += x[c] }\n }\n smsObject.to = correctedPhone\n const result = await fetchAndCheckJson('sms-send', 'POST', { smsObject: smsObject });\n return result;\n}\n\n/**\n * @param {string} email\n */\nexport async function sendEmailVerification(email) {\n /** @type {{ loginId?:number }} */\n const result = await fetchAndCheckJson('email-send', 'POST', { kind: EMAIL_KIND.emailVerification, eMailObject: email });\n return result;\n}","import { getBreakSettingsByTag } from \"@/model/dn-break-settings.js\";\nimport { postEmployeeSkill } from \"@/js/dn-fetch-employee.js\";\nimport { simulationData } from \"@/stores/dn-simulation-data.js\";\nimport { INFOTYPE } from \"@/js/dn-schedule-helper.js\";\nimport { getColorFromName } from \"@/js/dn-variables\";\nimport { useDataStore } from '@/stores/dataStore.js';\nimport { useScheduleStore } from \"@/stores/scheduleStore.js\";\nimport variables from \"@/assets/css/variables.module.scss\";\nimport { i18n } from \"@/i18n.js\";\nimport { addDays } from '@/shared/dn-shared-helper.js';\nimport {getShiftWorkTime} from '@/model/dn-shift.js';\n\n\n/** @returns {import(\"@/model/dn-skill.js\").Skill[]} */\nexport function getSortedSkills(){\n const dataStore = useDataStore();\n return dataStore.skillsCurrentCC.sort((a,b) => (a.numericSort > b.numericSort) ? 1 : ((b.numericSort > a.numericSort) ? -1 : 0))\n}\n\n/** @typedef {{id:number; empid:string; name:string; ghost:boolean; skills:boolean[]}} SkillMatrixRow */\n\nexport function getSkillsMatrix(){\n const scheduleStore = useScheduleStore();\n const employees=scheduleStore.employees.list;\n const skills = getSortedSkills()\n /** @type {SkillMatrixRow[]} */\n const skillsMatrix=employees.map(function (x) { return {id:x.id, empid: x.empid, name: x.name, ghost:x.ghost, skills: new Array(skills.length).fill(false)}});\n\n //load matrix\n for(let e=0;e<skillsMatrix.length;e++){\n let emp = employees[e]\n \n\n for(let s=0;s<skills.length;s++){\n if(emp.skills.includes(skills[s].id)){\n skillsMatrix[e].skills[s]=true //1\n }\n }\n }\n return skillsMatrix\n}\n\nexport function getSkillsMatrixColumns(sMinMax){\n const scheduleStore = useScheduleStore();\n let setting=scheduleStore.scheduleOptions.scheduleFilter\n let aId=setting.affinity;\n let skills = getSortedSkills()\n let paginatedSkillIds = []\n let filteredskills = skills.filter((s => s.affinity ==aId||aId==null));\n for(let s=0;s<filteredskills.length;s++){\n if(s>=sMinMax[0]&&s<=sMinMax[1]){\n paginatedSkillIds.push(filteredskills[s].id)\n }\n }\n\n let columnDefs =\n [{\"name\":\"empid\",\"label\":\"empid\",\"sticky\":true,\"width\":60},\n {\"name\":\"name\",\"label\":\"name\",\"sticky\":true,\"width\":300},\n {\"name\":\"copy/paste\",\"label\":\"copy\",\"sticky\":false,\"width\":10},\n]\n\n for(let s=0;s<skills.length;s++){\n if(paginatedSkillIds.includes(skills[s].id)){\n columnDefs.push({\"name\":skills[s].name,\"label\":skills[s].name.slice(0, 4),\"field\":'skills', \"description\":skills[s].description,\"type\":'skill',\"index\":s, \"sticky\":false,\"width\":'20px'})\n } \n }\n columnDefs.push({\"name\":\"empty\",\"label\":\"\",\"sticky\":false,\"width\":800})\n\n return columnDefs\n}\n\nexport function numberOfSkillsColumns(){\n const scheduleStore = useScheduleStore();\n let setting=scheduleStore.scheduleOptions.scheduleFilter\n let aId=setting.affinity;\n if(aId){\n return getSortedSkills().filter((s => s.affinity ==aId)).length;\n }else{\n return getSortedSkills().length;\n }\n \n}\n\n export async function saveSkillsMatrix(skillsMatrix){\n const scheduleStore = useScheduleStore();\n const employees=scheduleStore.employees.list;\n /** @type {import(\"@/shared/dn-employee.js\").EmployeeSkillDto[]} */\n const postEmployeeSkillDto = [];\n\n /** @type {import(\"@/shared/dn-employee.js\").Employee[]} */\n const changedEmps = [];\n let skills = getSortedSkills()\n //load matrix\n for(let i=0;i<skillsMatrix.length;i++){\n for(let e=0;e<employees.length;e++){\n if(skillsMatrix[i].id==employees[e].id){\n let skillList=[]\n for(let s=0;s<skills.length;s++){\n if(skillsMatrix[i].skills[s]==true){\n skillList.push(skills[s].id)\n }\n }\n skillList.sort()\n\n //check if changed\n let hasChanges = false\n let skillListOrg =employees[e].skills.sort()\n if(skillList.length==skillListOrg.length){\n for(let s=0;s<skillListOrg.length;s++){\n if(skillList[s]!==skillListOrg[s]){\n hasChanges = true\n break\n }\n }\n } else{\n hasChanges = true\n }\n if(hasChanges){\n employees[e].skills=skillList\n const dto = employees[e].toEmployeeSkillDto();\n changedEmps.push(employees[e])\n if (dto) {\n postEmployeeSkillDto.push(dto);\n }\n }\n }\n }\n }\n if(postEmployeeSkillDto.length > 0){\n await postEmployeeSkill(postEmployeeSkillDto);\n for (const emp of changedEmps) {\n emp.confirmChanges();\n }\n simulationData.reset();\n }\n}\n\nexport function getEmpIdsSameTags(emp){\n const scheduleStore = useScheduleStore();\n const empids = [];\n let employees=scheduleStore.employees.list;\n for(let e=0;e<employees.length;e++){\n if(arraysAreEqual(employees[e].tagIds,emp.tagIds)){empids.push(employees[e].id)}\n }\n return empids\n}\n\nexport function arraysAreEqual(a1,a2){\n a1.sort()\n a2.sort()\n let isEqual = true\n if(a1.length==a2.length){\n for(let i=0;i<a1.length;i++){\n if(a1[i]!=a2[i]){isEqual=false}\n }\n }else{isEqual=false}\n return isEqual\n}\n\nexport function getAffinityInfoMap(){\n const dataStore = useDataStore();\n const affinities = dataStore.affinities;\n let hasAffinities=affinities != null && affinities.length > 0\n let affinityInfoMap = new Map\n if(hasAffinities){\n const dataStore = useDataStore();\n \n let taskTypes=dataStore.taskTypes.list\n for(let a=0;a<affinities.length;a++){\n for(let i=0;i<taskTypes.length;i++){\n if(taskTypes[i].affinity==affinities[a].id){\n affinityInfoMap.set(affinities[a].id,{id:affinities[a].id,name:affinities[a].name,color:taskTypes[i].getColor(getColorFromName)})\n }\n }\n }\n return affinityInfoMap\n }\nreturn null\n}\n\nexport function getAffintyIndicators(emps, svgWidth){\n const svgns= \"http://www.w3.org/2000/svg\"\n const dataStore = useDataStore();\n const affinities = dataStore.affinities;\n let returnMap = new Map //key: empid value: indicator\n let hasAffinities=affinities != null && affinities.length > 0\n //prepare affinity data\n \n if(hasAffinities){\n const dataStore = useDataStore();\n let affinityInfoMap = getAffinityInfoMap()\n /* for(let a=0;a<affinities.length;a++){\n for(let i=0;i<taskTypes.length;i++){\n if(taskTypes[i].affinity==affinities[a].id){\n affinityInfoMap.set(affinities[a].id,{id:affinities[a].id,name:affinities[a].name,color:taskTypes[i].getColor(getColorFromName)})\n }\n }\n } */\n\n //prepare skill data\n let callGroups = dataStore.skillsCurrentCC;\n let skillsInfoMap = new Map\n for(let i=0;i<callGroups.length;i++){\n skillsInfoMap.set(callGroups[i].id,affinityInfoMap.get(callGroups[i].affinity))\n }\n \n \n //Create indicator plupps\n for(let e=0;e<emps.length;e++){\n let empAffinitiyInfos = new Set\n let emp =emps[e]\n for(let i=0;i<emp.skills.length;i++){\n empAffinitiyInfos.add(skillsInfoMap.get(emp.skills[i]))\n }\n let numberOfAffinties=empAffinitiyInfos.size\n let indicators =[]\n let counter =0\n \n for (const aInfo of empAffinitiyInfos) {\n if (!aInfo) { continue; }\n counter +=1\n const ellipse = document.createElementNS(svgns, \"ellipse\");\n let tagObject ={ emp: emp,aInfo:aInfo,type:INFOTYPE.skillsInfo }\n ellipse.tag = tagObject;\n \n ellipse.setAttributeNS(null, \"rx\", 6);\n ellipse.setAttributeNS(null, \"ry\", 6);\n ellipse.setAttributeNS(null, \"cx\", svgWidth-6-(counter-1)*14);\n ellipse.setAttributeNS(null, \"cy\", 7);\n ellipse.setAttributeNS(null, \"opacity\", 1);\n ellipse.setAttributeNS(null, \"fill\", aInfo.color);\n indicators.push(ellipse)\n }\n returnMap.set(emp.id,indicators)\n }\n \n }else{\n\n //Create indicator plupps\n for(let e=0;e<emps.length;e++){\n let emp =emps[e]\n let indicators =[]\n const ellipse = document.createElementNS(svgns, \"ellipse\");\n let tagObject ={ emp: emp,aInfo:null,type:INFOTYPE.skillsInfo }\n ellipse.tag = tagObject;\n ellipse.setAttributeNS(null, \"rx\", 6);\n ellipse.setAttributeNS(null, \"ry\", 6);\n ellipse.setAttributeNS(null, \"cx\", svgWidth-6);\n ellipse.setAttributeNS(null, \"cy\", 7);\n ellipse.setAttributeNS(null, \"opacity\", 1);\n ellipse.setAttributeNS(null, \"fill\", variables.grey);\n indicators.push(ellipse)\n\n\n returnMap.set(emp.id,indicators)\n }\n }\n \n return returnMap\n}\n\nexport function getSkillsText(emp,affintyInfo){\n const dataStore = useDataStore();\n const callGroups = dataStore.callGroupsCurrentCC;\n let skillInfoText=''\n if(affintyInfo){\n skillInfoText=affintyInfo.name + ': '\n for (const skill of callGroups) {\n if(emp.skills.includes(skill.id)&&skill.affinity==affintyInfo.id){\n skillInfoText+=\"<br>\"+ skill.name;\n }\n }\n }else{\n skillInfoText= i18n.global.t('employees.skills')+':'\n for (const skill of callGroups) {\n if(emp.skills.includes(skill.id)){\n skillInfoText+=\"<br>\"+ skill.name;\n }\n }\n }\n return skillInfoText\n}\n//Nghia Lang Codes\n/**\n * @param {import(\"@/shared/dn-employee.js\").Employee} emp\n */\nexport function getEmployeeWarning(emp,fromOptDialog=false){\n const dataStore = useDataStore();\n /** @type {string[]} */\n const warnings=[];\n if (!dataStore.currentUser) { return warnings; }\n const scheduleStore = useScheduleStore();\n const rotations = scheduleStore.rotations\n const shiftBags= scheduleStore.shiftBags\n const availabilities = scheduleStore.availabilities\n const employeeDisplaySettings = scheduleStore.employeeDisplaySettings\n const taskTypeMap=dataStore.taskTypeMap\n \n //skill warning\n if(emp.skills.length==0&&employeeDisplaySettings.skillsWarning) {warnings.push(i18n.global.t('employees.no-skills'))}\n\n //shiftbags || rotations\n if(rotations&&shiftBags){\n if(!rotations.byEmp.has(emp.id)&&!shiftBags.byEmp.has(emp.id)&&employeeDisplaySettings.shiftWarning){warnings.push(i18n.global.t('employees.no-shifts'))}\n }\n\n //switch id\n if(dataStore.currentUser.hasAdherence&&employeeDisplaySettings.switchIdWarning){\n if(!emp.switchid&&!emp.ghost&&!fromOptDialog){\n {warnings.push(i18n.global.t('employees.no-switch-id'))}\n }\n }\n\n //work time &&emp.empid==84311\n if(employeeDisplaySettings.workTimeWarning ){\n\n if(!emp.workTimeOk()) {\n {warnings.push(i18n.global.t('employees.work-time-outside'))}\n }\n\n //prepare breaksettings\n const breakSettingsIsLoaded = dataStore.breakSettings !== null;\n const breakSettings = breakSettingsIsLoaded ? getBreakSettingsByTag(dataStore.breakSettings, emp, dataStore.currentCC.tagIds) : null;\n if(breakSettings&&taskTypeMap){\n for(const bs of breakSettings){\n bs.calculateUnpaidDuration(taskTypeMap)\n }\n }\n\n //Check cyclic shedules fit into work time\n let wwt =null//weekly work time\n let rotation= null\n if(rotations && breakSettingsIsLoaded && rotations.byEmp.has(emp.id)) {\n rotation =rotations.byEmp.get(emp.id)\n if(rotation){wwt=rotation.getWeeklyWorkTime(breakSettings,dataStore.taskTypeMap)}\n }\n let empMinMax = getMinMaxWeeklyWork(emp)\n let remainingWorkTime={minWork:empMinMax.min,maxWork:empMinMax.max}\n\n let remainingWorkTimeAfterCyclicExist=false\n if(wwt){\n remainingWorkTimeAfterCyclicExist=false\n //check cyclic shedule work time\n if(wwt.minWork>empMinMax.max||(!shiftBags.byEmp.has(emp.id)&&wwt.maxWork<empMinMax.min)){\n warnings.push(\"Cyclic schedule do not fit agent work time\")\n }else if(wwt.maxWork<empMinMax.min){ \n remainingWorkTimeAfterCyclicExist=true\n remainingWorkTime.minWork = remainingWorkTime.minWork-wwt.maxWork\n remainingWorkTime.maxWork = remainingWorkTime.maxWork-wwt.minWork\n }\n }\n\n //Check for shift bag shifts to fill work time\n if(shiftBags && breakSettingsIsLoaded &&shiftBags.byEmp.has(emp.id)&&(!wwt||remainingWorkTimeAfterCyclicExist)){\n const sBag = shiftBags.byEmp.get(emp.id)\n let weeks =1\n if(rotation){weeks=rotation.weeks}\n\n //check all weekdays\n let shiftCombosOK = true\n //cyclic shedule may have diffferent shifts different days\n for(let w=0;w<weeks;w++){\n let possibleShifts =[]\n for(let d=0;d<7;d++){\n //days with no cyclic\n if(!rotation||(rotation&&!rotation.shifts[d+w*7])){\n for(let s=0;s<sBag.shifts.length;s++){\n const sh = sBag.shifts[s]\n if(dayIsIncludedInShiftDaylist(d,sh.dayList)){\n possibleShifts.push(getShiftWorkTime(sh,taskTypeMap,breakSettings))\n }\n } \n }\n }\n \n shiftCombosOK=empvaluatePossibleShiftCombosToMeetWorkTime(possibleShifts,remainingWorkTime)\n if(!shiftCombosOK) {break}\n }\n\n if(!shiftCombosOK){\n if(remainingWorkTimeAfterCyclicExist){warnings.push(\"Shifts & cyclic schedules do not fit work time\")}\n else{warnings.push(\"Shifts do not fit work time\")}\n } \n }\n }\n\n //Check shifts and availability match &&emp.empid==84648 &&emp.name=='emp02'\n if(employeeDisplaySettings.shiftWarning){\n \n let rotation=null\n if(rotations && rotations.byEmp.has(emp.id)) {\n rotation =rotations.byEmp.get(emp.id)\n }\n let warningCountArray= new Array(7)\n for(let i=0;i<7;i++){\n warningCountArray[i]={shiftCount:0,errorShifts:new Array()}\n }\n\n if(rotations&&shiftBags){\n if(shiftBags.byEmp.has(emp.id)&&availabilities.byEmp.has(emp.id)){\n const sBag = shiftBags.byEmp.get(emp.id)\n const avail = availabilities.byEmp.get(emp.id)\n\n //check all weekdays (monday 0, sunday 6)\n for(let d=0;d<7;d++){\n for(let s=0;s<sBag.shifts.length;s++){\n const sh = sBag.shifts[s]\n if(dayIsIncludedInShiftDaylist(d,sh.dayList)){\n warningCountArray[d].shiftCount+=1\n let stOK = false\n let fiOK = false\n let durOK = false\n let shiftOKweek = null\n for(let w=0;w<avail.weeks;w++){\n const ava = getDayAvailability(d+w*7,avail)\n if(d>=0&&ava&&ava.length>0){\n\n //check if fits into availability\n if(ava){\n if(!shiftOKweek){shiftOKweek=new Array(avail.weeks).fill(false)}\n if(sh.isFix){\n let fixShift= sh.getFixShift(taskTypeMap)\n durOK=true\n //number shift parts and availability parts are equal\n if(fixShift.tasks.length ==ava.length){\n let doFit = true\n for (let a=0;a<ava.length;a++) {\n const shPart = fixShift.tasks[a]\n const aSpan =ava[a]\n //if(d==4){ console.log('d '+d +'st a '+aSpan.st+' stmin s '+shPart.st);}\n if(shPart.st<aSpan.st){doFit=false}\n if(shPart.fi>aSpan.fi){doFit=false}\n }\n shiftOKweek[w]=doFit\n \n //check if shift fits any availability part\n }else if(fixShift.tasks.length==1){\n const shPart = fixShift.tasks[0]\n for (let a=0;a<ava.length;a++) {\n const aSpan =ava[a]\n if(shPart.st>=aSpan.st&&shPart.fi<=aSpan.fi){shiftOKweek[w]=true}\n } \n }\n //if (ava.length==0){shiftOKweek[w]=false} ???\n }else{\n for(let a=0;a<ava.length;a++){\n const aSpan =ava[a]\n if(sh.stMax>=aSpan.st&&sh.fiMin<=aSpan.fi&&sh.durMin<=aSpan.fi-aSpan.st){shiftOKweek[w]=true}\n }\n }\n }\n }else{\n stOK = true\n fiOK = true\n durOK = true\n\n }\n }\n if(shiftOKweek){\n stOK = true\n fiOK = true\n durOK = true\n let x = shiftOKweek.filter((s => s ==false)).length;\n if(x==avail.weeks){stOK=false;fiOK=false} \n }\n if(!stOK||!fiOK||!durOK){\n if(!warningCountArray[d].errorShifts.includes(s)){\n warningCountArray[d].errorShifts.push(s)}\n }\n }\n }\n }\n\n // check for days where no shift fits\n const weekDayFormat = new Intl.DateTimeFormat(useDataStore().language, { weekday: 'long' });\n let tempWarnings = new Array\n for(let d=0;d<7;d++){\n let dt=addDays( new Date(2000,1,7),d)\n if(warningCountArray[d].errorShifts.length>0&&warningCountArray[d].errorShifts.length==warningCountArray[d].shiftCount){tempWarnings.push(\"No shift fits availabilty on \"+ weekDayFormat.format(dt))}\n }\n if(tempWarnings.length==1){warnings.push(tempWarnings[0])}\n else if(tempWarnings.length>1){warnings.push(\"No shift fits availabilty on \"+tempWarnings.length + \" weekdays\")}\n\n // check for shifts that do not fit any days availability\n for(let s=0;s<sBag.shifts.length;s++){\n const sh = sBag.shifts[s]\n let shiftFits = false\n for(let d=0;d<7;d++){\n if(dayIsIncludedInShiftDaylist(d,sh.dayList)&&!dayHasRotationShift(d,rotation)){\n if(!warningCountArray[d].errorShifts.includes(s) ) {shiftFits=true}//add if is in rotaiton\n }\n \n }\n if(!shiftFits){warnings.push(\"Shift on row \"+(s+1)+ \" do not fit availabilities any day\")}\n }\n }\n }\n }\n return warnings\n\n //Helping functions, daylist (mon 1, sat 6, sun 0)\n function dayIsIncludedInShiftDaylist(d,list){\n let day = d+1\n if (day== 7){day=0}\n return list.includes(day)\n }\n\n function getDayAvailability(d,avail){\n let result = []\n for(let i=0;i<avail.stFi.length-1;i+=2){\n if(avail.stFi[i]<(d+1)*96&&avail.stFi[i]>d*96){\n result.push({st:avail.stFi[i]-d*96,fi:avail.stFi[i+1]-d*96})\n }\n }\n return result\n }\n\n /**\n * @param {import(\"@/shared/dn-employee.js\").Employee} emp\n */\n function getMinMaxWeeklyWork(emp) {\n let retuenValue = { min: emp.agreedWorkWeek, max: emp.agreedWorkWeek }\n const minWorkWeek = emp.minWorkWeek ? emp.minWorkWeek : 0;\n const maxWorkWeek = emp.maxWorkWeek ? emp.maxWorkWeek : 7 * 24 * 60;\n if (emp.agreedWorkWeek > 0) {\n if (maxWorkWeek > emp.agreedWorkWeek) {\n retuenValue.max = maxWorkWeek;\n }\n if (minWorkWeek > 0) {\n retuenValue.min = minWorkWeek;\n }\n } else {\n retuenValue = { min: minWorkWeek, max: maxWorkWeek };\n }\n return retuenValue\n }\n\n function dayHasRotationShift(d,rotation){\n if(!rotation){return false}\n for(let w=0;w<rotation.weeks;w++){\n if(!rotation.shifts[d+w*7]){return false}\n }\n return true\n }\n\n function empvaluatePossibleShiftCombosToMeetWorkTime(possibleShifts,remainingWorkTime){\n let shiftCombos=[]\n for(let i=0;i<possibleShifts.length;i++){\n shiftCombos=combine(shiftCombos,possibleShifts) \n for(let s=0;s<shiftCombos.length;s++){\n if(intersect(shiftCombos[s],remainingWorkTime)){return true}\n }\n }\n \n return false\n \n function intersect(a,b){\n return a.maxWork>=b.minWork && a.minWork<=b.maxWork\n }\n\n \n function combine(a,b){\n let res=[]\n if(a.length==0){return b}\n for(let x=0;x<a.length;x++){\n for(let i=0;i<b.length;i++){\n let sh = {minWork:a[x].minWork+b[i].minWork,maxWork:a[x].maxWork+b[i].maxWork}\n let duplicat= res.some( value => { return value.minWork == sh.minWork&&value.maxWork == sh.maxWork })\n if(!duplicat){\n res.push(sh)\n }\n }\n }\n \n return res\n }\n }\n\n \n}\nexport function empSkillsRowIsIncluded(r){\n return empRowIsIncluded(useScheduleStore().employees.getById(r.id))\n}\n\nexport function empRowIsIncluded(r){\n const scheduleStore = useScheduleStore();\n //if(!scheduleStore.scheduleOptions.scheduleFilter.show){return true}\n let filter=scheduleStore.scheduleOptions.scheduleFilter\n let isIncludedByName=false\n let isIncludedBySkill=false\n let isIncludedByTag = false\n let includeByTermination= true\n \n if(filter.searchText.length>0){\n if( r.name.toLowerCase().includes(filter.searchText.toLowerCase())){isIncludedByName=true}\n }else{isIncludedByName=true}\n \n if(filter.callGroups.length>0){\n for(let c=0;c<filter.callGroups.length;c++){\n if( r.skills.includes(filter.callGroups[c].id)){isIncludedBySkill=true}\n }\n }else{isIncludedBySkill=true}\n \n \n if(filter.tagIds.length>0){\n for(let t=0;t<filter.tagIds.length;t++){\n if( r.tagIds.includes(filter.tagIds[t])){isIncludedByTag=true}\n }\n }else{isIncludedByTag=true}\n\n if(!filter.includeTerminated){\n if((r.terminationDate >new Date('2000-01-01')&&r.terminationDate<new Date())||!r.active){includeByTermination= false}\n }\n \n \n return isIncludedByName&&isIncludedBySkill&&isIncludedByTag&&includeByTermination\n }\n\n\n\n\n","import mitt from 'mitt';\r\nexport const EventBus = mitt();","import { fetchAndCheckJson } from '@/js/dn-fetch.js';\nimport { employeeFromDto } from '@/shared/dn-employee.js';\n\n/**\n * @param {number} employeeId\n */\nexport async function deleteEmployee(employeeId) {\n await fetchAndCheckJson(`employees/${employeeId}`, 'DELETE');\n}\n\n/**\n * @param {number} ccId\n */\nexport async function getEmployeeCount(ccId) {\n /** @type {number} */\n const result = await fetchAndCheckJson(`employees?ccId=${ccId}&count=1`, 'GET');\n return result;\n}\n\n/**\n * @param {number} contactCenterId\n */\nexport async function getEmployees(contactCenterId) {\n /** @type {import(\"@/shared/dn-employee\").EmployeeDto[]} */\n const rows = await fetchAndCheckJson(`employees?ccId=${contactCenterId}`, 'GET');\n const employees = rows.map(employeeFromDto);\n return employees;\n}\n\n/**\n * @param {import(\"@/shared/dn-employee\").Employee} employee\n */\nasync function patchEmployee(employee) {\n /** @type {{id:number, userId:number|null, notifyResult:boolean|null, emailAlreadyInUse:boolean, employeeSwitchConflicts:undefined|{id:string, employeeId:number}[]}} */\n const result = await fetchAndCheckJson(`employees/${employee.id}`, 'PATCH', employee.toDto(true));\n if (result.emailAlreadyInUse)\n return result;\n\n removeDuplicatedSwitchid(employee, result.employeeSwitchConflicts);\n employee.password = '';\n employee.userId = result.userId;\n employee.confirmChanges();\n return result;\n}\n\n/**\n * @param {import(\"@/shared/dn-employee\").Employee} employee\n * @param {{availabilityId?:number|null;shiftBagId?:number|null;rotationId?:number|null}} [extra]\n */\nexport async function postEmployee(employee, extra = undefined) {\n const dto = employee.toDto();\n if (extra) {\n dto.availabilityId = extra.availabilityId;\n dto.shiftBagId = extra.shiftBagId;\n dto.rotationId = extra.rotationId;\n }\n\n /** @type {{id:number, userId:number|null, notifyResult:boolean|null, emailAlreadyInUse:boolean, employeeSwitchConflicts:undefined|{id:string, employeeId:number}[]}} */\n const result = await fetchAndCheckJson('employees', 'POST', dto);\n if (result.emailAlreadyInUse)\n return result;\n\n removeDuplicatedSwitchid(employee, result.employeeSwitchConflicts);\n employee.id = result.id;\n employee.userId = result.userId;\n employee.confirmChanges();\n return result;\n}\n\n/**\n * @param {import(\"@/shared/dn-employee\").EmployeeSkillDto[]} data\n */\nexport async function postEmployeeSkill(data) {\n await fetchAndCheckJson(`employee-skill`, 'POST', data);\n}\n\n/**\n * @param {import(\"@/shared/dn-employee\").Employee} employee\n * @param {{ id: string; employeeId: number; }[]} employeeSwitchConflicts\n */\nfunction removeDuplicatedSwitchid(employee, employeeSwitchConflicts) {\n if (employeeSwitchConflicts && employeeSwitchConflicts.length > 0) {\n let switchIdList = employee.switchIdList;\n for (const switchIdConflict of employeeSwitchConflicts) {\n switchIdList = switchIdList.filter(x => x !== switchIdConflict.id);\n }\n employee.switchIdList = switchIdList;\n }\n}\n\n/**\n * @param {import(\"@/shared/dn-employee\").Employee[]} employees\n */\nexport async function saveEmployees(employees) {\n let result = [];\n await new Promise((resolve) => {\n let promises = []\n for (let i = 0; i < employees.length; i++) {\n if (employees[i].hasChanges) {\n promises.push(patchEmployee(employees[i]).then(x => result.push(x)));\n }\n }\n Promise.all(promises).then(resolve).catch(error => {\n console.error(error.message)\n });\n });\n\n return result;\n}","import { fetchAndCheckJson } from '@/js/dn-fetch.js';\nimport { addDays } from '@/shared/dn-shared-helper.js';\nimport { Task } from '@/shared/dn-task.js';\n\n/**\n * @param {{st:Date; numberOfDays:number}[]} dateIntervals\n * @param {number} id\n * @param {boolean} idIsEmp\n * @return {Promise<Task[]>}\n */\nexport async function getScheduleTasks(dateIntervals, id, idIsEmp = false) {\n const result = await getTasks(dateIntervals, id, idIsEmp);\n return result.map(x => new Task(x));\n}\n\n/**\n * @param {{st:Date; numberOfDays:number}[]} dateIntervals\n * @param {number} id\n * @param {boolean} idIsEmp\n * @return {Promise<import(\"@/shared/dn-task.js\").TaskDto[]>}\n */\nexport async function getTasks(dateIntervals, id, idIsEmp = false) {\n const idParam = idIsEmp ? 'empId' : 'ccid';\n const st = dateIntervals.map(x => x.st.toISOString()).join(';');\n const fi = dateIntervals.map(x => (new Date(addDays(x.st, x.numberOfDays))).toISOString()).join(';');\n /** @type {import(\"@/shared/dn-task.js\").TaskDto[]} */\n const result = await fetchAndCheckJson(`scheduletasks?st=${st}&fi=${fi}&${idParam}=${id}`, 'GET');\n return result;\n}\n\n/**\n * @param {{st:Date; numberOfDays:number}[]} dateIntervals\n * @param {number} id\n * @param {boolean} idIsEmp\n * @param {{id:number;histId:number}} last\n * @return {Promise<{tasks:import(\"@/shared/dn-task.js\").TaskDto[];last:{id:number; histId:number};deleted?:number[];updated?:import(\"@/shared/dn-task.js\").TaskDto[]}>}\n */\nexport async function getScheduleTasksSync(dateIntervals, id, idIsEmp = false, last) {\n const idParam = idIsEmp ? 'empId' : 'ccid';\n const st = dateIntervals.map(x => x.st.toISOString()).join(';');\n const fi = dateIntervals.map(x => (new Date(addDays(x.st, x.numberOfDays))).toISOString()).join(';');\n\n /** @type {{tasks:import(\"@/shared/dn-task.js\").TaskDto[];last:{id:number; histId:number};deleted?:number[];updated?:import(\"@/shared/dn-task.js\").TaskDto[]}} */\n const result = await fetchAndCheckJson(`scheduletasks?st=${st}&fi=${fi}&${idParam}=${id}&minId=${last.id}&minHistId=${last.histId}`, 'GET');\n return result;\n}\n\n/**\n * @param {import(\"@/shared/dn-task.js\").TaskDto} dto\n */\nfunction getUniqueTaskDtoKey(dto) {\n const st = new Date(dto.st);\n return dto.empid + '_' + dto.tasktypeId + '_' + st.getTime();\n}\n\n/**\n * @param {Task} t\n */\nfunction getUniqueTaskKey(t) {\n return t.empid + '_' + t.tasktypeId + '_' + t.st.getTime();\n}\n\n/**\n * @param {{st:Date; numberOfDays:number}[]} dateIntervals\n * @param {number} id\n * @param {boolean} idIsEmp\n * @param {{id:number;histId:number}} last\n * @param {import(\"@/model/dn-schedule-task.js\").ScheduleTasks} scheduleTasks\n */\nexport async function updateScheduleTasks(dateIntervals, id, idIsEmp, last, scheduleTasks) {\n scheduleTasks.removeUnsavedDeletedTasks();\n const tasks = scheduleTasks.list;\n const result = await getScheduleTasksSync(dateIntervals, id, idIsEmp, last);\n let wasChanged = false\n if (result.deleted && result.deleted.length > 0) {\n const toDelete = new Set(result.deleted);\n for (let i = tasks.length - 1; i >= 0; i--) {\n const t = tasks[i];\n if (t.id >0 && toDelete.has(t.id)) {\n if (t.hasChanges) {\n t.id = -1;\n t.confirmChanges();\n } else {\n t.toDelete();\n tasks.splice(i, 1);\n }\n }\n }\n wasChanged = true;\n }\n\n if ((result.updated && result.updated.length > 0) || result.tasks.length > 0) {\n wasChanged = true;\n const currentById = new Map(tasks.filter(x => x.id > 0).map(x => [x.id, x]));\n const unsavedByUniqueKey = new Map(tasks.filter(x => x.id <= 0).map(x => [getUniqueTaskKey(x), x]));\n if (result.updated) {\n for (const dto of result.updated) {\n updateOrInsert(scheduleTasks, dto, currentById, unsavedByUniqueKey);\n }\n }\n for (const dto of result.tasks) {\n updateOrInsert(scheduleTasks, dto, currentById, unsavedByUniqueKey);\n }\n }\n\n last.id = result.last.id;\n last.histId = result.last.histId;\n return wasChanged;\n\n /**\n * @param {import(\"@/model/dn-schedule-task.js\").ScheduleTasks} scheduleTasks\n * @param {import(\"@/shared/dn-task.js\").TaskDto} dto\n * @param {Map<number, Task>} currentById\n * @param {Map<string, Task>} unsavedByUniqueKey\n */\n function updateOrInsert(scheduleTasks, dto, currentById, unsavedByUniqueKey) {\n let t = currentById.get(dto.id);\n if (t !== undefined) {\n t.update(dto);\n } else {\n const key = getUniqueTaskDtoKey(dto);\n t = unsavedByUniqueKey.get(key);\n if (t !== undefined) {\n t.update(dto);\n } else {\n t = scheduleTasks.add(dto);\n currentById.set(t.id, t);\n }\n }\n }\n}\n","import { getLoginInfo, setLoginInfo } from './dn-localStorage.js';\nimport { LoginInfo } from '@/model/dn-login.js';\nimport { EventBus } from \"./dn-event-bus.js\";\nconst apiPath = 'https://api-dot-secure-ripple-312910.nw.r.appspot.com/';\n\nexport function getApiPath() {\n return apiPath;\n}\n\n/**\n * @param {{ email: string; password: string; }} userCredentials\n * @param {{ loginId: number; password: string; }} [credentials2]\n * @returns {Promise<{msg?:string;cause?:number;loginId?:number; refreshToken?:string;accessToken?:string;user?:{id:number;email:string;name:string;authMethod:number|null;reqNotify:number|null}}>}\n */\nexport async function login(userCredentials, credentials2 = undefined) {\n const url = apiPath + 'authentication/user';\n const body = {\n strategy: 'local',\n email: userCredentials.email,\n password: userCredentials.password\n };\n\n if (credentials2) {\n body.loginId = credentials2.loginId;\n body.password2 = credentials2.password;\n }\n\n const options = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body)\n };\n\n try {\n const response = await fetch(url, options);\n const json = await response.json();\n if (response.ok) return json;\n \n let cause = 0;\n let msg;\n if (response.status === 401) {\n msg = 'Wrong email or password.';\n if (json.data) {\n cause = json.data.cause;\n console.log(cause)\n }\n } else { \n msg = response.statusText; \n }\n \n return { msg, cause};\n\n } catch (error) {\n console.log(error)\n return { msg: error.message};\n }\n}\n\nlet _lastUpdateAccessToken = 0;\n\n/**\n * @param {import(\"@/model/dn-login.js\").LoginInfo} loginInfo\n */\nexport async function updateAccessToken(loginInfo) {\n // avoid duplicated calls.\n if (Date.now() - _lastUpdateAccessToken < 1000 * 30) {\n let counter = 0;\n do {\n await new Promise((resolve) => {\n setTimeout(() => resolve(), 1000)\n });\n if (!loginInfo.needRefresh()) {\n return;\n }\n\n counter++;\n } while (counter < 10);\n\n return;\n }\n\n _lastUpdateAccessToken = Date.now();\n const url = apiPath + 'authentication/user';\n const options = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n 'strategy': 'local',\n 'action': 'refresh',\n 'refresh_token': loginInfo.refreshToken\n })\n };\n return await fetch(url, options).then(returnJson)\n .then(function (response) {\n loginInfo.setAuthRefreshResult(response);\n setLoginInfo(loginInfo);\n })\n}\n\nexport async function passwordReset(accCredentials) {\n const url = apiPath + 'user/change-password';\n const options = {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n 'accToReset': {\n 'userName': accCredentials.username,\n 'password': accCredentials.password,\n 'newPassword': accCredentials.newPassword\n }\n })\n };\n\n return await fetch(url, options)\n .then(function (response) {\n let result;\n console.log(response)\n if (response.status === 401) {\n result = {\n msg: 'Wrong username or password!',\n success: false\n }\n return result;\n }\n else if (response.status === 200) {\n result = {\n msg: 'Success',\n success: true\n }\n return result;\n }\n }).catch(function (error) {\n return error.statusText\n });\n}\n\n/**\n * @param {string} key\n * @param {(isAgent) => void} afterExternalLogin\n */\nexport async function externalLogin(key, afterExternalLogin) {\n const options = { method: 'PATCH' };\n const url = apiPath + `authentication/external/${key}`;\n try {\n /** @type {{accessToken:string, user: {id:number;email:string;isAgent:boolean;name:string, schema:string}}} */\n const result = await fetch(url, options).then(checkIfOk).then(returnJson);\n const loginInfo = new LoginInfo({ accessToken: result.accessToken, customerSchema: result.user.schema, isAgent: result.user.isAgent });\n setLoginInfo(loginInfo);\n afterExternalLogin(loginInfo.isAgent);\n } catch (error) {\n afterExternalLogin();\n }\n}\n\nexport function getSchemas() {\n return fetchAndCheckJson('schema-selection/', 'GET')\n}\n\nexport function getLongestCalls(date, maxToReturn, longestCallKind) {\n let path =\n 'callDetails/longestCalls?dt=' +\n date +\n '&maxToReturn=' +\n maxToReturn +\n '&longestCallKind=' +\n longestCallKind;\n return fetchAndCheckJson(path, 'GET');\n}\n\nexport async function getCustomerData(schema) {\n let path = 'customer-data';\n if (schema)\n path += '?schema=' + schema;\n return await fetchAndCheckJson(path, 'GET');\n}\n\nexport async function saveForecastAdjustment(adjustmentsToSave){\n await fetchAndCheckJson(`forecastadjustment`,'POST', adjustmentsToSave);\n}\n\n/**\n * @param {number} contactCenterId\n * @param {FormData} formData\n */\nexport async function importEmployeeData(contactCenterId, formData) {\n let loginInfo = getLoginInfo();\n if (loginInfo === null) {\n throw 'No login.';\n }\n\n if (loginInfo.needRefresh()) {\n await updateAccessToken(loginInfo);\n }\n const accessToken = loginInfo.accessToken;\n const response = await fetch(`${apiPath}import-employee-data?ccId=${contactCenterId}`, {\n method: 'POST',\n headers: {\n Authorization: 'Bearer ' + accessToken,\n 'dn-customer-schema': loginInfo.customerSchema\n },\n body: formData\n });\n\n if (response.status !== 201) {\n let json = await response.json();\n throw json.message;\n }\n\n return await response.text();\n}\n\n/**\n * @param {string} resource\n * @param {string} method\n * @param {any} data\n */\nasync function fetchAndCheck(resource, method, data) {\n EventBus.emit('onError', null);\n const loginInfo = getLoginInfo();\n if (loginInfo === null) {\n return Promise.reject(new Error('No login.'));\n }\n\n if (loginInfo.needRefresh()) {\n await updateAccessToken(loginInfo);\n }\n\n const options = getOptions(method, loginInfo, data);\n var url = apiPath + resource;\n return fetch(url, options)\n .then(checkIfOk)\n .catch(function (error) {\n EventBus.emit('onError', error.message);\n return Promise.reject(error);\n });\n}\n\nexport async function fetchAndCheckJson(resource, method, data = undefined) {\n return fetchAndCheck(resource, method, data).then(returnJson);\n}\n\nfunction checkIfOk(response) {\n if (response.ok) return response;\n let msg = '';\n if (response.status === 401) EventBus.emit('unauthorized');\n else msg = response.statusText;\n throw new Error(msg);\n}\n\nfunction returnJson(response) {\n if (response.status === 204) return null;\n return response.json();\n}\n\n/**\n * @param {string} method\n * @param {import(\"@/model/dn-login.js\").LoginInfo} loginInfo\n * @param {any} data\n * @return {RequestInit}\n */\nfunction getOptions(method, loginInfo, data) {\n if (data === undefined || data === null) {\n return {\n method: method,\n headers: {\n Authorization: 'Bearer ' + loginInfo.accessToken,\n 'dn-customer-schema': loginInfo.customerSchema\n }\n };\n }\n\n return {\n method: method,\n headers: {\n Authorization: 'Bearer ' + loginInfo.accessToken,\n 'Content-Type': 'application/json',\n 'dn-customer-schema': loginInfo.customerSchema\n },\n\n body: JSON.stringify(data)\n };\n}","import { getStartOfWeek } from '@/js/dn-helper.js';\nimport { addDays, getShortDate, getStartOfDay } from '@/shared/dn-shared-helper.js';\n\n/**\n * @param {Date} nowDt\n * @param {{ forecastWeeks: number; historicFocusDate:null|Date; historicWeeks: number; occupacyFte: number; }} forecastOptions\n * @param {Map<string, number>} specialDays\n * @param {Map<string, {acgr:number, dt:Date, ahtData:number[], nocData:number[]}>} historicDataMap\n * @param {{id:number}[]} callGroups\n * @param {{id:number}[]} dayTypes\n */\nexport function getAllWeekData(nowDt,forecastOptions,specialDays,historicDataMap,callGroups, dayTypes) {\n const returnData = new Map();\n let startDate=new Date()\n if(forecastOptions.historicFocusDate!==null){\n startDate = getStartOfWeek(addDays(new Date(forecastOptions.historicFocusDate), 0)); /* mon or sun of the youngset week */\n }else{\n startDate = getStartOfWeek(addDays(new Date(nowDt), forecastOptions.forecastWeeks * 7)); /* mon or sun of the youngset week */\n }\n\n\n for (let a = 0; a < callGroups.length; a++) {\n let weekMap = new Map();\n /* NORMAL DAYS including special days during normal period*/\n for (let w = 0; w < forecastOptions.historicWeeks + forecastOptions.forecastWeeks; w++) {\n let dtweekStart = getStartOfWeek(addDays(startDate, 1 - w * 7));\n\n let wArray = []; /* 7 days */\n for (let d = 0; d <= 6; d++) {\n let dtx = addDays(dtweekStart, d);\n wArray.push(getDayData(callGroups[a].id, dtx, forecastOptions.occupacyFte,historicDataMap));\n }\n weekMap.set(getShortDate(dtweekStart), wArray);\n }\n\n /* SPECIAL DAYS*/\n if(forecastOptions.historicFocusDate===null){\n for (let dx = 1; dx < dayTypes.length; dx++) {\n let itr = historicDataMap.keys();\n for (let i = 0; i < historicDataMap.size; i++) {\n let key = itr.next().value;\n let histData =historicDataMap.get(key);\n\n if (specialDays.has(getShortDate(histData.dt))) {\n if (histData.acgr == callGroups[a].id && specialDays.get(getShortDate(histData.dt)) == dayTypes[dx].id) {\n let dt = new Date(histData.dt);\n let wArray = [];\n let dtweekStart = getStartOfWeek(dt);\n let dtkey = getShortDate(dtweekStart);\n if (weekMap.has(dtkey)) {\n wArray = weekMap.get(dtkey);\n } else {\n for (let d = 0; d <= 6; d++) {\n wArray.push({ weekdayindex: d, dt: null, fte: 0, ffte: 0, noc: 0, fnoc: 0, aht: 0, faht: 0, nocRms: 8, dayType: 0, isChecked: false });\n }\n }\n wArray[dt.getDay()] = getDayData(callGroups[a].id, dt, forecastOptions.occupacyFte,historicDataMap);\n weekMap.set(dtkey, wArray);\n }\n }\n }\n }\n }\n\n /* Transfer data from weekMap to weeklists */\n let itr2 = weekMap.keys();\n let weekList = []; /* One row per week */\n for (let i = 0; i < weekMap.size; i++) {\n let key = itr2.next().value;\n let val = weekMap.get(key);\n let dt = new Date(key);\n let weeknumber = dt.getWeekNumber();\n\n if (new Date(dt).getFullYear() != nowDt.getFullYear()) {\n weeknumber = dt.getFullYear() + ' ' + dt.getWeekNumber();\n }\n\n weekList.push({ week: 'w ' + weeknumber, weekdata: val });\n }\n let key = callGroups[a].id;\n returnData.set(key, weekList);\n }\n return returnData;\n}\nexport function updateForecastInAllWeekData(callStatsWeekMap, nowDt, forecastOptions, specialDaysMap, forecastAdjustmentmap,historicDataMap,aiForecastMap,callGroups, latestImportDate) {\n let focusDt =nowDt\n if(forecastOptions.historicFocusDate!==null){ focusDt = forecastOptions.historicFocusDate }\n for (let a = 0; a < callGroups.length; a++) {\n let key = callGroups[a].id;\n let weekList = callStatsWeekMap.get(key);\n for (let w = 0; w < weekList.length; w++) {\n for (let d = 0; d < 7; d++) {\n let dayData = weekList[w].weekdata[d];\n const dt = new Date(dayData.dt);\n const forc = getForcastXX(dt, focusDt, specialDaysMap, forecastOptions.historicWeeks, callGroups[a], historicDataMap,aiForecastMap, forecastAdjustmentmap, latestImportDate);\n dayData.fnoc = parseInt(forc.noc.reduce((a, b) => a + b, 0));\n if (dayData.fnoc > 0) {\n dayData.faht = forc.ht.reduce((a, b) => a + b, 0) / dayData.fnoc;\n dayData.ffte = (dayData.faht * dayData.fnoc) / (96*900*(forecastOptions.occupacyFte/100));\n }\n dayData.nocRms=dayData.noc*getRMS(callGroups[a].id,dt,forc.noc,historicDataMap)\n }\n }\n }\n return callStatsWeekMap;\n}\n\nfunction getRMS(acgr,dt,fnoc,historicDataMap){\n let keyx = acgr + '_' + dt.yyyymmdd();\n let seriesData = {};\n if (historicDataMap.has(keyx)) {\n seriesData = historicDataMap.get(keyx);\n let sq= seriesData.nocData.map(function(x, index) {return Math.pow((fnoc[index] -x),2) });\n let sqRef=seriesData.nocData.map(function(x, index) {return Math.pow((x),2) });\n let refRMS =Math.sqrt(sqRef.reduce((a, b) => a + b, 0) / 96)\n let RMS =Math.sqrt(sq.reduce((a, b) => a + b, 0) / 96)\n if(refRMS>0){return 100*RMS/refRMS;}\n }\n return 0\n}\n\n\n\n/**\n * @param {{ selectedParameters: string[]; compareWithForecast: boolean; selectedCallGroups: {id:number;forecastMethod:number}[]; selectedDates: any[]; historicWeeks: number; occupacyFte: number}} forecastOptions\n * @param {Map<string, number>} specialDaysMap\n * @param {Date} dateNow\n * @param {Map<string, Map<number, any>>} forecastAdjustmentmap\n * @param {Map<string, { dt: Date; acgr: number; ahtData: number[]; nocData: number[]; }>} historicDataMap\n * @param {import(\"@/stores/dn-forecast-ai-data.js\").ForecastDataMap} aiForecastMap\n * @param {Date} latestImportDate\n */\nexport function getChartData(forecastOptions, specialDaysMap,dateNow,forecastAdjustmentmap,historicDataMap,aiForecastMap, latestImportDate) {\n const selectedCallGroups = forecastOptions.selectedCallGroups;\n const dates = forecastOptions.selectedDates;\n const params = forecastOptions.selectedParameters;\n let returnValue = [];\n\n if (params.length == 1) {\n if(dates.length == 1){\n switch (params[0]) {\n case \"noc\":\n\n if (isForecast(dates[0])) {\n returnValue.push(getChartSerie(selectedCallGroups, dates[0], 'fnoc', dateNow, specialDaysMap, forecastOptions,forecastAdjustmentmap,historicDataMap, aiForecastMap, latestImportDate));\n } else {\n returnValue.push(getChartSerie(selectedCallGroups, dates[0], params[0], dateNow, specialDaysMap, forecastOptions,forecastAdjustmentmap, historicDataMap,aiForecastMap, latestImportDate));\n if (forecastOptions.compareWithForecast) {\n returnValue.push(getChartSerie(selectedCallGroups, dates[0], 'fnoc', dateNow, specialDaysMap, forecastOptions,forecastAdjustmentmap, historicDataMap,aiForecastMap, latestImportDate));\n }\n }\n break;\n case \"aht\":\n if (isForecast(dates[0])) {\n returnValue.push(getChartSerie(selectedCallGroups, dates[0], 'faht', dateNow, specialDaysMap, forecastOptions,forecastAdjustmentmap, historicDataMap,aiForecastMap, latestImportDate));\n } else {\n returnValue.push(getChartSerie(selectedCallGroups, dates[0], params[0], dateNow, specialDaysMap, forecastOptions,forecastAdjustmentmap, historicDataMap,aiForecastMap, latestImportDate));\n if (forecastOptions.compareWithForecast) {\n returnValue.push(getChartSerie(selectedCallGroups, dates[0], 'faht', dateNow, specialDaysMap, forecastOptions,forecastAdjustmentmap, historicDataMap,aiForecastMap, latestImportDate));\n }\n }\n break;\n case \"fte\":\n if (isForecast(dates[0])) {\n returnValue.push(getChartSerie(selectedCallGroups, dates[0], 'ffte', dateNow, specialDaysMap, forecastOptions,forecastAdjustmentmap, historicDataMap,aiForecastMap, latestImportDate));\n } else {\n returnValue.push(getChartSerie(selectedCallGroups, dates[0], params[0], dateNow, specialDaysMap, forecastOptions,forecastAdjustmentmap, historicDataMap,aiForecastMap, latestImportDate));\n if (forecastOptions.compareWithForecast) {\n returnValue.push(getChartSerie(selectedCallGroups, dates[0], 'ffte', dateNow, specialDaysMap, forecastOptions,forecastAdjustmentmap, historicDataMap,aiForecastMap, latestImportDate));\n }\n }\n break;\n default:\n console.log(\"in default\");\n }\n }else{\n for (let i = 0; i < dates.length; i++) {\n switch (params[0]) {\n case \"noc\":\n\n if (isForecast(dates[i])) {\n returnValue.push(getChartSerie(selectedCallGroups, dates[i], 'fnoc', dateNow, specialDaysMap, forecastOptions,forecastAdjustmentmap, historicDataMap,aiForecastMap, latestImportDate));\n } else {\n returnValue.push(getChartSerie(selectedCallGroups, dates[i], params[0], dateNow, specialDaysMap, forecastOptions,forecastAdjustmentmap, historicDataMap,aiForecastMap, latestImportDate));\n }\n break;\n case \"aht\":\n if (isForecast(dates[i])) {\n returnValue.push(getChartSerie(selectedCallGroups, dates[i], 'faht', dateNow, specialDaysMap, forecastOptions,forecastAdjustmentmap, historicDataMap,aiForecastMap, latestImportDate));\n } else {\n returnValue.push(getChartSerie(selectedCallGroups, dates[i], params[0], dateNow, specialDaysMap, forecastOptions,forecastAdjustmentmap, historicDataMap,aiForecastMap, latestImportDate));\n\n }\n break;\n case \"fte\":\n if (isForecast(dates[i])) {\n returnValue.push(getChartSerie(selectedCallGroups, dates[i], 'ffte', dateNow, specialDaysMap, forecastOptions,forecastAdjustmentmap, historicDataMap,aiForecastMap, latestImportDate));\n } else {\n returnValue.push(getChartSerie(selectedCallGroups, dates[i], params[0], dateNow, specialDaysMap, forecastOptions,forecastAdjustmentmap, historicDataMap,aiForecastMap, latestImportDate));\n }\n break;\n default:\n console.log(\"in default\");\n }\n }\n }\n return returnValue;\n }\n\n if (dates.length == 1) {\n for (let i = 0; i <params.length; i++) {\n switch (params[i]) {\n\n case \"noc\":\n\n if (isForecast(dates[0])) {\n returnValue.push(getChartSerie(selectedCallGroups, dates[0], 'fnoc', dateNow, specialDaysMap, forecastOptions,forecastAdjustmentmap, historicDataMap, aiForecastMap,latestImportDate));\n } else {\n returnValue.push(getChartSerie(selectedCallGroups, dates[0], params[i], dateNow, specialDaysMap, forecastOptions,forecastAdjustmentmap, historicDataMap, aiForecastMap,latestImportDate));\n }\n break;\n case \"aht\":\n if (isForecast(dates[0])) {\n returnValue.push(getChartSerie(selectedCallGroups, dates[0], 'faht', dateNow, specialDaysMap, forecastOptions,forecastAdjustmentmap, historicDataMap, aiForecastMap,latestImportDate));\n } else {\n returnValue.push(getChartSerie(selectedCallGroups, dates[0], params[i], dateNow, specialDaysMap, forecastOptions,forecastAdjustmentmap, historicDataMap, aiForecastMap,latestImportDate));\n }\n break;\n case \"fte\":\n if (isForecast(dates[0])) {\n returnValue.push(getChartSerie(selectedCallGroups, dates[0], 'ffte', dateNow, specialDaysMap, forecastOptions,forecastAdjustmentmap, historicDataMap, aiForecastMap,latestImportDate));\n } else {\n returnValue.push(getChartSerie(selectedCallGroups, dates[0], params[i], dateNow, specialDaysMap, forecastOptions,forecastAdjustmentmap, historicDataMap, aiForecastMap,latestImportDate));\n }\n break;\n default:\n console.log(\"in default\");\n }\n }\n }\n\n if(dates.length > 1&¶ms.length>1){\n returnValue = []\n }\n\n return returnValue;\n function isForecast(dt){\n return (new Date(dt) >= new Date(dateNow) || dt == dateNow)\n }\n}\n\n/**\n * @param {Date} dt\n * @param {number} length\n * @param {Date} nowDt\n * @param {Map<string, number>} specialDaysMap\n * @param {number} numberOfWeeks\n * @param {object} acgr\n * @param {Map<string, { dt: Date; acgr: number; ahtData: number[]; nocData: number[]; }>} historicDataMap\n * @param {import(\"@/stores/dn-forecast-ai-data.js\").ForecastDataMap} aiForecastMap\n * @param {Map<string, Map<number, any>>} forecastAdjustmentmap\n * @param {Date} latestImportDate\n */\nexport function getForcastOnInterval(dt, length, nowDt, specialDaysMap, numberOfWeeks, acgr, historicDataMap,aiForecastMap, forecastAdjustmentmap, latestImportDate) {\n const indexesPerDay = 96;\n const startOfDay = getStartOfDay(dt);\n if (length === indexesPerDay && startOfDay.getTime() === dt.getTime()) {\n return getForcastXX(dt, nowDt, specialDaysMap, numberOfWeeks, acgr, historicDataMap,aiForecastMap, forecastAdjustmentmap, latestImportDate);\n }\n\n const msPerIndex = 1000*60*15;\n const startIndex = Math.floor((dt.getTime() - startOfDay.getTime()) / msPerIndex);\n const lengthNextDay = Math.max(0, startIndex + length - indexesPerDay);\n const lengthStartDay = length - lengthNextDay;\n const forecast = getForcastXX(startOfDay, nowDt, specialDaysMap, numberOfWeeks, acgr, historicDataMap,aiForecastMap, forecastAdjustmentmap, latestImportDate);\n forecast.ht = forecast.ht.slice(startIndex, startIndex + lengthStartDay);\n forecast.noc= forecast.noc.slice(startIndex, startIndex + lengthStartDay);\n if (lengthNextDay > 0) {\n const nextDay = addDays(startOfDay, 1);\n const forecastNextDay = getForcastXX(nextDay, nowDt, specialDaysMap, numberOfWeeks, acgr, historicDataMap,aiForecastMap, forecastAdjustmentmap, latestImportDate);\n forecast.ht = forecast.ht.concat(forecastNextDay.ht.slice(0, lengthNextDay));\n forecast.noc = forecast.noc.concat(forecastNextDay.noc.slice(0, lengthNextDay));\n }\n\n return forecast;\n}\n\n/**\n * Calculate forecast for one given day\n * @param {Date} dt\n * @param {Date} nowDt\n * @param {Map<string, number>} specialDaysMap\n * @param {number} numberOfWeeks\n * @param {{id:number;forecastMethod:number}} acgr\n * @param {Map<string, {dt:Date, acgr:number, ahtData:number[], nocData:number[]}>} historicDataMap\n * @param {import(\"@/stores/dn-forecast-ai-data.js\").ForecastDataMap} aiForecastMap\n * @param {Map<string, Map<number, any>>} forecastAdjustmentmap\n * @param {Date} latestImportDate\n */\nexport function getForcastXX(dt, nowDt, specialDaysMap, numberOfWeeks, acgr, historicDataMap,aiForecastMap, forecastAdjustmentmap, latestImportDate,ignoreCopiedData=false) {\n \n let adjInfo =getAdj(dt, acgr.id, forecastAdjustmentmap);\n let daytype = getDaytype(dt, specialDaysMap);\n if (!latestImportDate) { latestImportDate = nowDt; }\n\n /** @type {number[]}} */\n let nocSum = new Array(96).fill(0);\n /** @type {number[]}} */\n let htSum = new Array(96).fill(0);\n\n if(acgr.forecastMethod==1){\n let keyx = acgr.id + '_' + getShortDate(dt);\n if(aiForecastMap.has(keyx)){\n let x = aiForecastMap.get(keyx)\n nocSum = x.nocData\n for (let i = 0; i < 96; i++) {\n htSum[i]= x.ahtData[i] * x.nocData[i]\n }\n }\n }else{\n\n //future days same forecast as earliest future day\n if (dt.getTime() >= nowDt.getTime()) {\n let weekOffset = Math.floor((dt.getTime() - nowDt.getTime()) / (60 * 60 * 24 * 1000 * 7));\n dt = addDays(dt, -weekOffset * 7);\n }\n let numberOfDysCounter = 0;\n\n if (daytype == 0) {\n for (let wx = 1; wx < numberOfWeeks + 1; wx++) {\n let dtx = addDays(new Date(dt), -wx * 7);\n let keyx = acgr.id + '_' + getShortDate(dtx);\n let histData = {};\n\n //exclude days that are not complete\n if (historicDataMap.has(keyx)&&dtx<=addDays(latestImportDate, -1)) {\n histData = historicDataMap.get(keyx);\n let daytypex = getDaytype(dtx, specialDaysMap);\n if(histData.nocData.reduce((a, b) => a + b, 0)>0){\n if (daytypex == 0) {\n nocSum = nocSum.map(function(x, index) {\n return histData.nocData[index] + x;\n });\n htSum = htSum.map(function(x, index) {\n return histData.nocData[index] * histData.ahtData[index] + x;\n });\n numberOfDysCounter++;\n }\n }\n }\n }\n } else {\n let itr = historicDataMap.keys();\n for (let i = 0; i < historicDataMap.size; i++) {\n let key = itr.next().value;\n let histData = historicDataMap.get(key);\n let dtx = histData.dt;\n if (dtx < dt) {\n let daytypex = getDaytype(dtx, specialDaysMap);\n\n if (histData.acgr == acgr.id && daytypex == daytype) {\n if(histData.nocData.reduce((a, b) => a + b, 0)>0){\n nocSum = nocSum.map(function(x, index) {\n return histData.nocData[index] + x;\n });\n htSum = htSum.map(function(x, index) {\n return histData.nocData[index] * histData.ahtData[index] + x;\n });\n numberOfDysCounter++;\n }\n }\n }\n }\n }\n\n/*\nlet isDemo=false\n let loginInfo = dnLocalStorage.getLoginInfo();\n if(loginInfo && loginInfo.customerSchema == 'demo'){isDemo=true}\n if (numberOfDysCounter > 0) {\n nocSum = nocSum.map(function(x) {\n if(isDemo){return 1*x / numberOfDysCounter;}else{return x / numberOfDysCounter;}\n });\n htSum = htSum.map(function(x) {\n if(isDemo){return 1*x / numberOfDysCounter;}else{return x / numberOfDysCounter;}\n });\n } */\n\n//*************************************************************************** */\n if (numberOfDysCounter > 0) {\n nocSum = nocSum.map(function(x) {\n return x / numberOfDysCounter;\n });\n htSum = htSum.map(function(x) {\n return x / numberOfDysCounter;\n });\n }\n\n}\n //*************************************************************************** */\n\n /* STATIC COPIED DATA */\n if (adjInfo.copiedNocAht&&!ignoreCopiedData) {\n nocSum=adjInfo.copiedNocAht.noc\n htSum=adjInfo.copiedNocAht.ht\n }\n\n //ADJUSTEMENT\n if (adjInfo.nocAdj!=0) {\n return adjustSeries(htSum,nocSum, adjInfo.nocAdj,adjInfo.quarterRange)\n }\n\n/* nocSum = new Array(96).fill(0)\n htSum = new Array(96).fill(0*300)\n\n nocSum[48] = 5\n htSum[48] = 5*300 */\n\n return { noc: nocSum, ht: htSum };\n}\n\nfunction adjustSeries(ht,noc, adj,quarterRange) {\n let qr =[0,96]\n if(quarterRange){qr=quarterRange}\n let nocAdj = []\n let s = noc.map(function(x,index) {return index>=qr[0]&&index<qr[1]? x:0}).reduce((a, b) => a + b, 0);\n if (s != 0) {\n nocAdj = noc.map(function(x,index) {return index>=qr[0]&&index<qr[1]? x+ (x * adj/ s):x});\n ht = ht.map(function(x,index) {return noc[index]>0 ? x*nocAdj[index]/noc[index]:0});\n }\n return { noc: nocAdj, ht: ht };\n}\n\n/**\n * @param {string} parameter\n */\nexport function getForecastSetValue(parameter) {\n let returnValue = { setValue: 0, minimum: 0, maximum: 0 };\n switch (parameter) {\n case 'SL':\n returnValue = { setValue: 80, minimum: 70, maximum: 90 };\n break;\n default:\n console.log('in default');\n }\n return returnValue;\n}\n\n/**\n * @param {Date} dt\n * @param {number} acgr\n * @param {Map<string, Map<number, any>>} forecastAdjustmentmap\n */\nfunction getAdj(dt, acgr, forecastAdjustmentmap) {\n let adj = {nocAdj:0,quarterRange:[0,96],copiedNocAht:null};\n let timerange = null\n const day = getShortDate(dt);\n if (forecastAdjustmentmap.has(day)) {\n let adjMap = forecastAdjustmentmap.get(day);\n if (adjMap.has(acgr)) {\n adj = adjMap.get(acgr);\n }\n }\n\n return adj;\n}\n\n/**\n * @param {{id:number;forecastMethod:number}[]} selectedCallGroups\n * @param {string | number | Date} dt\n * @param {string} param\n * @param {Date} nowDt\n * @param {Map<string, number>} specialDaysMap\n * @param {{ historicWeeks: number; occupacyFte: number; }} forecastOptions\n * @param {Map<string, Map<number, any>>} forecastAdjustmentmap\n * @param {Map<string, { dt: Date; acgr: number; ahtData: number[]; nocData: number[]; }>} historicDataMap\n * @param {import(\"@/stores/dn-forecast-ai-data.js\").ForecastDataMap} aiForecastMap\n * @param {Date} [latestImportDate]\n */\nexport function getChartSerie(selectedCallGroups, dt, param, nowDt, specialDaysMap, forecastOptions, forecastAdjustmentmap,historicDataMap,aiForecastMap, latestImportDate) {\n\n let shortDate = getShortDate(new Date(dt));\n\n let nocArray = Array(96).fill(0);\n let htArray = Array(96).fill(0);\n\n let returnArray = [];\n\n for (let a = 0; a < selectedCallGroups.length; a++) {\n let key = selectedCallGroups[a].id + '_' + shortDate;\n let nocData = [];\n let htData = [];\n if (param == 'noc' || param == 'aht' || param == 'fte') {\n let seriesData = {};\n if (historicDataMap.has(key)) {\n seriesData = historicDataMap.get(key);\n\n nocData = seriesData.nocData;\n htData = seriesData.ahtData.map(function(x, index) {\n return x * nocData[index];\n });\n }\n } else {\n const x = getForcastXX(new Date(dt), nowDt, specialDaysMap, forecastOptions.historicWeeks, selectedCallGroups[a], historicDataMap,aiForecastMap, forecastAdjustmentmap, latestImportDate);\n nocData = x.noc;\n htData = x.ht;\n }\n\n //if day is 23 hours due to day shortening\n if(nocData.length<nocArray.length){\n let diff =nocData.length-nocArray.length\n for(let q=0;q<diff;q++){\n nocData.push(0)\n htData.push(0)\n }\n }\n\n if (nocData != null) {\n switch (param) {\n case 'noc':\n case 'fnoc':\n nocArray = nocArray.map(function(x, index) {\n return nocData[index] + x;\n });\n break;\n default:\n nocArray = nocArray.map(function(x, index) {\n return nocData[index] + x;\n });\n htArray = htArray.map(function(x, index) {\n return htData[index] + x;\n });\n break;\n }\n }\n }\n\n let scaleindex=0;\n switch (param) {\n case 'noc':\n case 'fnoc':\n scaleindex=0;\n returnArray = nocArray;\n break;\n case 'faht':\n case 'aht':\n scaleindex=1;\n returnArray = nocArray.map(function(x, index) {\n return x>0? (htArray[index] / x):0;\n });\n break;\n case 'fte':\n case 'ffte':\n scaleindex=2;\n returnArray = htArray.map(function(x) {\n return x / (900*(forecastOptions.occupacyFte/100));\n });\n break;\n default:\n break;\n }\n\n return {\n label: param,\n dt: dt,\n parameterData: returnArray,\n scaleIndex: scaleindex\n };\n}\n\n/**\n * @param {Date} dt\n * @param {Map<string, number>} specialDaysMap\n */\nexport function getDaytype(dt, specialDaysMap) {\n const key = getShortDate(dt);\n const daytype = specialDaysMap.get(key);\n if (daytype === undefined)\n return 0;\n\n return daytype;\n}\n\n/* calculate avg for hisoric data */\n/**\n * @param {string | number} acgr\n * @param {Date} dt\n * @param {number} occupancyFte\n * @param {Map<string, { acgr: number; dt: Date; ahtData: number[]; nocData: number[]; }>} historicDataMap\n */\nfunction getDayData(acgr, dt, occupancyFte,historicDataMap) {\n let key = acgr + '_' + getShortDate(dt);\n if (historicDataMap.has(key)) {\n let x = historicDataMap.get(key);\n let noc = 0;\n let ht = 0;\n for (let i = 0; i <= 95; i++) {\n noc += x.nocData[i];\n ht += x.ahtData[i] * x.nocData[i];\n }\n return { weekdayindex: dt.getDay(), dt: dt, fte: ht / (96*900*(occupancyFte/100)), ffte: 0, noc: parseInt(noc), fnoc: 0, aht: (noc>0)?(ht / noc):0, faht: 0, nocRms: 0, isChecked: false };\n } else {\n return { weekdayindex: dt.getDay(), dt: dt, fte: 0, ffte: 0, noc: 0, fnoc: 0, aht: 0, faht: 0, nocRms: 0, isChecked: false };\n }\n}\n\n/**\n * @param {Map<number, {week:string, weekdata:any[]}[]>} callStatsWeekMap\n * @param {{ selectedCallGroups: {id:number}[]; focusedDaytyp: { id: number; system: boolean; }; }} forecastOptions\n * @param {Map<string, number>} specialDaysMap\n */\nexport function getCallStatsWeek(callStatsWeekMap, forecastOptions, specialDaysMap) {\n if (callStatsWeekMap) {\n const callGroups = forecastOptions.selectedCallGroups;\n let returnArray = [];\n if (callGroups.length > 0) {\n const numberOfRows = callStatsWeekMap.get(callGroups[0].id).filter(isValidWeekRow).length;\n\n if (callGroups.length == 1) {\n returnArray = callStatsWeekMap.get(callGroups[0].id).filter(isValidWeekRow);\n } else {\n for (let j = 0; j < numberOfRows; j++) {\n let weekdata = [];\n for (let d = 0; d <= 6; d++) {\n weekdata.push(getEmptyDayData(d))\n }\n returnArray.push({ week: '', weekdata: weekdata });\n }\n for (let j = 0; j < numberOfRows; j++) {\n for (let i = 0; i < callGroups.length; i++) {\n const callStatWeekData = callStatsWeekMap.get(callGroups[i].id).filter(isValidWeekRow);\n for (let d = 0; d <= 6; d++) {\n returnArray[j].weekdata[d] = addWeeks(returnArray[j].weekdata[d], callStatWeekData[j].weekdata[d]);\n }\n }\n\n returnArray[j].week = callStatsWeekMap.get(callGroups[0].id).filter(isValidWeekRow)[j].week\n }\n }\n\n return returnArray;\n } else {\n return [];\n }\n }\n\n function isValidWeekRow(item) {\n let returnValue = false;\n for (let i = 0; i < 7; i++) {\n if (item.weekdata[i].dt != null) {\n if (forecastOptions.focusedDaytyp.id == specialDaysMap.get(getShortDate(item.weekdata[i].dt)) ||\n forecastOptions.focusedDaytyp.system) {\n returnValue = true;\n }\n }\n }\n return returnValue;\n }\n function addWeeks(item1, item2) {\n /* TODO Skulle det gÃ¥ snabbare om man inte skapade ett nytt objekt? */\n return {\n weekdayindex: item1.weekdayindex,\n dt: item2.dt,\n fte: item1.fte + item2.fte,\n ffte: item1.ffte + item2.ffte,\n noc: item1.noc + item2.noc,\n fnoc: item1.fnoc + item2.fnoc,\n aht: item1.noc + item2.noc > 0 ? (item1.noc * item1.aht + item2.aht * item2.noc) / (item1.noc + item2.noc) : 0,\n faht: item1.fnoc + item2.fnoc > 0 ? (item1.fnoc * item1.faht + item2.faht * item2.fnoc) / (item1.fnoc + item2.fnoc) : 0,\n nocRms: item1.nocRms + item2.nocRms,\n isChecked: false\n };\n }\n function getEmptyDayData(weekdayInedx) {\n return {\n weekdayindex: weekdayInedx,\n dt: null,\n fte: 0,\n ffte: 0,\n noc: 0,\n fnoc: 0,\n aht: 0,\n faht: 0,\n nocRms: 0,\n isChecked: false\n };\n }\n}\n\n/**\n * @param {{type:string,forecast:boolean}} kind \n * @param {Map} callsData \n * @param {Date} dt \n * @param {Array<object>} [selectedCallGroups=[]] \n * @param {object} [selectedAdjustmentRow=null] \n */\nexport function exportToFile(kind, callsData, dt, selectedCallGroups = [], selectedAdjustmentRow = null) {\n const callsDataToExport = callsData instanceof Map ? callsData : new Map(callsData);\n const formattedDate = getShortDate(dt);\n let csvContent = \"\";\n let filename = \"\";\n\n if (kind.type === 'row') {\n if (!selectedAdjustmentRow?.acgr?.id) {\n console.error(\"Invalid selected row data.\");\n return;\n }\n\n const rowId = selectedAdjustmentRow.acgr.id;\n if (!callsDataToExport.has(rowId)) {\n console.error(`No data found in the map for row ID: ${rowId}`);\n return;\n }\n\n const entry = callsDataToExport.get(rowId);\n const maxLength = Math.max(entry.noc.length, entry.ht.length);\n const emptyColumns = new Array(maxLength).fill(\"\").join(\",\");\n const csvHeader = `callgroup,date,param,${emptyColumns}\\n`;\n const csvRows = [\n `${rowId},${formattedDate},noc,${entry.noc.join(\",\")}`,\n `${rowId},${formattedDate},ht,${entry.ht.join(\",\")}`\n ];\n\n csvContent = csvHeader + csvRows.join(\"\\n\");\n if(kind.forecast){\n filename = `simTree forecast noc&ht for callgroup ${rowId} ${formattedDate}.csv`;\n } else {\n filename = `simTree actual noc&ht for callgroup ${rowId} ${formattedDate}.csv`;\n }\n\n } else if (kind.type === 'day') {\n if (!selectedCallGroups.length) {\n console.error(\"No selected callgroup provided.\");\n return;\n }\n\n const csvHeader = `callgroup,date,param,values\\n`;\n let csvRows = [];\n\n for (const callGroup of selectedCallGroups) {\n if (callsDataToExport.has(callGroup.id)) {\n const entry = callsDataToExport.get(callGroup.id);\n csvRows.push(`${callGroup.id},${formattedDate},noc,${entry.noc.join(\",\")}`);\n csvRows.push(`${callGroup.id},${formattedDate},ht,${entry.ht.join(\",\")}`);\n } else {\n console.warn(`No data found for callgroup ID: ${callGroup.id}`);\n }\n }\n\n csvContent = csvHeader + csvRows.join(\"\\n\");\n if(kind.forecast){\n filename = `simTree forecast noc&ht on ${formattedDate}.csv`;\n } else {\n filename = `simTree actual noc&ht on ${formattedDate}.csv`;\n }\n\n } else {\n console.error(\"Invalid export type.\");\n }\n\n const blob = new Blob([csvContent], { type: \"text/csv\" });\n const url = URL.createObjectURL(blob);\n const downloadAnchor = document.createElement(\"a\");\n downloadAnchor.href = url;\n downloadAnchor.download = filename;\n document.body.appendChild(downloadAnchor);\n downloadAnchor.click();\n document.body.removeChild(downloadAnchor);\n URL.revokeObjectURL(url);\n}\n/**\n * @param {string} type\n * @param {object} [selectedAdjustmentRow=null] \n */\n\nexport function importFromCsv(type,selectedAdjustmentRow){\n console.log(\"Import triggered\");\n return new Promise((resolve, reject) => { \n const fileInput = document.createElement(\"input\");\n fileInput.type = \"file\";\n fileInput.accept = \".csv\";\n fileInput.style.display = \"none\";\n fileInput.addEventListener(\"change\", async (event) => {\n const file = event.target.files[0];\n if (!file) return;\n\n try {\n let fileContent = await file.text();\n const lines = fileContent.split(\"\\n\").map(line => line.trim()).filter(line => line);\n \n if (lines.length < 2) {\n console.error(\"Invalid CSV format.\");\n return;\n }\n\n const importedCallsData = new Map();\n\n for (let i = 1; i < lines.length; i++) {\n const cols = lines[i].split(\",\");\n\n if (cols.length < 3) continue; \n\n const callgroup = parseInt(cols[0]);\n const param = cols[2].trim();\n const values = cols.slice(3).map(Number);\n if (!importedCallsData.has(callgroup)) {\n importedCallsData.set(callgroup, { noc: [], ht: [] });\n }\n\n importedCallsData.get(callgroup)[param] = values;\n }\n if(type==='row'){\n let row = selectedAdjustmentRow;\n row.copiedNocAht = importedCallsData.values().next().value;\n row.baseNoc = parseInt(row.copiedNocAht.noc.reduce((sum, val) => sum + val, 0));\n resolve(row);\n } else {\n resolve(importedCallsData);\n }\n\n } catch (error) {\n reject(error);\n }\n});\n document.body.appendChild(fileInput);\n fileInput.click();\n setTimeout(() => fileInput.remove(), 1000); \n})\n}\n","import { getDayDiff, getStartOfDay } from '@/shared/dn-shared-helper.js';\n\n/**\n * @param {any[]} array\n * @param {number} factor\n */\nexport function condence(array, factor, round = true) {\n let returnArray = []\n if (array) {\n for (let i = 0; i < array.length; i++) {\n let s = 0\n let nullCounter = 0\n for (let j = 0; j < factor; j++) {\n if (array[i] === null) { nullCounter += 1 }//if no calls sl is null\n else { s += array[i] }\n if (j > 0) { i++ }\n }\n if (nullCounter == factor) { returnArray.push(null) }\n else {\n if (round) { returnArray.push(Math.round(s / factor)) } else { returnArray.push(s / factor) }\n }\n }\n }\n return returnArray\n}\n\n/**\n * Chart resolution\n * @param {number} numberOfDays\n */\nexport function getDisplayResolutionFactor(numberOfDays) {\n let displayResolutionFactor = 1;\n if (numberOfDays <= 2) {\n displayResolutionFactor = 1;\n } else if (numberOfDays <= 7) {\n displayResolutionFactor = 2;\n } else if (numberOfDays <= 28) {\n displayResolutionFactor = 4;\n } else {\n displayResolutionFactor = 24;\n }\n return displayResolutionFactor;\n}\n\n/**\n * @param {Date[]} intervalMinusOneDay\n */\nexport function getNumberOfDaysFromIntervalMinusOne(intervalMinusOneDay) {\n return 1 + getDayDiff(intervalMinusOneDay[1], intervalMinusOneDay[0])\n}\n\n/**\n * @param {Date} dt\n */\nexport function getElapsedTimeString(dt) {\n let elapsed = Math.floor((Date.now() - dt.getTime()) / 1000);\n if (elapsed < 1) { return 'now';}\n let unit = 'second';\n if (elapsed >= 60) {\n elapsed = Math.floor(elapsed / 60);\n unit = 'minute';\n if (elapsed >= 60) {\n elapsed = Math.floor(elapsed / 60);\n unit = 'hour';\n if (elapsed >= 24) {\n elapsed = Math.floor(elapsed / 24);\n unit = 'day';\n }\n }\n }\n\n if (elapsed > 1) {\n unit = unit + 's';\n }\n\n return `${elapsed} ${unit} ago`;\n}\n\n/**\n * @param {Date} dt\n * @param {number} empid\n */\nexport function getSelectionKey(dt, empid) {\n return getStartOfDay(dt).getTime() + '_' + empid;\n}\n\n/**\n * @param {string | number | Date} dt\n * @param {number} weekStartDay\n */\nexport function getStartOfWeek(dt, weekStartDay = 0) {\n let d = new Date(dt);\n d = new Date(d.getFullYear(), d.getMonth(), d.getDate());\n let dayIndex = d.getDay() - weekStartDay;\n if (dayIndex < 0) { dayIndex += 7; }\n d.setDate(d.getDate() - dayIndex);\n return d;\n}\n\n/**\n * @param {{id:number}[]} idObjList\n */\nexport function getUniqueNegativeId(idObjList) {\n let id = 0;\n for (const idObj of idObjList) {\n id = Math.min(id, idObj.id);\n }\n return id - 1;\n}\n\n/**\n * Checks if the second array is a subset of the first.\n * @param {any[]} sortedArray\n * @param {any[]} sortedArray2\n */\nexport function isSubset(sortedArray, sortedArray2) {\n if (sortedArray.length >= sortedArray2.length) {\n let i = 0;\n for (const value of sortedArray2) {\n while (i < sortedArray.length && sortedArray[i] != value) {\n i += 1;\n }\n if (i >= sortedArray.length) {\n return false;\n }\n }\n\n return true;\n }\n\n return false;\n}\n\n/**\n * @param {any[]} array\n */\nexport function shuffleArray(array) {\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n const temp = array[i];\n array[i] = array[j];\n array[j] = temp;\n }\n}\n\n /**\n * @param {Intl.LocalesArgument} lang\n * @param {Array<Number>} dtRange\n * @param {Number} incrementPerQuarter //tested with 1 or 3 (15 or 5 min)\n * @param {String} hourFormat\n */\n export function timeRangeInformation(lang, dtRange, incrementPerQuarter, hourFormat) {\n const st = dtRange[0];\n const fi = dtRange[1];\n if (st > 0 || fi < 96*incrementPerQuarter) {\n let options = { hour: 'numeric', minute: '2-digit' };\n if(hourFormat == \"24\"){\n options.hour12 = false;\n } else if(hourFormat == \"12\"){\n options.hour12 = true;\n }\n let dtFormat = new Intl.DateTimeFormat(lang, options);\n const zero = new Date(2000, 0, 1);\n const ticksPerInterval = 1000 * 60 * 15/incrementPerQuarter;\n const stDate = new Date(zero.getTime() + ticksPerInterval * st);\n const fiDate = new Date(zero.getTime() + ticksPerInterval * fi);\n return `${dtFormat.format(stDate)} - ${dtFormat.format(fiDate)}`;\n }\n return '';\n }","import { LoginInfo } from '@/model/dn-login.js';\n\nconst rememberCredentialsKey = 'rememberCredentials'\nconst credentialsKey = 'credentials'\nconst simulationSettingsKey = 'simulationSettings'\nconst lastForcastOptionsKey = 'lastForcastOptionsKey'\nconst lastScheduleOptionsKey = 'lastScheduleOptionsKey'\nconst lastAgentScheduleOptionsKey = 'lastAgentScheduleOptionsKey'\nconst lastSettingsOptionsKey = 'lastSettingsOptionsKey'\nconst scheduleColumnIdsKey = 'scheduleColumnIdsKey'\nconst languageKey = 'languageKey'\nconst timeKey = 'timeKey'\nconst loginInfoKey = 'loginKey';\nconst currentCCKey = 'currentCCId';\nconst lastSortOptionKey = 'lastSortOptionKey';\nconst requestFilterKey = 'requestFilterKey';\nconst employeeDisplaySettingsKey= 'employeeDisplaySettingsKey';\nconst virtualScrollerOptions = 'virtualScrollerOptions';\nexport const TABLE_COLUMN_SCHEDULE_KEY= 'dn-state-schtabel-local'\n\n/** @type {null|LoginInfo} */\nlet _loginInfo = null;\n\n/** @type {null|Boolean} */\nlet _rememberCredentials = null;\n\n/** @type {null|number} */\nlet _currentCCId = null;\n\nexport function clearLocalStorage() {\n localStorage.clear();\n}\n\nexport function getCurrentCCId() {\n if (_currentCCId == null) {\n const id = localStorage.getItem(currentCCKey);\n if (id != null) {\n _currentCCId = parseInt(id);\n }\n }\n\n return _currentCCId;\n}\n\n/**\n * @param {number} id\n */\nexport function setCurrentCCId(id) {\n _currentCCId = id;\n if (getRememberCredentials())\n localStorage.setItem(currentCCKey, id.toString());\n}\n\nexport function removeCurrentCCId() {\n _currentCCId = null;\n localStorage.removeItem(currentCCKey);\n}\n\nexport function getLoginInfo() {\n if (_loginInfo === null) {\n const loginInfo = getJSONFromLocalStorage(loginInfoKey);\n if (loginInfo !== null) {\n _loginInfo = new LoginInfo(loginInfo);\n }\n }\n return _loginInfo;\n}\n\nexport function removeLoginInfo() {\n window.localStorage.removeItem(loginInfoKey);\n _loginInfo = null;\n}\n\n/**\n * @param {import(\"../model/dn-login\").LoginInfo} loginInfo\n */\nexport function setLoginInfo(loginInfo) {\n if (getRememberCredentials() && loginInfo.customerSchema.length > 0)\n localStorage.setItem(loginInfoKey, JSON.stringify(loginInfo.toStore()));\n _loginInfo = loginInfo;\n}\n\n//Simulation settings\nexport function getSimulationSettings() {\n return getJSONFromLocalStorage(simulationSettingsKey);\n}\nexport function setSimulationSettings(simulationSettings) {\n localStorage.setItem(simulationSettingsKey, JSON.stringify(simulationSettings));\n}\nexport function removeSimulationSettings() {\n localStorage.removeItem(simulationSettingsKey);\n}\n\n//Remeber Credentials (checkbox)\nexport function getRememberCredentials() {\n if (_rememberCredentials === null) {\n const value = localStorage.getItem(rememberCredentialsKey);\n if(value=== null){ _rememberCredentials = false; }\n else{ _rememberCredentials = value === 'true';}\n }\n\n return _rememberCredentials;\n}\n/**\n * @param {Boolean} rememberCredentials\n */\nexport function setRememberCredentials(rememberCredentials) {\n _rememberCredentials = rememberCredentials;\n localStorage.setItem(rememberCredentialsKey, rememberCredentials.toString());\n}\n\n//Credentials\nexport function getCredentials() {\n return getJSONFromLocalStorage(credentialsKey);\n}\n\nexport function removeCredentials() {\n localStorage.removeItem(credentialsKey);\n}\n\n//LastForcastOptions\nexport function getLastForcastOptions() {\n return getJSONFromLocalStorage(lastForcastOptionsKey);\n}\n\nexport function setLastForcastOptions(lastForcastOptions) {\n localStorage.setItem(lastForcastOptionsKey, JSON.stringify(lastForcastOptions));\n}\n\n//LastScheduleOptions\nexport function getLastScheduleOptions() {\n return getJSONFromLocalStorage(lastScheduleOptionsKey);\n}\nexport function setLastScheduleOptions(lastScheduleOptions) {\n localStorage.setItem(lastScheduleOptionsKey, JSON.stringify(lastScheduleOptions));\n}\n\n//LastAgentScheduleOptions\nexport function getLastAgentScheduleOptions() {\n return getJSONFromLocalStorage(lastAgentScheduleOptionsKey);\n}\nexport function setLastAgentScheduleOptions(lastAgentScheduleOptions) {\n localStorage.setItem(lastAgentScheduleOptionsKey, JSON.stringify(lastAgentScheduleOptions));\n}\n\n//LastSettingsOptions\nexport function getLastSettingsOptions() {\n return getJSONFromLocalStorage(lastSettingsOptionsKey);\n}\nexport function setLastSettingsOptions(lastSettingsOptions) {\n localStorage.setItem(lastSettingsOptionsKey, JSON.stringify(lastSettingsOptions));\n}\n\n//requestFilterOptions\nexport function getRequestFilterOptions() {\n return getJSONFromLocalStorage(requestFilterKey);\n}\nexport function setRequestFilterOptions(RequestFilterOptions) {\n localStorage.setItem(requestFilterKey, JSON.stringify(RequestFilterOptions));\n}\n\n//employeeDisplaySettings\nexport function getEmployeeDisplaySettings() {\n return getJSONFromLocalStorage(employeeDisplaySettingsKey);\n}\nexport function setEmployeeDisplaySettings(employeeDisplaySettings) {\n localStorage.setItem(employeeDisplaySettingsKey, JSON.stringify(employeeDisplaySettings));\n}\n\n/** @returns {number[]} */\nexport function getScheduleColumnIds() {\n return getJSONFromLocalStorage(scheduleColumnIdsKey);\n}\n/**\n * @param {number[]} scheduleColumnIds\n */\nexport function setScheduleColumnIds(scheduleColumnIds) {\n localStorage.setItem(scheduleColumnIdsKey, JSON.stringify(scheduleColumnIds));\n}\n\n//Language\nexport function getLanguage() {\n return getJSONFromLocalStorage(languageKey);\n}\nexport function setLanguage(language) {\n localStorage.setItem(languageKey, JSON.stringify(language));\n}\nexport function removeLanguage() {\n localStorage.removeItem(languageKey);\n}\n\n//Time setting\nexport function getTimeDisplaySetting() {\n return getJSONFromLocalStorage(timeKey);\n}\nexport function setTimeDisplaySetting(timeDisplay) {\n localStorage.setItem(timeKey, JSON.stringify(timeDisplay));\n}\nexport function removeTimeDisplaySetting() {\n localStorage.removeItem(timeKey);\n}\n\n//lastSortOption\nexport function getLastSortOption() {\n return getJSONFromLocalStorage(lastSortOptionKey);\n}\nexport function setLastSortOption(lastSortOption) {\n localStorage.setItem(lastSortOptionKey, JSON.stringify(lastSortOption));\n}\n\nexport function removeScheduleColumnsWidths() {\n localStorage.removeItem(TABLE_COLUMN_SCHEDULE_KEY);\n}\n\n//Virtual scroll\nexport function getVirtualScrollSetting(){\n return getJSONFromLocalStorage(virtualScrollerOptions);\n \n}\nexport function setVirtualScrollSetting(option){\n localStorage.setItem(virtualScrollerOptions, JSON.stringify(option));\n}\nexport function removeVirtualScrollSetting(){\n localStorage.removeItem(virtualScrollerOptions);\n}\n\n/**\n * @param {string} key\n */\nfunction getJSONFromLocalStorage(key) {\n const value = localStorage.getItem(key);\n if (value === null)\n return null;\n return JSON.parse(value)\n}","\nvar moment = require(\"moment-timezone\");\nimport * as dnLocalStorage from './dn-localStorage.js';\nimport { getNumberOfDaysFromIntervalMinusOne, getStartOfWeek,getElapsedTimeString } from './dn-helper.js';\nimport { addDays, getStartOfDay } from '@/shared/dn-shared-helper.js';\nimport * as dn_uiHelper from \"@/js/dn-uihelper.js\";\nimport * as dnModel from '@/model/dn-model.js';\nimport { useDataStore } from \"@/stores/dataStore.js\";\nimport { createSchedule, getEmpWorkMap,getEmpBreakMap, getShiftBounds,getEmpWorkArray } from '#shared/dn-employee-schedule';\nimport { useScheduleStore } from '@/stores/scheduleStore.js';\nimport { Task } from '@/shared/dn-task.js';\nimport { TASK_KIND } from '@/shared/dn-tasktype.js'\nimport variables from \"@/assets/css/variables.module.scss\"; \n\n/**\n* @typedef {{\n*selectedRequests:import(\"@/model/dn-schedule-request.js\").ScheduleRequest[];\n*selectedEmpDays:{empSchedule:import(\"#shared/dn-employee-schedule\").EmployeeSchedule; dt:Date}[],saveReqired:boolean,selectGostShiftWarning:boolean,action:string}} PostGhostShifts\n*/\n\n\nexport function getTimeNow(){\n let loginInfo = dnLocalStorage.getLoginInfo();\n if(loginInfo && loginInfo.customerSchema == 'demo'){return moment([2022,4,3]).toDate()}\n if(loginInfo && loginInfo.customerSchema.substring(0,5)=='demo2'){return moment([2023,8,10]).toDate()}\n return moment(new Date()).startOf('day').toDate()\n}\n\nexport function getInitialDateInterval(){\n const scheduleStore = useScheduleStore();\n //Whole days in local timezone\n return [getTimeNow(),addDays(getTimeNow(),scheduleStore.scheduleOptions.numberOfDaysInSchedule-1)]\n}\n\nexport function getSpecialTaskType(subtype) {\n let x = {}\n const dataStore = useDataStore();\n dataStore.taskTypeMap.forEach(element => { if (element.subtype == subtype) { x = element } })\n return x;\n}\n\n/**\n * Calculate bounderies of a workShiftFiltered, presented as a Task with tasktype null\n * @param {Date} dt\n * @param {import(\"@/shared/dn-task.js\").Task[]} possibleTasks tasks that connect over midnight\n * @param {{absences:import(\"#shared/dn-employee-schedule\").DeletableDateInterval[];breaks:import(\"#shared/dn-employee-schedule\").DeletableDateInterval[];payments:import(\"#shared/dn-employee-schedule\").DeletableDateInterval[]}} schedule\n */\nexport function getShift(dt, possibleTasks, schedule = undefined) {\n const shift = getShiftBounds(dt, possibleTasks, schedule);\n return new Task({empid:null, st:shift.st, fi:shift.fi, tasktypeId:null});\n}\n\n/**\n * @param {import(\"#shared/dn-employee-schedule\").EmployeeSchedule[]} schedule\n * @param {Map<number, dnModel.TaskType>} taskTypeMap\n * @param {Date} dt\n * @param {import(\"@/model/dn-employee-cc.js\").EmployeeCallcenters} employeeCallcenters\n * @param {number} ccId\n * @param {number[]} [taskTypeIds]\n */\nexport function getEmpWorkSum(schedule, taskTypeMap, dt, employeeCallcenters, ccId, taskTypeIds=null) {\n const length = 96;\n const empWorkMap = getEmpWorkMap(schedule, taskTypeMap, dt, 1, length, employeeCallcenters, ccId, taskTypeIds);\n const dtKey = dn_uiHelper.getShortDate(dt);\n /** @type {number[]} */\n const empSumArray = Array(length).fill(0)\n for (const pair of empWorkMap) {\n const empWork = pair[1].get(dtKey)\n for (let i = 0; i < length; i++) {\n empSumArray[i] += empWork[i]\n }\n }\n\n return empSumArray;\n}\n\n/**\n * @param {import(\"#shared/dn-employee-schedule\").EmployeeSchedule[]} schedule\n * @param {Date} dt\n * @param {import(\"@/model/dn-employee-cc.js\").EmployeeCallcenters} employeeCallcenters\n * @param {number} ccId\n * @param {number[]} [taskTypeIds]\n */\nexport function getEmpBreakSum(schedule, dt, employeeCallcenters, ccId, taskTypeIds=null) {\n const length = 96;\n const empBreakMap = getEmpBreakMap(schedule, dt, 1, length, employeeCallcenters, ccId);\n const dtKey = dn_uiHelper.getShortDate(dt);\n /** @type {number[]} */\n const empSumBreakArray = Array(length).fill(0)\n for (const pair of empBreakMap) {\n const empBreak = pair[1].get(dtKey)\n for (let i = 0; i < length; i++) {\n empSumBreakArray[i] += empBreak[i]\n }\n }\n\n return empSumBreakArray;\n}\n\n/**\n * @param {string | Date} st\n * @param {string | Date} fi\n * @param {number} ttid\n * @param {number} empid\n * @returns {import(\"@/shared/dn-task.js\").Task}\n */\nexport function getTask(st, fi, ttid, empid = null) {\n /** @type {import(\"@/shared/dn-task.js\").TaskDto} */\n const dto = { empid, st, fi, tasktypeId: ttid };\n if (empid) {\n return useScheduleStore().scheduleTasks.add(dto);\n } else {\n return new Task(dto);\n }\n}\n\n/**\n * @param {Date} dt\n */\nexport function get24hourShift(dt) {\n return {\n st: new Date(dt),\n fi: new Date(dt.getTime() + 24 * 60 * 60 * 1000),\n dur: 24\n };\n}\n\n /**\n * @param {dnModel.Task} t\n * @param {{st:Date;fi:Date}[]} workShiftFiltered\n */\n export function moveEntireShift(t,workShiftFiltered){\n let change = moment.duration( moment(t.st).diff(t.lastSt )).asHours();\n if (t.tasktypeId==null){\n\n for(let i=1;i<workShiftFiltered.length;i++){\n let t =workShiftFiltered[i];\n t.st = moment(t.st).add(change,\"hours\").toDate();\n t.fi = moment(t.fi).add(change,\"hours\").toDate();\n }\n }\n }\n\n/**\n * @param {{ tasks: dnModel.Task[]; breaks: dnModel.Task[]; payments: dnModel.Task[]; absences: dnModel.Task[]; }} empTasks\n * @param {{st:Date, fi:Date}} focusedShift\n * @param {string} type\n */\nfunction getTaskList(empTasks,focusedShift,type){\n let taskList =[]\n switch(type){\n case 'task':\n taskList=empTasks.tasks.filter(isInShift);//updated taskList\n break;\n case 'break':\n taskList=empTasks.breaks.filter(isInShift);//updated taskList\n break;\n case 'payment':\n taskList=empTasks.payments.filter(isInShift);//updated taskList\n break;\n case 'absence':\n taskList=empTasks.absences.filter(isInShift);//updated taskList\n break;\n case 'log':\n taskList=empTasks.log.filter(isInShift);//updated taskList\n break;\n default:\n break;\n }\n return taskList\n\n /**\n * @param {dnModel.Task} t\n */\n function isInShift(t) {\n return (t.st >= focusedShift.st && t.fi <= focusedShift.fi)&&(!t.isToDelete);\n }\n}\n\nexport function validateAndCorrectWorkShift(activeTask,empTasks,dt){\n const dataStore = useDataStore();\n //active task\n let tt = dataStore.taskTypeMap.get(activeTask.tasktypeId)\n let st=moment(activeTask.st);//all operations using moment.js\n let fi= moment(activeTask.fi);\n let lastSt=moment(activeTask.lastSt);\n let lastFi= moment(activeTask.lastFi);\n let focusedShift = getShiftBounds(dt, empTasks.tasks);\n\n \n\n if(tt){\n let taskList=getTaskList(empTasks,focusedShift,tt.type);//updated taskList\n for (let i = 0; i < taskList.length; i++) {\n if(taskList[i]!=activeTask){\n let tti = dataStore.taskTypeMap.get(taskList[i].tasktypeId)\n if(tti){\n let sti =moment(taskList[i].st)\n let fii =moment(taskList[i].fi)\n if(st.isSameOrBefore(sti)&&fi.isSameOrAfter(fii)){\n removeTask(taskList[i])\n }\n if(st.isBefore(fii)&&fi.isSameOrAfter(fii)&&st.isAfter(sti)){\n taskList[i].fi=st.toDate()\n }\n\n if(st.isAfter(sti)&&fi.isBefore(fii)&&tt!=tti){\n taskList[i].fi=st.toDate();\n empTasks.tasks.push(getTask(fi.toDate(),fii.toDate(),tti.id,empTasks.emp._id));\n break;\n }\n\n \n if(st.isAfter(sti)&&fi.isBefore(fii)){\n removeTask(activeTask)\n }\n\n\n if(st.isSameOrBefore(sti)&&fi.isAfter(sti)&&fi.isBefore(fii)){\n taskList[i].st=fi.toDate()\n }\n //Conected tasks\n if(fii.isSame(lastSt)&&st.isAfter(fii)){\n if(tt!=tti){taskList[i].fi=st.toDate();}\n }\n if(sti.isSame(lastFi)){\n if(fi<fii){\n if(tt!=tti){taskList[i].st=fi.toDate();}\n }\n }\n }\n }\n }\n\n\n\n //Join tasks of same tt that are connecting\n //Removes overlapping tasks\n\n taskList=getTaskList(empTasks,focusedShift,tt.type);//updated taskList\n for (let i = 0; i < taskList.length; i++) {\n let sti =moment(taskList[i].st)\n let fii =moment(taskList[i].fi)\n\n for (let j = 0; j < taskList.length; j++) {\n if(j>i){\n let stj =moment(taskList[j].st)\n let fij =moment(taskList[j].fi)\n if(stj.isBefore(sti)&&fij.isAfter(sti)&&fij.isBefore(fii)){\n taskList[j].fi=sti.toDate()\n }\n if(stj.isBefore(sti)&&fij.isSame(sti)&&taskList[j].tasktypeId==taskList[i].tasktypeId){\n taskList[i].st=stj.toDate()\n removeTask(taskList[j])\n }\n if(stj.isSame(sti)&&stj.isAfter(sti)&&taskList[j].tasktypeId==taskList[i].tasktypeId){\n removeTask(taskList[j])\n }\n if(stj.isBefore(fii)&&fij.isAfter(fii)&&stj.isAfter(sti)){\n taskList[j].st=fii.toDate()\n }\n if(stj.isSame(fii)&&fij.isAfter(fii)&&taskList[j].tasktypeId==taskList[i].tasktypeId){\n taskList[i].fi=fij.toDate()\n removeTask(taskList[j])\n }\n if(fij.isSame(fii)&&stj.isBefore(fii)&&taskList[j].tasktypeId==taskList[i].tasktypeId){\n removeTask(taskList[j])\n }\n if(stj.isAfter(sti)&&fij.isBefore(fii)){\n removeTask(taskList[j])\n }\n }\n }\n }\n //}\n}\n\nfunction removeTask(x){\n x.toDelete()\n}\n}\n\nexport function getShiftText(shift, refDate){\n let shiftText = \"\";\n if(shift.tasks.length>0){\n const timeInterval = Math.abs((shift.tasks[shift.tasks.length-1].fi-shift.tasks[0].st))\n if(shift.cmd){\n shiftText=moment(refDate).add(shift.tasks[0].st,'minutes').format('HH:mm')+ \" \"+\n shift.name + \" (\"+\n Math.round(timeInterval/60,2)+ \" h)\" + \" cmd: ctrl \" + shift.cmd\n } else {\n shiftText=moment(refDate).add(shift.tasks[0].st,'minutes').format('HH:mm')+ \" \"+\n shift.name + \" (\"+\n Math.round(timeInterval/60,2)+ \" h)\"\n }\n\n }\n return shiftText\n}\n\nexport function getSelectionKey(dt,empid){\n return moment(dt).startOf('day')+'_'+empid\n}\nexport function getEmpDt(dt,emp){\n return {emp:emp,dt: moment(dt).startOf('day').date}\n}\nexport function getDateKey(dt){\n return moment(dt).date.yyyymmdd()\n}\n\n/**\n * @param {string} selectionKey\n */\nexport function getRequestForSchedule(selectionKey) {\n const keyParts = selectionKey.split('_');\n const employeeId = Number(keyParts[1]);\n const ts = Number(keyParts[0]);\n const scheduleStore = useScheduleStore();\n const filter = scheduleStore.scheduleRequestSettings;\n const scheduleOptions = scheduleStore.scheduleOptions;\n const future = scheduleOptions.dateInterval[1] ? addDays(scheduleOptions.dateInterval[1], 1) : new Date();\n const selectedEmpId = scheduleOptions.selectedEmpId;\n let scheduleRequest = scheduleStore.scheduleRequestData.bySelectionKey.get(selectionKey);\n let isPoster = false;\n let countOrOrder = 0;\n if (scheduleRequest && scheduleRequest.kind === dnModel.REQUEST_KIND.post) {\n isPoster = scheduleRequest.employees[0].employeeId === employeeId;\n if (isPoster) {\n countOrOrder = scheduleRequest.employees.length - 2;\n } else {\n countOrOrder = scheduleRequest.employees.findIndex(x => x.employeeId === employeeId) - 1;\n }\n if (!isPoster) {\n if (scheduleRequest.approved === false) {\n scheduleRequest = undefined;\n } else if (scheduleRequest.approved === true && scheduleRequest.employees[1].employeeId !== employeeId) { \n scheduleRequest = undefined;\n }\n }\n }\n\n const isAgentLogin = useDataStore().currentUser.isAgent;\n if (scheduleRequest) {\n if (!(scheduleRequest.kind === dnModel.REQUEST_KIND.post || scheduleRequest.isFilterOk(filter, future, selectedEmpId) || isAgentLogin)) {\n scheduleRequest = undefined;\n }\n }\n \n const availEmpRequests = scheduleStore.availabilityRequests.getByEmp(employeeId);\n /** @type {import(\"@/model/dn-request-item.js\").RequestItem} */\n let requestItem = scheduleRequest; \n if (availEmpRequests) {\n const now = getTimeNow();\n const requestOnDay = availEmpRequests.byDate.get(ts);\n if (requestOnDay) {\n for (const r of requestOnDay) {\n if (!isAgentLogin) {\n if (!r.isFilterOk(filter, future, selectedEmpId, scheduleStore.employees.list, now)) {\n continue;\n }\n }\n let best = requestItem === undefined;\n if (!best) {\n if (requestItem.isOpen === r.isOpen) {\n best = r.created < requestItem.created;\n } else {\n best = r.isOpen;\n }\n }\n if (best) {\n requestItem = r;\n scheduleRequest = undefined;\n } \n }\n }\n }\n\n if (!requestItem) { return undefined; }\n\n let kind = dnModel.REQUEST_KIND.availability;\n if (scheduleRequest) {\n kind = scheduleRequest.kind;\n }\n\n return { isPoster, countOrOrder, kind, requestItem};\n}\n\n/**\n * @param {number} numberOfDays\n * @param {Date} stDate\n * @param {dnModel.Task[]} scheduleTasks\n * @param {dnModel.Employee[]} employees\n * @param {boolean} includeInactive\n */\nexport function getSchedule(numberOfDays, stDate, scheduleTasks, employees, includeInactive) {\n const dataStore = useDataStore();\n const taskTypes = dataStore.taskTypes;\n return createSchedule({numberOfDays, st:stDate}, scheduleTasks, taskTypes, employees, includeInactive)\n}\n\n/**\n * @param {number} empId\n * @returns {import(\"#shared/dn-employee-schedule\").EmployeeSchedule}\n */\nexport function getScheduleFromStore(empId) {\n const schedules = useScheduleStore().schedule.list;\n for (let i = 0; i < schedules.length; i++) {\n if (schedules[i].emp.id == empId) {\n return schedules[i]\n }\n }\n return undefined;\n}\n\nexport function getScheduleRowIndex(empid) {\n let index = 0;\n const currentSortMap = useScheduleStore().scheduleOptions.currentSortMap;\n for (let keySortMap of currentSortMap.keys()) {\n let value = currentSortMap.get(keySortMap)\n if (empid == value.id) { index = keySortMap }\n }\n return index\n}\n\n/**\n * @param {import(\"#shared/dn-employee-schedule\").EmployeeSchedule} schedule\n */\nexport function workShiftDetails(schedule){\n const dataStore = useDataStore();\n const locale = dataStore.language;\n const timeZone = dataStore.currentUser.timezoneUI;\n const dtFormat = new Intl.DateTimeFormat(locale, { hour: 'numeric', minute: '2-digit', timeZone });\n /** @type {import(\"#shared/dn-date-interval\").DateInterval} */\n const di = schedule.dateInterval;\n const dt = di.st;\n const nextDt = di.fi;\n const shiftBounds = getShiftBounds(di.st, schedule.tasks);\n\n let details =[]\n for (const t of schedule.absences) {\n if(t.st.getTime() >= dt.getTime() && t.st.getTime() < nextDt.getTime()){ details.push(getTaskText(t))}\n }\n for (const t of schedule.tasks) {\n if(t.st.getTime() >= shiftBounds.st.getTime() && t.st.getTime() < shiftBounds.fi.getTime()){ details.push(getTaskText(t))}\n }\n for (const t of schedule.breaks) {\n if(t.st.getTime() >= shiftBounds.st.getTime() && t.st.getTime() < shiftBounds.fi.getTime()){ details.push(getTaskText(t))}\n }\n for (const t of schedule.payments) {\n if(t.st.getTime() >= dt.getTime() && t.st.getTime() < nextDt.getTime()){ details.push(getTaskText(t))}\n }\n\n return(details)\n\n /**\n * @param {dnModel.Task} t\n */\n function getTaskText(t){\n const dataStore = useDataStore();\n let tt = dataStore.taskTypeMap.get(t.tasktypeId)\n return tt.name+`: ${dtFormat.format(t.st)} - ${dtFormat.format(t.fi)}`;\n }\n}\n\nexport function arrangeReportWeekDayStart(type,list,date){\n const weekDayNum = date.getDay();\n let steadyCols = list.slice(0,3);\n let weekDaysCols = list.slice(3);\n let completeWeek;\n if(type == 'table'){\n completeWeek = [{name:'sun','width':400}].concat(weekDaysCols.concat(weekDaysCols));\n return steadyCols.concat(completeWeek.slice(weekDayNum,weekDayNum+7))\n }\n if(type == 'weekDayData'){\n completeWeek = steadyCols.concat(weekDaysCols.concat(list));\n return completeWeek.slice(weekDayNum,weekDayNum+7)\n }\n else if(type == 'pdfFormating' || type == 'csvFormating'){\n completeWeek = [{name:'sun',width:300}].concat(weekDaysCols.concat(weekDaysCols));\n return steadyCols.concat(completeWeek.slice(weekDayNum,weekDayNum+7));\n }\n}\n\nexport function getAgentAppRowHeight() {\n return parseInt((window.innerHeight-350)/7)\n}\n\n/**\n * @param {Date} dt\n */\nexport function scheduleIsPublished(dt) {\n return dt <= getLatestPublishedDate();\n}\nexport function erliestRequestDate(){\n const dataStore = useDataStore();\n return addDays(getTimeNow(),dataStore.generalEmpAppSettings.requestClosedNumberOfDays)\n}\n\nexport function getLatestPublishedDate() {\n const nowDt = getTimeNow();\n const dataStore = useDataStore();\n const generalEmpAppSettings = dataStore.generalEmpAppSettings;\n const weekDay = generalEmpAppSettings.publishingWeekDay\n const numberOfDays = generalEmpAppSettings.publishingNumberOfDays\n let latestDate= new Date()\n if(generalEmpAppSettings.publishingFixedDate){\n latestDate=generalEmpAppSettings.publishingFixedDate\n }else{\n let daysToAdd\n if (nowDt.getDay() <= weekDay) {\n daysToAdd = weekDay - 8;\n } else {\n daysToAdd = weekDay - 1;\n }\n latestDate = addDays(getStartOfWeek(nowDt), numberOfDays + daysToAdd);\n }\n \n return latestDate\n}\n\n/**\n * @param {Date[]} dateInterval\n */\nexport function scheduleisAllowedToOptimize(dateInterval){\n const currentUser = useDataStore().currentUser;\n return !currentUser.isSupervisor||(currentUser.isSupervisor) && dateInterval[1] <=dn_uiHelper.addDays( getLatestPublishedDate(),0)\n}\n\n\n/**\n * @param {import(\"#shared/dn-employee-schedule\").EmployeeSchedule} r\n */\nexport function scheduleRowIsIncluded(r){\n const scheduleStore = useScheduleStore();\n //if(!scheduleStore.scheduleOptions.scheduleFilter.show){return true}\n let filter=scheduleStore.scheduleOptions.scheduleFilter\n let fi=dn_uiHelper.addDays(scheduleStore.scheduleOptions.dateInterval[1],1)\n let isIncludedByName=false\n let isIncludedBySkill=false\n let isIncludedByTag = false\n let isIncludedByTask = false\n\n if(filter.searchText.length>0){\n if( r.emp.name.toLowerCase().includes(filter.searchText.toLowerCase())){isIncludedByName=true}\n }else{isIncludedByName=true}\n\n\n if(filter.callGroups.length>0){\n for(let c=0;c<filter.callGroups.length;c++){\n if( r.emp.skills.includes(filter.callGroups[c].id)){isIncludedBySkill=true}\n }\n }else{isIncludedBySkill=true}\n\n if(filter.taskTypes.length>0){\n for(let t=0;t<filter.taskTypes.length;t++){\n if( r.tasks.concat(r.absences).filter(x => x.tasktypeId === filter.taskTypes[t].id&& x.st<fi&&!x.isToDelete).length>0 ){isIncludedByTask=true}\n }\n }else{isIncludedByTask=true}\n\n if(filter.tagIds.length>0){\n for(let t=0;t<filter.tagIds.length;t++){\n if( r.emp.tagIds.includes(filter.tagIds[t])){isIncludedByTag=true}\n }\n }else{isIncludedByTag=true}\n\n\n\n\n return isIncludedByName&&isIncludedBySkill&&isIncludedByTask&&isIncludedByTag\n}\n\nexport function singleSelectionIsVisible(scheduleOptions,schedule,dt){\n let returnValue=true\n if(scheduleOptions.scheduleFilter.show){\n let filterdSched=schedule.filter(scheduleRowIsIncluded)\n let filterdSched2=filterdSched.filter(r => r.emp.id==scheduleOptions.selectedEmpId)\n returnValue=(filterdSched2.length==1)\n }\n return returnValue&&(dt>=scheduleOptions.dateInterval[0]&&dt<=scheduleOptions.dateInterval[1])\n}\n\nexport function getSelectionKeysVisible(){\n const dataStore = useDataStore();\n const currentCC = dataStore.currentCC;\n const scheduleStore = useScheduleStore();\n const schedule=scheduleStore.schedule.list;\n const scheduleOptions = scheduleStore.scheduleOptions\n const filterdSched=schedule.filter(scheduleRowIsIncluded)\n const visibleKeys=[]\n for (let key of scheduleOptions.selection.keys()) {\n let v=scheduleOptions.selection.get(key)\n if(v.dt>=scheduleOptions.dateInterval[0]&&v.dt<=scheduleOptions.dateInterval[1]){\n if(filterdSched.filter(r => r.emp.id==v.emp.id).length==1){\n const ccId = dataStore.employeeCallcenters.getCCByDate(v.emp, v.dt);\n if (ccId === currentCC.id) {\n visibleKeys.push(key);\n }\n }\n }\n }\n return visibleKeys\n}\n\nexport function selectionIsOk(selection){\n let returnValue = {supervisorCheck:true,postedShiftCheck:true}\n const currentUser = useDataStore().currentUser;\n const scheduleStore = useScheduleStore();\n //const selection = scheduleStore.scheduleOptions.selection\n const scheduleRequests =scheduleStore.scheduleRequestData\n\n if(currentUser.isSupervisor){\n\n for (let key of selection.keys()) {\n let v=selection.get(key)\n if(v.dt>getLatestPublishedDate()){\n returnValue.supervisorCheck= false\n }\n }\n }\n\n for (let key of selection.keys()) {\n let v=selection.get(key)\n if(v.emp.ghost){\n let sr =scheduleRequests.bySelectionKey.get(key) \n if (sr&&(sr.kind === dnModel.REQUEST_KIND.post && (sr.approved === null || sr.isPending))) {\n returnValue.postedShiftCheck=false\n }\n }\n }\n\n return returnValue\n }\n\n\n/**\n * @param {import(\"#shared/dn-employee-schedule\").EmployeeSchedule[]} schedule\n * @param {{dateInterval:Date[], selection:Map<string, {emp:import(\"@/shared/dn-employee.js\").Employee, dt:Date}>}} scheduleOptions\n */\nexport function getSelection(schedule, scheduleOptions) {\n const dataStore = useDataStore();\n const currentCC = dataStore.currentCC;\n const filteredSchedule = schedule.filter(scheduleRowIsIncluded)\n /** @type {Map<number, {empSchedule:import(\"#shared/dn-employee-schedule\").EmployeeSchedule, dates:Date[]}>} */\n const byEmpId = new Map();\n\n for (let key of scheduleOptions.selection.keys()) {\n let v = scheduleOptions.selection.get(key)\n if (v.dt >= scheduleOptions.dateInterval[0] && v.dt <= scheduleOptions.dateInterval[1]) {\n const empSchedule = filteredSchedule.find(r => r.emp.id === v.emp.id);\n if (empSchedule !== undefined) {\n const ccId = dataStore.employeeCallcenters.getCCByDate(v.emp, v.dt);\n if (ccId === currentCC.id) {\n let empSelection = byEmpId.get(v.emp.id);\n if (empSelection === undefined) {\n empSelection = {empSchedule: empSchedule, dates:[]};\n byEmpId.set(v.emp.id, empSelection);\n }\n empSelection.dates.push(v.dt);\n }\n }\n }\n }\n\n const result = [];\n for (const empSelection of byEmpId.values()) {\n empSelection.dates.sort((a, b) => a.getTime() - b.getTime());\n result.push(empSelection)\n }\n\n return result;\n}\n\n\n/**\n * @param {Date} dt\n * @param {string[]} [changedDates]\n */\nexport function addToChangedDatedInclNext(dt, changedDates = []) {\n let dtKey = dn_uiHelper.getShortDate(dt);\n if (!changedDates.includes(dtKey)) { changedDates.push(dtKey); }\n dtKey = dn_uiHelper.getShortDate(dn_uiHelper.addDays(dt, 1));\n if (!changedDates.includes(dtKey)) { changedDates.push(dtKey); }\n return changedDates;\n}\n\nexport function saveLocalScheduleSettings(){\n const scheduleStore = useScheduleStore();\n const opt = scheduleStore.scheduleOptions;\n const insp = scheduleStore.inspectorPanel;\n if (opt.dateInterval.length === 0)\n return;\n let localScheduleOptions ={\n //dateInterval:this.scheduleOptions.dateInterval,\n showServiceLevel:opt.showServiceLevel,\n showOccupancyChart:opt.showOccupancyChart,\n showWorkChart:opt.showWorkChart,\n showRequestTile:opt.showRequestTile,\n showEmployeeOccupancy:opt.showEmployeeOccupancy,\n autoSimulate:opt.autoSimulate,\n autoKeyFigures:opt.autoKeyFigures,\n numberOfSimIterations:opt.numberOfSimIterations,\n numberOfDaysInSchedule:getNumberOfDaysFromIntervalMinusOne(opt.dateInterval),\n workChartHeight:opt.workChartHeight,\n chartDisplayTarget:opt.chartDisplay.target,\n chartDisplayErlangC:opt.chartDisplay.erlangC,\n chartDisplaySmooth:opt.chartDisplay.smooth,\n chartDisplaychartInspector:opt.chartDisplay.chartInspector,\n chartDisplayFixedY:opt.chartDisplay.fixedY,\n chartDisplayFixedYvalue:opt.chartDisplay.fixedYvalue,\n chartDisplayServicelevelPercentForWarning:opt.chartDisplay.servicelevelPercentForWarning,\n\n chartDisplayBreaks:opt.chartDisplay.breaks,\n chartDisplayDeviationTooFewBars:opt.chartDisplay.deviationTooFewBars,\n chartDisplayDeviationTooManyBars:opt.chartDisplay.deviationTooManyBars,\n\n showLog:opt.adherence.showLog,\n showWorkWarnings:opt.adherence.showWorkWarnings,\n showBreakWarnings:opt.adherence.showBreakWarnings,\n showAdherenceWarnings:opt.adherence.showAdherenceWarnings,\n\n meetingLastTasktypeId:opt.meetingSettings.meetingLastTasktypeId,\n meetingLastStartMinute:opt.meetingSettings.lastStartMinute,\n meetingLastStartMinuteMax:opt.meetingSettings.lastStartMinuteMax,\n meetingLastOnlyOnShift:opt.meetingSettings.onlyOnShift,\n meetingLastFlexStart:opt.meetingSettings.flexStart,\n meetingLastDurationMinute:opt.meetingSettings.lastDurationMinute,\n\n notifyOnScheduleChange:opt.notifications.onScheduleChange,\n indicatorsHighlightBeforeSave:opt.scheduleIndicators.highlightBeforeSave,\n indicatorsUnsavedIndicators:opt.scheduleIndicators.unsavedIndicators,\n\n showInRotation:opt.adherence.showInRotation,\n inspectorPanelTimespan:insp.timespan,\n inspectorHideTimeSpan:insp.hideTimeSpan,\n inspectorServiceLevel:insp.serviceLevel,\n }\n console.log('saved settings')\n dnLocalStorage.setLastScheduleOptions(localScheduleOptions)\n saveLocalRequestFilterOptions()\n }\n\n export function saveLocalEmployeeDisplaySettings(){\n const scheduleStore = useScheduleStore();\n const opt = scheduleStore.employeeDisplaySettings;\n\n let localEmployeeDisplaySettings ={\n workTimeWarning:opt.workTimeWarning,\n skillsWarning:opt.skillsWarning,\n shiftWarning:opt.shiftWarning,\n switchIdWarning:opt.switchIdWarning,\n hasMobileApp:opt.hasMobileApp,\n breakWarnings:opt.breakWarnings,\n }\n dnLocalStorage.setEmployeeDisplaySettings(localEmployeeDisplaySettings)\n }\n\n\n function saveLocalRequestFilterOptions(){\n const scheduleStore = useScheduleStore();\n const opt = scheduleStore.scheduleRequestSettings;\n if (scheduleStore.scheduleOptions.dateInterval.length === 0)\n return;\n let localRequestFilterOptions ={\n //dateInterval:this.scheduleOptions.dateInterval,\n showSick:opt.showSick,\n showVacation:opt.showVacation,\n showFree:opt.showFree,\n showWork:opt.showWork,\n showPending:opt.showPending,\n showHistoric:opt.showHistoric,\n showFuture:opt.showFuture,\n showBasedOnSelection:opt.showBasedOnSelection,\n showApproved:opt.showApproved,\n showRejected:opt.showRejected,\n tagId:opt.tagId\n }\n dnLocalStorage.setRequestFilterOptions(localRequestFilterOptions)\n }\n\n export const INFOTYPE = createInfoTypeEnum();\n export const DRAWKIND = createDrawTaskKindEnum();\n export const TEAMSCHEDULEKIND = createTeamScheduleKindEnum();\n\n\n\nfunction createInfoTypeEnum() {\n const enumObject = {\n shift: 0,\n warningFromTaskBar: 1,\n warningFromRow: 2,\n publishedDayIndicator:3,\n erliestRequestIndicator: 4,\n skillsInfo:5,\n shiftFromTaskBar:6,\n unAvailabilityOtherCC:7,\n chartInfo:8\n };\n return Object.freeze(enumObject);\n};\n\n function createDrawTaskKindEnum() {\n const enumObject = {\n unavailable: 0,\n otherCC: 1,\n hasChanges:2,\n none:3\n };\n\n return Object.freeze(enumObject);\n};\n\nfunction createTeamScheduleKindEnum() {\n const enumObject = {\n none: 0,\n barSchedule: 1,\n textSchedule:2\n };\n\nreturn Object.freeze(enumObject);\n};\nexport function taskChangeInfo(userId,ts){\n\n let userInitials =\"\"\n let userName =\"\"\n let colorId=1\n let timeText =\"\"\n let users = useDataStore().users\n if(users){\n let user =users.find(item => item.id === userId)\n if(user){\n if(user.colorId&&user.colorId>0){colorId=user.colorId}\n userInitials=dn_uiHelper.suggestUserInitials(user)\n if(user.name&&user.name.length>0){userName=user.name}\n else{userName=user.email}\n }else{\n userInitials=\"SA\"\n colorId=9\n userName=\"super admin\"\n }\n timeText = getElapsedTimeString(ts)\n }\n\n return {colorId:colorId,timeText:timeText,userInitials:userInitials,userName:userName}\n\n}\n\n\nexport function getWorkShiftWithDeleted(empTasks){\n let focusedDate=empTasks.focusedDate\n let workShiftWithDeleted = []\n /** @type {{st:Date;fi:Date}} */\nlet focusedShift=null\nif(empTasks&&empTasks.tasks){ \n focusedShift=getShiftBounds(focusedDate, empTasks.tasks, empTasks)\n workShiftWithDeleted =empTasks.absences.filter(isInShiftWithDeleted)\n .concat(empTasks.tasks.filter(isInShiftWithDeleted))\n .concat(empTasks.breaks.filter(isInShiftWithDeleted))\n .concat(empTasks.payments.filter(isInShiftWithDeleted))\n}\n\n return workShiftWithDeleted\n\n function isInShiftWithDeleted(t) {\n let st_day=focusedDate\n let fi_day=dn_uiHelper.addDays(st_day,1)\n let st_shift=focusedShift.st\n let fi_shift=focusedShift.fi\n return (((t.st >= st_shift && t.fi <= fi_shift)||(t.st >= st_day && t.fi <= fi_day))&&t.tasktypeId);\n }\n}\n\n\nexport function changeInfo(empTasks){\n let workShiftWithDeleted =getWorkShiftWithDeleted(empTasks)\n return changeInfoFromTaskList(workShiftWithDeleted)\n}\n\n export function changeInfoFromTaskList(taskList){\n let maxDt = new Date(1970,1,1)\n let latestTask = null\n const dataStore=useDataStore()\n \n \n for(let i=0;i<taskList.length;i++){\n const task= taskList[i]\n let tt = task.tasktypeId == undefined ? undefined : dataStore.taskTypeMap.get(task.tasktypeId);\n if(tt&&task.updated&&task.updated>maxDt){\n maxDt=task.updated\n latestTask = task \n } \n }\n \n if(latestTask){\n return taskChangeInfo(latestTask.userId,latestTask.updated)\n }else{\n return {colorId:1,timeText:'',userInitials:'?',userName:''}\n }\n }\n\n export function getPublishedScheduleTasksWithChanges(){\n const dataStore = useDataStore();\n const scheduleStore= useScheduleStore();\n const scheduleTasksInStore = scheduleStore.scheduleTasks.list;\n \n const returnList=[]\n for (let i = 0; i < scheduleTasksInStore.length; i++) {\n const t = scheduleTasksInStore[i]\n \n if (t.st <= addDays(getLatestPublishedDate(), 1)) {\n if ((t.isToDelete||t.hasChanges)) {\n let ttKind = dataStore.taskTypeMap.get(t.tasktypeId).kind;\n let excludeTask = false\n if(ttKind==TASK_KIND.inRotation||ttKind==TASK_KIND.log){excludeTask=true}\n if(!excludeTask){returnList.push(t)}}\n }\n }\n return returnList\n }\n\n export function selectionHasGhost(){\n const scheduleStore= useScheduleStore();\n const schedule =scheduleStore.schedule.list\n const selection = getSelection(schedule, scheduleStore.scheduleOptions);\n\n for (const empSelection of selection) {\n const empSchedule = empSelection.empSchedule;\n if (empSchedule.emp.ghost) {\n return true\n }\n }\n return false\n }\n\n /**\n * @param {import(\"#shared/dn-employee-schedule\").EmployeeSchedule[]} schedule\n */\n export function openPostShifts() {\n if (!selectionIsOk(useScheduleStore().scheduleOptions.selection)) { return null }\n const scheduleStore= useScheduleStore();\n const schedule =scheduleStore.schedule.list\n\n /** @type {Map<number, import(\"@/model/dn-schedule-request.js\").ScheduleRequest[]>} */\n const scheduleRequests = useScheduleStore().scheduleRequestData.items;\n \n const byEmp = new Map();\n for (const sr of scheduleRequests) {\n if (sr.kind === dnModel.REQUEST_KIND.post && (sr.approved === null || sr.isPending)) {\n const employeeId = sr.employees[0].employeeId;\n let requests = byEmp.get(employeeId);\n if (!requests) {\n requests = [];\n byEmp.set(employeeId, requests);\n }\n requests.push(sr);\n }\n }\n\n const selection = getSelection(schedule, scheduleStore.scheduleOptions);\n \n /** @type {PostGhostShifts} */\n const postGhostShifts = { selectedRequests: [], selectedEmpDays: [],saveReqired:false,selectGostShiftWarning:false,action:'' };\n for (const empSelection of selection) {\n const empSchedule = empSelection.empSchedule;\n if (empSchedule.emp.ghost) {\n for (const t of empSchedule.tasks.concat(empSchedule.breaks)) {\n if (t.hasChanges) {\n postGhostShifts.saveReqired=true\n /* this.$toast.add({\n severity: 'info',\n detail: this.$t('schedule.save-schedule-before-posting-shifts'),\n life: 3000 });\n return; */\n }\n }\n const requests = byEmp.get(empSchedule.emp.id);\n /** @type {Map<number, import(\"@/model/dn-schedule-request.js\").ScheduleRequest>} */\n const byDate = new Map();\n if (requests) {\n for (const sr of requests) {\n const dt = getStartOfDay(sr.employees[0].starts[0]);\n byDate.set(dt.getTime(), sr);\n }\n }\n \n for (const dt of empSelection.dates) {\n const shiftBounds = getShiftBounds(dt, empSchedule.tasks);\n if (shiftBounds.st < shiftBounds.fi) {\n const sr = byDate.get(dt.getTime());\n if (sr) {\n postGhostShifts.selectedRequests.push(sr);\n } else {\n postGhostShifts.selectedEmpDays.push({empSchedule, dt});\n }\n }\n }\n }\n }\n \n if (postGhostShifts.selectedEmpDays.length === 0 && postGhostShifts.selectedRequests.length === 0) {\n postGhostShifts.selectGostShiftWarning=true\n /* this.$toast.add({\n severity: 'info',\n detail: this.$t('schedule.select-ghost-shifts-to-post-delete-post'),\n life: 3000 });\n return; */\n }\n \n return postGhostShifts;\n }\n\n function getIndicatorPoints(x){\n let p = (x+1)+',0 '\n +(x+12)+',0 '\n +(x+1)+',11 '\n +(x+1)+',0 '\n \n return p//\"0,12 10,12 5,5 0,12\"\n //let p = x+',22 '+(x+10)+',22 '+(x+5)+',13 '+x+',22'\n }\n \n export function getUnsavedIndicator(svgns,x){\n let indicatorPolyline = null\n \n indicatorPolyline = document.createElementNS(svgns,\"polyline\");\n indicatorPolyline.setAttributeNS(null, \"points\", getIndicatorPoints(x));\n indicatorPolyline.setAttributeNS(null, \"fill\", variables.warning)\n\n return indicatorPolyline\n \n }\n\n export function selectionHasChanges(){\n let returnValue = false\n const sheduleOptions=useScheduleStore().scheduleOptions\n const selectionList = getSelection(useScheduleStore().schedule.list, sheduleOptions);\n for (const empSelection of selectionList) {\n const empTasks = empSelection.empSchedule;\n for (const dt of empSelection.dates) {\n if(shiftHasChanges(dt,empTasks)){\n returnValue = true\n break\n }\n }\n }\n return returnValue\n }\n\n export function shiftHasChanges(dt,empTasks){\n const shift24 = get24hourShift(dt);\n const shift =getShiftBounds(shift24.st,empTasks.tasks, empTasks,true)\n const allTasks= empTasks.tasks.concat(empTasks.breaks).concat(empTasks.absences)\n const tasks = allTasks.filter(x =>x.hasChanges && x.st >=shift.st && x.st <shift.fi)\n return tasks.filter((x =>x.hasChanges && x.st >=shift.st && x.st <shift.fi)).length>0\n }\n\n\n /**\n * @param {Date} dt\n * @param {import(\"#shared/dn-employee-schedule\").EmployeeSchedule} empTasks\n */\n export function shiftRevert(dt,empTasks){\n useScheduleStore().scheduleTasks.removeUnsavedDeletedTasks()\n const shift24 = get24hourShift(dt);\n const shift =getShiftBounds(shift24.st,empTasks.tasks, empTasks,true)\n const allTasks= empTasks.tasks.concat(empTasks.breaks).concat(empTasks.absences)\n const tasks = allTasks.filter(x =>x.hasChanges && x.st >=shift.st && x.st <shift.fi)\n \n for (const t of tasks) {\n if(t.id!=-1){\n if(t.isToDelete){\n t.resurrect()\n }\n t.revert()\n }else{\n t.toDelete()\n }\n }\n }\n\n\n \n \n\n \n\n\n\n","// @ts-check\nexport class Call {\n /**\n * @param {number} msSinceEpoch\n * @param {number} ht\n * @param {number} callGroupId\n */\n constructor(msSinceEpoch, ht, callGroupId) {\n /** @readonly @type {number} */\n this.msSinceEpoch = msSinceEpoch;\n /** @readonly @type {number} */\n this.ht = ht;\n /** @readonly @type {number} */\n this.callGroupId = callGroupId;\n /** @type {null|number} */\n this.empId = null;\n /** @type {boolean} */\n this.processed =false\n\n\n\n }\n\n get wait() {\n return this._wait\n }\n /**\n * @param {number} newValue\n */\n set wait(newValue) {\n this._wait = newValue\n }\n\n /**\n * @param {number} adherancePercent\n * @param {number} workFactor\n */\n timeStampEnd(adherancePercent, workFactor = 1) {\n //compensate end of call for workFactor\n if (adherancePercent > 0) {\n workFactor = workFactor * adherancePercent / 100;\n }\n return this.msSinceEpoch + 1000 * (this.wait + this.ht / (workFactor));\n }\n\n tostring() {\n let str = this.empId > 0 ? (' Answered by: ' + this.empId + ' ht: ' + Math.round(this.ht)) : \" ABANDONNED after\"\n return 'at ' + this.timeStampEnd(100) + str + ' wait: ' + this.wait + ' call group: ' + this.callGroupId\n }\n}\n\nexport class SimData {\n /**\n * @param {import(\"@/model/dn-callgroup.js\").CallGroup[]} callGroups\n * @param {{id:number}[]} emps\n * @param {number} length\n */\n constructor(callGroups, emps, length) {\n /** @private @readonly @type {import(\"@/model/dn-callgroup.js\").CallGroup[]} */\n this._callGroups = callGroups;\n /** @readonly @type {number} */\n this.length = length;\n /** \n * key=callGroupId, values in array is null if no forecast, -1 if no planned.\n * @readonly @type {Map<number, number[]>} \n */\n this.slMap = new Map // key=callGroupId\n /** @private @readonly @type {Map<number, number>} */\n this._slTotalMap = new Map // key=callGroupId\n this._waitTotalMap = new Map // key=callGroupId\n /** @private @readonly @type {Map<number, number[][]>} */\n this._waitMap = new Map// key=callGroupId\n /** @private @readonly @type {Map<number, any[]>} */\n this._waitWithinMap = new Map// key=callGroupId\n this._queueAvgMap = new Map // key=callGroupId [calls in que],[]\n /** @private @readonly @type {Map<number, number[]>} */\n this._occupancyEmpMap = this.getInitiatedOccupancyMap(emps)//key=empId,value [seconds of work]\n this.initiateValueMap(this.slMap)\n this.initateTotalsValueMap(this._slTotalMap)\n this.initiateArrayMap(this._waitMap)\n this.initateTotalsArrayMap(this._waitTotalMap)\n this.initiateValueMap(this._queueAvgMap)\n this.initiateValueMap(this._waitWithinMap)\n }\n\n get slTotalMap() { return this._slTotalMap }\n\n get waitTotalMap() { return this._waitTotalMap }\n\n get waitMap() { return this._waitMap }\n\n get waitWithinMap() { return this._waitWithinMap }\n\n get queueAvgMap() { return this._queueAvgMap }\n\n get occupancyEmpMap() { return this._occupancyEmpMap }\n\n /**\n * @param {number} id\n */\n getCallGroup(id) {\n return this._callGroups.find(x => x.id === id);\n }\n\n /**\n * @private\n * @param {Map<number, any[]>} xMap\n */\n initiateArrayMap(xMap) {\n let intervalItems = Array(this.length)\n for (let i = 0; i < this.length; i++) { intervalItems[i] = [] }\n xMap.set(0, intervalItems)\n for (let a = 0; a < this._callGroups.length; a++) {\n let intervalItems = Array(this.length)\n for (let i = 0; i < this.length; i++) { intervalItems[i] = [] }\n xMap.set(this._callGroups[a].id, intervalItems)\n }\n }\n\n /**\n * @private\n * @param {Map<any, any>} xMap\n */\n initiateValueMap(xMap) {\n let intervalItems = Array(this.length)//key0 contains total\n for (let i = 0; i < this.length; i++) { intervalItems[i] = 0 }\n xMap.set(0, intervalItems)\n for (let a = 0; a < this._callGroups.length; a++) {\n let intervalItems = Array(this.length)\n for (let i = 0; i < this.length; i++) { intervalItems[i] = 0 }\n xMap.set(this._callGroups[a].id, intervalItems)\n }\n }\n\n /**\n * @private\n * @param {Map<any, any>} xMap\n */\n initateTotalsArrayMap(xMap) {\n xMap.set(0, [])//key0 contains total\n for (let a = 0; a < this._callGroups.length; a++) {\n xMap.set(this._callGroups[a].id, [])\n }\n }\n\n /**\n * @private\n * @param {Map<number, number>} xMap\n */\n initateTotalsValueMap(xMap) {\n xMap.set(0, 0)//key0 contains total\n for (let a = 0; a < this._callGroups.length; a++) {\n xMap.set(this._callGroups[a].id, 0)\n }\n }\n\n /**\n * @private\n * @param {{id:number}[]} emps\n */\n getInitiatedOccupancyMap(emps) {\n /** @type {Map<number, number[]>} */\n const xMap = new Map //key0 contains total all emps\n let intervalItems = Array(this.length)\n for (let i = 0; i < this.length; i++) { intervalItems[i] = 0 }\n xMap.set(0, intervalItems)\n\n for (let e = 0; e < emps.length; e++) {\n let intervalItems = Array(this.length)\n for (let i = 0; i < this.length; i++) { intervalItems[i] = 0 }\n xMap.set(emps[e].id, intervalItems)\n }\n return xMap\n }\n}\n","import { condence, getDisplayResolutionFactor, getNumberOfDaysFromIntervalMinusOne, shuffleArray } from \"@/js/dn-helper.js\";\nimport { addDays, getShortDate } from '@/shared/dn-shared-helper.js';\nimport { getForcastOnInterval, getForcastXX } from './dn-forecast.js';\nimport { getEmpWorkArray, getEmpWorkMap } from \"#shared/dn-employee-schedule\";\nimport { TASK_KIND } from \"@/shared/dn-tasktype.js\";\nimport { simulationData } from \"@/stores/dn-simulation-data.js\";\nimport * as dnSimModel from './dn-simulation-model.js';\n/**\n* @typedef {{avgQueue:boolean; datesWithChanges:any[]; employeeOccupancy:boolean; forceUpdate:boolean; numberOfSimIterations:number; occ:boolean; sl:boolean; waitWithin:boolean}} OutputSpec\n*/\n\nconst _maxWaitBeforeAbandonn = 600\nconst _numberOfSecondsPerDay = 24 * 60 * 60\n\nexport class SimState {\n\n /**\n * @param {import(\"@/shared/dn-tasktype.js\").TaskTypes} taskTypes\n * @param {Date} dateNow\n * @param {Map<string, Map<number, number>>} forecastAdjustmentmap\n * @param {{ historicWeeks: number; adherancePercent: number; }} forecastOptions\n * @param {Map<string, { dt: Date; acgr: number; ahtData: number[]; nocData: number[]; }>} historicDataMap,\n * @param {Map<string, { dt: Date; acgr: number; ahtData: number[]; nocData: number[]; }>} aiForecastMap,\n * @param {{ handlingTimePercent: number; handlingTimeVariationPercent: number; callsPercent: number; }} simulationSettings\n * @param {Map<string, number>} specialDaysMap\n * @param {import(\"@/model/dn-callgroup.js\").CallGroup[]} callGroups\n * @param {Date} latestImportDate\n * @param {import(\"@/model/dn-employee-cc.js\").EmployeeCallcenters} employeeCallcenters\n * @param {number} ccId\n * @param {number|null} affinity\n */\n constructor(taskTypes, dateNow, forecastAdjustmentmap, forecastOptions, historicDataMap,aiForecastMap, simulationSettings, specialDaysMap, callGroups, latestImportDate, employeeCallcenters, ccId, affinity = null) {\n /** @type {number|null} */\n this.affinity = affinity;\n /** @readonly @type {Map<number, import(\"@/shared/dn-tasktype.js\").TaskType>} */\n this.affinityTaskTypeById = new Map(taskTypes.list.filter(x => x.affinity === affinity && x.kind === TASK_KIND.task).map(x => [x.id, x]));\n /** @readonly @type {number|null} best task type to plan */\n this.taskTypeId = null;\n let maxWork = -1;\n for (const tt of this.affinityTaskTypeById.values()) {\n if (tt.work > maxWork) {\n maxWork = tt.work;\n this.taskTypeId = tt.id;\n }\n }\n /** @readonly @type {{ handlingTimePercent: number; handlingTimeVariationPercent: number; callsPercent: number; }} */\n this.simulationSettings = simulationSettings;\n /** @readonly @type {Date} */\n this.dateNow = dateNow;\n /** @readonly @type {Map<string, Map<number, number>>} */\n this.forecastAdjustmentmap = forecastAdjustmentmap;\n /** @readonly @type {Date} */\n this.latestImportDate = latestImportDate;\n /** @readonly @type {Map<string, number>} */\n this.specialDaysMap = specialDaysMap;\n /** @readonly @type {Map<number, import(\"@/shared/dn-tasktype.js\").TaskType>} */\n this.taskTypeById = taskTypes.byId;\n /** @readonly @type {Map<string, { dt: Date; acgr: number; ahtData: number[]; nocData: number[]; }>} */\n this.historicDataMap = historicDataMap;\n /** @readonly @type {Map<string, { dt: Date; acgr: number; ahtData: number[]; nocData: number[]; }>} */\n this.aiForecastMap = aiForecastMap;\n /** @readonly @type {{ historicWeeks: number; adherancePercent: number; }} */\n this.forecastOptions = forecastOptions;\n /** @readonly @type {import(\"@/model/dn-callgroup.js\").CallGroup[]} */\n this.callGroups = callGroups.filter(x => x.affinity === affinity);\n /** @readonly @type {import(\"@/model/dn-employee-cc.js\").EmployeeCallcenters} */\n this.employeeCallcenters = employeeCallcenters;\n /** @readonly @type {number} */\n this.ccId = ccId;\n }\n}\n\nexport class SimParameters {\n /**\n * @param {SimState} simState\n * @param {import(\"#shared/dn-employee-schedule\").EmployeeSchedule[]} schedule\n * @param {{id:number}[]} emps\n * @param {Date} simSt\n * @param {number} length\n */\n constructor(simState, schedule, emps, simSt, length) {\n this.dayForcast = simState.callGroups.map(function (x) {\n return {\n acgr: x,\n forc: getForcastOnInterval(simSt, length, simState.dateNow, simState.specialDaysMap, simState.forecastOptions.historicWeeks, x, simState.historicDataMap, simState.aiForecastMap, simState.forecastAdjustmentmap, simState.latestImportDate)\n }\n })\n /** @readonly @type {any[]} */\n this.daySchedule = schedule.map(function (x) {\n return {\n emp: { id: x.emp.id, skills: x.emp.skills, occupiedUntil: 0 }, scheduleInfoArray: getEmpWorkArray(x, simSt, simState.affinityTaskTypeById, length, simState.employeeCallcenters, simState.ccId)\n }\n });\n /** @readonly @type {import(\"@/model/dn-callgroup.js\").CallGroup[]} */\n this.callGroups = simState.callGroups;\n /** @readonly @type {{id:number}[]} */\n this.emps = emps;\n /** @readonly @type {number} */\n this.length = length;\n /** @readonly @type {Date} */\n this.simSt = simSt;\n /** @readonly @type {{ handlingTimePercent: number; handlingTimeVariationPercent: number; callsPercent: number; }} */\n this.simulationSettings = simState.simulationSettings;\n /** @readonly @type {{adherancePercent: number}} */\n this.forecastOptions = simState.forecastOptions;\n }\n}\n\n/**\n * @param {SimParameters} params\n * @param {number} numberOfIterations\n */\nexport function getSimResult(params, numberOfIterations) {\n\n const simData = new dnSimModel.SimData(params.callGroups, params.emps, params.length);\n const simStTime = params.simSt.getTime();\n for (let i = 0; i < numberOfIterations; i++) {\n for (const ds of params.daySchedule) {\n ds.emp.occupiedUntil = simStTime;\n }\n\n const calls = simulate(params.simSt, params.daySchedule, params.dayForcast, params.callGroups, params.simulationSettings, params.forecastOptions.adherancePercent);\n addSimData(simData, calls, params.simSt, numberOfIterations, params.daySchedule);\n }\n\n return getSimulationResult(params, simData);\n}\n\n\n/**\n * @param {{ emps: {id:number}[]; callGroups: import(\"@/model/dn-callgroup.js\").CallGroup[]; daySchedule: any[]; }} params\n */\nfunction getEmptySimDay(params) {\n const length = 96;\n const simData = new dnSimModel.SimData(params.callGroups, params.emps, length);\n return getSimulationResult(params, simData);\n}\n\n/**\n * @param {string} dtKey\n * @param {number|null} affinityId\n */\nfunction getSimulationDataKey(dtKey, affinityId) {\n return dtKey + '_' + affinityId;\n}\n\n/**\n * @param {OutputSpec} outputSpec\n * @param {SimState} simState\n * @param {{dateInterval:Date[]}} scheduleOptions\n * @param {import(\"#shared/dn-employee-schedule\").EmployeeSchedule[]} schedule\n * @param {?function(number):void} callbackSiminfo\n */\nexport function getSimData(outputSpec, simState, scheduleOptions, schedule, callbackSiminfo = null) {\n const length = 96;\n let simData = {}\n const numberOfDays = getNumberOfDaysFromIntervalMinusOne(scheduleOptions.dateInterval)\n let dt = new Date\n const emps = schedule.map(function (x) { return x.emp });\n const numberOfIterations = outputSpec.numberOfSimIterations\n const simulationDataMap = simulationData.simulationDataMap;\n\n // var t0 = performance.now()\n for (let d = 0; d < numberOfDays; d++) {\n if (callbackSiminfo) { callbackSiminfo((d + 1) * 100 / numberOfDays) }\n dt = addDays(new Date(scheduleOptions.dateInterval[0]), d); //eg:Wed Apr 01 2020 00:00:00 GMT+0200 (centraleuropeisk sommartid)\n const dtKey = getShortDate(dt);\n const key = getSimulationDataKey(dtKey, simState.affinity);\n\n if (!simulationDataMap.has(key) || outputSpec.forceUpdate || outputSpec.datesWithChanges.includes(dtKey)) {\n let simDay;\n if (numberOfIterations > 0) {\n const simParameters = new SimParameters(simState, schedule, emps, dt, length);\n simDay = getSimResult(simParameters, numberOfIterations);\n } else {\n const x = { emps: emps, callGroups: simState.callGroups, daySchedule: [] };\n simDay = getEmptySimDay(x);\n }\n simulationDataMap.set(key, simDay)\n }\n }\n\n if (outputSpec.sl) {\n simData.serviceLevelDisplayData = getServicelevelDisplayData(simState.affinity, scheduleOptions.dateInterval[0], numberOfDays, simState);\n }\n if (outputSpec.occ) {\n const numberOfDays = getNumberOfDaysFromIntervalMinusOne(scheduleOptions.dateInterval)\n let empWorkMap = getEmpWorkMap(schedule, simState.affinityTaskTypeById, scheduleOptions.dateInterval[0], numberOfDays, length, simState.employeeCallcenters, simState.ccId);\n let x = getOccupancyAndWorkChartData(scheduleOptions.dateInterval[0], numberOfDays, empWorkMap, emps, length, simState);\n simData.occChartData = x.occData;\n simData.workChartData = x.workData;\n simData.work = x.totWork;\n simData.occ = x.totOcc;\n }\n\n /* if(outputSpec.sickAndVaccationSummary){\n let data=getSickAndVaccationSummary(daySchedule,taskTypeMap)\n simData.numberOfSick=x.numberOfSick;\n simData.numberOfVacation=x.numberOfVacation;\n } */\n\n\n if (outputSpec.avgQueue) {\n simData.avgQueueData = getQueueChartData(scheduleOptions.dateInterval[0], numberOfDays, simState);\n }\n if (outputSpec.waitWithin) {\n simData.waitWithinData = getWaitWithinData(scheduleOptions.dateInterval[0], numberOfDays, simState);\n }\n if (outputSpec.employeeOccupancy) {\n simData.employeeOccupancyData = getEmployeeOccupancyData(scheduleOptions.dateInterval[0], numberOfDays, emps, length, simState);\n }\n // var t1 = performance.now()\n // console.log(\"Timer \" + (t1 - t0) + \" milliseconds.\")\n return simData\n}\n\n/**\n * @param {import(\"@/model/dn-callgroup.js\").CallGroup[]} callGroups\n */\nfunction getDataByAffinity(callGroups, emplyeesByAffinity) {\n /** @type {Map<number|null, import(\"@/model/dn-callgroup.js\").CallGroup[]>} */\n const callGroupsByAffinity = new Map();\n for (const cg of callGroups) {\n let cgData = callGroupsByAffinity.get(cg.affinity);\n if (cgData === undefined) {\n cgData = [];\n callGroupsByAffinity.set(cg.affinity, cgData);\n }\n cgData.push(cg);\n }\n\n const byAffinity = [];\n for (const [affinity, cgs] of callGroupsByAffinity) {\n byAffinity.push({ affinity, callGroups: cgs, slTarget: getAvgSlSetting(cgs), fantomDefaultSkills: cgs.map(function (x) { return x.id }), filteredEmpsByAffinity: emplyeesByAffinity.get(affinity) });\n }\n\n return byAffinity;\n}\n\n/**\n * @param {import(\"@/model/dn-callgroup.js\").CallGroup[]} callGroups\n * @param {any[]} employees\n * @param {any[]} affinities\n */\nfunction getEmployeesByAffinity(callGroups, employees, affinities) {\n const hasAffinities = affinities != null && affinities.length > 0\n\n /** @type {Map<number|null, any[]>} */\n const returnMap = new Map()\n\n if (hasAffinities) {\n\n //prepare data structure\n /** @type {Map<number, number|null>} */\n const cgMap = new Map();\n let hasCallgroupWithNoAffinity = false;\n for (const cg of callGroups) {\n cgMap.set(cg.id, cg.affinity);\n if (cg.affinity === null) {\n hasCallgroupWithNoAffinity = true;\n }\n }\n if (hasCallgroupWithNoAffinity) {\n returnMap.set(null, []);\n }\n\n for (const affinity of affinities) {\n returnMap.set(affinity.id, []);\n }\n\n //load arrys with emps connected to each affinity\n for (const emp of employees) {\n for (const s of emp.skills) {\n let a = cgMap.get(s)\n let empArray = returnMap.get(a)\n if (empArray && !empArray.includes(emp)) { empArray.push(emp) }\n }\n }\n } else {\n returnMap.set(null, employees)\n }\n return returnMap\n}\n\n/**\n * @param {any} simulationSettings\n * @param {{ dateInterval: Date[]; }} scheduleOptions\n * @param {any[]} employees\n * @param {{ historicWeeks: number; adherancePercent: number}} forecastOptions\n * @param {Map<string, number>} specialDaysMap\n * @param {Date} dateNow\n * @param {Map<string, Map<number, number>>} forecastAdjustmentmap\n * @param {import(\"@/model/dn-callgroup.js\").CallGroup[]} callGroups\n * @param {Map<string, {dt:Date, acgr:number, ahtData:number[], nocData:number[]}>} historicDataMap\n * @param {import(\"@/stores/dn-forecast-ai-data.js\").ForecastDataMap} aiForecastMap\n * @param {boolean} forceUpdate\n * @param {number|null} affinityId\n * @param {Date} latestImportDate\n * @param {any[]} affinities\n * @param {number} [numberOfIterations]\n */\nexport function getTarget(simulationSettings, scheduleOptions, employees,\n forecastOptions, specialDaysMap, dateNow, forecastAdjustmentmap,\n callGroups, historicDataMap,aiForecastMap, forceUpdate, affinityId, latestImportDate, affinities, numberOfIterations = 1) {\n //function may be called before data are fully loaded\n if (employees.length === 0 || historicDataMap.size === 0) { return []; }\n\n // var t0 = performance.now()\n /** @type {number[]} */\n let returnArray = [];\n\n const numberOfDays = getNumberOfDaysFromIntervalMinusOne(scheduleOptions.dateInterval);\n const adheranceFactor = 100 / forecastOptions.adherancePercent;\n if (!simulationData.emplyeesByAffinity || forceUpdate) {\n simulationData.emplyeesByAffinity = getEmployeesByAffinity(callGroups, employees, affinities);\n }\n let byAffinity;\n const targetDataMap = simulationData.targetDataMap;\n for (let d = 0; d < numberOfDays; d++) {\n const dt = addDays(new Date(scheduleOptions.dateInterval[0]), d); //eg:Wed Apr 01 2020 00:00:00 GMT+0200 (centraleuropeisk sommartid)\n let dtKey = getShortDate(dt);\n\n if (!targetDataMap.has(dtKey) || forceUpdate) {\n /** @type {Map<number|null, number[]>}} */\n const targetByAffinity = new Map();\n if (byAffinity === undefined) {\n byAffinity = getDataByAffinity(callGroups, simulationData.emplyeesByAffinity);\n }\n\n for (const affinityData of byAffinity) {\n if (affinityData.filteredEmpsByAffinity.length === 0) { continue; }\n /** @type {number[]} */\n const target = new Array(96).fill(0)\n const dayForcast = affinityData.callGroups.map(function (x) {\n return {\n acgr: x,\n forc: getForcastXX(new Date(dt), dateNow, specialDaysMap, forecastOptions.historicWeeks, x, historicDataMap,aiForecastMap, forecastAdjustmentmap, latestImportDate)\n }\n })\n\n for (let i = 0; i < numberOfIterations; i++) {\n for (let q = 0; q < 96; q++) {\n //expand the quarter with a factor to get at least 100 calls to simulate\n let timeRangeInQuarters = getTimeRangeInQuartersForTargetSim(dayForcast, q)\n let calls = generateQuarterCallsTarget(dt, dayForcast, affinityData.callGroups, simulationSettings, q, timeRangeInQuarters)\n\n if (calls.length == 0) {\n target[q] = 0\n } else {\n\n //detrmin initial possible target range based on Erlang C and after one iteration based on previous iterations\n //let targetRange = []\n // if (i == 0 || target[q] < 10) {\n //const erlangA = getErlangA(dayForcast, q);\n // targetRange = [erlangA, erlangA * 3];\n const minTarget = getErlangCTargetWeighted(dayForcast, q);\n const maxTarget = getErlangCTargetSum(dayForcast, q);\n const targetRange = [Math.floor(minTarget), Math.ceil(maxTarget)];\n\n // } else {\n // if (i === 1)\n // targetRange = [(target[q] / (i) * 0.8), (target[q] / (i) * 1.2)];\n // else\n // targetRange = [(target[q] / (i) * 0.9), (target[q] / (i) * 1.1)];\n // }\n //narrow posible target range by half in each iteration\n let slLow = 0;\n let slHigh = 100;\n let hasCalculated = [targetRange[0] === 0, false];\n do {\n let testNumberOfAgent = undefined;\n if (targetRange[1] - targetRange[0] < 3) {\n if (!hasCalculated[0]) {\n testNumberOfAgent = targetRange[0];\n hasCalculated[0] = true;\n } else if (!hasCalculated[1]) {\n testNumberOfAgent = targetRange[1];\n hasCalculated[1] = true;\n }\n }\n if (testNumberOfAgent === undefined)\n testNumberOfAgent = Math.round((targetRange[0] + targetRange[1]) / 2);\n\n let emps = []\n for (let e = 0; e < testNumberOfAgent; e++) { emps.push(getFantom(dt, affinityData)) }\n const waitData = getWaitData(emps, calls, q, timeRangeInQuarters, affinityData.callGroups, dt);\n let slQuarter = getTargetServiceLevel(waitData, calls, affinityData.slTarget)\n if (slQuarter < affinityData.slTarget.slPercent) {\n slLow = slQuarter\n targetRange[0] = testNumberOfAgent;\n hasCalculated[0] = true;\n } else {\n slHigh = slQuarter;\n targetRange[1] = testNumberOfAgent;\n hasCalculated[1] = true;\n }\n\n } while (!hasCalculated[0] || !hasCalculated[1] || (targetRange[1] - targetRange[0] > 2))\n const weight = (slHigh - affinityData.slTarget.slPercent) / (slHigh - slLow);\n let weighted = weight * targetRange[0] + (1 - weight) * targetRange[1];\n weighted = Math.max(minTarget, Math.min(maxTarget, weighted));\n target[q] += Math.max(1, weighted);\n }\n }\n }\n\n for (let q = 0; q < 96; q++) {\n target[q] = target[q] * adheranceFactor / numberOfIterations\n }\n\n targetByAffinity.set(affinityData.affinity, target);\n\n targetDataMap.set(dtKey, targetByAffinity)\n //validation data\n /* for(let p=0;p<96;p++){\n let noc =0\n let ht=0\n let aht=0\n for(let a = 0;a<dayForcast.length;a++){\n noc+=dayForcast[a].forc.noc[p]\n ht+=dayForcast[a].forc.ht[p]\n }\n if(noc>0){aht=ht/noc}\n console.log(noc+';'+aht+';'+target[p])\n } */\n\n }\n }\n let targetSum;\n const dayTargetByAffinity = targetDataMap.get(dtKey);\n if (dayTargetByAffinity !== undefined) {\n if (affinityId !== null) {\n targetSum = dayTargetByAffinity.get(affinityId);\n } else if (dayTargetByAffinity.size === 1) {\n for (const dayTarget of dayTargetByAffinity.values()) {\n targetSum = dayTarget;\n }\n } else {\n targetSum = new Array(96).fill(0);\n for (const dayTarget of dayTargetByAffinity.values()) {\n for (let q = 0; q < 96; q++) {\n targetSum[q] += dayTarget[q];\n }\n }\n }\n } else {\n targetSum = new Array(96).fill(0);\n }\n\n returnArray = returnArray.concat(targetSum);\n }\n\n // console.log(t0 - performance.now())\n return returnArray;\n\n\n /**\n * @param {number[]} waitData\n * @param {any[]} calls\n * @param {{ slPercent?: number; slWithin: any; min?: number; max?: number; }} slTarget\n */\n function getTargetServiceLevel(waitData, calls, slTarget) {\n let slQuarter = 0\n let x = waitData.filter(d => d <= slTarget.slWithin).length\n if (x > 0) { slQuarter = Math.round(100 * x / waitData.length) } else { slQuarter = 0 }\n if (calls.length == 0) { slQuarter = 100 }\n return slQuarter\n }\n\n /**\n * @param {any[]} emps\n * @param {dnSimModel.Call[]} calls\n * @param {number} q\n * @param {number} timeRangeInQuarters\n * @param {import(\"@/model/dn-callgroup.js\").CallGroup[]} callGroups\n * @param {Date} daySt\n */\n function getWaitData(emps, calls, q, timeRangeInQuarters, callGroups, daySt) {\n let waitData = []\n\n //arange emps by skill in a Map\n /** @type {Map<number, any>} */\n let empsBySkillMap = new Map\n for (let a = 0; a < callGroups.length; a++) {\n const callGroupId = callGroups[a].id;\n let filteredEmps = emps.filter(e => e.skills.includes(callGroupId))\n empsBySkillMap.set(callGroupId, filteredEmps)\n }\n\n //set initial occupied time to start of day\n for (let ex = 0; ex < emps.length; ex++) {\n emps[ex].occupiedUntil = daySt.getTime();\n }\n\n const excludeStartup = daySt.getTime() + 1000 * ((q + (3 * timeRangeInQuarters / 15)) * 15 * 60);\n for (let c = 0; c < calls.length; c++) {\n let empWithLongestWait = getEmpWithLongestWait(empsBySkillMap.get(calls[c].callGroupId), calls[c])\n if (empWithLongestWait) {\n const diff = (empWithLongestWait.occupiedUntil - calls[c].msSinceEpoch) / 1000\n if (diff < _maxWaitBeforeAbandonn) {\n calls[c].wait = diff > 0 ? diff : 0;\n empWithLongestWait.occupiedUntil = calls[c].timeStampEnd(100)//adherence is applied after target calculation\n } else {\n calls[c].wait = _maxWaitBeforeAbandonn\n }\n } else { calls[c].wait = _maxWaitBeforeAbandonn }\n\n //Exclude first minutes to avoid startup effect\n if (calls[c].msSinceEpoch > excludeStartup) {\n waitData.push(calls[c].wait)\n }\n }\n return waitData\n\n function getEmpWithLongestWait(emps, call) {\n let maxDiff = 10000000\n let indexFound = -1\n for (let ex = 0; ex < emps.length; ex++) {\n const diff = emps[ex].occupiedUntil - call.msSinceEpoch;\n if (diff < maxDiff) {\n indexFound = ex\n maxDiff = diff\n }\n }\n //To be discussed:If I understand this correctly the routing of calls is defined so that the work is spread out evenly. Perhaps alternative one could stop and give the call to the first how has no wait time.\n return emps[indexFound]\n }\n }\n\n //create a fantom agent with random skills following skill profile of contavt center\n function getFantom(dt, affinityData) {\n let randomEmpId = Math.floor(Math.random() * affinityData.filteredEmpsByAffinity.length)\n let fantom = null\n if (affinityData.filteredEmpsByAffinity[randomEmpId].skills.length > 0) {\n fantom = { occupiedUntil: dt.getTime(), skills: affinityData.filteredEmpsByAffinity[randomEmpId].skills }\n } else {\n fantom = { occupiedUntil: dt.getTime(), skills: affinityData.fantomDefaultSkills }\n }\n return fantom\n }\n}\n\n\n//if fixedNumberOfcalls>1, this number of calls are generated each q. the time range is prolonged so that the same density of calls are produced\n/**\n * @param {Date} simSt\n * @param {any[]} dayForcast\n * @param {import(\"@/model/dn-callgroup.js\").CallGroup[]} callGroups\n * @param {{ handlingTimePercent: number; handlingTimeVariationPercent: number; }} simulationSettings\n * @param {number} q\n * @param {number} timeRangeInQuarters\n */\nfunction generateQuarterCallsTarget(simSt, dayForcast, callGroups, simulationSettings, q, timeRangeInQuarters) {\n let returnValue = []\n for (let a = 0; a < dayForcast.length; a++) {\n let aht = dayForcast[a].forc.noc[q] == 0 ? 0 : dayForcast[a].forc.ht[q] / dayForcast[a].forc.noc[q]\n aht = aht * ((100 + simulationSettings.handlingTimePercent) / 100)\n let ht = aht * (1 + (Math.random() - 0.5) * (2 * simulationSettings.handlingTimeVariationPercent / 100))\n //if(q==0){console.log(timeRangeInQuarters+ ' ' +dayForcast[a].forc.noc[q])}\n for (let i = 0; i < dayForcast[a].forc.noc[q] * timeRangeInQuarters; i++) {\n const secondsToAdd = q * 15 * 60 + Math.random() * 15 * 60 * timeRangeInQuarters;\n const c = new dnSimModel.Call(simSt.getTime() + secondsToAdd * 1000, ht, callGroups[a].id)\n returnValue.push(c)\n }\n //if(q==0){ console.log('q: '+q+ ' calls: '+ returnValue.length)}\n }\n return returnValue.sort(function (a, b) { return a.msSinceEpoch - b.msSinceEpoch; });\n}\n\n/**\n* @param {{acgr: import(\"@/model/dn-callgroup.js\").CallGroup, forc: {ht:number[], noc:number[]}}[]} dayForcast\n* @param {number} q\n*/\nfunction getErlangA(dayForcast, q) {\n let returnValue = 0\n for (let a = 0; a < dayForcast.length; a++) {\n returnValue += dayForcast[a].forc.ht[q]\n }\n\n return returnValue / 900;\n}\n/**\n* @param {{acgr: import(\"@/model/dn-callgroup.js\").CallGroup, forc: {ht:number[], noc:number[]}}[]} dayForcast\n* @param {number} q\n*/\nfunction getErlangCTargetWeighted(dayForcast, q) {\n let ht = 0;\n let noc = 0;\n let slPercent = 100;\n let slWithin = 0;\n for (let a = 0; a < dayForcast.length; a++) {\n const df = dayForcast[a];\n if (df.forc.noc[q] > 0) {\n ht += df.forc.ht[q];\n noc += df.forc.noc[q];\n slPercent = Math.min(slPercent, df.acgr.slPercent);\n slWithin = Math.max(slWithin, df.acgr.slWithin);\n }\n }\n\n const e = ht / 900;\n const aht = noc == 0 ? 0 : ht / noc;\n return getErlangCTarget(e, aht, slWithin, slPercent);\n}\n\n/**\n* @param {{acgr: import(\"@/model/dn-callgroup.js\").CallGroup, forc: {ht:number[], noc:number[]}}[]} dayForcast\n* @param {number} q\n*/\nfunction getErlangCTargetSum(dayForcast, q) {\n let sum = 0\n for (let a = 0; a < dayForcast.length; a++) {\n const df = dayForcast[a];\n const e = df.forc.ht[q] / 900;\n const aht = df.forc.noc[q] == 0 ? 0 : df.forc.ht[q] / df.forc.noc[q];\n sum += getErlangCTarget(e, aht, df.acgr.slWithin, df.acgr.slPercent)\n }\n\n return sum;\n}\n\n\n/**\n * @param {Date} dt\n * @param {Date} dateNow\n * @param {Map<string, number>} specialDaysMap\n * @param {any} forecastOptions\n * @param {Map<string, {dt:Date, acgr:number, ahtData:number[], nocData:number[]}>} historicDataMap\n * @param {Map<string, {dt:Date, acgr:number, ahtData:number[], nocData:number[]}>} aiForecastMap\n * @param {Map<string, Map<number, number>>} forecastAdjustmentmap\n * @param {import(\"@/model/dn-callgroup.js\").CallGroup[]} callGroupsToInclude\n * @param {Date} latestImportDate\n */\nexport function getErlangCTargetArray(dt, dateNow, specialDaysMap, forecastOptions, historicDataMap,aiForecastMap, forecastAdjustmentmap, callGroupsToInclude, latestImportDate) {\n const minArray = new Array(96).fill(0);\n const maxArray = new Array(96).fill(0);\n\n /** @type {Map<number|null, import(\"@/model/dn-callgroup.js\").CallGroup[]>} */\n const cgByAffinity = new Map();\n for (const cg of callGroupsToInclude) {\n let cgs = cgByAffinity.get(cg.affinity)\n if (cgs === undefined) {\n cgs = [];\n cgByAffinity.set(cg.affinity, cgs);\n }\n cgs.push(cg);\n }\n\n const adherenceFactor = forecastOptions.adherancePercent / 100;\n for (const callGroups of cgByAffinity.values()) {\n const totForc = { noc: new Array(96).fill(0), ht: new Array(96).fill(0) }\n let slSetting = getAvgSlSetting(callGroups)\n /** @type {number[]} */\n const sum = new Array(96).fill(0);\n for (let a = 0; a < callGroups.length; a++) {\n let forc = getForcastXX(new Date(dt), dateNow, specialDaysMap, forecastOptions.historicWeeks, callGroups[a], historicDataMap,aiForecastMap, forecastAdjustmentmap, latestImportDate)\n for (let q = 0; q < 96; q++) {\n const e = forc.ht[q] / 900;\n const aht = forc.noc[q] == 0 ? 0 : forc.ht[q] / forc.noc[q];\n totForc.ht[q] += forc.ht[q]\n totForc.noc[q] += forc.noc[q]\n sum[q] += getErlangCTarget(e, aht, callGroups[a].slWithin, callGroups[a].slPercent) / adherenceFactor;\n }\n }\n for (let q = 0; q < 96; q++) {\n if (sum[q] > 0) {\n maxArray[q] += Math.max(1.0, sum[q]);\n }\n const e = totForc.ht[q] / 900;\n const aht = totForc.noc[q] == 0 ? 0 : totForc.ht[q] / totForc.noc[q];\n minArray[q] += getErlangCTarget(e, aht, slSetting.slWithin, slSetting.slPercent) / adherenceFactor;\n }\n }\n\n return { minArray, maxArray };\n}\n\n\nfunction getTimeRangeInQuartersForTargetSim(dayForcast, q) {\n let timeRangeInQuarters = 1\n let forcSum = 0\n for (let a = 0; a < dayForcast.length; a++) { forcSum += dayForcast[a].forc.noc[q] }\n if (forcSum > 0) { timeRangeInQuarters = 60 / forcSum }\n if (timeRangeInQuarters < 1.5) { timeRangeInQuarters = 1.5 }\n return timeRangeInQuarters\n}\n\n/**\n * @param {Date} simSt\n * @param {{emp:{id:number, skills:number[], occupiedUntil: number}, scheduleInfoArray:number[]}[]} daySchedule\n * @param {{ acgr: import(\"@/model/dn-callgroup.js\").CallGroup; forc: { noc: number[]; ht: number[]; }}[]} dayForcast\n * @param {import(\"@/model/dn-callgroup.js\").CallGroup[]} callGroups\n * @param {{ handlingTimePercent: number; handlingTimeVariationPercent: number; callsPercent: number; }} simulationSettings\n * @param {number} adherancePercent\n */\nfunction simulate(simSt, daySchedule, dayForcast, callGroups, simulationSettings, adherancePercent) {\n let calls = generateQuarterCalls(simSt, dayForcast, simulationSettings)\n\n if (!simulationData.callGroupPrioInfoMap) { loadCallGroupPrioInfo(callGroups) }\n const maxPrioSecondInQueue = simulationData.callGroupPrioMax\n const callGroupPrioInfoMap = simulationData.callGroupPrioInfoMap\n\n let lastQuarter = -1\n\n /** @type {Map<number, {emp:{id:number, skills:number[], occupiedUntil: number}, scheduleInfoArray:number[]}[]>} */\n const daySchedulesQuarterBySkillMap = new Map();\n shuffleArray(daySchedule);\n\n for (let c = 0; c < calls.length; c++) {\n const call = calls[c]\n const q = Math.floor((calls[c].msSinceEpoch - simSt.getTime()) / (1000 * 60 * 15));\n if (q != lastQuarter) {\n for (let a = 0; a < callGroups.length; a++) {\n let callGroupId = callGroups[a].id\n let filteredDaySchedules = daySchedule.filter(d => d.emp.skills.includes(callGroupId) && d.scheduleInfoArray[q] > 0)\n\n daySchedulesQuarterBySkillMap.set(callGroupId, filteredDaySchedules)\n }\n lastQuarter = q\n }\n\n if (maxPrioSecondInQueue > 0) {\n for (let i = 1; i < 100; i++) {\n if (i + c < calls.length) {\n const callX = calls[i + c]\n let qx = Math.floor((callX.msSinceEpoch - simSt.getTime()) / (1000 * 60 * 15))\n if (qx == lastQuarter) {\n if (!callX.processed && (callX.msSinceEpoch - call.msSinceEpoch) < callGroupPrioInfoMap.get(callX.callGroupId) * 1000) {\n processCall(callX, qx)\n }\n }\n }\n }\n }\n if (!call.processed) { processCall(call, q) }\n }\n //if(calls[c].callGroupId==1&&calls[c].empId>0){ console.log(calls[c].tostring())}\n return calls\n\n function processCall(call, q) {\n //DaySchedules relevant for the actual quarter and skill\n let skilledAndWorkingDayScheduls = daySchedulesQuarterBySkillMap.get(call.callGroupId)\n if (skilledAndWorkingDayScheduls && skilledAndWorkingDayScheduls.length > 0) {\n const empDayScheduleWithMaxWait = getDayScheduleWithLowestWait(skilledAndWorkingDayScheduls, call);\n if (empDayScheduleWithMaxWait !== undefined) {\n const diff = (empDayScheduleWithMaxWait.emp.occupiedUntil - call.msSinceEpoch) / 1000;\n if (diff < _maxWaitBeforeAbandonn) {\n call.wait = diff > 0 ? diff : 0;\n call.empId = empDayScheduleWithMaxWait.emp.id;\n empDayScheduleWithMaxWait.emp.occupiedUntil = call.timeStampEnd(adherancePercent, empDayScheduleWithMaxWait.scheduleInfoArray[q])\n } else {\n call.wait = _maxWaitBeforeAbandonn\n }\n } else {\n call.wait = _maxWaitBeforeAbandonn;\n }\n } else {\n call.wait = _maxWaitBeforeAbandonn\n }\n call.processed = true\n //console.log(call.tostring());\n }\n\n\n /**\n * @param {{emp:{id:number, skills:number[], occupiedUntil: number}, scheduleInfoArray:number[]}[]} skilledAndWorkingDayScheduls\n * @param {dnSimModel.Call} call\n */\n function getDayScheduleWithLowestWait(skilledAndWorkingDayScheduls, call) {\n let maxDiff = Number.MAX_VALUE;\n let indexFound = -1\n for (let ex = 0; ex < skilledAndWorkingDayScheduls.length; ex++) {\n let diff = skilledAndWorkingDayScheduls[ex].emp.occupiedUntil - call.msSinceEpoch\n if (maxDiff === null || diff < maxDiff) {\n indexFound = ex\n maxDiff = diff\n }\n }\n\n //To be discussed:If I understand this correctly the routing of calls is defined so that the work is spread out evenly. Perhaps alternative one could stop and give the call to the first how has no wait time.\n return skilledAndWorkingDayScheduls[indexFound]\n }\n\n}\n/**\n * @param {dnSimModel.SimData} simDay\n * @param {dnSimModel.Call[]} calls\n * @param {Date} simSt\n * @param {number} numberOfIterations\n * @param {{emp:{id:number}, scheduleInfoArray:number[]}[]} daySchedule\n */\nfunction addSimData(simDay, calls, simSt, numberOfIterations, daySchedule) {\n const length = simDay.length;\n const msPerIndex = 1000 * 60 * 15;\n const msTot = msPerIndex * length;\n\n //Prepare wait&ht data\n for (let c = 0; c < calls.length; c++) {\n const iCallStart = Math.floor(length * (calls[c].msSinceEpoch - simSt.getTime()) / msTot);\n simDay.waitMap.get(0)[iCallStart].push(calls[c].wait)\n simDay.waitMap.get(calls[c].callGroupId)[iCallStart].push(calls[c].wait)\n simDay.waitTotalMap.get(0).push(calls[c].wait)\n simDay.waitTotalMap.get(calls[c].callGroupId).push(calls[c].wait)\n if (calls[c].empId) {\n let ixTalkStart = length * (calls[c].msSinceEpoch + calls[c].wait * 1000 - simSt.getTime()) / msTot\n let iTalkStart = Math.floor(ixTalkStart)\n let x = calls[c].ht\n //long calls are distributed over several periods\n do {\n let xPart = 0\n if (x < (iTalkStart + 1 - ixTalkStart) * msPerIndex) { xPart = x } else { xPart = (iTalkStart + 1 - ixTalkStart) * msPerIndex }\n x = x - xPart\n if (iTalkStart < length) { simDay.occupancyEmpMap.get(calls[c].empId)[iTalkStart] += xPart / numberOfIterations }\n iTalkStart += 1\n ixTalkStart = iTalkStart\n } while (x > 0);\n }\n }\n\n //set zero occupancy if no work\n for (let ex = 0; ex < daySchedule.length; ex++) {\n let occupArray = simDay.occupancyEmpMap.get(daySchedule[ex].emp.id)\n let workArray = daySchedule[ex].scheduleInfoArray\n for (let q = 0; q < length; q++) {\n if (workArray[q] == 0) { occupArray[q] = 0 }\n }\n }\n}\n\n\n/**\n * @param {{callGroups:import(\"@/model/dn-callgroup.js\").CallGroup[];emps:{id:number}[];daySchedule:any[]}} params\n * @param {dnSimModel.SimData} simDay\n */\nfunction getSimulationResult(params, simDay) {\n const callGroups = params.callGroups;\n const emps = params.emps;\n const numberOfDayIntervals = simDay.length;\n const numberOfSecondsPerInterval = 900;\n //if(!callGroups){return simDay}\n let callGroupIds = callGroupIdsWith0(callGroups)\n\n //Sl total\n for (let a = 0; a < callGroupIds.length; a++) {\n let slWithin = (a == 0) ? getAvgSlSetting(callGroups).slWithin : callGroups[a - 1].slWithin\n let waitsData = simDay.waitTotalMap.get(callGroupIds[a])\n if (waitsData.length > 0) {\n if (waitsData.filter(d => d <= slWithin).length > 0) {\n simDay.slTotalMap.set(callGroupIds[a], Math.round(100 * waitsData.filter(d => d <= slWithin).length / waitsData.length))\n }\n }\n\n\n //Sl and waitqueue\n for (let i = 0; i < numberOfDayIntervals; i++) {\n let waitsData2 = simDay.waitMap.get(callGroupIds[a])[i].sort(function (x, y) { return x - y });\n if (waitsData2.length > 0) {\n if (waitsData2.filter(d => d <= slWithin).length > 0) {\n simDay.slMap.get(callGroupIds[a])[i] =100 * waitsData2.filter(d => d <= slWithin).length / waitsData2.length;\n }\n\n simDay.queueAvgMap.get(callGroupIds[a])[i] = waitsData2.reduce((a, b) => a + b, 0) / (_numberOfSecondsPerDay / numberOfDayIntervals);\n simDay.waitWithinMap.get(callGroupIds[a])[i] = waitsData2[Math.round(waitsData2.length * 80 / 100)];\n }\n else {\n simDay.slMap.get(callGroupIds[a])[i] = null//if forcast is zero\n }\n }\n\n //Zero coverage NOT reported on total or department level\n if(a!=0){\n let slArray = simDay.slMap.get(callGroupIds[a])\n if (slArray.includes(0)) {\n for (let i = 0; i < slArray.length; i++) {\n if (slArray[i] == 0) {\n if (params.daySchedule.filter(d => d.emp.skills.includes(callGroupIds[a]) && d.scheduleInfoArray[i] > 0).length == 0) {\n slArray[i] = -1\n }\n }\n }\n }\n }\n }\n\n //Occupancy data\n let occData = simDay.occupancyEmpMap.get(0)\n for (let e = 0; e < emps.length; e++) {\n let occEmpData = simDay.occupancyEmpMap.get(emps[e].id)\n for (let i = 0; i < numberOfDayIntervals; i++) {//calls over interval border\n if (occEmpData[i] > numberOfSecondsPerInterval && i < numberOfDayIntervals - 1) {\n //console.log((emps[e].id + '-'+ occEmpData[i]))\n occEmpData[i + 1] += occEmpData[i] - numberOfSecondsPerInterval\n occEmpData[i] = numberOfSecondsPerInterval\n }\n occData[i] += occEmpData[i]\n }\n }\n\n return simDay\n}\n\n/** \n * @typedef {{ acgrid: number|null, affinity: number|null, name: string, slMin: number, slAvg: number, slMax: number, slPeneltyScore: number, slData: any[],\n * slSetting: { slPercent: number, slWithin: number, min: number, max: number } }} ServicelevelDisplayData\n */\n\n/**\n * @param {number|null} affinity\n * @param {string | number | Date} stDt\n * @param {number} numberOfDays\n * @param {SimState} simState\n */\nfunction getServicelevelDisplayData(affinity, stDt, numberOfDays, simState) {\n\n const callGroups = simState.callGroups;\n let callGroupIds = callGroupIdsWith0(callGroups)\n /** @type {ServicelevelDisplayData[]} */\n const returnArray = [];\n let displayResolutionFactor = getDisplayResolutionFactor(numberOfDays)\n\n returnArray.push({ acgrid: null, affinity, name: \"Service level\", slMin: 0, slAvg: 0, slMax: 0,slPeneltyScore:0, slData: [], slSetting: getAvgSlSetting(callGroups) })\n for (let a = 0; a < callGroups.length; a++) {\n returnArray.push({\n acgrid: callGroups[a].id, affinity, name: callGroups[a].name.slice(0, 10), slMin: 0, slAvg: 0, slMax: 0,slPeneltyScore:0, slData: [],\n slSetting: { slPercent: callGroups[a].slPercent, slWithin: callGroups[a].slWithin, min: callGroups[a].slPercent - 30, max: 100 }\n })\n }\n\n let dt = new Date\n for (let d = 0; d < numberOfDays; d++) {\n dt = addDays(new Date(stDt), d); //eg:Wed Apr 01 2020 00:00:00 GMT+0200 (centraleuropeisk sommartid)\n let dtKey = getShortDate(dt);\n const key = getSimulationDataKey(dtKey, simState.affinity);\n const simDay = simulationData.simulationDataMap.get(key)\n for (let a = 0; a < callGroupIds.length; a++) {\n returnArray[a].slData = returnArray[a].slData.concat(simDay.slMap.get(callGroupIds[a]))\n //returnArray[a].slData = returnArray[a].slData.concat(condence(simDay.slMap.get(callGroupIds[a]), displayResolutionFactor))\n returnArray[a].slAvg += Math.round(simDay.slTotalMap.get(callGroupIds[a]))\n }\n }\n //console.log(returnArray);\n\n if(numberOfDays>0){\n for (let a = 0; a < callGroupIds.length; a++) {\n returnArray[a].slMin = Math.min(...returnArray[a].slData.filter(d =>d!==null ))\n returnArray[a].slMax = Math.max(...returnArray[a].slData)\n returnArray[a].slAvg = (numberOfDays == 0) ? 0 : Math.round(returnArray[a].slAvg / numberOfDays)\n returnArray[a].slPeneltyScore = (returnArray[a].slData.filter(d =>d==-1 ).length*10+returnArray[a].slData.filter(d =>d===0 ).length*5+returnArray[a].slData.filter(d =>d>0&&d<returnArray[a].slSetting.slWithin*100 ).length/4)/numberOfDays\n //console.log(returnArray[a].name + ' '+ returnArray[a].slPeneltyScore);\n }\n }\n\n return returnArray\n}\n\n/** \n * @typedef {{ label: string; dt: null; parameterData: number[]; scaleIndex: number; }} ChartData\n */\n\n/**\n * @param {string | number | Date} stDt\n * @param {number} numberOfDays\n * @param {Map<number, Map<string, number[]>>} empWorkMap\n * @param {any[]} emps\n * @param {number} resolution\n * @param {SimState} simState\n */\nfunction getOccupancyAndWorkChartData(stDt, numberOfDays, empWorkMap, emps, resolution, simState) {\n /** @type {ChartData[]} */\n const returnArrayOcc = [];\n /** @type {ChartData[]} */\n const returnArrayWork = []\n let occArray = []\n let workArray = []\n let occWorkArray = []\n let totWork = 0\n let totOccWork = 0\n let totOcc = 0\n let displayResolutionFactor = getDisplayResolutionFactor(numberOfDays)\n\n let dt = new Date\n for (let d = 0; d < numberOfDays; d++) {\n dt = addDays(new Date(stDt), d); //eg:Wed Apr 01 2020 00:00:00 GMT+0200 (centraleuropeisk sommartid)\n let dtKey = getShortDate(dt);\n let empSumArray = Array(resolution).fill(0)\n const key = getSimulationDataKey(dtKey, simState.affinity);\n const simDay = simulationData.simulationDataMap.get(key);\n for (let e = 0; e < emps.length; e++) {\n let empWork = empWorkMap.get(emps[e].id).get(dtKey)\n let empOccArray = simDay.occupancyEmpMap.get(emps[e].id)\n for (let i = 0; i < resolution; i++) {\n if (empWork[i] == 0) { empOccArray[i] = 0 } //set zero occupancy if no work\n empSumArray[i] += empWork[i]\n }\n }\n\n occWorkArray = occWorkArray.concat(condence(simDay.occupancyEmpMap.get(0), displayResolutionFactor))\n workArray = workArray.concat(condence(empSumArray, displayResolutionFactor))\n }\n for (let i = 0; i < occWorkArray.length; i++) {\n totOccWork += occWorkArray[i]\n totWork += workArray[i] / 4\n occArray.push(workArray[i] > 0 ? Math.round(100 * occWorkArray[i] / (workArray[i] * (_numberOfSecondsPerDay / resolution))) : 0)\n occWorkArray[i] = occWorkArray[i] / (_numberOfSecondsPerDay / resolution)\n }\n if (totWork > 0) { totOcc = 100 * (totOccWork / (60 * 60)) / totWork }\n returnArrayOcc.push({ label: \"Occupancy\", dt: null, parameterData: occArray, scaleIndex: 0 })\n returnArrayWork.push({ label: \"Work\", dt: null, parameterData: workArray, scaleIndex: 0 })\n returnArrayWork.push({ label: \"Occ Work\", dt: null, parameterData: occWorkArray, scaleIndex: 0 })\n return { occData: returnArrayOcc, workData: returnArrayWork, totWork: totWork, totOcc: totOcc }\n}\n\n/**\n * @param {string | number | Date} stDt\n * @param {number} numberOfDays\n * @param {SimState} simState\n */\nfunction getQueueChartData(stDt, numberOfDays, simState) {\n\n const callGroups = simState.callGroups;\n let callGroupIds = callGroupIdsWith0(callGroups)\n /** @type {ChartData[]} */\n const returnArrayAvg = []\n let queueAvgArray = new Array(callGroupIds.length).fill([])\n\n let displayResolutionFactor = getDisplayResolutionFactor(numberOfDays)\n let dt = new Date\n for (let d = 0; d < numberOfDays; d++) {\n dt = addDays(new Date(stDt), d); //eg:Wed Apr 01 2020 00:00:00 GMT+0200 (centraleuropeisk sommartid)\n let dtKey = getShortDate(dt);\n const key = getSimulationDataKey(dtKey, simState.affinity);\n let simDay = simulationData.simulationDataMap.get(key)\n for (let a = 0; a < callGroupIds.length; a++) {\n queueAvgArray[a] = queueAvgArray[a].concat(condence(simDay.queueAvgMap.get(callGroupIds[a]), displayResolutionFactor))\n }\n }\n\n for (let a = 0; a < callGroupIds.length; a++) {\n if (a == 0) {\n returnArrayAvg.push({ label: \"All\", dt: null, parameterData: queueAvgArray[a], scaleIndex: 0 })\n } else {\n returnArrayAvg.push({ label: callGroups[a - 1].name.slice(0, 10), dt: null, parameterData: queueAvgArray[a], scaleIndex: 0 })\n }\n }\n return returnArrayAvg\n}\n\n/**\n * @param {string | number | Date} stDt\n * @param {number} numberOfDays\n * @param {SimState} simState\n */\nfunction getWaitWithinData(stDt, numberOfDays, simState) {\n const callGroups = simState.callGroups;\n let callGroupIds = callGroupIdsWith0(callGroups)\n /** @type {ChartData[]} */\n const returnArray = [];\n let waitWithinArray = new Array(callGroupIds.length).fill([])\n\n let displayResolutionFactor = getDisplayResolutionFactor(numberOfDays)\n let dt = new Date\n for (let d = 0; d < numberOfDays; d++) {\n dt = addDays(new Date(stDt), d); //eg:Wed Apr 01 2020 00:00:00 GMT+0200 (centraleuropeisk sommartid)\n let dtKey = getShortDate(dt);\n const key = getSimulationDataKey(dtKey, simState.affinity);\n let simDay = simulationData.simulationDataMap.get(key)\n for (let a = 0; a < callGroupIds.length; a++) {\n waitWithinArray[a] = waitWithinArray[a].concat(condence(simDay.waitWithinMap.get(callGroupIds[a]), displayResolutionFactor))\n }\n }\n\n for (let a = 0; a < callGroupIds.length; a++) {\n if (a == 0) {\n returnArray.push({ label: \"All\", dt: null, parameterData: waitWithinArray[a], scaleIndex: 0 })\n } else {\n returnArray.push({ label: callGroups[a - 1].name.slice(0, 10), dt: null, parameterData: waitWithinArray[a], scaleIndex: 0 })\n }\n }\n return returnArray\n}\n\n/** \n * @typedef {Map<number, number[]>} EmployeeOccupancyData\n */\n\n/**\n * Get calculated occupancy per employee\n * @param {string | number | Date} stDt\n * @param {number} numberOfDays\n * @param {any[]} emps\n * @param {number} resolution\n * @param {SimState} simState\n */\nfunction getEmployeeOccupancyData(stDt, numberOfDays, emps, resolution, simState) {\n /** @type {EmployeeOccupancyData} */\n const occupancyEmpMap = new Map\n for (let e = 0; e < emps.length; e++) { occupancyEmpMap.set(emps[e].id, []) }\n let displayResolutionFactor = getDisplayResolutionFactor(numberOfDays)\n\n //data from each day\n let dt = new Date\n for (let d = 0; d < numberOfDays; d++) {\n dt = addDays(new Date(stDt), d); //eg:Wed Apr 01 2020 00:00:00 GMT+0200 (centraleuropeisk sommartid)\n let dtKey = getShortDate(dt);\n const key = getSimulationDataKey(dtKey, simState.affinity);\n let simDay = simulationData.simulationDataMap.get(key);\n for (let e = 0; e < emps.length; e++) {\n let occEmp = occupancyEmpMap.get(emps[e].id)\n occEmp = occEmp.concat(condence(simDay.occupancyEmpMap.get(emps[e].id), displayResolutionFactor))\n occupancyEmpMap.set(emps[e].id, occEmp)\n }\n }\n\n //Calcualte occupancy from busy seconds\n for (let e = 0; e < emps.length; e++) {\n let occEmp = occupancyEmpMap.get(emps[e].id)\n occEmp = occEmp.map(function (x) { return x / (_numberOfSecondsPerDay / resolution) });\n occupancyEmpMap.set(emps[e].id, occEmp)\n }\n\n return occupancyEmpMap\n}\n\n//HELPER FUNCTIONS\nfunction callGroupIdsWith0(callGroups) {\n return [0].concat(callGroups.map(function (obj) {\n return obj.id;\n }))\n}\n\n/**\n * @param {import(\"@/model/dn-callgroup.js\").CallGroup[]} callGroups\n */\nfunction getAvgSlSetting(callGroups) {\n let sumP = 0;\n let sumS = 0;\n for (let a = 0; a < callGroups.length; a++) {\n sumP += callGroups[a].slPercent\n sumS += callGroups[a].slWithin\n }\n if (callGroups.length > 0 && sumP > 0 && sumS > 0) {\n return { slPercent: Math.round(sumP / callGroups.length), slWithin: Math.round(sumS / callGroups.length), min: Math.round(sumP / callGroups.length) - 30, max: 100 }\n } else {\n return { slPercent: 80, slWithin: 20, min: 50, max: 100 }\n }\n}\n\n/**\n * @param {Date} simSt\n * @param {{ acgr: import(\"@/model/dn-callgroup.js\").CallGroup; forc: { noc: number[]; ht: number[]; }}[]} dayForcast\n * @param {{ handlingTimePercent: number; handlingTimeVariationPercent: number; callsPercent: number; }} simulationSettings\n */\nfunction generateQuarterCalls(simSt, dayForcast, simulationSettings) {\n /** @type {dnSimModel.Call[]} */\n const returnValue = [];\n if (dayForcast.length === 0) {\n return returnValue;\n }\n\n const length = dayForcast[0].forc.ht.length;\n for (let q = 0; q < length; q++) {\n for (const df of dayForcast) {\n let aht = df.forc.noc[q] == 0 ? 0 : df.forc.ht[q] / df.forc.noc[q]\n aht = aht * ((100 + simulationSettings.handlingTimePercent) / 100)\n const ht = aht * (1 + (Math.random() - 0.5) * (2 * simulationSettings.handlingTimeVariationPercent / 100))\n for (let i = 0; i < df.forc.noc[q] * (100 + simulationSettings.callsPercent) / 100; i++) {\n const secondsToAdd = q * 15 * 60 + Math.random() * 15 * 60;\n const c = new dnSimModel.Call(simSt.getTime() + secondsToAdd * 1000, ht, df.acgr.id)\n returnValue.push(c)\n }\n }\n }\n return returnValue.sort(function (a, b) { return a.msSinceEpoch - b.msSinceEpoch; });\n}\n\n/**\n * @param {number} e\n * @param {number} m\n */\nfunction getErlangB(e, m) {\n let invB = 1;\n for (let i = 1; i <= m; i++) {\n invB = 1 + invB * i / e;\n }\n return 1 / invB;\n}\n\n/**\n * @param {number} e\n * @param {number} m\n */\nfunction getErlangC(e, m) {\n const erlB = getErlangB(e, m);\n return m * erlB / (m - e * (1 - erlB));\n}\n\n/**\n * @param {number} e\n * @param {number} m\n * @param {number} aht\n * @param {number} slWithin\n */\nfunction getServiceLevel(e, m, aht, slWithin) {\n if (m < e)\n return 0;\n const erlC = getErlangC(e, m);\n const sl = 1 - erlC * Math.exp(-(m - e) * (slWithin / aht));\n if (sl < 0)\n return 0;\n return 100 * sl;\n}\n\n/**\n * @param {number} e\n * @param {number} aht\n * @param {number} slWithin\n * @param {number} slPercent\n */\nfunction getErlangCTarget(e, aht, slWithin, slPercent) {\n if (e <= 0 || slPercent <= 0)\n return 0;\n let m = Math.floor(e);\n let sl = 0;\n let slLast = 0;\n while (sl < slPercent) {\n m++;\n slLast = sl;\n sl = getServiceLevel(e, m, aht, slWithin);\n }\n\n return m - (sl - slPercent) / (sl - slLast);\n}\n\nfunction loadCallGroupPrioInfo(callGroups) {\n let callGroupPrioInfoMap = new Map\n let maxPrioSecondInQueue = 0\n for (let i = 0; i < callGroups.length; i++) {\n if (callGroups[i].prioSecondsInQueue > maxPrioSecondInQueue) { maxPrioSecondInQueue = callGroups[i].prioSecondsInQueue }\n /* if(callGroups[i].id==9||callGroups[i].id==10||callGroups[i].id==12){\n callGroupPrioInfoMap.set(callGroups[i].id,15)\n maxPrioSecondInQueue=60\n } */\n callGroupPrioInfoMap.set(callGroups[i].id, callGroups[i].prioSecondsInQueue)\n }\n simulationData.callGroupPrioInfoMap = callGroupPrioInfoMap\n simulationData.callGroupPrioMax = maxPrioSecondInQueue\n}","import { getStartOfWeek } from '@/js/dn-helper.js';\r\nimport { getShortDate as getShortDate2, getStartOfDay } from '@/shared/dn-shared-helper.js';\r\nimport moment from \"moment\";\r\nimport { useDataStore } from \"@/stores/dataStore.js\";\r\n\r\n/**\r\n * @param {string | number | Date} dt\r\n * @param {number} days\r\n */\r\nexport function addDays(dt, days) {\r\n return moment(dt).add(days,'days').toDate()\r\n}\r\n\r\n/**\r\n * @param {Date} st\r\n * @param {Date} fi\r\n */\r\nexport function getDurationInMinutes(st, fi) {\r\n return Math.round((fi.getTime() - st.getTime()) / 60000);\r\n}\r\n\r\n/**\r\n* @param {Date} dt\r\n*/\r\nexport function formatMMDDYYY(dt) {\r\nreturn moment(dt).format('MM/DD/YYYY')\r\n}\r\n\r\nDate.prototype.yyyymmdd = function() {\r\n return getShortDate(this);\r\n};\r\n\r\nDate.prototype.mmdd = function() {\r\n var mm = this.getMonth() + 1; // getMonth() is zero-based\r\n var dd = this.getDate();\r\n return [(mm > 9 ? '' : '0') + mm, (dd > 9 ? '' : '0') + dd].join('-');\r\n};\r\n\r\n/**\r\n * @param {Date} dt\r\n */\r\nexport function getShortDate(dt) {\r\n return getShortDate2(dt);\r\n}\r\n\r\n/**\r\n * @param {string | number | Date} dt\r\n */\r\nexport function getStartOfWeekUI(dt) {\r\n const dataStore = useDataStore();\r\n return getStartOfWeek(dt, dataStore.generalEmpAppSettings.weekStartDay);\r\n}\r\n\r\n/**\r\n * @param {Date} dt\r\n */\r\nexport function getWeekdayNarrow(dt) {\r\n return dt.toLocaleDateString(useDataStore().language, { weekday: 'narrow' });\r\n}\r\n\r\n/**\r\n * @param {Date} dt\r\n */\r\n export function getWeekdayLong(dt) {\r\n return dt.toLocaleDateString(useDataStore().language, { weekday: 'long' });\r\n}\r\n\r\nexport function getWeekDays(dt){\r\n let returnValue=[]\r\n for(let d=0;d<7;d++){\r\n returnValue.push(getWeekdayLong(addDays(dt, d)))\r\n }\r\n return returnValue\r\n}\r\n\r\n/**\r\n * @param {string | number | Date} startDay\r\n */\r\nexport function getWeekDaysWithInfo(startDay) {\r\n const days = [];\r\n for (let d = 0; d < 7; d++) {\r\n const dt = addDays(startDay, d);\r\n const day = dt.getDay();\r\n days.push({ day, name: getWeekdayLong(dt), isWeekend: day === 0 || day === 6 });\r\n }\r\n return days\r\n}\r\n\r\nexport function GetToday() {\r\n var d = new Date();\r\n return new Date(d.getFullYear(), d.getMonth(), d.getDate());\r\n}\r\n\r\n/**\r\n * @param {Date} dt\r\n * @param {string} locale\r\n * @param {string} [timeZone]\r\n * \r\n */\r\nfunction getShortTime(dt, locale, timeZone = undefined) {\r\n const dataStore = useDataStore();\r\n const hourFormat = dataStore.hourFormat;\r\n\r\n  /** @type {Intl.DateTimeFormatOptions} */\r\n let optionsTime = { hour: 'numeric', minute: '2-digit', timeZone };\r\n if(hourFormat == \"24\"){\r\n optionsTime.hour12 = false;\r\n } else if (hourFormat == \"12\"){\r\n optionsTime.hour12 = true;\r\n }\r\n return dt.toLocaleTimeString(locale, optionsTime);\r\n}\r\n\r\n/**\r\n * @param {Date} dt\r\n */\r\nexport function ShortTime(dt) {\r\n const dataStore = useDataStore();\r\n const locale = dataStore.language;\r\n const timeZone = dataStore.currentUser.timezoneUI;\r\n return getShortTime(dt, locale, timeZone);\r\n}\r\n\r\n/**\r\n * @param {number} minutes\r\n */\r\nexport function getShortTimeMinutes(minutes) {\r\n const dataStore = useDataStore();\r\n const locale = dataStore.language;\r\n const dt = new Date(new Date(2000, 0, 1).getTime() + minutes * 60 * 1000);\r\n return getShortTime(dt, locale);\r\n}\r\n\r\n/**\r\n * @param {number} quarter\r\n */\r\nexport function getShortTimeQuarterHour(quarter) {\r\n return getShortTimeMinutes(15 * quarter);\r\n}\r\n\r\n/**\r\n * @param {Date} dt\r\n */\r\nexport function formatTimeAsDuration(dt) {\r\n return dt.toLocaleTimeString(\"se-SE\", { hour12: false, hour: 'numeric', minute: '2-digit' });\r\n}\r\n\r\nexport function getDateFormat(){\r\n if(useDataStore().language=='en-US'){return 'dd/mm/yy'}else{return 'yy-mm-dd'}\r\n}\r\n\r\nexport function getMonthLong(date){\r\n const dt = new Date(date)\r\n return new Intl.DateTimeFormat('en-US', { month: 'long' }).format(dt);\r\n}\r\n\r\n// This script is released to the public domain and may be used, modified and\r\n// distributed without restrictions. Attribution not necessary but appreciated.\r\n// Source: https://weeknumber.net/how-to/javascript\r\n\r\n// Returns the ISO week of the date.\r\nDate.prototype.getWeekNumber = function() {\r\n let date = getStartOfDay(this);\r\n // Thursday in current week decides the year.\r\n date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7);\r\n // January 4 is always in week 1.\r\n var week1 = new Date(date.getFullYear(), 0, 4);\r\n // Adjust to Thursday in week 1 and count number of weeks from date to week1.\r\n return 1 + Math.round(((date.getTime() - week1.getTime()) / 86400000\r\n - 3 + (week1.getDay() + 6) % 7) / 7);\r\n}\r\n\r\n// Returns the four-digit year corresponding to the ISO week of the date.\r\nDate.prototype.getWeekYear = function() {\r\n var date = new Date(this.getTime());\r\n date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7);\r\n return date.getFullYear();\r\n}\r\n\r\nexport function isMobile() {\r\n if (\r\n/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\r\n navigator.userAgent\r\n)\r\n) {\r\nreturn true;\r\n} else {\r\nreturn false;\r\n}\r\n}\r\n\r\nexport function suggestUserInitials(user){\r\n let userInitials = \"\"\r\n if(user.initials&&user.initials!=undefined&&user.initials.length>0){userInitials=user.initials}\r\n else if(user.name&&user.name.length>0){userInitials=user.name.substring(0,2)}\r\n else{userInitials=user.email.substring(0,2)}\r\n return userInitials\r\n}\r\n\r\n\r\n","const UNDO_STATE = createUndoState();\nlet revCounter = 0\nconst revisionMap = new Map()\nlet lastIncrementUndoOrRedo = UNDO_STATE.undo\nlet newSelectionPending = false\n\n\nexport function incrementUndoRevision(direct=false){\n if(direct){\n if(revCounter<revisionMap.size-1){\n if(lastIncrementUndoOrRedo == UNDO_STATE.redo){revCounter++}\n }\n lastIncrementUndoOrRedo = UNDO_STATE.redo\n }else{\n if(revisionMap.get(revCounter)&&revisionMap.get(revCounter).undo.size>0){newSelectionPending = true}\n } \n}\n\n//undo\nexport function decrementUndoRevision(){ \n if(revisionMap.has(revCounter)){\n if(revCounter>0){\n if(lastIncrementUndoOrRedo == UNDO_STATE.undo){revCounter--} \n }\n lastIncrementUndoOrRedo = UNDO_STATE.undo\n }\n}\n\nexport function resetUndo(){\n revCounter = 0\n revisionMap.clear\n newSelectionPending = false\n}\n\n\nexport function addUndoTransaction(id,st,fi,tasktypeId,isNew=null,isDeleted=null){\n if(id==-1){return}\n if(newSelectionPending){\n revCounter=revisionMap.size\n newSelectionPending = false}\n \n if(!revisionMap.has(revCounter)){revisionMap.set(revCounter,{undo:new Map(),redo:new Map()})}\n else if(revCounter<revisionMap.size-1){\n //console.log('remove older data for ' +id);\n for(let i=revCounter;i<revisionMap.size-1;i++){\n let x = revisionMap.get(i)\n if(x.undo.get(id)){x.undo.delete(id)}\n if(x.redo.get(id)){x.redo.delete(id)}\n //console.log('deleted rev' +i);\n } \n }\n\n const currentMap =revisionMap.get(revCounter).undo\n if(!currentMap.has(id)){\n currentMap.set(id,{st:st,fi:fi,tasktypeId:tasktypeId,isNew:isNew,isDeleted:isDeleted})\n }else{\n let x = currentMap.get(id)\n if(st&&!x.st){x.st = st}\n if(fi&&!x.fi){x.fi = fi}\n if(tasktypeId&&!x.tasktypeId){x.tasktypeId = tasktypeId}\n if(isDeleted){x.isDeleted = isDeleted}\n if(isNew){x.isNew = isNew}\n currentMap.set(id,x)\n }\n\n //console.log('after edit ' + revCounter);\n lastIncrementUndoOrRedo = UNDO_STATE.none\n}\n\nexport function addRedoTransaction(currentMap,id,st,fi,tasktypeId,isNew=null,isDeleted=null){\n currentMap.set(id,{st:st,fi:fi,tasktypeId:tasktypeId,isNew:isNew,isDeleted:isDeleted})\n}\n\nexport function getRevisionMap(){\n console.log('REV INDEX: '+ revCounter +' size '+revisionMap.size);\n return revisionMap.get(revCounter)\n}\n\nexport function canUndoRedo(){\n let canUndo = false\n let canRedo =false\n\n let redoDataExist =(revisionMap.size > 0 &&revisionMap.get(revCounter).redo.size>0)\n let undoDataExist =(revisionMap.size > 0 &&revisionMap.get(revCounter).undo.size>0)\n \n if(redoDataExist){\n if(lastIncrementUndoOrRedo==UNDO_STATE.redo){canRedo= revCounter<revisionMap.size-1}\n if(lastIncrementUndoOrRedo==UNDO_STATE.undo){canRedo= revCounter<revisionMap.size}\n }\n if(undoDataExist){\n if(lastIncrementUndoOrRedo!==UNDO_STATE.undo){canUndo= revCounter>=0}\n else {canUndo= revCounter>0 }\n }\n return {undo:canUndo,redo:canRedo}\n\n}\n\n\nfunction createUndoState() {\n const enumObject = {\n none: 0,\n undo: 1,\n redo: 2,\n };\n \n return Object.freeze(enumObject);\n }\n\n\n \n\n\n","import variables from \"@/assets/css/variables.module.scss\";\n// @ts-check\nimport { COLORS } from \"./dn-colors\";\n\n/**\n * @param {string} schemecolor\n */\nexport function getColorFromName(schemecolor) {\n /** @type {string} */\n let returnColor = variables.stroke1\n switch (schemecolor) {\n case COLORS.stroke1:\n returnColor = variables.stroke1;\n break;\n case COLORS.stroke2:\n returnColor = variables.stroke2;\n break;\n case COLORS.stroke3:\n returnColor = variables.stroke3;\n break;\n case COLORS.stroke4:\n returnColor = variables.stroke4;\n break;\n case COLORS.stroke5:\n returnColor = variables.stroke5;\n break;\n case COLORS.stroke6:\n returnColor = variables.stroke6;\n break;\n case COLORS.stroke7:\n returnColor = variables.stroke7;\n break;\n case COLORS.stroke8:\n returnColor = variables.stroke8;\n break;\n case COLORS.stroke9:\n returnColor = variables.stroke9;\n break;\n case COLORS.primary:\n returnColor = variables.primary;\n break;\n case COLORS.lightinfo:\n returnColor = variables.lightinfo;\n break;\n case COLORS.lightdanger:\n returnColor = variables.lightdanger;\n break;\n case 'light':\n returnColor = variables.light;\n break;\n case 'grey':\n returnColor = variables.grey;\n break;\n case 'dark':\n returnColor = variables.dark;\n break;\n case 'warning':\n returnColor = variables.warning;\n break;\n case 'success':\n returnColor = variables.success;\n break;\n case 'danger':\n returnColor = variables.danger;\n break;\n case 'free':\n returnColor = variables.free;\n break;\n default:\n returnColor = variables.primary;\n break;\n }\n\n return returnColor\n}","<template>\n <div id=\"app\" @keydown.q.ctrl.prevent=\"reSimulate\" :class=\"[{ 'isdark': currentRoute != 'login'&&isAgentLogin&&isDark }]\">\n <Header v-if=\"currentRoute != 'login'\" />\n <div class=\"tile is-ancestor\" >\n <div :class=\"[{ 'is-12': !userGuide,'is-9': userGuide}, 'tile','is-vertical']\" >\n <div class=\"section\" id=\"main\">\n <router-view></router-view>\n </div>\n </div>\n\n <Guide />\n </div>\n <Footer v-if=\"currentRoute != 'login'&&!isLowHeight\" />\n </div>\n</template>\n\n<script>\nimport Header from \"./components/Navigation/Header.vue\";\nimport Footer from \"./components/Navigation/Footer.vue\";\nimport Guide from \"./components/Settings/Guide.vue\";\nimport { EventBus } from '@/js/dn-event-bus.js';\nimport { useDataStore } from \"@/stores/dataStore.js\";\nimport { useScheduleStore } from \"@/stores/scheduleStore.js\";\n\nexport default {\n components: {Header,Footer,Guide},\n data() {\n return {\n user: { name: \"System\", admin: true, isLoggedIn: true },\n selectedAptId: 0,\n isLowHeight:false,\n };\n },\n methods: {\n sizeChange: function () { this.isLowHeight = window.innerHeight < 534 },\n setFirstDayOfWeek() {\n this.$primevue.config.locale.firstDayOfWeek = this.firstDayOfWeek;\n },\n reSimulate() {\n EventBus.emit(\"resimulate\");\n }\n },\n computed: {\n currentRoute() {return this.$route.name;},\n firstDayOfWeek() { return useDataStore().generalEmpAppSettings.weekStartDay; },\n userGuide() { return useDataStore().userGuide.display; },\n isAgentLogin() { \n const user = useDataStore().currentUser;\n if (user) { return (user.isAgent) }\n else { return (false) }\n },\n isDark(){\n return useScheduleStore().scheduleOptions.agentScheduleDarkView;\n }\n },\n created() {\n useDataStore().loadLanguage();\n useDataStore().loadHourFormat();\n useScheduleStore().loadLocalScheduleOptions();\n if (this.firstDayOfWeek !== 0) {\n this.setFirstDayOfWeek();\n }\n },\n watch: {\n firstDayOfWeek() {\n this.setFirstDayOfWeek();\n }\n },\n mounted() {window.addEventListener(\"resize\", this.sizeChange);},\n beforeUnmount() {window.removeEventListener(\"resize\", this.sizeChange);},\n};\n</script>\n\n<style lang=\"scss\">\n@import url(\"https://use.typekit.net/jqt3jzd.css\");\n@import \"~bulma/sass/utilities/_all\";\n@import \"./assets/css/variables.module.scss\";\n\n$primary-light: findLightColor($primary);\n$primary-dark: findDarkColor($primary);\n$primary-invert: findColorInvert($primary);\n$twitter: #4099ff;\n$twitter-invert: findColorInvert($twitter);\n\n/* $datepicker-background-color:red; */\n\n$control-radius: 30px;\n$control-radius-small: 30px;\n\n// Lists and maps\n$custom-colors: null !default;\n$custom-shades: null !default;\n\n// Setup $colors to use as bulma classes (e.g. 'is-twitter')\n$colors: mergeColorMaps(\n (\n \"white\": (\n $white,\n $black,\n ),\n \"black\": (\n $black,\n $white,\n ),\n \"light\": (\n $light,\n $light-invert,\n ),\n \"dark\": (\n $dark,\n $dark-invert,\n ),\n \"primary\": (\n $primary,\n $primary-invert,\n $primary-light,\n $primary-dark,\n ),\n \"link\": (\n $link,\n $link-invert,\n $link-light,\n $link-dark,\n ),\n \"info\": (\n $info,\n $info-invert,\n $info-light,\n $info-dark,\n ),\n \"success\": (\n $success,\n $success-invert,\n $success-light,\n $success-dark,\n ),\n \"warning\": (\n $warning,\n $warning-invert,\n $warning-light,\n $warning-dark,\n ),\n \"danger\": (\n $danger,\n $danger-invert,\n $danger-light,\n $danger-dark,\n ),\n \"stroke1\": ($stroke1, $white),\n \"stroke2\": ($stroke2, $black),\n \"stroke3\": ($stroke3, $white),\n \"stroke4\": ($stroke4, $white),\n \"stroke5\": ($stroke5, $white),\n \"stroke6\": ($stroke6, $white),\n \"free\": ($free, $white),\n ),\n $custom-colors\n);\n\n// Links\n$link: $primary;\n$link-invert: $primary-invert;\n$link-focus-border: $primary;\n\n$input-focus-border-color: rgba($black, 0.5);\n$input-focus-box-shadow-color: rgba($black, 0.1);\n$input-focus-box-shadow-size: 0 0 5px 2px;\n\n$button-focus-border-color: rgba($black, 0.5);\n$button-focus-box-shadow-size: 0 0 5px 2px;\n$button-focus-box-shadow-color: rgba($black, 0.1);\n\n// Import Bulma styles\n@import \"~bulma\";\n\nbody {\n font-family: proxima-nova, sans-serif;\n font-weight: 400;\n}\n\n#app {\n display: flex;\n flex-flow: column;\n min-height: 100vh;\n}\n.isdark{\n background: black;\n}\n\nbody {\n overflow: hidden; /* Hide scrollbars */\n}\n\n#main {\n flex-grow: 1;\n}\n\n\n\n\n.section {\n padding: 0 1.5rem 2rem 1.5rem;\n \n}\n\n\n.no_highlights {\n -webkit-tap-highlight-color: transparent!important;\n -webkit-touch-callout: none!important;\n -webkit-user-select: none!important;\n -khtml-user-select: none!important;\n -moz-user-select: none!important;\n -ms-user-select: none!important;\n user-select: none!important;\n}\n\n@media screen and (max-width: $mobileBreakPoint) {\n .section {\n padding: 0rem 1.5rem 86px 1.5rem;\n }\n}\n</style>\n","<template>\n <div class=\"navbar-wrapper\" id=\"application-header\">\n <div @click=\"layOutChange\">\n <PvMessage v-if=\"showExpireWarning\" severity=\"warn\" class=\"header-msg\" icon=\"none\">{{ expireMessage }}</PvMessage>\n <PvMessage v-if=\"refreshedDueToError\" severity=\"success\" class=\"header-msg\" icon=\"none\">\n {{ $t('navigation.refreshed-due-to-error-msg') }}</PvMessage>\n <PvMessage v-if=\"showSettings && relevantInvoiceStatus == 1\" severity=\"success\" class=\"header-msg\" icon=\"none\">\n {{ $t('navigation.new-invoice-long') }}</PvMessage>\n <PvMessage v-if=\"showSettings && relevantInvoiceStatus == 3\" severity=\"error\" class=\"header-msg\" icon=\"none\">\n {{ $t('navigation.unpaid-invoice-long') }}</PvMessage>\n <PvMessage v-if=\"showSettings && relevantInvoiceStatus == 4\" severity=\"error\" class=\"header-msg\" icon=\"none\">\n {{ $t('navigation.overdue-invoice-long') }}</PvMessage>\n </div>\n <div class=\"container\">\n <nav v-if=\"!isAgentLogin\" class=\"navbar\">\n <div class=\"navbar-brand\">\n <!--logo-->\n <div class=\"brand\">\n <router-link :to=\"'/'\">\n <img src=\"@/assets/simTree_logotext_white_bg.svg\" class=\"no_highlights loggo\" alt=\"logo\" />\n </router-link>\n </div>\n <!--menu items-->\n <div>\n <a v-if=\"isNormalLogin\" class=\"menu-item\" :class=\"[{ 'active': isPage('portfolio') }]\"\n @click=\"goToView('portfolio')\">\n {{ $t('navigation.home') }}\n </a>\n <a v-if=\"isNormalLogin && !forecastIsAvailable\" class=\"menu-item\">\n {{ $t('navigation.loading') }}...\n </a>\n <a v-if=\"showForecast\" class=\"menu-item\" :class=\"[{ 'active': isPage('forecast') }]\"\n @click=\"goToView('forecast')\">\n {{ $t('navigation.forecast') }}\n </a>\n <a v-if=\"showSchedule\" class=\"menu-item\" :class=\"[{ 'active': isPage('schedule') }]\"\n @click=\"goToView('schedule')\">\n {{ $t('navigation.schedule') }}\n </a>\n <a v-if=\"showSchedule\" class=\"menu-item\" :class=\"[{ 'active': isPage('employees') }]\"\n @click=\"goToView('employees')\">\n {{ $t('navigation.employees') }}\n </a>\n <a v-if=\"showReport\" class=\"menu-item\" :class=\"[{ 'active': isPage('report') }]\" @click=\"goToView('report')\">\n {{ $t('navigation.report') }}\n </a>\n <a v-if=\"showSettings\" class=\"menu-item\" :class=\"[{ 'active': isPage('settings') }]\"\n @click=\"goToView('settings')\">\n {{ $t('navigation.settings') }}\n </a>\n </div>\n </div>\n <div style=\"flex: 1; position: relative; display: flex; justify-content: flex-end;\" ref=\"rightMenu\">\n <div class=\"menu-toggle\" id=\"menu-toggle\" @click=\"toggleMenubar = !toggleMenubar\">☰</div>\n <div class=\"menu-bar\" :style=\"{ display: isShowSidebar ? 'flex' : 'none' }\">\n <div class=\"menu-bar_item\" @click=\"checkInvoiceStatus\">\n <p v-if=\"showSettings && relevantInvoiceStatus == 1\"\n class=\"is-size-6 no_highlights invoice-info invoice-color-info\"\n v-tooltip=\"$t('navigation.new-invoice-long')\">{{ $t('navigation.new-invoice') }}</p>\n <p v-if=\"showSettings && relevantInvoiceStatus == 3\"\n class=\"is-size-6 no_highlights invoice-info invoice-color-due\"\n v-tooltip=\"$t('navigation.unpaid-invoice-long')\">{{ $t('navigation.unpaid-invoice') }}</p>\n <p v-if=\"showSettings && relevantInvoiceStatus == 4\"\n class=\"is-size-6 no_highlights invoice-info invoice-color-overdue\"\n v-tooltip=\"$t('navigation.overdue-invoice-long')\">{{ $t('navigation.overdue-invoice') }}</p>\n </div>\n <div v-if=\"supervisorInfo\" class=\"menu-bar_item\">\n <p v-tooltip.bottom=\"$t('navigation.supervior-info-tt')\" class=\"is-size-6 supervior-info\">{{\n $t('navigation.published-only')\n }}</p>\n </div>\n <div v-if=\"showCurrentTimezone\" class=\"menu-bar_item\">\n <i class=\"pi pi-clock\" style=\"margin-right: 12px;\" v-tooltip.bottom=currentTimezone></i>\n </div>\n <div v-if=\"showEmpFilter\" class=\"menu-bar_item\">\n <i class=\"pi pi-filter\" style=\"margin-right: 4px; cursor: pointer\"\n v-tooltip.bottom=\"$t('schedule.filter-tt')\" @click=\"scheduleFilter.show = !scheduleFilter.show\"></i>\n </div>\n <div v-if=\"showEmpFilter\" class=\"menu-bar_item\">\n <p class=\"is-size-6 filter-info\">{{ scheduleFilter.filterMsg }}</p>\n </div>\n <div v-if=\"showReadOnlyInfo\" class=\"menu-bar_item\" style=\"display: flex; align-items:center\">\n <p class=\"is-size-6 supervior-info\">{{ $t('navigation.read-only') }}</p>\n </div>\n <div v-if=\"showAffintyDropDown\" class=\"affinity-info menu-bar_item\" disabled>\n <PvDropdown v-model=\"scheduleFilter.affinity\" :options=\"affinitySelection()\" optionValue=\"id\"\n optionLabel=\"name\" @change=\"filterChange\" :pt=\"{\n root: { style: { borderRadius: '2rem', maxHeight: '600px' } },\n input: { style: { height: '40px', padding: '0.5rem' } },\n item: { style: { padding: '0.25rem 0.5rem', margin: '0.25rem' } },\n }\">\n <template #value=\"slotProps\">\n <span> {{ getAffinityText() }}</span>\n </template>\n </PvDropdown>\n </div>\n <div v-if=\"isCurrentCCSelected\" class=\"menu-bar_item is-size-6 call-center\">\n <p style=\"white-space: nowrap;\">{{ currentCC.name }}</p>\n </div>\n\n <div class=\"user-menu\" style=\"padding: 0.25rem 0.5rem\">\n <div @click=\"toggleUserMenubar = !toggleUserMenubar\"\n style=\"height: 100%;display: flex;align-items: center;\">\n <span>{{ this.$t('navigation.user') }}</span>\n <span class=\"pi pi-fw pi-angle-down\" />\n </div>\n <ul class=\"dropdown-menu-bar\" :style=\"{ display: toggleUserMenubar ? 'block' : 'none' }\">\n <li\n v-if=\"!isSuperAdmin && currentUser !== null && currentUser.hasAccessSettings && !currentUser.isSupervisor\"\n @click=\"goToView('admin')\">\n <span>{{ this.$t('navigation.admin') }}</span>\n </li>\n <li\n v-if=\"!isSuperAdmin && currentUser !== null && currentUser.hasAccessSettings && !currentUser.isSupervisor\"\n @click=\"goToView('invoice')\">\n <span>{{ this.$t('navigation.invoice') }}</span>\n </li>\n <li v-if=\"currentUser !== null\" @click=\"settingsDialogVisible = true\">\n <span>{{ this.$t('navigation.user-settings') }}</span>\n </li>\n <li v-if=\"!isSuperAdmin\" @click=\"userGuide.display = !userGuide.display\">\n <span>{{ this.$t('navigation.user-guide') }}</span>\n </li>\n <li @click=\"logOut()\">\n <span>{{ this.$t('navigation.log-out') }}</span>\n </li>\n <li v-if=\"isPage('portfolio')\" @click=\"clearLocalStorage()\">\n <span>{{ this.$t('navigation.clear-cookies') }}</span>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </nav>\n </div>\n <PvDialog v-model:visible=\"settingsDialogVisible\" modal :header=\"$t('navigation.user-settings')\" :style=\"{ width: '700px' }\">\n <div class=\"user-setting-dialog\">\n <nav>\n <ul class=\"settings-tab-menu\" v-for=\"tab in tabMenu\">\n <li>\n <a @click=\"activeTab = tab.id\" :class=\"{ active: tab.id === activeTab }\">\n <span>{{ $t(tab.tabKey) }}</span>\n </a>\n </li>\n </ul>\n </nav>\n <div class=\"vertical-line\"></div>\n <div class=\"user-settings-menu\">\n <TabView v-model:activeIndex=\"activeTab\" :pt=\"{ navContainer: { style: { display: 'none' } } }\">\n <TabPanel>\n <div class=\"flex flex-col gap-6\">\n <div class=\"w-full\">\n <div class=\"flex items-center\">\n <AvatarSelector ref=\"avatarSelector\" :user=\"currentUser\" @update:initials=\"currentUser.initials = $event\"\n @update:colorId=\"currentUser.colorId = $event\"/>\n </div>\n </div>\n </div>\n </TabPanel>\n <!-- <TabPanel>\n <div class=\"switch-w-label\">\n <InputSwitch v-model=\"reportOptions.reportCsvSemicolon\" inputId=\"reportCsvSemicolon\"\n v-tooltip.right=\"$t('report.use-semicolon-separation-tt')\" />\n <label class=\"text-sm ml-2\" for=\"reportCsvSemicolon\"\n v-tooltip.right=\"$t('report.use-semicolon-separation-tt')\">\n {{ $t('report.use-semicolon-separation') }}\n </label>\n </div>\n </TabPanel> -->\n <TabPanel>\n <div class=\"switch-w-label\">\n <InputSwitch v-model=\"useVirtualScroll\" \n v-tooltip.right=\"$t('settings.use-virtual-scroll-tt')\" />\n <label class=\"text-sm ml-2\" for=\"reportCsvSemicolon\"\n v-tooltip.right=\"$t('settings.use-virtual-scroll-tt')\">\n {{ $t('settings.use-virtual-scroll') }}\n </label>\n </div>\n </TabPanel>\n <TabPanel>\n <UserAuthConfig section=\"security\" />\n </TabPanel>\n <TabPanel>\n <UserAuthConfig section=\"noti\" />\n </TabPanel>\n <TabPanel>\n <div class=\"w-full\">\n <span class=\"block text-sm font-medium mb-2 mt-2\">Language setting</span>\n <div class=\"flex items-center\">\n <PvDropdown v-model=\"selectedLanguage\" :options=\"languages\" placeholder=\"Select a language\" :pt=\"{\n input: { style: { height: '40px', padding: '0.5rem' } },\n item: { style: { padding: '0.25rem 0.5rem' } }\n }\" :style=\"{ width: '200px' }\" />\n </div>\n </div>\n </TabPanel>\n <TabPanel>\n <div class=\"w-full\">\n <span class=\"block text-sm font-medium mb-2 mt-2\">{{$t('navigation.hour-format')}}</span>\n <div class=\"flex items-center\">\n <PvDropdown\n v-model=\"hourFormat\" \n :options=\"hourFormats\" \n placeholder=\"Select hour format\"\n optionLabel=\"label\"\n optionValue=\"value\" :pt=\"{\n input: { style: { height: '40px', padding: '0.5rem' } },\n item: { style: { padding: '0.25rem 0.5rem' } }\n }\" :style=\"{ width: '200px' }\" />\n </div>\n </div>\n </TabPanel>\n </TabView>\n </div>\n </div>\n <div class=\"dialog-row mt-2\" style=\"float: right;\">\n <PvButton type=\"button\" :label=\"$t('global.close')\" @click=\"settingsDialogVisible = false\" class=\"small-button ml-2\"\n severity=\"contrast\" />\n </div>\n </PvDialog>\n <!-- <RawData class :data=\"affinitySelection()\" :title=\"'affinitySelection'\" /> -->\n </div>\n</template>\n\n<script>\nimport RawData from \"@/components/Base/RawData.vue\";\nimport AvatarSelector from \"@/components/Settings/AvatarSelector.vue\";\n// import { useReportStore } from \"@/stores/reportStore.js\";\nimport { getSupportedCultures, loadLanguageAsync } from '@/i18n.js';\nimport * as dnLocalStorage from '@/js/dn-localStorage.js';\nimport * as dn_schedulehelper from '@/js/dn-schedule-helper.js';\nimport Icon from \"@/components/Base/Icon.vue\";\nimport { EventBus } from \"@/js/dn-event-bus.js\";\nimport { useDataStore } from \"@/stores/dataStore.js\";\nimport { useFileImportStore } from \"@/stores/fileImportStore.js\";\nimport { useForecastStore } from \"@/stores/forecastStore\";\nimport { useScheduleStore } from \"@/stores/scheduleStore.js\";\nimport Modal from \"@/components/Base/Modal.vue\";\nimport Button from \"@/components/Base/Button.vue\";\nimport { saveUsers } from \"@/model/dn-user\";\nimport UserAuthConfig from \"@/components/Account/UserAuthConfig.vue\";\n\nexport default {\n // @ts-ignore\n components: { Icon, RawData, Modal, Button, AvatarSelector, UserAuthConfig },\n name: \"Header\",\n\n data() {\n return {\n languages: getSupportedCultures(),\n activeSelectAvatar: false,\n toggleMenubar: false,\n toggleUserMenubar: false,\n screenWidth: window.innerWidth,\n xLargeBreakPoint: 1200,\n settingsDialogVisible: false,\n activeTab: 0,\n tabMenu: [\n { id: 0, tabKey: 'settings.user-settings-avatar-language' },\n // { id: 1, tabKey: 'settings.user-settings-files-separator' },\n { id: 1, tabKey: 'settings.use-virtual-scroll' },\n { id: 2, tabKey: 'settings.user-settings-security' },\n { id: 3, tabKey: 'settings.user-settings-noti' },\n { id: 4, tabKey: 'settings.user-settings-language' },\n { id: 5, tabKey: 'navigation.hour-format' }\n ],\n selectedLanguage: dnLocalStorage.getLanguage() || \"en-US\",\n useVirtualScroll: false,\n hourFormats: [\n {label: '12 hours', value: \"12\"},\n {label: '24 hours', value: \"24\"},\n ],\n userData: {\n initials: null,\n colorId: null\n },\n hourFormat: dnLocalStorage.getTimeDisplaySetting() || \"24h\"\n };\n },\n computed: {\n // reportOptions() { return useReportStore().reportOptions },\n scheduleOptions() { return useScheduleStore().scheduleOptions },\n useMode() { return useDataStore().getMode },\n scheduleFilter() { return useScheduleStore().scheduleOptions.scheduleFilter; },\n affinities() { return useDataStore().affinities; },\n hasAffinity() {\n const callGroups = this.callGroups;\n return callGroups.some(x => x.affinity !== null);\n },\n callGroups() { return useDataStore().skillsCurrentCC; },\n currentCC() { return useDataStore().currentCC; },\n currentUser() { return useDataStore().currentUser; },\n currentTimezone() {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n },\n showCurrentTimezone() {\n /** @type {string} */\n const routeName = this.$route.name;\n return routeName !== 'employees' && routeName !== 'settings';\n },\n employeeContext() { return useScheduleStore().employeeContext; },\n language: {\n get() {\n return useDataStore().language;\n },\n /**\n * @param {string} lang\n */\n set(lang) {\n useDataStore().language = lang;\n }\n },\n forecastIsAvailable() { return useForecastStore().forecastOptions.forecastIsLoaded; },\n refreshedDueToError() { return useDataStore().refreshedDueToError; },\n userGuide() { return useDataStore().userGuide; },\n showAffintyDropDown: function () {\n return (this.isPage('schedule') || (this.isPage('employees') && this.employeeContext.activeTab == 1)) && this.hasAffinity && this.affinities\n },\n showEmpFilter() {\n return this.isPage('schedule') || this.isPage('employees')\n },\n isAgentLogin: function () {\n return this.currentUser != null && this.currentUser.isAgent;\n },\n isCurrentCCSelected: function () {\n return this.currentCC != null;\n },\n\n isNormalLogin: function () {\n return this.currentUser != null && !this.currentUser.isAgent && !this.currentUser.isSuperAdmin;\n },\n isSuperAdmin: function () {\n return this.currentUser != null && this.currentUser.isSuperAdmin;\n },\n showForecast() {\n return this.forecastIsAvailable && this.currentUser !== null && this.currentUser.hasAccessForecasting && this.useMode == 0;\n },\n showReport() {\n return this.forecastIsAvailable && this.currentUser !== null && this.currentUser.hasAccessReports && this.isCurrentCCSelected;\n },\n showSchedule() {\n return this.forecastIsAvailable && this.currentUser !== null && this.currentUser.hasAccessScheduling && this.isCurrentCCSelected;\n },\n supervisorInfo() {\n if (this.isPage('schedule')) {\n return this.currentUser !== null && (this.currentUser.isSupervisor)\n }\n },\n showReadOnlyInfo() {\n if (this.isPage('schedule')) {\n return this.currentUser !== null && (!this.currentUser.canEditScheduling && this.isCurrentCCSelected)\n } else if (this.isPage('settings')) {\n return this.currentUser !== null && (!this.currentUser.canEditSettings)\n } else if (this.isPage('forecast')) {\n return this.currentUser !== null && (!this.currentUser.canEditForecasting)\n }\n return false;\n },\n showSettings() {\n return this.forecastIsAvailable && this.currentUser !== null && this.currentUser.hasAccessSettings;\n },\n fileImportInfo() { return useFileImportStore().fileImportInfo; },\n scheduleNeedsSave() { return useScheduleStore().scheduleNeedsToSave; },\n showExpireWarning() {\n return this.currentUser != null && this.currentUser.endTime !== null;\n },\n relevantInvoiceStatus() { return useDataStore().relevantInvoiceStatus },\n\n expireMessage() {\n return this.$t('navigation.program-will-stop-working') + `${this.currentUser.endTime}.`;\n },\n isShowSidebar() {\n if (this.screenWidth > this.xLargeBreakPoint) {\n return true;\n } else {\n return this.toggleMenubar;\n }\n },\n },\n methods: {\n checkVirtualScrollSetting() {\n this.useVirtualScroll = !!dnLocalStorage.getVirtualScrollSetting();\n },\n hasChangeUser() {\n return (\n this.userData.initials !== this.currentUser.initials ||\n this.userData.colorId !== this.currentUser.colorId\n )\n },\n saveUserSettings(activeTab) {\n if (this.hasChangeUser()) {\n saveUsers([this.currentUser])\n this.userData = {\n initials: this.currentUser.initials,\n colorId: this.currentUser.colorId,\n };\n } else if (activeTab === 1) {\n if(this.useVirtualScroll){\n const option = {\n itemSize: 27, \n lazy:true,\n numToleratedItems: 2,\n showLoader:true\n }\n dnLocalStorage.setVirtualScrollSetting(option);\n this.scheduleOptions.virtualScrollerOptions = dnLocalStorage.getVirtualScrollSetting();\n } else if(!this.useVirtualScroll){\n dnLocalStorage.removeVirtualScrollSetting();\n this.scheduleOptions.virtualScrollerOptions = {}\n }\n } else if(activeTab === 4){\n this.setLanguage(this.selectedLanguage)\n } \n },\n checkInvoiceStatus() {\n useDataStore().loadRelevantInvoiceStatus()\n },\n layOutChange() {\n setTimeout(() => {\n EventBus.emit('scheduleLayoutChange');\n }, 500);\n },\n filterChange() {\n EventBus.emit(\"simulationChange\");\n EventBus.emit(\"schedulefilterchange\")\n },\n affinitySelection() {\n const sel = [{ id: null, name: 'All departments' }];\n const callGroups = this.callGroups;\n const affinities = this.affinities;\n\n /** @type {Set<number>} */\n const usedAffinities = new Set();\n for (const cg of callGroups) {\n if (cg.affinity !== null) {\n usedAffinities.add(cg.affinity);\n }\n }\n for (const a of affinities) {\n if (usedAffinities.has(a.id)) {\n sel.push(a);\n }\n }\n return sel;\n },\n getAffinityText() {\n const id = this.scheduleFilter.affinity;\n if (id === null) {\n return \"All departments\";\n }\n\n /** @type {import(\"@/model/dn-affinity.js\").Affinity[]} */\n const affinities = this.affinities;\n const affinity = affinities.find(x => x.id === id);\n if (affinity)\n return affinity.name;\n return id;\n },\n /**\n * @param {string} lang\n */\n setLanguage(lang) {\n dnLocalStorage.setLanguage(lang);\n loadLanguageAsync(lang);\n EventBus.emit('calculateReport');\n },\n async logOut() {\n const dataStore = useDataStore();\n this.userGuide.display = false\n dn_schedulehelper.saveLocalScheduleSettings()\n try {\n if (this.scheduleNeedsSave) {\n this.$confirm.require({\n message: `${this.$t('global.unsaved-schedule')}`,\n rejectLabel: 'Cancel',\n acceptLabel: 'Confirm',\n accept: () => {\n dataStore.logOut();\n this.$router.push({ name: \"login\" });\n }\n });\n } else {\n dataStore.logOut();\n this.$router.push({ name: \"login\" });\n }\n } catch (e) {\n console.log(e);\n }\n },\n isPage: function (page) {\n return this.$route.name == page;\n },\n clearLocalStorage: function () {\n dnLocalStorage.clearLocalStorage()\n },\n goToView(name) {\n if (this.$route.name !== name) {\n /** @type {import(\"@/model/dn-employee-context.js\").EmployeeContext} */\n const employeeContext = this.employeeContext;\n if (employeeContext.hasModifiedData) {\n this.$confirm.require({\n message: `${this.$t('global.discard-changes')}`,\n rejectLabel: `${this.$t('global.no')}`,\n acceptLabel: `${this.$t('global.yes')}`,\n accept: () => {\n employeeContext.revertModifiedData();\n this.$router.push({ name: name });\n }\n });\n } else {\n this.$router.push({ name: name });\n }\n }\n },\n handleClickOutsideMenu(event) {\n if (this.$refs.rightMenu && !this.$refs.rightMenu.contains(event.target)) {\n this.toggleMenubar = false;\n this.toggleUserMenubar = false;\n }\n },\n updateScreenWidth() {\n this.screenWidth = window.innerWidth;\n },\n },\n watch: {\n fileImportInfo: {\n handler: function () {\n const fileImportInfo = this.fileImportInfo;\n if (fileImportInfo.error) {\n this.$toast.add({\n severity: 'error',\n detail: \"File \" + this.fileImportInfo.fileName + \" has error(s)\",\n life: 2000\n });\n }\n else if (fileImportInfo.nofImported > 0) {\n this.$toast.add({\n severity: 'secondary',\n detail: fileImportInfo.nofImported + \" files imported\",\n life: 2000\n });\n }\n const forecastStore = useForecastStore();\n forecastStore.reloadForecastAndHistoricData();\n },\n deep: true\n },\n activeTab: function (newTab, oldTab) {\n this.saveUserSettings(oldTab);\n },\n\n currentUser: {\n immediate: true,\n handler(newUser) {\n if (!newUser) { return; }\n this.userData = {\n initials: newUser.initials,\n colorId: newUser.colorId,\n };\n },\n },\n\n settingsDialogVisible: function (newValue) {\n if (!newValue) {\n this.saveUserSettings(this.activeTab);\n }\n },\n\n hourFormat(newValue) {\n useDataStore().setHourFormat(newValue);\n }\n },\n created() {\n this.checkVirtualScrollSetting();\n },\n mounted() {\n document.addEventListener('click', this.handleClickOutsideMenu);\n window.addEventListener(\"resize\", this.updateScreenWidth);\n window.addEventListener('storage', this.checkVirtualScrollSetting);\n },\n beforeUnmount() {\n window.removeEventListener('storage', this.checkVirtualScrollSetting);\n },\n beforeDestroy() {\n document.removeEventListener('click', this.handleClickOutsideMenu);\n window.removeEventListener(\"resize\", this.updateScreenWidth);\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import \"@/assets/css/variables.module.scss\";\n@import \"@/assets/css/common.module.scss\";\n.vertical-line {\n width: 1px;\n background-color: #beb8b8;\n height: auto;\n min-height: 100%; \n}\n\n.custom-tabview{\n display: flex;\n align-items: stretch;\n border: 1px solid #ddd; \n border-radius: 8px;\n overflow: hidden;\n}\n\n.switch-w-label{\n display: flex;\n align-items: center; \n justify-content: flex-start; \n gap: 8px;\n}\n\n.small-button {\n height: 32px;\n margin-right: 4px\n}\n\n.user-setting-dialog {\n display: flex;\n flex-direction: row;\n align-items: stretch;\n gap:20px;\n height: 250px;\n}\n\n.settings-tab-menu {\n display: flex;\n flex-direction: column;\n}\n\n.settings-tab-menu li {\n display: block;\n width: 100%;\n}\n\n.settings-tab-menu li a {\n display: flex;\n align-items: center;\n border-bottom-color: hsl(0, 0%, 86%);\n border-bottom-style: solid;\n border-bottom-width: 1px;\n color: hsl(0, 0%, 29%);\n margin-bottom: -1px;\n padding: 0.5em 1em;\n}\n\n.settings-tab-menu li a:hover {\n border-bottom-color: hsl(0, 0%, 21%);\n color: hsl(0, 0%, 21%);\n}\n\n.settings-tab-menu li a.active {\n border-bottom-color: #7600ED;\n color: #7600ED;\n}\n\n.dropdown-botton {\n border-radius: 4px;\n height: 22px;\n width: 80px;\n margin-left: 5px;\n margin-top: 5px\n}\n\n.supervior-info {\n color: $primary;\n margin-top: 19px;\n margin-right: 10px;\n min-width: 120px;\n}\n\n.filter-info {\n color: $primary;\n font-size: 12px;\n margin-right: 10px;\n}\n\n.invoice-info {\n margin-right: 10px;\n min-width: 120px;\n}\n\n.invoice-color-info {\n color: $success\n}\n\n.invoice-color-due {\n color: $warning\n}\n\n.invoice-color-overdue {\n font-weight: 900;\n color: $danger;\n}\n\n.affinity-info {\n min-width: 120px;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n#brand {\n margin-right: 20px;\n margin-top: 5px;\n padding: 0px;\n\n}\n\n.loggo {\n margin-left: -10px;\n margin-right: -10px;\n padding: 0px;\n width: 180px;\n height: 30px;\n}\n\n.navbar-wrapper {\n border-bottom: 1.5px solid $dark;\n margin-bottom: 2rem;\n\n .container {\n margin: 0;\n padding: 0 1.5rem;\n //margin-right: 160px;\n max-width: 100% !important;\n }\n\n .navbar {\n align-items: bottom;\n\n .comp-icon {\n margin-right: 2px;\n }\n\n .tag {\n margin-left: 0.5rem;\n }\n }\n}\n\n.mobile-navbar {\n display: none;\n}\n\n.navbar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0;\n border: none;\n background: none;\n margin-top: 0.75rem;\n\n .menu-item {\n color: $darker;\n padding: 0.5rem .75rem;\n\n &:hover {\n color: $primary;\n }\n }\n\n .menu-item.active {\n color: $primary;\n }\n\n .brand {\n flex-shrink: 0;\n }\n\n .right-menu,\n .navbar-brand {\n display: flex;\n align-items: center;\n flex-shrink: inherit;\n }\n\n .call-center {\n margin-left: 1rem;\n }\n}\n\n.menu-bar {\n display: flex;\n\n .menu-bar_item {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n padding: 0.25rem 0.5rem;\n\n &:hover {\n color: $primary;\n }\n }\n\n .user-menu {\n cursor: pointer;\n margin-left: 1rem;\n\n &:hover {\n color: $primary;\n\n .dropdown-menu-bar {\n display: block;\n }\n }\n\n .dropdown-menu-bar {\n //display: none;\n box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);\n position: absolute;\n background-color: $white;\n border: none;\n font-size: 14px;\n right: 0;\n top: 2.5rem;\n padding: 0.5rem;\n z-index: 99999;\n\n li {\n cursor: pointer;\n color: $dark;\n padding: 0.5rem;\n\n span {\n padding: 0 1rem 0 0.25rem;\n }\n\n &:hover {\n background-color: $light;\n color: $primary;\n }\n }\n }\n\n .language-menu {\n position: relative;\n\n &:hover {\n .language {\n display: block;\n }\n }\n\n .language {\n display: none;\n right: 0;\n top: 2rem;\n li.active {\n color: $white;\n background-color: $primary;\n }\n }\n }\n }\n}\n\n.menu-toggle {\n display: none;\n font-size: 1.5rem;\n cursor: pointer;\n color: $primary;\n}\n\n\n\n\n@media screen and (max-width: $mobileBreakPoint) {\n :deep(.navbar) {\n display: none;\n }\n\n .mobile-navbar {\n display: flex;\n }\n\n .navbar-wrapper {\n background-color: $white;\n position: sticky;\n top: 0;\n z-index: 10;\n }\n}\n\n@media screen and (max-width: $desktopBreakPoint) {\n .navbar-brand {\n .search-btn {\n margin-left: auto;\n }\n\n .navbar-item {\n padding-left: 0;\n }\n }\n\n :deep(.navbar-burger) {\n margin-left: 0;\n }\n}\n\n@media screen and (min-width: $desktopBreakPoint) {\n :deep(.navbar-brand) {\n //width: calc(100% - 8rem);\n }\n\n :deep(.navbar-end) {\n width: 300px;\n align-items: right;\n }\n\n :deep(.navbar-menu) {\n flex-grow: 0;\n }\n\n :deep(.navbar-dropdown) {\n border-top: 1px solid #dbdbdb;\n left: auto;\n right: 0;\n }\n\n .dropdown-subitem {\n color: $dark;\n font-size: 15px;\n }\n\n :deep(li) {\n list-style-type: none;\n }\n}\n\n@media screen and (max-width: $xLargeBreakPoint) {\n .user-settings-menu {\n flex-grow: 1;\n }\n\n .menu-toggle {\n display: block;\n width: 100%;\n text-align: right;\n }\n\n .menu-bar {\n box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);\n display: none;\n flex-direction: column;\n position: absolute;\n right: 0;\n top: 2rem;\n background: white;\n justify-content: center;\n align-items: baseline;\n width: 100%;\n max-width: 12rem;\n\n .call-center {\n margin-left: 0;\n }\n\n .user-menu {\n margin-left: 0;\n\n .dropdown-menu-bar {\n box-shadow: none;\n width: 100%;\n position: static;\n }\n }\n }\n\n}\n</style>\n","<template>\n\n<div>\n <Avatar :colorId=\"colorId\" :initials=\"initials\"></Avatar>\n <div class=\"flex\" style=\"margin-top:20px\">\n <div class=\"flex-column\">\n <label>{{$t('settings.color')}}</label>\n <PvDropdown v-model=\"colorName\"\n :scrollHeight=\"'100%'\"\n :options=\"colors\"\n panelClass=\"color-selector\">\n <template #value=\"slotProps\">\n <ColorIndicator v-bind:schemecolor=\"colorName\"></ColorIndicator>\n </template>\n <template #option=\"slotProps\">\n <ColorIndicator v-bind:schemecolor=\"slotProps.option\" class=\"color-options\"></ColorIndicator>\n </template>\n </PvDropdown>\n </div>\n <div class=\"flex-column\">\n <label>{{$t('settings.initials')}}</label>\n <InputText type=\"text\" v-model=\"initials\" class=\"ml-2\"></InputText>\n </div>\n </div>\n</div>\n</template>\n\n<script>\nimport * as dn_uiHelper from \"@/js/dn-uihelper.js\";\nimport RawData from \"@/components/Base/RawData.vue\";\nimport Avatar from \"@/components/Base/Avatar.vue\";\nimport ColorIndicator from \"@/components/Settings/ColorIndicator.vue\";\n\nimport { COLORS,getSelectableColors } from '@/js/dn-colors.js';\n\n\n\nexport default {\n// @ts-ignore\ncomponents: { RawData,Avatar,ColorIndicator },\nprops: {\nuser: { type: Object },\n},\ndata() {\nreturn {\n initials:\"NN\",\n colorName:null,\n colors:getSelectableColors(),\n};\n},\ncomputed: {\ncolorId(){return COLORS.idBySchemecolor(this.colorName)}\n\n},\nmethods: {\n getInitials() {\n return this.user.initials;\n },\n getColorId() {\n return this.user.colorId;\n }\n},\ncreated() {\n if (!this.user.initials||this.user.initials==undefined) {this.initials=dn_uiHelper.suggestUserInitials(this.user)}else{this.initials=this.user.initials}\n if (!this.user.colorId) {this.colorName=COLORS.byId(1)} else {this.colorName=COLORS.byId(this.user.colorId)}\n},\nmounted(){},\nwatch: {\n initials(init) {\n this.$emit(\"update:initials\", init); \n },\n colorName(color) {\n this.$emit(\"update:colorId\", COLORS.idBySchemecolor(color)); \n }\n}\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"@/assets/css/variables.module.scss\";\n:deep(.p-dropdown){\n border: none;\n box-shadow: none;\n}\n\n\n</style>","import { render } from \"./AvatarSelector.vue?vue&type=template&id=c54221ac&scoped=true\"\nimport script from \"./AvatarSelector.vue?vue&type=script&lang=js\"\nexport * from \"./AvatarSelector.vue?vue&type=script&lang=js\"\n\nimport \"./AvatarSelector.vue?vue&type=style&index=0&id=c54221ac&lang=scss&scoped=true\"\n\nimport exportComponent from \"C:\\\\DeepNumbers\\\\GitLab\\\\answerccs\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-c54221ac\"]])\n\nexport default __exports__","import { render } from \"./Header.vue?vue&type=template&id=65566ac0&scoped=true\"\nimport script from \"./Header.vue?vue&type=script&lang=js\"\nexport * from \"./Header.vue?vue&type=script&lang=js\"\n\nimport \"./Header.vue?vue&type=style&index=0&id=65566ac0&scoped=true&lang=scss\"\n\nimport exportComponent from \"C:\\\\DeepNumbers\\\\GitLab\\\\answerccs\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-65566ac0\"]])\n\nexport default __exports__","<template>\n <div class=\"footer-wrapper\">\n <MobileNavbarFooter />\n </div>\n</template>\n\n<script>\nimport MobileNavbarFooter from \"../Navigation/MobileNavbarFooter.vue\";\n\nexport default {\n name: \"Footer\",\n components: { MobileNavbarFooter },\n data() {\n return {};\n },\n computed: {},\n methods: {},\n created() { },\n};\n</script>\n\n<style lang=\"scss\">\n@import \"@/assets/css/variables.module.scss\";\n\n.footer-wrapper {\n display:flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n z-index: 10;\n\n footer {\n text-align: center;\n }\n}\n\n@media screen and (max-width: $mobileBreakPoint) {\n .footer-wrapper {\n position: fixed;\n bottom: 0;\n }\n}\n</style>\n","<template>\n <div v-if=\"(!isAgentLogin&&isMobile)||isAgentLogin\" :class=\"[{'is-dark': scheduleOptions.agentScheduleDarkView==true}, 'mobile-nav-footer']\" >\n <MobileNavbarItem\n v-if=\"!isAgentLogin\"\n :label=\"$t('navigation.portfolio')\"\n icon=\"portfolio_outline\"\n @click=\"goto('portfolio')\"\n :class=\"\n (isPage('portfolio') && 'is-active') || (isPage('node') && 'is-active')\n \"\n />\n <MobileNavbarItem\n v-if=\"isAgentLogin\"\n :label=\"$t('navigation.schedule')\"\n icon=\"clock\"\n :isDark=\"this.isDark\"\n @click=\"goto('agenthomescr')\"\n :class=\"isPage('agenthomescr') && 'is-active'\"\n />\n <!--v-if checks both canSeeTeam and isAgentLogin-->\n <MobileNavbarItem\n v-if=\"canSeeTeam && isAgentLogin\"\n :label=\"$t('navigation.team')\"\n icon=\"grid\"\n :isDark=\"this.isDark\"\n @click=\"canSeeTeam && goto('team-schedule')\"\n :class=\"isPage('team-schedule') && 'is-active'\"\n />\n\n <!--v-if checks both canTrade and isAgentLogin-->\n <MobileNavbarItem\n v-if=\"canTrade && isAgentLogin\"\n :label=\"$t('navigation.trade')\"\n icon=\"trade\"\n :isDark=\"this.isDark\"\n @click=\"canTrade && goto('trade')\"\n :class=\"isPage('trade') && 'is-active'\"\n \n />\n <MobileNavbarItem\n v-if=\"canSeeStats && isAgentLogin\"\n :label=\"$t('navigation.agent-stats')\"\n icon=\"stats\"\n :isDark=\"this.isDark\"\n @click=\"goto('agent-stats')\"\n :class=\"isPage('agent-stats') && 'is-active'\"\n />\n <MobileNavbarItem\n v-if=\"showForecast\"\n :label=\"$t('navigation.forecast')\"\n icon=\"compare_outline\"\n @click=\"goto('forecast')\"\n :class=\"isPage('forecast') && 'is-active'\"\n />\n <MobileNavbarItem\n v-if=\"showSchedule\"\n :label=\"$t('navigation.schedule')\"\n icon=\"compare_outline\"\n @click=\"goto('schedule')\"\n :class=\"isPage('schedule') && 'is-active'\"\n />\n <MobileNavbarItem\n v-if=\"showReport\"\n :label=\"$t('navigation.report')\"\n icon=\"compare_outline\"\n @click=\"goto('report')\"\n :class=\"isPage('report') && 'is-active'\"\n />\n <MobileNavbarItem\n v-if=\"showSettings\"\n :label=\"$t('navigation.settings')\"\n icon=\"compare_outline\"\n @click=\"goto('settings')\"\n :class=\"isPage('settings') && 'is-active'\"\n />\n <MobileNavbarItem\n v-if=\"isAgentLogin\"\n :label=\"$t('navigation.user')\"\n icon=\"user\"\n :isDark=\"this.isDark\"\n @click=\"goto('user')\"\n :class=\"isPage('user') && 'is-active'\"\n />\n\n \n </div>\n</template>\n\n<script>\nimport MobileNavbarItem from \"./MobileNavbarItem.vue\";\nimport * as dn_uiHelper from \"@/js/dn-uihelper.js\";\nimport { useDataStore } from \"@/stores/dataStore.js\";\nimport { useScheduleStore } from \"@/stores/scheduleStore.js\";\n\nexport default {\n // @ts-ignore\n name: \"MobileNavbarFooter\",\n components: { MobileNavbarItem},\n data() {\n return {\n isMobile:false,\n };\n },\n computed: {\n scheduleOptions() { return useScheduleStore().scheduleOptions; },\n isDark() { return useScheduleStore().scheduleOptions.agentScheduleDarkView; },\n currentCC() { return useDataStore().currentCC; },\n currentUser() { return useDataStore().currentUser; },\n canTrade() { return !useDataStore().generalEmpAppSettings.tradeDisabled;},\n //!useDataStore().generalEmpAppSettings.hideTeamSchedule\n canSeeTeam: function() {\n return !useDataStore().generalEmpAppSettings.hideTeamSchedule;\n },\n canSeeStats: function() {\n const gs=useDataStore().generalEmpAppSettings\n return gs.statsAdherence||gs.statsPayrollCodes||gs.statsDetailedAdherence;\n },\n\n isAgentLogin: function() {\n return this.currentUser != null && this.currentUser.isAgent;\n },\n isCurrentCCSelected: function () {\n return this.currentCC != null;\n },\n showForecast() {\n return this.currentUser !== null && this.currentUser.hasAccessForecasting;\n },\n showReport() {\n return this.currentUser !== null && this.currentUser.hasAccessReports && this.isCurrentCCSelected;\n },\n showSchedule() {\n return this.currentUser !== null && this.currentUser.hasAccessScheduling && this.isCurrentCCSelected;\n },\n showSettings() {\n return this.currentUser !== null && this.currentUser.hasAccessSettings;\n }\n },\n methods: {\n goto(name) {\n console.log(name);\n this.$router.push({ name });\n },\n isPage: function (page) {\n return this.$route.name == page;\n },\n },\n created() { this.isMobile = dn_uiHelper.isMobile();},\n mounted() { },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import \"@/assets/css/variables.module.scss\";\n\n.mobile-nav-footer {\n max-width: $agentDesktop-max-width;\n position: fixed; \n width: 100%;\n display: flex;\n height: 85px;\n border-top: 1px solid $dark;\n align-items: center;\n justify-content: space-around;\n background: white;\n z-index: 2;\n bottom: 0;\n &.is-dark {\n background: black;\n border-top: 1px solid $dark;\n }\n\n .nav-item {\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-flow: column;\n position: relative;\n width: 100%;\n\n &.is-active {\n &:after {\n content: \"\";\n border-bottom: 4px solid;\n color: $primary;\n width: 100%;\n height: 3px;\n display: block;\n margin-top: 7px;\n position: absolute;\n bottom: 0px;\n }\n }\n }\n}\n// @media screen and (min-width: $mobileBreakPoint) {\n// .mobile-nav-footer {\n// display: none;\n// }\n// }\n</style>\n","<template>\n <div :class=\"[{ 'is-dark': isDark==true }, 'nav-item']\">\n <Icon :name=\"icon\" />\n <div class=\"nav-label\">\n {{ label }}\n </div>\n </div>\n</template>\n\n<script>\nimport Icon from \"@/components/Base/Icon.vue\";\n\nexport default {\n name: \"MobileNavbarItem\",\n components: { Icon},\n props: {\n label: String,\n icon: String,\n isDark: Boolean,\n },\n data() {\n return {};\n },\n computed: {\n },\n methods: {},\n created() {},\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import \"@/assets/css/variables.module.scss\";\n\n.nav-item {\n text-align: center;\n flex-grow: 0;\n min-width: 60px;\n background-color: transparent;\n color:$dark;\n cursor: pointer;\n &.is-dark{\n color:$grey;\n }\n &.is-active{\n color:$black; \n &.is-dark{\n color:$white;\n }\n }\n \n .nav-label {\n font-size: $fontSmall;\n }\n \n}\n@media screen and (max-width: 767px) {\n}\n</style>\n","import { render } from \"./MobileNavbarItem.vue?vue&type=template&id=9a6e136a&scoped=true\"\nimport script from \"./MobileNavbarItem.vue?vue&type=script&lang=js\"\nexport * from \"./MobileNavbarItem.vue?vue&type=script&lang=js\"\n\nimport \"./MobileNavbarItem.vue?vue&type=style&index=0&id=9a6e136a&scoped=true&lang=scss\"\n\nimport exportComponent from \"C:\\\\DeepNumbers\\\\GitLab\\\\answerccs\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-9a6e136a\"]])\n\nexport default __exports__","import { render } from \"./MobileNavbarFooter.vue?vue&type=template&id=096ecdea&scoped=true\"\nimport script from \"./MobileNavbarFooter.vue?vue&type=script&lang=js\"\nexport * from \"./MobileNavbarFooter.vue?vue&type=script&lang=js\"\n\nimport \"./MobileNavbarFooter.vue?vue&type=style&index=0&id=096ecdea&scoped=true&lang=scss\"\n\nimport exportComponent from \"C:\\\\DeepNumbers\\\\GitLab\\\\answerccs\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-096ecdea\"]])\n\nexport default __exports__","import { render } from \"./Footer.vue?vue&type=template&id=1b53ffea\"\nimport script from \"./Footer.vue?vue&type=script&lang=js\"\nexport * from \"./Footer.vue?vue&type=script&lang=js\"\n\nimport \"./Footer.vue?vue&type=style&index=0&id=1b53ffea&lang=scss\"\n\nimport exportComponent from \"C:\\\\DeepNumbers\\\\GitLab\\\\answerccs\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\n <div v-if=\"userGuide.display\" class=\"tile is-vertical guideLineTile\" id=\"main-tile\">\n <article class=\"tile is-child guide-area\">\n <div class=\"content\">\n <section>\n <span class=\"header\">User guide</span>\n <IconField iconPosition=\"left\" class=\"search-bar\">\n <InputIcon class=\"pi pi-search\"></InputIcon>\n <InputText v-model=\"searchText\" placeholder=\"Search\" style=\"width:100%\" />\n <InputIcon class=\"pi pi-times clear-search\" @click=\"searchText=''\"></InputIcon>\n </IconField>\n <PvButton class=\"button\" icon=\"pi pi-times\" severity=\"danger\" @click=\"userGuide.display=false\"/>\n </section>\n\n <section>\n <ScrollPanel style=\"height:calc(100vh - 12.5rem) \">\n <!--NO SEARCH TEXT-->\n <div v-if=\"searchText == ''\">\n <Accordion\n v-model:activeIndex=\"activeIndex\"\n expandIcon=\"null\"\n collapseIcon=\"null\"\n @tab-click=\"setTab\"\n\n >\n <AccordionTab\n v-for=\"(item, index) of filteredGuideItems\"\n :pt=\"{\n root:{\n style: {\n marginBottom: '1px',\n fontFamily: 'proxima-nova, sans-serif'\n }\n },\n header: ({ props, parent }) => ({\n class: hideAccordionTab(props, parent, index)\n }),\n toggleableContent: ({ props, parent }) => ({\n class: hideAccordionTab(props, parent, index)\n })\n }\">\n <template #header>\n <div class=\"header-item\">\n <span class=\"card-header-title\">{{ item.title }}</span>\n <div class=\"header-right\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24\" viewBox=\"0 -960 960 960\" width=\"24\">\n <path v-if=\"activeIndex===index\" d=\"m212-372 268-267 268 267H212Z\"/>\n <path v-else d=\"M480-322 212-589h536L480-322Z\"/>\n </svg>\n <!-- <i class=\"pi\" :class=\"activeIndex===index ? 'pi-caret-down' : 'pi-caret-up'\"/>-->\n \n </div>\n </div>\n </template>\n \n <Accordion\n v-model:activeSubIndex=\"activeSubIndex\"\n expandIcon=\"null\"\n collapseIcon=\"null\"\n @tab-click=\"setTab\"\n\n >\n <AccordionTab\n v-for=\"(subitem, subindex) of item.subchapters\"\n :pt=\"{\n root:{\n style: {\n marginBottom: '1px',\n fontFamily: 'proxima-nova, sans-serif'\n }\n },\n header: ({ props, parent }) => ({\n class: hideAccordionTab(props, parent, subindex)\n }),\n toggleableContent: ({ props, parent }) => ({\n class: hideAccordionTab(props, parent, subindex),\n\n })\n }\">\n <template #header>\n <div class=\"subheader-item\">\n <span class=\"card-subheader-title\">{{ subitem.title }}</span>\n <div class=\"header-right\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24\" viewBox=\"0 -960 960 960\" width=\"24\">\n\n </svg>\n <i class=\"pi pi-external-link\" @click=\"openDialog(subindex, subitem)\"/>\n </div>\n </div>\n </template>\n <template #default>\n <div class=\"card-content\">\n <div class=\"content\">\n <div class=\"intro-text\">\n <span>{{ subitem.intro }}</span>\n </div>\n <div v-for=\"(step, subindex) of subitem.steps\" v-bind:key=\"subindex\">\n <span class=\"step-number\">{{ subindex + 1 }}:</span> <span>{{\n step.text\n }}</span>\n <span v-if=\"step.ref.length\" class=\"step-ref\" v-tooltip.left=\"{ value: step.ref}\">i</span>\n <span v-if=\"step.refMenu\" class=\"menu-ref\">{{ step.refMenu }}</span>\n <span v-if=\"step.link\">\n <InlineSvg :src=\"videoSrc\" :width=\"32\" :height=\"32\" class=\"inline-svg\"\n @click=\"followLink(step.link)\"></InlineSvg>\n </span>\n </div>\n </div>\n </div>\n </template>\n </AccordionTab>\n </Accordion>\n </AccordionTab>\n </Accordion>\n </div>\n <!--SEARCHING-->\n <div v-else>\n <Accordion \n v-model:activeSubIndex=\"activeSubIndex\"\n expandIcon=\"null\"\n collapseIcon=\"null\"\n @tab-click=\"setTab\"\n >\n <AccordionTab\n v-for=\"(subitem, subindex) of filteredGuideItems\"\n :pt=\"{\n root:{\n style: {\n marginBottom: '1px',\n fontFamily: 'proxima-nova, sans-serif'\n }\n },\n header: ({ props, parent }) => ({\n class: hideAccordionTab(props, parent, subindex)\n }),\n toggleableContent: ({ props, parent }) => ({\n class: hideAccordionTab(props, parent, subindex)\n })\n }\">\n <template #header>\n <div class=\"subheader-item\">\n <span class=\"card-subheader-title\">{{ subitem.title }}</span>\n <div class=\"header-right\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24\" viewBox=\"0 -960 960 960\" width=\"24\">\n <path v-if=\"activeSubIndex===subindex\" d=\"m212-372 268-267 268 267H212Z\"/>\n <path v-else d=\"M480-322 212-589h536L480-322Z\"/>\n </svg>\n <i class=\"pi pi-external-link\" @click=\"openDialog(subindex, subitem)\"/>\n </div>\n </div>\n </template>\n <template #default>\n <div class=\"card-content\">\n <div class=\"content\">\n <div>\n <span class=\"intro-text\">{{ subitem.intro }}</span>\n </div>\n <div v-for=\"(step, subindex) of subitem.steps\" v-bind:key=\"subindex\">\n <span class=\"step-number\">{{ subindex + 1 }}:</span> <span>{{\n step.text\n }}</span>\n <span v-if=\"step.ref.length\" class=\"step-ref\" v-tooltip.left=\"{ value: step.ref}\">i</span>\n <span v-if=\"step.refMenu\" class=\"menu-ref\">{{ step.refMenu }}</span>\n <span v-if=\"step.link\">\n <InlineSvg :src=\"videoSrc\" :width=\"32\" :height=\"32\" class=\"inline-svg\"\n @click=\"followLink(step.link)\"></InlineSvg>\n </span>\n </div>\n </div>\n </div>\n </template>\n </AccordionTab>\n </Accordion>\n </div>\n </ScrollPanel>\n </section>\n </div>\n </article>\n </div>\n <PvDialog v-model:visible=\"dialogVisible\"\n :header=\"popupData.title\"\n :style=\"{ width: '25%'}\"\n :pt=\"{\n header: {\n style: {\n cursor: 'pointer'\n }\n }\n }\">\n \n <div class=\"card-content\">\n \n <div class=\"content\">\n <div>\n <span class=\"intro-text\">{{ popupData.intro }}</span>\n </div>\n <div v-for=\"(step, index) of popupData.steps\" v-bind:key=\"index\">\n <span class=\"step-number\">{{ index + 1 }}:</span> <span>{{ step.text }}</span>\n <span v-if=\"step.ref.length\" class=\"step-ref\" v-tooltip.left=\"{ value: step.ref,\n pt: {\n arrow: {\n style: {\n borderLeftColor: 'var(--primary-color)'\n }\n },\n text: {\n style: {\n backgroundColor: 'var(--primary-color)!important',\n color: 'var(--primary-color-text)!important',\n fontSize: '0.85rem',\n \n borderRadius: '6px',\n fontWeight: '400',\n // whiteSpace: 'nowrap'\n }\n }\n }\n }\">i</span>\n <span v-if=\"step.refMenu\" class=\"menu-ref\">{{ step.refMenu }}</span>\n <span v-if=\"step.link\">\n <InlineSvg :src=\"videoSrc\" :width=\"32\" :height=\"32\" class=\"inline-svg\"\n @click=\"followLink(step.link)\"></InlineSvg>\n </span>\n </div>\n </div>\n </div>\n </PvDialog>\n</template>\n<script>\nimport {useDataStore} from \"@/stores/dataStore.js\";\nimport dnUserguides from \"@/jso/dn-new-user-guide.json\";\n//import dnUserguides from \"@/jso/dn-user-guides.json\";\nimport InlineSvg from \"vue-inline-svg\";\n\nexport default {\n // @ts-ignore\n data() {\n return {\n searchText: '',\n videoSrc: require(\"@/assets/images/icons/youtube.svg\"),\n activeIndex: null,\n activeSubIndex: null,\n activePopupTab: null,\n dialogVisible: false,\n currentTab: null,\n currentSubTab: null,\n popupData: {},\n }\n },\n components: {InlineSvg},\n computed: {\n filteredGuideItems() {\n if (this.searchText == '') {\n return dnUserguides\n }\n let foundSubchaps = []\n //console.log(\"length: \" + dnUserguides.length)\n \n dnUserguides.forEach(chapter => {\n let foundSubChapter = chapter.subchapters.filter(this.guideFilter)\n foundSubChapter.forEach(subchap => {\n foundSubchaps.push(subchap)\n });\n\n });\n return foundSubchaps\n //return dnUserguides.filter(this.guideFilter)\n },\n userGuide() {\n return useDataStore().userGuide;\n },\n },\n methods: {\n //fÃ¥r in subchapters istället som item\n guideFilter(item) {\n let searchOK = this.searchText.length <= 2\n\n if (!searchOK) {\n if (item.title.toLowerCase().includes(this.searchText.toLowerCase()) || \n item.intro.toLowerCase().includes(this.searchText.toLowerCase())) {\n searchOK = true\n }\n item.steps.forEach(step => {\n if (step.text.toLowerCase().includes(this.searchText.toLowerCase())) {\n searchOK = true\n }\n });\n\n }\n return searchOK\n },\n followLink(link) {\n window.open(link, '_blank');\n },\n openDialog(index, popupData) {\n this.activePopupTab = index;\n this.dialogVisible = true;\n this.popupData = popupData;\n },\n setTab(data) {\n this.currentTab = data.index;\n },\n setSubTab(data) {\n this.currentSubTab = data.subindex;\n },\n hideAccordionTab(props, parent, index) {\n if (this.dialogVisible && this.activePopupTab === index) {\n if (this.currentTab === this.activePopupTab) {\n this.activeIndex = null;\n parent.state.d_activeIndex = null;\n }\n\n }\n\n }\n\n }\n}\n</script>\n<style lang=\"scss\" scoped>\n@import \"@/assets/css/variables.module.scss\";\n\n\n.tooltip-guide {\n width: auto;\n border-radius: 6px;\n font-size: 0.85rem;\n font-weight: 300;\n -webkit-box-shadow: 0px 1px 2px 1px rgba(0, 1, 0, 0.2);\n box-shadow: 0px 1px 2px 1px rgba(0, 1, 0, 0.2);\n z-index: 38;\n white-space: nowrap;\n position: absolute;\n}\n\n\n.guideLineTile{\n margin-left: 2px;\n margin-right: 12px;\n border-top-left-radius: 8px;\n border-top: 2px solid $light;\n border-left: 5px solid $light;\n max-height: calc(100vh - 5.5rem);\n}\n\n.guide-area {\n border-radius: 5px;\n background-color: $white !important;\n position: relative;\n height: 100%;\n padding: 4px;\n}\n\n:deep(.p-accordion .p-accordion-header .p-accordion-header-link) {\n background-color: $white;\n display: flex;\n padding: 0;\n border-radius: 0;\n border-width: 0px;\n border-bottom-width:1px;\n border-bottom-color: $primaryXlight;\n text-decoration: none;\n transition: background-color 0.375s;\n}\n:deep(.p-accordion:hover .p-accordion-header:hover .p-accordion-header-link:hover) {\n background-color: $primaryXlight-light;\n transition: background-color 0.375s;\n}\n:deep(.p-accordion .hide-tab) {\n display: none;\n}\n\n.card-header-title {\n padding: 12px 0px 4px 0px;\n font-size: 1.375rem;\n font-weight: 400;\n}\n\n.card-subheader-title {\n padding: 8px 0px 4px 6px;\n color: $dark;\n font-size: 1.125rem;\n font-weight: 400;\n}\n\n.card-content {\n border-left: 2px solid $primaryXlight;\n border-bottom: 2px solid $primaryXlight;\n border-top-left-radius: 0px !important; \n padding: 6px 6px 10px 6px;\n}\n\n.button {\n background-color: #fff;\n color: #e73542;\n border-radius: 2px;\n position: absolute;\n margin: 4px;\n right: 2px;\n top: 4px;\n height: 2rem;\n width: 2rem;\n cursor: pointer;\n\n}\n\n.button:hover {\n background-color: #f2f2f2;\n}\n\n.button > :deep(.pi) {\n font-size: 0.75em;\n}\n\n.clear-search {\n display: block;\n position: absolute;\n right: 10px;\n top: calc(50% - 10px);\n padding: 10px;\n background: $white;\n color: rgba(54, 54, 54, 0.3);\n border-radius: 50%;\n cursor: pointer;\n transition: background-color 0.75s;\n}\n.clear-search:hover {\n background: rgba(54, 54, 54, 0.3);\n color: #fff;\n}\n.content-search {\n font-size: 1rem;\n height: 2rem;\n width: 100%;\n}\n.search-bar {\n margin-bottom: 0.5rem;\n border-radius: 15px;\n width: 100%;\n display: flex;\n}\n.p-inputtext {\n border: 2px solid $light;\n border-radius: 10px;\n transition: border 0.75s;\n}\n.p-inputtext:hover {\n border: 2px solid $primary;\n}\n.p-inputtext:focus {\n border: 2px solid $primary;\n}\n.p-inputtext:active {\n border: 2px solid $primary;\n}\n.content-search:focus {\n outline: none;\n border-color: rgba(0, 0, 0, 0.5);\n -webkit-box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.1);\n box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.1);\n}\n.content-search:hover {\n border-color: hsl(0, 0%, 71%);\n}\n.content-search::placeholder, .pi-search {\n color: rgba(54, 54, 54, 0.3);\n}\n\n.header-item, .subheader-item{\n display: flex;\n justify-content: space-between;\n width: 100%;\n align-items: center;\n \n}\n\n.header-right {\n display: flex;\n align-items: center;\n padding-right: 12px;\n}\n.header-right .pi-external-link{\n margin-left: 12px;\n}\n.header-right .pi-external-link:hover {\n color: rgba(54, 54, 54, 0.5);\n}\n.content-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n.header {\n display: inline-block;\n color: $mid-grey;\n padding: 8px 16px;\n font-size: 1.75rem;\n}\n\n.closebutton {\n background-color: #fff;\n color: red;\n height: 30px;\n text-align: center;\n line-height: 50%;\n}\n\n.step-ref {\n color: $light;\n \n font-style: italic;\n font-weight: 400;\n font-size: 12px;\n margin: 0px 3px !important;\n}\n\n.menu-ref {\n background-color: $primary;\n color: white;\n font-size: 0.75rem;\n font-style: italic;\n border-radius: 4px;\n padding: 1px;\n margin-top: -40px;\n}\n\n.step-number {\n font-weight: 600;\n padding-left: 4px;\n}\n.intro-text {\n padding-bottom:8px;\n}\n\n.inline-svg {\n cursor: pointer;\n margin-left: 8px;\n margin-top: -4px;\n margin-bottom: -8px;\n}\n\n.floating-guide {\n position: fixed;\n width: calc(calc(100% / 6) - 8px);\n z-index: 1111;\n border: solid #555 1px;\n border-radius: 5px;\n padding: 0 10px;\n background-color: #fff\n}\n\n.p-dialog-content > .card-content{\n border-left: none;\n}\n\n\n\n</style>","import { render } from \"./Guide.vue?vue&type=template&id=78348fee&scoped=true\"\nimport script from \"./Guide.vue?vue&type=script&lang=js\"\nexport * from \"./Guide.vue?vue&type=script&lang=js\"\n\nimport \"./Guide.vue?vue&type=style&index=0&id=78348fee&lang=scss&scoped=true\"\n\nimport exportComponent from \"C:\\\\DeepNumbers\\\\GitLab\\\\answerccs\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-78348fee\"]])\n\nexport default __exports__","import { render } from \"./App.vue?vue&type=template&id=7037eea7\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\n\nimport \"./App.vue?vue&type=style&index=0&id=7037eea7&lang=scss\"\n\nimport exportComponent from \"C:\\\\DeepNumbers\\\\GitLab\\\\answerccs\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { forecastData } from '@/stores/dn-forecast-data.js';\nimport { forecastAiData } from '@/stores/dn-forecast-ai-data.js';\nimport { simulationData } from \"@/stores/dn-simulation-data.js\";\nimport { specialDayData } from '@/stores/dn-special-day-data.js';\nimport { useDataStore } from \"@/stores/dataStore.js\";\nimport { useFileImportStore } from \"@/stores/fileImportStore.js\";\nimport { useForecastStore } from '@/stores/forecastStore.js';\nimport { usePortfolioStore } from \"@/stores/portfolioStore.js\";\nimport { useReportStore } from \"@/stores/reportStore.js\";\nimport { useScheduleStore } from '@/stores/scheduleStore.js';\n\nexport function resetStores() {\n forecastData.reset();\n specialDayData.reset();\n forecastAiData.reset();\n simulationData.reset();\n useDataStore().$reset();\n useFileImportStore().$reset();\n useForecastStore().$reset();\n usePortfolioStore().$reset();\n useReportStore().$reset();\n useScheduleStore().$reset();\n}","import { createRouter, createWebHistory, createWebHashHistory } from \"vue-router\";\nimport { getLoginInfo } from '@/js/dn-localStorage.js';\nimport { externalLogin, updateAccessToken } from \"./js/dn-fetch\";\nimport { useDataStore } from \"@/stores/dataStore.js\";\nimport { useForecastStore } from \"@/stores/forecastStore.js\";\nimport { useScheduleStore } from \"@/stores/scheduleStore.js\";\nimport { resetStores } from \"@/stores/dn-store\";\n\nconst routes = [\n {\n path: \"/\",\n name: \"portfolio\",\n component: () => import(\"./views/Portfolio.vue\"),\n },\n {\n path: \"/admin\",\n name: \"admin\",\n component: () => import(\"./views/AdminView.vue\"),\n },\n {\n path: \"/login\",\n name: \"login\",\n component: () => import(\"./views/Login.vue\"),\n },\n {\n path: \"/forecast\",\n name: \"forecast\",\n component: () => import(\"./views/Forecast.vue\"),\n },\n {\n path: \"/schedule\",\n name: \"schedule\",\n component: () => import(\"./views/Schedule.vue\"),\n },\n {\n path: \"/report\",\n name: \"report\",\n component: () => import(\"./views/Report.vue\"),\n },\n {\n path: \"/settings\",\n name: \"settings\",\n component: () => import(\"./views/Settings.vue\"),\n },\n {\n path: \"/agenthomescr\",\n name: \"agenthomescr\",\n component: () => import(\"./views/AgentHomeScr.vue\"),\n },\n {\n path: \"/trade\",\n name: \"trade\",\n component: () => import(\"./views/AgentTrade.vue\"),\n },\n {\n path: \"/super-admin\",\n name: \"super-admin\",\n component: () => import(\"./views/SuperAdminView.vue\"),\n },\n {\n path: \"/employees\",\n name: \"employees\",\n component: () => import(\"./views/Employees.vue\"),\n },\n {\n path: \"/invoice\",\n name: \"invoice\",\n component: () => import(\"./views/Invoice.vue\"),\n },\n {\n path: \"/team-schedule\",\n name: \"team-schedule\",\n component: () => import(\"./views/AgentTeamSchedule.vue\"),\n },\n {\n path: \"/agent-stats\",\n name: \"agent-stats\",\n component: () => import(\"./views/AgentStats.vue\"),\n },\n {\n path: \"/user\",\n name: \"user\",\n component: () => import(\"./views/User.vue\"),\n }\n];\n\nexport function createAppRouter() {\n const router = createRouter({\n history: createWebHashHistory(),\n routes,\n });\n\n router.beforeEach((to, from, next) => {\n const externalPath = '/external/';\n if (to.path.startsWith(externalPath)) {\n const afterExternalLogin = (isAgent) => {\n if (isAgent === true) {\n next({ name: \"agenthomescr\" });\n } else if (isAgent === false) {\n next({ name: \"\" });\n }\n else {\n next({ name: \"login\" })\n }\n };\n const key = to.path.slice(externalPath.length);\n externalLogin(key, afterExternalLogin);\n return;\n }\n const loginInfo = getLoginInfo();\n if (loginInfo === null && to.name !== \"login\") {\n next({ name: \"login\" });\n }\n else if (from.name === \"login\") {\n init();\n next();\n }\n else if (to.name === \"login\") {\n if (loginInfo === null) {\n resetStores();\n next();\n } else if (loginInfo.isAgent) {\n next({ name: \"agenthomescr\" });\n } else if (loginInfo.isSuperAdmin) {\n next({ name: \"super-admin\" });\n } else {\n next({ name: \"portfolio\" });\n }\n }\n else if (to.name === \"portfolio\" && loginInfo.isAgent) {\n next({ name: \"agenthomescr\" });\n }\n else if (to.name === \"portfolio\" && loginInfo.isSuperAdmin) {\n next({ name: \"super-admin\" });\n }\n else {\n const dataStore = useDataStore();\n if (!dataStore.currentUser) { initUser() };\n next();\n }\n }\n );\n\n router.afterEach((to, from) => {\n if (from.name === null) {\n if (hasRefreshed()) {\n const dataStore = useDataStore();\n dataStore.refreshedDueToError = true;\n }\n \n } \n else {\n if (from.name === 'settings'){\n const dataStore = useDataStore();\n dataStore.loadRelevantInvoiceStatus()}\n }\n if (hasRefreshed()) {\n window.sessionStorage.setItem('refreshed-due-to-error', 'false');\n const dataStore = useDataStore();\n dataStore.refreshedDueToError = false; \n }\n\n\n \n if(hasNotCheckedInvoiceStatus()){\n useDataStore().loadRelevantInvoiceStatus\n }\n })\n\n router.onError(err => {\n if (err.name === 'ChunkLoadError') {\n if (!hasRefreshed()) {\n window.sessionStorage.setItem('refreshed-due-to-error', 'true');\n window.location.reload();\n }\n }\n })\n\n return router;\n}\n\nfunction hasRefreshed() {\n return window.sessionStorage.getItem('refreshed-due-to-error') === 'true';\n}\n\nfunction hasNotCheckedInvoiceStatus() {\n return ((new Date().getTime()-useDataStore().lastRelevantInvoiceStatuscheck.getTime())>1000*60*60*24)\n}\n\nasync function initUser() {\n const loginInfo = getLoginInfo();\n if (loginInfo.needRefresh())\n await updateAccessToken(loginInfo);\n\n const dataStore = useDataStore();\n await dataStore.loadCurrentUser();\n if (!loginInfo.isSuperAdmin)\n init()\n}\n\nasync function init() {\n const loginInfo = getLoginInfo();\n if (loginInfo.isSuperAdmin)\n return;\n const dataStore = useDataStore();\n await dataStore.init();\n dataStore.loadDateNow();\n const scheduleStore = useScheduleStore();\n const forecastStore = useForecastStore();\n forecastStore.forecastOptions.forecastIsLoaded = false;\n scheduleStore.loadLocalAgentScheduleOptions();\n scheduleStore.loadSimulationSettings();\n dataStore.loadGeneralSettings();\n dataStore.loadAffinities();\n dataStore.loadCallCenters().then(() => {\n scheduleStore.loadCurrentCCData();\n });\n dataStore.loadHolidays();\n \n dataStore.loadRelevantInvoiceStatus();\n dataStore.loadAgreements();\n if (!loginInfo.isAgent) {\n \n forecastStore.initForecast();\n dataStore.loadTagUsage();\n }\n}","import { createApp } from 'vue/dist/vue.esm-bundler.js';\r\nimport App from \"./App.vue\";\r\nimport { createAppRouter } from '@/router.js';\r\nimport { createPinia } from 'pinia';\r\nimport { i18n } from '@/i18n.js';\r\n\r\n//Primevue\r\nimport PrimeVue from 'primevue/config';\r\nimport Accordion from 'primevue/accordion';\r\nimport AccordionTab from 'primevue/accordiontab';\r\nimport AutoComplete from 'primevue/autocomplete';\r\nimport Button from 'primevue/button';\r\nimport Calendar from 'primevue/calendar';\r\nimport Card from 'primevue/card';\r\nimport Checkbox from 'primevue/checkbox';\r\nimport Column from 'primevue/column';\r\nimport ConfirmationService from 'primevue/confirmationservice';\r\nimport ConfirmDialog from 'primevue/confirmdialog';\r\nimport DataTable from 'primevue/datatable';\r\nimport Dialog from 'primevue/dialog';\r\nimport Dropdown from 'primevue/dropdown';\r\nimport FileUpload from 'primevue/fileupload';\r\nimport FloatLabel from 'primevue/floatlabel';\r\nimport IconField from 'primevue/iconfield';\r\nimport InlineMessage from 'primevue/inlinemessage';\r\nimport InputGroup from 'primevue/inputgroup';\r\nimport InputGroupAddon from 'primevue/inputgroupaddon';\r\nimport InputIcon from 'primevue/inputicon';\r\nimport InputNumber from 'primevue/inputnumber';\r\nimport InputSwitch from 'primevue/inputswitch';\r\nimport InputText from 'primevue/inputtext';\r\nimport Listbox from 'primevue/listbox';\r\nimport Message from 'primevue/message';\r\nimport MultiSelect from 'primevue/multiselect';\r\nimport Panel from 'primevue/panel';\r\nimport Password from 'primevue/password';\r\nimport ProgressBar from 'primevue/progressbar';\r\nimport RadioButton from 'primevue/radiobutton';\r\nimport ScrollPanel from 'primevue/scrollpanel';\r\nimport ContextMenu from 'primevue/contextmenu';\r\nimport Splitter from 'primevue/splitter';\r\nimport SplitterPanel from 'primevue/splitterpanel';\r\nimport PanelMenu from 'primevue/panelmenu';\r\n\r\n\r\nimport SelectButton from 'primevue/selectbutton';\r\nimport Slider from 'primevue/slider';\r\nimport SplitButton from 'primevue/splitbutton';\r\nimport TabPanel from 'primevue/tabpanel';\r\nimport TabView from 'primevue/tabview';\r\nimport Tag from 'primevue/tag';\r\nimport Textarea from 'primevue/textarea';\r\nimport Toast from 'primevue/toast';\r\nimport ToastService from 'primevue/toastservice';\r\nimport Tooltip from 'primevue/tooltip';\r\nimport TreeTable from 'primevue/treetable';\r\nimport OverlayPanel from 'primevue/overlaypanel';\r\nimport Rating from 'primevue/rating';\r\nimport TieredMenu from 'primevue/tieredmenu';\r\nimport Menubar from 'primevue/menubar';\r\nimport Sidebar from 'primevue/sidebar';\r\n\r\nimport '@/assets/themes/lara-light-purple/theme.css'\r\nimport 'primeicons/primeicons.css'\r\n\r\nconst app = createApp(App);\r\n\r\nconst pinia = createPinia();\r\napp.use(pinia);\r\napp.use(i18n);\r\napp.use(PrimeVue, {});\r\napp.use(ToastService)\r\n\r\n//PrimeVue components\r\napp.component('Accordion', Accordion);\r\napp.component('AccordionTab', AccordionTab);\r\napp.component('AutoComplete', AutoComplete);\r\napp.component('Calendar', Calendar);\r\napp.component('Card', Card);\r\napp.component('Checkbox', Checkbox);\r\napp.component('Column', Column);\r\napp.component('ConfirmDialog', ConfirmDialog);\r\napp.component('ContextMenu', ContextMenu);\r\napp.component('DataTable', DataTable);\r\napp.component('FileUpload', FileUpload);\r\napp.component('IconField', IconField);\r\napp.component('InlineMessage', InlineMessage);\r\napp.component('InputGroup', InputGroup);\r\napp.component('InputGroupAddon', InputGroupAddon);\r\napp.component('InputIcon', InputIcon);\r\napp.component('InputNumber', InputNumber);\r\napp.component('InputSwitch', InputSwitch);\r\napp.component('InputText', InputText)\r\napp.component('Listbox', Listbox)\r\n\r\napp.component('MultiSelect', MultiSelect);\r\napp.component('Panel', Panel);\r\napp.component('Password', Password);\r\napp.component('ProgressBar', ProgressBar);\r\napp.component('PvButton', Button);\r\napp.component('PvDialog', Dialog);\r\napp.component('PvDropdown', Dropdown);\r\napp.component('PvFloatLabel', FloatLabel);\r\napp.component('PvMessage', Message);\r\napp.component('PvSelectButton', SelectButton);\r\napp.component('RadioButton', RadioButton);\r\napp.component('ScrollPanel', ScrollPanel);\r\napp.component('SelectButton', SelectButton);\r\napp.component('Slider', Slider);\r\napp.component('SplitButton', SplitButton);\r\napp.component('Splitter', Splitter);\r\napp.component('SplitterPanel', SplitterPanel);\r\napp.component('PanelMenu', PanelMenu);\r\n\r\napp.component('TabPanel', TabPanel);\r\napp.component('TabView', TabView);\r\napp.component('Tag', Tag);\r\napp.component('Textarea', Textarea);\r\napp.component('Toast', Toast);\r\napp.component('TreeTable', TreeTable);\r\napp.component('PvOverlayPanel', OverlayPanel);\r\napp.component('PvRating', Rating);\r\napp.component('PvTieredMenu', TieredMenu);\r\napp.component('PvMenubar', Menubar);\r\napp.component('Sidebar', Sidebar);\r\n\r\napp.directive('tooltip', Tooltip);\r\n\r\nconst router = createAppRouter();\r\napp.use(router);\r\napp.use(ConfirmationService);\r\n\r\napp.mount('#app');\r\n","import { fetchAndCheckJson } from '@/js/dn-fetch.js';\r\n\r\n/**\r\n* @typedef {{id:number; name:string;}} AffinityDto\r\n*/\r\n\r\n/**\r\n * @param {{ id: number; }} affinity\r\n */\r\nasync function deleteAffinity(affinity) {\r\n return await fetchAndCheckJson(`affinity/${affinity.id}`, 'DELETE');\r\n}\r\n\r\nexport async function getAffinities() {\r\n /** @type {AffinityDto[]} */\r\n const rows = await fetchAndCheckJson(`affinity`, 'GET');\r\n return rows.map(x => new Affinity(x));\r\n}\r\n\r\n/**\r\n * @param {Affinity} affinity\r\n */\r\nasync function patchAffinity(affinity) {\r\n return await fetchAndCheckJson(`affinity/${affinity.id}`, 'PATCH', affinity.toDto());\r\n}\r\n\r\n/**\r\n * @param {Affinity} affinity\r\n */\r\nasync function postAffinity(affinity) {\r\n return await fetchAndCheckJson(`affinity`, 'POST', affinity.toDto());\r\n}\r\n\r\n/**\r\n * @param {Affinity[]} affinities\r\n */\r\nexport async function saveAffinityChanges(affinities) {\r\n for (const affinity of affinities) {\r\n if (affinity.isToDelete) {\r\n if (affinity.id > 0)\r\n await deleteAffinity(affinity);\r\n } else if (affinity.hasChanges) {\r\n if (affinity.id > 0) {\r\n await patchAffinity(affinity);\r\n } else {\r\n await postAffinity(affinity);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport class Affinity {\r\n /**\r\n * @param {AffinityDto} dto\r\n */\r\n constructor(dto) {\r\n /** @type {number} */\r\n this.id = dto.id;\r\n /** @private @type {string} */\r\n this._name = dto.name;\r\n /** @private @type {boolean} */\r\n this._hasChanges = false;\r\n /** @private @type {boolean} */\r\n this._isToDelete = false;\r\n }\r\n\r\n get name() {\r\n return this._name;\r\n }\r\n\r\n set name(newValue) {\r\n if (this._name !== newValue) {\r\n this._name = newValue;\r\n this._hasChanges = true;\r\n }\r\n }\r\n\r\n get hasChanges() {\r\n return this._hasChanges;\r\n }\r\n\r\n get isToDelete() {\r\n return this._isToDelete;\r\n }\r\n\r\n copy() {\r\n return new Affinity(this.toDto());\r\n }\r\n\r\n toDelete() {\r\n this._hasChanges = true;\r\n this._isToDelete = true;\r\n }\r\n\r\n /** @returns {AffinityDto} */\r\n toDto() {\r\n return { id: this.id, name: this.name };\r\n }\r\n}\r\n","import { fetchAndCheckJson } from '@/js/dn-fetch.js';\nimport { getSelectionKey } from '@/js/dn-helper.js';\nimport { getDateOfInstant } from '#shared/dn-timezone';\nimport { RequestItem } from '@/model/dn-request-item.js';\nimport { addDays, getShortDate, getStartOfDay, getQuarterHour } from '@/shared/dn-shared-helper.js';\nimport { TASK_SYSTEM_KIND } from '@/shared/dn-tasktype.js';\n\n/**\n* @typedef {{employeeId:number; st:Date; fi:Date; available:boolean; msg:string|null}} AvailabilityRequestPostDto\n*/\n\n/**\n* @typedef {AvailabilityRequestPostDto & {id:number; available:boolean; created:Date; updated:null|Date; approved:boolean|null; replyMsg:string|null, deleted:boolean|null}} AvailabilityRequestDto\n*/\n\n/**\n* @typedef {{approved?:boolean|null; replyMsg?:string|null}} AvailabilityRequestPatchDto\n*/\n\n/**\n * @param {number} st\n * @param {number} fi\n * @param {number} id employee or callcenter id\n * @param {boolean} idIsEmployee\n * @param {number} [ts]\n * @returns {Promise<AvailabilityRequestDto[]>}\n */\nasync function getAvailabilityRequests(st, fi, id, idIsEmployee, ts = undefined) {\n let filter = ''\n if (fi) {\n filter += '&fi=' + fi;\n }\n if (ts) {\n filter += '&ts=' + ts;\n }\n\n return await fetchAndCheckJson(`availability-request?id=${id}&idIsEmployee=${idIsEmployee}&st=${st}${filter}`, 'GET');\n}\n\n/**\n * @param {AvailabilityRequestPostDto} data\n */\nexport async function postAvailabilityRequest(data) {\n /** @type {{id:number; created:string}} */\n const result = await fetchAndCheckJson(`availability-request`, 'POST', data);\n return result;\n}\n\n/**\n * @param {number} id\n * @param {AvailabilityRequestPatchDto} data\n */\nasync function patchAvailabilityRequest(id, data) {\n /** @type {{id:number; updated:string}} */\n const result = await fetchAndCheckJson(`availability-request/${id}`, 'PATCH', data);\n return result;\n}\n\n/**\n * @param {number} id\n */\nasync function deleteAvailabilityRequest(id) {\n /** @type {{id:number; updated:string}} */\n const result = await fetchAndCheckJson(`availability-request/${id}`, 'DELETE');\n return result;\n}\n\nexport class AvailabilityRequest extends RequestItem {\n /**\n * @param {AvailabilityRequestDto} dto\n */\n constructor(dto) {\n super(dto.id, isApprovedOrAutoApproved(dto), new Date(dto.created));\n /** @readonly @type {number} */\n this.employeeId = dto.employeeId;\n /** @readonly @type {Date} */\n this.st = new Date(dto.st);\n /** @readonly @type {Date} */\n this.fi = new Date(dto.fi);\n /** @readonly @type {boolean} */\n this.available = dto.available;\n /** @type {string} */\n this.msg = dto.msg;\n /** @type {string} */\n this.replyMsg = dto.replyMsg;\n /** @type {Date|null} */\n this.updated = dto.updated ? new Date(dto.updated) : null;\n }\n\n get employeesToDisplay() {\n return [{ starts: [this.st] }];\n }\n\n get iconName() {\n return this.available ? 'arrows_expand_vertical' : 'arrows_collapse_vertical';\n }\n\n get key() {\n return -this.id;\n }\n\n /**\n * @param {string} timezone\n * @returns {string[]}\n */\n getSelectionKeys(timezone) {\n const stLocal = getDateOfInstant(this.st, timezone);\n return [getSelectionKey(stLocal, this.employeeId)];\n }\n\n /** @returns {Date[]} */\n affectedScheduleInterval() {\n if (!this.available) {\n const st = getStartOfDay(this.st);\n const fi = getStartOfDay(this.fi);\n return [st, fi < this.fi ? addDays(fi, 1) : fi];\n }\n return [];\n }\n\n /**\n * @param {{ id: number; }} employee\n */\n canDelete(employee = null) {\n if (employee) {\n return this.approved === null;\n }\n return this.approved !== null;\n }\n\n /**\n * @param {{ id: number; }} employee\n */\n canReply(employee = null) {\n return !employee;\n }\n\n async deleteRequest() {\n await deleteAvailabilityRequest(this.id);\n }\n\n /**\n * @param {number} index\n */\n getEmployeeIdByIndex(index) { // eslint-disable-line no-unused-vars\n return this.employeeId;\n }\n\n getMsgToDisplay() {\n if (this.msg) {\n return this.msg;\n }\n\n return this.available ? 'available' : 'unavailable';\n }\n\n getReplyMsg() {\n return this.replyMsg;\n }\n\n /**\n * @param {{ id: number; }} employee\n * @returns {{id:number;msg:string}}\n */\n getReplyObj(employee) {\n return new AvailabilityRequestReply(this, employee !== undefined);\n }\n\n /**\n * @param {any} srEmp\n * @param {string} language\n * @param {string} timeZone\n * @returns {string[]}\n */\n getTasksInfo(srEmp, language, timeZone) { // eslint-disable-line no-unused-vars\n const dtFormat = new Intl.DateTimeFormat(language, { hour: 'numeric', minute: '2-digit', timeZone });\n return [`${dtFormat.format(this.st)} - ${dtFormat.format(this.fi)}`];\n }\n\n /**\n * @param {string} key\n * @param {string} timezone\n */\n hasSelectionKey(key, timezone) {\n const stLocal = getDateOfInstant(this.st, timezone);\n return getSelectionKey(stLocal, this.employeeId) === key;\n }\n\n /**\n * @param {{showAvailability:boolean;showUnavailability:boolean;showFuture:boolean;showBasedOnSelection:boolean;showApproved:boolean;showRejected:boolean;showHistoric:boolean;tagId:number}} filter\n * @param {Date} future\n * @param {number} selectedEmpId\n * @param {import(\"@/shared/dn-employee.js\").Employee[]} empList\n * @param {Date} now\n */\n isFilterOk(filter, future, selectedEmpId, empList, now) {\n\n let okByOthers = true\n let okByDate = true\n let okByTag= true\n\n if (this.approved === true) {\n if (!filter.showApproved) { okByOthers= false; }\n } else if (this.approved === false) {\n if (!filter.showRejected) { okByOthers= false; }\n }\n\n if (this.available) {\n if (!filter.showAvailability) { okByOthers= false; }\n } else {\n if (!filter.showUnavailability) { okByOthers= false; }\n }\n\n if (filter.showBasedOnSelection) {\n if (this.employeeId !== selectedEmpId) { okByOthers= false; }\n }\n\n if (!filter.showFuture) {\n if (this.st > future) { okByOthers= false; }\n }\n\n\n if(filter.tagId>0){\n okByTag=false\n let tagList= [filter.tagId]\n let emp= empList.find(x => x.id==this.employeeId)\n if (emp&&emp.hasAnyTag(tagList)) {\n okByTag=true\n }\n };\n \n if (addDays( this.st,this.days) < now && !filter.showHistoric) { okByDate = false }\n\n return okByOthers&&okByTag&&okByDate\n }\n\n /**\n * @private\n * @param {import(\"@/model/dn-schedule-task.js\").ScheduleTasks} scheduleTasks\n * @param {import(\"@/shared/dn-tasktype.js\").TaskTypes} taskTypes\n */\n syncWithSchedule(scheduleTasks, taskTypes) {\n const timeOffId = taskTypes.bySystemKind.get(TASK_SYSTEM_KIND.free).id;\n /** @type {import(\"@/shared/dn-task.js\").Task[]} */\n const timeOffTasks = [];\n let hasOverlappingShift = false;\n for (const task of scheduleTasks.list) {\n if (task.empid === this.employeeId && !task.isToDelete && task.overlaps(this.st, this.fi)) {\n if (task.tasktypeId === timeOffId) {\n timeOffTasks.push(task);\n } else {\n hasOverlappingShift = true;\n }\n }\n }\n\n if (hasOverlappingShift) {\n let modifed = false;\n if (this.approved) {\n if (timeOffTasks.length > 0) {\n const task = timeOffTasks[0];\n if (task.st > this.st) {\n task.st = this.st;\n modifed = true;\n }\n if (task.fi < this.fi) {\n task.fi = this.fi;\n modifed = true;\n }\n } else {\n scheduleTasks.add({ empid: this.employeeId, st: this.st, fi: this.fi, tasktypeId: timeOffId });\n modifed = true;\n }\n } else if (timeOffTasks.length > 0) {\n for (const task of timeOffTasks) {\n if (task.st < this.st) {\n if (task.fi > this.fi) {\n scheduleTasks.add({ empid: this.employeeId, st: this.fi, fi: task.fi, tasktypeId: timeOffId });\n }\n task.fi = this.st;\n } else if (task.fi > this.fi) {\n task.st = this.fi;\n } else {\n task.toDelete();\n }\n }\n modifed = true;\n }\n\n if (modifed) {\n /** @type {Set<string>} */\n const affectedDates = new Set();\n let dt = this.st;\n while (dt < this.fi) {\n affectedDates.add(getShortDate(dt));\n dt = addDays(dt, 1);\n }\n\n return affectedDates;\n }\n }\n return undefined;\n }\n\n /** @returns {AvailabilityRequestDto} */\n toDto() {\n return {\n id: this.id, employeeId: this.employeeId, st: this.st, fi: this.fi, available: this.available,\n created: this.created, updated: this.updated, msg: this.msg, approved: this.approved, replyMsg: this.replyMsg, deleted: false\n };\n }\n\n /**\n * @param {import(\"@/model/dn-schedule-task.js\").ScheduleTasks} scheduleTasks\n * @param {import(\"@/shared/dn-tasktype.js\").TaskTypes} taskTypes\n * @param {import(\"@/shared/dn-employee.js\").Employee} employee\n * @param {boolean|null} approve\n * @param {{id:number;msg:string;numberOfStars?:number}} reply\n * @returns {Promise<{ok:boolean; affectedDates?:Set<string>; toastMsg?:string;}>}\n */\n async toggleApproval(scheduleTasks, taskTypes, employee, approve, reply) { // eslint-disable-line no-unused-vars\n if (employee) {\n return { ok: false };\n }\n const approved = this.approved == approve ? null : approve;\n /** @type {AvailabilityRequestPatchDto} */\n const data = { approved: approved, replyMsg: this.replyMsg };\n const result = await patchAvailabilityRequest(this.id, data);\n this.approved = approved;\n this.updated = new Date(result.updated);\n /** @type {Set<string>} */\n let affectedDates;\n if (!this.available) {\n affectedDates = this.syncWithSchedule(scheduleTasks, taskTypes);\n }\n return { ok: true, affectedDates };\n }\n}\n\n/**\n * @param {AvailabilityRequestDto} dto\n */\nfunction isApprovedOrAutoApproved(dto) {\n if (dto.approved === null && dto.available) {\n const created = new Date(dto.created);\n if (Date.now() - created.getTime() > 1000 * 60 * 60 * 24) {\n return true;\n }\n }\n\n return dto.approved;\n}\n\nclass AvailabilityRequestReply {\n /**\n * @param {AvailabilityRequest} ar\n * @param {boolean} isEmp\n */\n constructor(ar, isEmp) {\n /** @private @type {AvailabilityRequest} */\n this.ar = ar;\n /** @private @type {boolean} */\n this.isEmp = isEmp;\n }\n\n get id() {\n return this.ar.id;\n }\n\n get msg() {\n return this.isEmp ? this.ar.msg : this.ar.replyMsg;\n }\n\n set msg(value) {\n if (this.isEmp) {\n this.ar.msg = value;\n } else {\n this.ar.replyMsg = value;\n }\n }\n}\n\nexport class AvailabilityRequests {\n /**\n * @param {AvailabilityRequestDto[]} [dtoList]\n */\n constructor(dtoList = undefined) {\n /** @private @readonly @type {Map<number, AvailabilityRequest>} */\n this.byId = new Map();\n /** @private @readonly @type {Map<number, AvailabilityRequestEmployee>} */\n this.byEmp = new Map();\n if (dtoList) {\n this.setData(dtoList.map(x => new AvailabilityRequest(x)), false);\n }\n }\n\n get isLoaded() {\n return this.id !== undefined;\n }\n\n /**\n * @param {{showAvailability:boolean;showUnavailability:boolean;showFuture:boolean;showBasedOnSelection:boolean;showApproved:boolean;showRejected:boolean}} filter\n * @param {Date} future\n * @param {number} selectedEmpId\n * @param {import(\"@/shared/dn-employee.js\").Employee[]} empList\n * @param {Date} now\n */\n getByFilter(filter, future, selectedEmpId, empList, now) {\n /** @type {AvailabilityRequest[]} */\n const requests = [];\n for (const r of this.byId.values()) {\n if (r.isFilterOk(filter, future, selectedEmpId, empList, now)) {\n requests.push(r);\n }\n }\n return requests;\n }\n\n /**\n * @param {number} employeeId\n * @param {Date} dt\n * @returns {AvailabilityRequest[]}\n */\n getByEmpDate(employeeId, dt) {\n const empRequests = this.byEmp.get(employeeId);\n if (empRequests) {\n const dtRequests = empRequests.byDate.get(dt.getTime());\n if (dtRequests) {\n return dtRequests.slice();\n }\n }\n return [];\n }\n\n /** @param {Map<number, Date[]>} byEmp */\n getOkOnSelection(byEmp) {\n /** @type {AvailabilityRequestDto[]} */\n const l = [];\n for (const r of this.byId.values()) {\n if (r.isApproved) {\n const dates = byEmp.get(r.employeeId);\n if (dates) {\n l.push(r.toDto());\n }\n }\n }\n return l;\n }\n\n /**\n * @param {number} id\n * @param {boolean} idIsEmployee\n */\n init(id, idIsEmployee) {\n /** @private @type {number} */\n this.id = id;\n /** @private @type {boolean} */\n this.idIsEmployee = idIsEmployee;\n /** @private @type {number} */\n this.loadedStTime = null;\n /** @private @type {number} */\n this.updated = 0;\n this.byId.clear();\n }\n\n /**\n * @param {Date} st\n */\n async load(st) {\n const stTime = st.getTime();\n if (this.loadedStTime === null) {\n await this.getData(stTime);\n this.loadedStTime = stTime;\n } else if (this.loadedStTime > stTime) {\n await this.getData(stTime, this.loadedStTime);\n this.loadedStTime = stTime;\n }\n }\n\n async refresh() {\n if (this.loadedStTime === null) { return; }\n const ts = this.updated;\n await this.getData(this.loadedStTime, undefined, ts);\n }\n\n /**\n * @private\n * @param {number} st\n * @param {number} [fi]\n * @param {number} [ts]\n */\n async getData(st, fi = undefined, ts = undefined) {\n const updateUpdated = fi === undefined;\n const rows = await getAvailabilityRequests(st, fi, this.id, this.idIsEmployee, ts);\n /** @type {AvailabilityRequest[]} */\n const requests = [];\n for (const r of rows) {\n if (r.deleted) {\n this.byId.delete(r.id);\n const availEmp = this.byEmp.get(r.employeeId);\n if (availEmp) {\n availEmp.remove(r);\n }\n if (updateUpdated) {\n const updated = (new Date(r.updated)).getTime();\n if (this.updated < updated) {\n this.updated = updated;\n }\n }\n } else {\n requests.push(new AvailabilityRequest(r));\n }\n }\n\n this.setData(requests, updateUpdated);\n }\n\n /**\n * @param {number} employeeId\n */\n getByEmp(employeeId) {\n return this.byEmp.get(employeeId);\n }\n\n /**\n * @private\n * @param {AvailabilityRequest[]} rows\n * @param {boolean} updateUpdated\n */\n setData(rows, updateUpdated) {\n for (const r of rows) {\n this.byId.set(r.id, r);\n let availEmp = this.byEmp.get(r.employeeId);\n if (availEmp === undefined) {\n availEmp = new AvailabilityRequestEmployee();\n this.byEmp.set(r.employeeId, availEmp);\n }\n availEmp.set(r);\n if (updateUpdated) {\n const updated = r.updated !== null ? r.updated.getTime() : r.created.getTime();\n if (this.updated < updated) {\n this.updated = updated;\n }\n }\n }\n }\n}\n\nclass AvailabilityRequestEmployee {\n constructor() {\n /** @type {Map<number, AvailabilityRequest[]>} */\n this.byDate = new Map();\n }\n\n /**\n * @param {Date} dt\n * @param {Date} nextDt\n * @param {{st:number;fi:number}[]} unavail\n */\n adjustQuarterHoursByDateUnavailability(dt, nextDt, unavail) {\n const startTime = getStartOfDay(dt).getTime();\n let requests = this.byDate.get(startTime);\n const endTime = getStartOfDay(nextDt).getTime();\n if (startTime !== endTime) {\n const request2 = this.byDate.get(endTime);\n if (request2) {\n if (requests) {\n requests = requests.concat(request2);\n } else {\n requests = request2;\n }\n }\n }\n if (requests) {\n for (const r of requests) {\n if (r.isApproved) {\n const st = r.st > dt ? getQuarterHour2(nextDt, r.st) : 0;\n const fi = r.fi < nextDt ? getQuarterHour2(nextDt,r.fi) : 96;\n addToIntervals(unavail, st, fi, r.available);\n }\n }\n }\n }\n\n /**\n * @param {Date} startDate\n * @param {import(\"#shared/dn-employee-schedule\").AvailabilityByDay} availabilityByDay\n */\n adjustQuarterHoursByDateAvailability(startDate, availabilityByDay) {\n for (let i = 0; i < availabilityByDay.length; i++) {\n const dayStart = addDays(startDate, i);\n const requests = this.byDate.get(dayStart.getTime());\n if (requests) {\n for (const r of requests) {\n if (r.isApproved) {\n const dayEnd = addDays(dayStart, 1);\n const st = getQuarterHourRelative(dayStart, dayEnd, r.st);\n const fi = getQuarterHourRelative(dayStart, dayEnd, r.fi);\n addToIntervals(availabilityByDay[i], st, fi, !r.available);\n }\n }\n }\n }\n }\n\n /**\n * @param {AvailabilityRequestDto} r\n */\n remove(r) {\n let dt = getStartOfDay(new Date(r.st));\n const fi = new Date(r.fi);\n while (dt < fi) {\n const dtTime = dt.getTime();\n const avails = this.byDate.get(dtTime);\n if (avails !== undefined) {\n const index = avails.findIndex(x => x.id === r.id);\n if (index >= 0) {\n avails.splice(index, 1);\n }\n }\n\n dt = addDays(dt, 1);\n }\n }\n\n /**\n * @param {AvailabilityRequest} ar\n */\n set(ar) {\n let dt = getStartOfDay(ar.st);\n while (dt < ar.fi) {\n const dtTime = dt.getTime();\n const avails = this.byDate.get(dtTime);\n if (avails === undefined) {\n this.byDate.set(dtTime, [ar]);\n } else {\n const index = avails.findIndex(x => x.id === ar.id);\n if (index >= 0) {\n avails[index] = ar;\n } else {\n avails.push(ar);\n }\n }\n\n dt = addDays(dt, 1);\n }\n }\n}\n\n/**\n * @param {{st:number; fi:number}[]} intervals\n * @param {number} st\n * @param {number} fi\n * @param {boolean} inverted\n */\nfunction addToIntervals(intervals, st, fi, inverted) {\n if (inverted) {\n let i = intervals.length - 1;\n while (i >= 0) {\n const interval = intervals[i];\n if (interval.st < fi && interval.fi > st) {\n if (interval.st < st) {\n if (interval.fi > fi) {\n intervals.push({ st: fi, fi: interval.fi });\n }\n interval.fi = st;\n } else {\n if (fi < interval.fi) {\n interval.st = fi;\n } else {\n intervals.splice(i, 1);\n }\n }\n }\n i--;\n }\n } else {\n let i = intervals.length - 1;\n while (i >= 0) {\n const interval = intervals[i];\n if (interval.st <= fi && interval.fi >= st) {\n interval.st = Math.min(interval.st, st);\n interval.fi = Math.max(interval.fi, fi);\n st = fi;\n break;\n }\n i--;\n }\n\n if (st < fi) {\n intervals.push({ st, fi });\n }\n }\n intervals.sort((a, b) => a.st - b.st);\n}\n\n/**\n * @param {Date} dayStart\n * @param {Date} dayEnd\n * @param {Date} dt\n */\nfunction getQuarterHourRelative(dayStart, dayEnd, dt) {\n if (dt < dayStart) {\n return getQuarterHour(dt) - 96;\n } else if (dt >= dayEnd) {\n return getQuarterHour(dt) + 96;\n }\n return getQuarterHour(dt);\n}\n\n/**\n * @param {Date} dayEnd\n * @param {Date} dt\n */\nfunction getQuarterHour2(dayEnd, dt) {\n const ms = dayEnd.getTime() - dt.getTime();\n return 96 - Math.round(ms / (15 * 60000));\n}","import { fetchAndCheckJson } from '@/js/dn-fetch.js';\nimport { isSubset } from '@/js/dn-helper.js';\nimport { getLocalOffset } from '#shared/dn-timezone';\nimport { fromISODate, getDayDiff, toISODate } from '@/shared/dn-shared-helper.js';\n\n/**\n* @typedef {{ id:number|null, stFi: number[]; st: string; weeks: number; employeeIdList:number[] }} AvailabilityDto\n*/\n\nexport class Availabilities {\n /**\n * @param {AvailabilityDto[]} dto\n */\n constructor(dto = undefined) {\n /** @private @type {AvailabilityDto[]} */\n this._dto = dto;\n }\n\n get dto() {\n return this._dto;\n }\n\n get byEmp() {\n if (this._byEmp === undefined) {\n /** @private @type {Map<number, Availability>} */\n this._byEmp = new Map();\n for (const availability of this.items) {\n for (const employeeId of availability.employeeIdList) {\n this._byEmp.set(employeeId, availability);\n }\n }\n }\n\n return this._byEmp;\n }\n\n get isLoaded() {\n return this._dto !== undefined;\n }\n\n get items() {\n if (this._items === undefined) {\n /** @private @type {Availability[]} */\n this._items = this.dto.map(r => new Availability(fromISODate(r.st), r.weeks, r.stFi, r.employeeIdList, r.id));\n }\n return this._items;\n }\n\n clear() {\n this._dto = undefined;\n this._byEmp = undefined;\n this._items = undefined;\n }\n\n /**\n * @param {number} ccId\n */\n async load(ccId) {\n this.clear();\n /** @type {AvailabilityDto[]} */\n const rows = await fetchAndCheckJson('availability?ccId=' + ccId, 'GET');\n this._dto = rows;\n }\n}\n\nexport function clearAvailability(a) {\n a.weeks = 0\n a.intervals = []\n a.employeeIdList = []\n a.id = null\n}\n\nexport class Availability {\n /**\n * @param {number} id\n * @param {Date} st\n * @param {number} weeks\n * @param {number[]} stFi st and fi in quarter hours\n * @param {number[]} employeeIdList\n */\n constructor(st, weeks, stFi, employeeIdList, id = null) {\n /** @private @type {number|null} */\n this._id = id;\n /** @type {number} */\n this.weeks = weeks;\n /** @type {Date} */\n this.st = st;\n /** @type {number[]} quarter hours from start of period */\n this.stFi = stFi;\n /** @readonly @type {number[]} */\n this.employeeIdList = employeeIdList;\n }\n\n get id() {\n return this._id;\n }\n\n get availabilityUI() {\n let intervals = []\n\n for (let i = 0; i < this.stFi.length; i++) {\n intervals.push({ st: this.stFi[i], fi: this.stFi[i + 1] })\n i++\n }\n return { weeks: this.weeks, intervals: intervals, employeeIdList: this.employeeIdList, id: this.id }\n }\n\n /**\n * @param {Date} startDt\n * @param {string} timezone\n */\n getUnavailability(startDt, timezone) {\n const localOffsetQ = getLocalOffset(startDt, timezone) / 15;\n const unavailability = [0];\n for (let i = 0; i < this.stFi.length; i += 1) {\n const q = this.stFi[i] - localOffsetQ;\n unavailability.push(q);\n }\n const endQ = this.weeks * 7 * 96;\n const lastQ = this.stFi[this.stFi.length - 1] - localOffsetQ;\n unavailability.push(endQ)\n if (lastQ > endQ) { \n unavailability[0] = lastQ - endQ;\n }\n const firstQ = this.stFi[0] - localOffsetQ;\n if (firstQ < 0) {\n unavailability[unavailability.length-1] = endQ + firstQ;\n } \n return unavailability;\n }\n /**\n * @param {Date} dt\n */\n getDayIndex(dt) {\n const dayDiff = getDayDiff(dt, this.st);\n const days = this.weeks * 7;\n return dayDiff % days;\n }\n\n /**\n * @param {number} dayIndex\n */\n getByDayIndex(dayIndex) {\n if (this._byDayIndex === undefined) {\n const dayCount = this.weeks * 7;\n /** @private @type {import(\"#shared/dn-employee-schedule\").AvailabilityByDay} */\n this._byDayIndex = [];\n let j = 0;\n let daySt = 0;\n for (let i = 0; i < dayCount; i++) {\n let intervals = [];\n const dayFi = daySt + 96;\n while (j < this.stFi.length && this.stFi[j] < dayFi) {\n const fi = this.stFi[j + 1];\n if (fi > daySt) {\n intervals.push({ st: this.stFi[j] - daySt, fi: this.stFi[j + 1] - daySt });\n }\n if (fi > dayFi) { break; }\n j += 2;\n }\n\n this._byDayIndex.push(intervals);\n daySt = dayFi;\n }\n\n if (j < this.stFi.length) {\n this._byDayIndex[0].splice(0, 0, { st: this.stFi[j] - daySt, fi: this.stFi[j + 1] - daySt });\n }\n }\n return this._byDayIndex[dayIndex];\n }\n}\n\n/**\n * @param {number[]} checkedEmps\n */\nexport async function deleteAvailability(checkedEmps) {\n /** @type {AvailabilityDto} */\n const data = { id: null, st: '', weeks: 0, stFi: [], employeeIdList: checkedEmps };\n await fetchAndCheckJson('availability', 'POST', data);\n}\n\n/**\n * @param {number|null} id\n * @param {Date} st\n * @param {number} weeks\n * @param {number[]} stFi\n * @param {number[]} employeeIdList\n * @param {number[]} checkedEmps\n */\nexport async function saveAvailability(id, st, weeks, stFi, employeeIdList, checkedEmps) {\n checkedEmps.sort();\n employeeIdList.sort();\n if (!isSubset(checkedEmps, employeeIdList)) {\n id = null;\n }\n\n /** @type {AvailabilityDto} */\n const data = { id: id, st: toISODate(st), weeks: weeks, stFi: stFi, employeeIdList: checkedEmps };\n await fetchAndCheckJson('availability', 'POST', data);\n}\n","import { fetchAndCheckJson } from '@/js/dn-fetch.js';\nimport { Skill } from '@/model/dn-skill.js';\nimport { getUniqueNegativeId } from '@/js/dn-helper.js';\nimport { addDays, fromISODate, toISODate } from '@/shared/dn-shared-helper.js';\n/**\n* @typedef {{ id?: number; interactions:number; aht:number, daysOfWeek:number[]|null; openHours:number[]|null}} SkillBODetailDto\n*/\n\n/**\n* @typedef {{ id?: number; schemecolor:string|null; minLength?:number|null;}} SkillBOTaskTypeDto\n*/\n\n/**\n* @typedef {import(\"@/model/dn-skill.js\").SkillDto & { taskType: SkillBOTaskTypeDto; st?:string|null; fi?:string|null; details:SkillBODetailDto[]}} SkillBODto\n*/\n\n/**\n* @typedef {{ target:number, openHours:number[]|null }} BOTargetDetail\n*/\n\n/**\n* @typedef {{ details:BOTargetDetail[] }} BOTargetDay\n*/\n\n/**\n* @typedef { {id:number; taskTypeId: number; minLength:number; affinity:number; optimizationPriority:number; targetByDay:BOTargetDay[] }} BOTarget\n*/\n\nexport class BackOfficeSkill extends Skill {\n /**\n * @param {SkillBODto} dto\n */\n constructor(dto) {\n super(dto);\n /** @private @type {SkillBOTaskTypeDto} */\n this.taskType = { id: dto.taskType.id, schemecolor: dto.taskType.schemecolor, minLength: dto.taskType.minLength };\n /** @readonly @type {BackOfficeSkillDetail[]} */\n this.details = dto.details.map(x => new BackOfficeSkillDetail(this, x));\n /** @private @type {Date} */\n this._stDate = fromISODate(dto.st);\n /** @private @type {Date} */\n this._fiDate = fromISODate(dto.fi);\n }\n\n get stDate() {\n return this._stDate;\n }\n\n set stDate(newValue) {\n this._stDate = newValue;\n this.markAsHasChanges();\n }\n\n get fiDate() {\n return this._fiDate;\n }\n\n set fiDate(newValue) {\n this._fiDate = newValue;\n this.markAsHasChanges();\n }\n\n get minLength() {\n return this.taskType.minLength;\n }\n\n set minLength(newValue) {\n const v = Number(newValue);\n if (Number.isNaN(v) || v < 0) { return; }\n this.taskType.minLength = v;\n this.markAsHasChanges();\n }\n\n get schemecolor() {\n return this.taskType.schemecolor;\n }\n\n set schemecolor(newValue) {\n this.taskType.schemecolor = newValue;\n this.markAsHasChanges();\n }\n\n addDetail() {\n const id = getUniqueNegativeId(this.details);\n this.details.push(new BackOfficeSkillDetail(this, { id, aht: 0, interactions: 1, daysOfWeek: null, openHours: null }));\n }\n\n toDto() {\n /** @type {SkillBODto} */ // @ts-ignore\n const dto = super.toDto();\n dto.st = toISODate(this.stDate);\n dto.fi = toISODate(this.fiDate);\n dto.taskType = this.taskType;\n dto.details = this.details.map(x => x.toDto());\n return dto;\n }\n}\n\nexport class BackOfficeSkillDetail {\n /**\n * @param {BackOfficeSkill} parent\n * @param {SkillBODetailDto} dto\n */\n constructor(parent, dto) {\n /** @private @type {BackOfficeSkill} */\n this.parent = parent;\n /** @readonly @type {number} */\n this.id = dto.id;\n /** @private @type {number} */\n this._aht = dto.aht;\n /** @private @type {number} */\n this._interactions = dto.interactions;\n /** @private @type {number[]} */\n this._daysOfWeek = dto.daysOfWeek ? dto.daysOfWeek : [0, 1, 2, 3, 4, 5, 6];\n /** @private @type {number[]} */\n this._openHours = dto.openHours ? dto.openHours : [0, 96];\n }\n\n get aht() {\n return this._aht;\n }\n\n set aht(newValue) {\n this._aht = newValue;\n this.parent.markAsHasChanges();\n }\n\n get interactions() {\n return this._interactions;\n }\n\n set interactions(newValue) {\n this._interactions = newValue;\n this.parent.markAsHasChanges();\n }\n\n get daysOfWeek() {\n return this._daysOfWeek;\n }\n\n set daysOfWeek(newValue) {\n this._daysOfWeek = newValue;\n this.parent.markAsHasChanges();\n }\n\n get openHours() {\n return this._openHours;\n }\n\n set openHours(newValue) {\n if (newValue[0] > newValue[1]) {\n const st = newValue[1];\n newValue[1] = newValue[0];\n newValue[0] = st;\n }\n this._openHours = newValue;\n this.parent.markAsHasChanges();\n }\n\n /**\n * @param {Intl.LocalesArgument} lang\n */\n openHoursInfo(lang) {\n const st = this.openHours[0];\n const fi = this.openHours[1];\n if (st > 0 || fi < 96) {\n const dtFormat = new Intl.DateTimeFormat(lang, { hour: 'numeric', minute: '2-digit' });\n const zero = new Date(2000, 0, 1);\n const ticksPerQ = 1000 * 60 * 15;\n const stDate = new Date(zero.getTime() + ticksPerQ * st);\n const fiDate = new Date(zero.getTime() + ticksPerQ * fi);\n return `${dtFormat.format(stDate)} - ${dtFormat.format(fiDate)}`;\n }\n return '';\n }\n\n /** @returns {SkillBODetailDto} */\n toDto() {\n const id = this.id >= 0 ? this.id : undefined;\n const daysOfWeek = this._daysOfWeek.length !== 7 ? this._daysOfWeek : null;\n return { id, aht: this._aht, interactions: this._interactions, daysOfWeek, openHours: this._openHours };\n }\n}\n\nexport class BackOfficeSkills {\n /**\n * @param {SkillBODto[]} [dtoList]\n */\n constructor(dtoList = undefined) {\n /** @private @type {SkillBODto[]} */\n this.dtoList = dtoList;\n }\n\n get hasBO() {\n return this.isLoaded && this.dtoList.length > 0;\n }\n\n get isLoaded() {\n return this.dtoList !== undefined;\n }\n\n /**\n * @param {number[]} [ccList]\n */\n createList(ccList = undefined) {\n return this.dtoList.filter(x => !ccList || ccList.length === 0 || ccList.includes(x.ccid)).map(x => new BackOfficeSkill(x));\n }\n\n /**\n * @param {number} ccId\n * @param {Date} st\n * @param {number} numberOfDays\n */\n getTargetByTaskType(ccId, st, numberOfDays) {\n /** @type {Map<number, BOTarget>} */\n const byTaskTypeId = new Map();\n const fi = addDays(st, numberOfDays);\n for (const skillBO of this.dtoList) {\n if (skillBO.ccid === ccId && skillBO.details.length > 0) {\n const boSt = fromISODate(skillBO.st);\n const boFi = fromISODate(skillBO.fi);\n if ((!boSt || boSt < fi) && (!boFi || boFi > st)) {\n /** @type {BOTargetDay[]} */\n const targetByDay = Array(numberOfDays);\n for (let i = 0; i < numberOfDays; i++) {\n /** @type {BOTargetDay} */\n let boTargetDay = null;\n const dt = addDays(st, i);\n if ((!boSt || boSt <= dt) && (!boFi || boFi >= dt)) {\n const day = dt.getDay();\n /** @type {BOTargetDetail[]} */\n const details = [];\n for (const detail of skillBO.details) {\n if (!detail.daysOfWeek || detail.daysOfWeek.includes(day)) {\n /** @type {BOTargetDetail} */\n const targetDetail = { target: detail.interactions * detail.aht, openHours: detail.openHours };\n details.push(targetDetail);\n }\n }\n\n if (details.length > 0) {\n boTargetDay = { details };\n }\n }\n\n targetByDay[i] = boTargetDay;\n }\n /** @type {BOTarget} */\n const boTarget = {\n id: skillBO.id, taskTypeId: skillBO.taskType.id, minLength: skillBO.taskType.minLength,\n affinity: skillBO.affinityId, optimizationPriority: skillBO.optimizationPriority, targetByDay\n };\n byTaskTypeId.set(boTarget.taskTypeId, boTarget);\n }\n }\n }\n\n return byTaskTypeId;\n }\n\n async load() {\n this.dtoList = await fetchAndCheckJson(`bo`, 'GET');\n }\n}\n\n/**\n * @param {number} id\n * @param {number|null} ccId\n */\nexport function createBackOfficeSkill(id, ccId) {\n /** @type {SkillBOTaskTypeDto} */\n const taskType = { schemecolor: 'stroke4' };\n return new BackOfficeSkill({ id, name: '', ccid: ccId, taskType, details: [] });\n}\n\n/**\n * @param {{ toDto: () => SkillBODto; readonly id: number; readonly hasChanges: boolean; readonly isToDelete: boolean; }[]} skills\n */\nexport async function saveBackOfficeSkills(skills) {\n /** @type {SkillBODto[]} */\n const changed = [];\n /** @type {number[]} */\n const deleted = [];\n for (const skill of skills) {\n if (skill.isToDelete) {\n deleted.push(skill.id);\n } else if (skill.hasChanges) {\n changed.push(skill.toDto());\n }\n }\n\n if (deleted.length > 0 || changed.length > 0) {\n await fetchAndCheckJson(`bo`, 'POST', { deleted, changed });\n }\n}\n","import { fetchAndCheckJson } from '@/js/dn-fetch.js';\r\n\r\nconst secondsPer5Min = 60 * 5;\r\n\r\n/**\r\n * @typedef {{\r\n * id: number;\r\n * minShiftDuration: number;\r\n * maxShiftDuration: number;\r\n * minWorkDuration: number;\r\n * tagId: number;\r\n * tasks: {tasktypeId: number, duration:number}[]\r\n * }} BreakSettingsDto\r\n */\r\n\r\n/**\r\n * @param {number} id\r\n */\r\nexport async function deleteBreakSettings(id) {\r\n return await fetchAndCheckJson(`break-settings/${id}`, 'DELETE');\r\n}\r\n\r\n/**\r\n * @return {Promise<BreakSettings[]>}\r\n */\r\nexport async function getBreakSettings() {\r\n return await fetchAndCheckJson('break-settings', 'GET').then(x => x.map(breakSettingsFromDto));\r\n}\r\n\r\n/**\r\n * @param {BreakSettings} bs\r\n */\r\nexport async function saveBreakSettings(bs) {\r\n let path = `break-settings`;\r\n if (bs.id < 0)\r\n return await fetchAndCheckJson(path, 'POST', bs.toDto()).then(x => {\r\n bs.id = x.id;\r\n bs.confirmChanges();\r\n });\r\n else\r\n return await fetchAndCheckJson(path + '/' + bs.id, 'PATCH', bs.toDto()).\r\n then(() => bs.confirmChanges());\r\n}\r\n\r\nexport class BreakSettings {\r\n /**\r\n * @param {number} id\r\n * @param {number} minShiftDuration\r\n * @param {number} maxShiftDuration\r\n * @param {number} minWorkDuration\r\n * @param {Array<BreakSettingsTask>} tasks\r\n * @param {number|null} tagId\r\n */\r\n constructor(id, minShiftDuration, maxShiftDuration, minWorkDuration, tasks, tagId = null) {\r\n /** @type {number} values below 0 is interpreted as new break settings */\r\n this.id = id;\r\n /** @private @type {number} inclusive min shift length in 5 minute intervals */\r\n this._minShiftDuration = minShiftDuration;\r\n /** @private @type {number} inclusive max shift length in 5 minute intervals */\r\n this._maxShiftDuration = maxShiftDuration;\r\n /** @private @type {number} min work duration in 5 minute intervals */\r\n this._minWorkDuration = minWorkDuration;\r\n /** @private @type {Array<BreakSettingsTask>} */\r\n this._tasks = tasks;\r\n /** @private @type {number|null} */\r\n this._tagId = tagId;\r\n /** @private @type {boolean} */\r\n this._hasChanges = false;\r\n /** @private @type {boolean} */\r\n this._isToDelete = false;\r\n /** @private @type {number|null} */\r\n this._unpaidDurationMinutes = null;\r\n }\r\n\r\n get minShiftDuration() {\r\n return this._minShiftDuration;\r\n }\r\n\r\n get minShiftDurationMinutes() {\r\n return 5 * this._minShiftDuration;\r\n }\r\n\r\n get minShiftDurationDate() {\r\n return unitToDate(this.minShiftDuration);\r\n }\r\n\r\n /**\r\n * @param {Date} newValue\r\n */\r\n set minShiftDurationDate(newValue) {\r\n this._minShiftDuration = dateToUnit(newValue);\r\n this.markAsHasChanges();\r\n }\r\n\r\n get maxShiftDuration() {\r\n return this._maxShiftDuration;\r\n }\r\n\r\n get maxShiftDurationMinutes() {\r\n return 5 * this._maxShiftDuration;\r\n }\r\n\r\n get maxShiftDurationDate() {\r\n return unitToDate(this.maxShiftDuration);\r\n }\r\n\r\n /**\r\n * @param {Date} newValue\r\n */\r\n set maxShiftDurationDate(newValue) {\r\n this._maxShiftDuration = dateToUnit(newValue)\r\n this.markAsHasChanges();\r\n }\r\n\r\n get minWorkDuration() {\r\n return this._minWorkDuration;\r\n }\r\n\r\n get minWorkDurationQ() {\r\n return Math.ceil(this._minWorkDuration / 3);\r\n }\r\n\r\n get minWorkDurationDate() {\r\n return unitToDate(this._minWorkDuration);\r\n }\r\n\r\n set minWorkDurationDate(newValue) {\r\n this._minWorkDuration = dateToUnit(newValue);\r\n this.markAsHasChanges();\r\n }\r\n\r\n get tagId() {\r\n return this._tagId;\r\n }\r\n set tagId(newValue) {\r\n this.markAsHasChanges();\r\n this._tagId = newValue\r\n }\r\n\r\n get tagIdSingle() {\r\n if (this.tagId === null)\r\n return [];\r\n return [this.tagId];\r\n }\r\n set tagIdSingle(newValue) {\r\n if (newValue.length === 0)\r\n this.tagId = null;\r\n else\r\n this.tagId = newValue[0];\r\n }\r\n\r\n get tasks() {\r\n return this._tasks;\r\n }\r\n\r\n set tasks(newValue) {\r\n this.markAsHasChanges();\r\n this._tasks = newValue\r\n }\r\n\r\n get hasChanges() {\r\n return this._hasChanges;\r\n }\r\n\r\n markAsHasChanges() {\r\n this._hasChanges = true;\r\n }\r\n\r\n confirmChanges() {\r\n this._hasChanges = false;\r\n }\r\n\r\n /**\r\n * Get average length in minutes betwwen breaks\r\n * @param {number} shiftLength shift length in minutes\r\n * @return {number}\r\n */\r\n avgWorkDuration(shiftLength) {\r\n const workIntervalCount = this.tasks.length + 1;\r\n let totalBreakDuration = 0;\r\n for (const bsTask of this.tasks) {\r\n totalBreakDuration += bsTask.duration;\r\n }\r\n\r\n return (shiftLength - 5 * totalBreakDuration) / workIntervalCount;\r\n }\r\n\r\n /**\r\n * @param {Map<number, import(\"@/shared/dn-tasktype.js\").TaskType>} taskTypeMap\r\n */\r\n calculateUnpaidDuration(taskTypeMap) {\r\n let unpaidDuration = 0;\r\n for (const t of this.tasks) {\r\n const tt = taskTypeMap.get(t.ttId);\r\n if (!tt.paidBreak) {\r\n unpaidDuration += t.duration;\r\n }\r\n }\r\n this._unpaidDurationMinutes = 5 * unpaidDuration;\r\n }\r\n\r\n get unpaidDurationMinutes() {\r\n return this._unpaidDurationMinutes;\r\n }\r\n\r\n get isToDelete() {\r\n return this._isToDelete;\r\n }\r\n\r\n get isMinMaxDurationOk() {\r\n return this.maxShiftDuration >= this.minShiftDuration;\r\n }\r\n\r\n get isValid() {\r\n if (this.isToDelete)\r\n return true;\r\n return this.isMinMaxDurationOk;\r\n }\r\n\r\n minPossibleDuration() {\r\n let sum = this.minWorkDuration;\r\n for (const t of this.tasks) {\r\n sum += this.minWorkDuration + t.duration;\r\n }\r\n\r\n return sum;\r\n }\r\n\r\n toDelete() {\r\n this._isToDelete = true\r\n }\r\n\r\n /**\r\n * @return {BreakSettingsDto}\r\n */\r\n toDto() {\r\n return {\r\n id: this.id,\r\n minShiftDuration: this.minShiftDuration * secondsPer5Min,\r\n maxShiftDuration: this.maxShiftDuration * secondsPer5Min,\r\n minWorkDuration: this.minWorkDuration * secondsPer5Min,\r\n tagId: this.tagId,\r\n tasks: this.tasks.map(x => x.toDto())\r\n };\r\n }\r\n}\r\n\r\nexport class BreakSettingsTask {\r\n /**\r\n * @param {number} ttId\r\n * @param {number} duration\r\n */\r\n constructor(ttId, duration) {\r\n /** @private @type {number} */\r\n this._ttId = ttId;\r\n /** @private @type {number} duration in 5 minute intervals*/\r\n this._duration = duration;\r\n }\r\n\r\n get duration() {\r\n return this._duration;\r\n }\r\n\r\n get durationDate() {\r\n return unitToDate(this._duration);\r\n }\r\n\r\n set durationDate(newValue) {\r\n this._duration = dateToUnit(newValue)\r\n }\r\n\r\n get ttId() {\r\n return this._ttId;\r\n }\r\n\r\n set ttId(newValue) {\r\n this._ttId = newValue\r\n }\r\n\r\n toDto() {\r\n return { tasktypeId: this.ttId, duration: this.duration * secondsPer5Min };\r\n }\r\n}\r\n\r\n\r\n/**\r\n * @param {BreakSettingsDto} bs\r\n */\r\nexport function breakSettingsFromDto(bs) {\r\n const bsTasks = [];\r\n for (const bsTask of bs.tasks) {\r\n bsTasks.push(new BreakSettingsTask(bsTask.tasktypeId, bsTask.duration / secondsPer5Min));\r\n }\r\n\r\n return new BreakSettings(bs.id, bs.minShiftDuration / secondsPer5Min,\r\n bs.maxShiftDuration / secondsPer5Min, bs.minWorkDuration / secondsPer5Min, bsTasks, bs.tagId);\r\n}\r\n\r\n/**\r\n * @param {BreakSettings[]} settings\r\n * @param {import(\"@/shared/dn-employee\").Employee} employee\r\n * @param {number[]} ccTagIdList\r\n */\r\nexport function getBreakSettingsByTag(settings, employee, ccTagIdList) {\r\n let filtered = filterByTag(employee.tagIds);\r\n if (filtered.length !== 0)\r\n return filtered;\r\n filtered = filterByTag(ccTagIdList);\r\n if (filtered.length !== 0)\r\n return filtered;\r\n\r\n return settings.filter(x => x.tagId === null);\r\n\r\n /**\r\n * @param { number[] } tagIds\r\n */\r\n function filterByTag(tagIds) {\r\n if (tagIds.length === 0)\r\n return [];\r\n\r\n return settings.filter(x => x.tagId !== null && tagIds.includes(x.tagId))\r\n }\r\n}\r\n\r\n/**\r\n * @param {BreakSettings[]} breakSettings\r\n * @param {number} durMinutes\r\n */\r\nexport function getBreakSettingsMinWork(breakSettings, durMinutes) {\r\n if (durMinutes <= 0)\r\n return 0;\r\n\r\n let work = durMinutes;\r\n for (const bs of breakSettings) {\r\n if (bs.minShiftDurationMinutes <= durMinutes && durMinutes <= bs.maxShiftDurationMinutes) {\r\n const workMinutes = durMinutes - bs.unpaidDurationMinutes;\r\n work = Math.min(work, workMinutes);\r\n }\r\n }\r\n return work;\r\n}\r\n\r\n/**\r\n * @param {BreakSettings[]} breakSettings\r\n * @param {number} durMinutes\r\n */\r\nexport function getBreakSettingsMaxWork(breakSettings, durMinutes) {\r\n if (durMinutes <= 0)\r\n return 0;\r\n\r\n let work = 0;\r\n for (const bs of breakSettings) {\r\n if (bs.minShiftDurationMinutes <= durMinutes && durMinutes <= bs.maxShiftDurationMinutes) {\r\n const workMinutes = durMinutes - bs.unpaidDurationMinutes;\r\n work = Math.max(work, workMinutes);\r\n }\r\n }\r\n if (work === 0) {\r\n work = durMinutes;\r\n }\r\n return work;\r\n}\r\n\r\n/**\r\n * @param {number} unit\r\n */\r\nfunction unitToDate(unit) {\r\n const minutes = (unit % 12) * 5;\r\n const hours = Math.floor(unit / 12);\r\n return new Date(2030, 1, 1, hours, minutes);\r\n}\r\n\r\n/**\r\n * @param {Date} time\r\n */\r\nfunction dateToUnit(time) {\r\n return time.getHours() * 12 + time.getMinutes() / 5;\r\n}\r\n","import { fetchAndCheckJson } from '@/js/dn-fetch.js';\n\n/**\n* @typedef {{ id: number; name: string; description: string; tagIds: number[]; }} CallCenterDto\n*/\n\n/**\n * @param {CallCenter} c\n */\nasync function deleteCallCenter(c) {\n await fetchAndCheckJson(`callcenters/${c.id}`, 'DELETE');\n}\n\nexport async function getCallCenters() {\n /** @type {CallCenterDto[]} */\n const rows = await fetchAndCheckJson(`callcenters`, 'GET');\n return rows.map(r => new CallCenter(r.id, r.name, r.description, r.tagIds));\n}\n\n/**\n * @param {CallCenter} c\n */\nasync function saveCallCenter(c) {\n const id = await fetchAndCheckJson(`callcenters`, 'POST', c.toApi());\n c.id = id;\n}\n\n/**\n * @param {CallCenter[]} callCenters\n */\nexport async function saveCallCenterList(callCenters) {\n for (const c of callCenters) {\n if (c.isToDelete) {\n await deleteCallCenter(c);\n } else if (c.hasChanges) {\n await saveCallCenter(c);\n c.confirmChanges();\n }\n }\n}\n\nexport class CallCenter {\n /**\n * @param {number} id\n * @param {string} name\n * @param {string} description\n * @param {number[]} tagIds\n */\n constructor(id, name, description = '', tagIds = []) {\n /** @private @type {number} */\n this._id = id;\n /** @private @type {string} */\n this._name = name;\n /** @type {number[]} */\n this.tagIds = tagIds;\n /** @private @type {string} */\n this._description = description;\n this._hasChanges = id === -1;\n this._isToDelete = false;\n this._imgUrl = \"building_primarydark.svg\"\n }\n get id() {\n return this._id\n }\n\n set id(newValue) {\n this._id = newValue\n }\n\n get name() {\n return this._name\n }\n set name(newValue) {\n this._name = newValue\n this._hasChanges = true\n }\n\n get description() {\n return this._description\n }\n set description(newValue) {\n this._description = newValue\n this._hasChanges = true\n }\n\n get imgUrl() {\n return this._imgUrl\n }\n set imgUrl(newValue) {\n this._imgUrl = newValue\n this._hasChanges = true\n }\n get hasChanges() {\n return this._hasChanges\n }\n confirmChanges() { this._hasChanges = false }\n markAsHasChanges() {\n this._hasChanges = true;\n }\n\n get isToDelete() {\n return this._isToDelete\n }\n toDelete() { this._isToDelete = true }\n\n toApi() {\n return { id: this.id, name: this.name, description: this.description, tagIds: this.tagIds };\n }\n\n tostring() {\n return 'id: ' + this._id + ' name: ' + this._name + ' description: ' + this._description\n }\n}\n","import { fetchAndCheckJson } from '@/js/dn-fetch.js';\nimport { Skill } from '@/model/dn-skill.js';\n\nfunction createForecastMethodEnum() {\n const enumObject = {\n average: 0,\n ai: 1\n };\n\n return Object.freeze(enumObject);\n}\n\nexport const FORCAST_METHOD_KIND = createForecastMethodEnum();\n\n/**\n* @typedef {{ switchId:number; id: number; tag1max:string|null; tag1min:string|null, tag2max:string|null; tag2min:string|null; tag3max:number|null; tag3min:number|null}} CallGroupConditionDto\n*/\n\n/**\n* @typedef {import(\"@/model/dn-skill.js\").SkillDto & { slpercent:number; slseconds:number; addWrap:number|null; prioSecondsInQueue?:number|null; forecastMethod:number; conditions?:CallGroupConditionDto[]}} CallGroupDto\n*/\n\n/**\n * @param {number} id\n * @param {number} defaultSwitchId\n * @param {number|null} ccId\n */\nexport function createCallGroup(id, defaultSwitchId, ccId) {\n const callGroup = new CallGroup({ id, name: '', slpercent: 0, slseconds: 0, ccid: ccId, addWrap: null,forecastMethod:0, conditions: [] });\n callGroup.setDefaultSwitchId(defaultSwitchId);\n return callGroup;\n}\n\n/**\n * @param {CallGroup[]} callgroups\n */\nexport async function mergeCallGroups(callgroups) {\n const itemsToDelete = []\n const promises = []\n for (let i = 0; i < callgroups.length; i++) {\n const c = callgroups[i];\n //New or changed callgroups\n if (c.isToDelete) {\n if (c.id >= 0)\n promises.push(fetchAndCheckJson(`callgroups/${c.id}`, 'DELETE'))\n itemsToDelete.push(c)\n } else if (c.hasChanges) {\n if (c.id < 0) {\n promises.push(fetchAndCheckJson(`callgroups`, 'POST', c.toApi()).then(result => c.confirmChanges(result)))\n }\n else {\n promises.push(fetchAndCheckJson(`callgroups/${c.id}`, 'PATCH', c.toApi()).then(result => c.confirmChanges(result)))\n }\n }\n }\n\n await Promise.all(promises);\n\n //Remove deleted callgrpoups from array\n for (let i = 0; i < itemsToDelete.length; i++) {\n const index = callgroups.indexOf(itemsToDelete[i]);\n callgroups.splice(index, 1);\n }\n}\n\n/**\n* @param {boolean} [includeConditions]\n* @param {number} [defaultSwitchId]\n*/\nexport async function getCallGroups(includeConditions = false, defaultSwitchId = undefined) {\n const cond = includeConditions ? '?includeConditions=1' : '';\n\n /** @type {CallGroupDto[]} */\n const result = await fetchAndCheckJson(`callgroups${cond}`, 'GET');\n const callGroups = result.map(x => new CallGroup(x));\n if (defaultSwitchId) {\n for (const cg of callGroups) {\n cg.setDefaultSwitchId(defaultSwitchId);\n }\n }\n return callGroups;\n}\n\nexport class CallGroup extends Skill {\n /**\n * @param {CallGroupDto} dto\n */\n constructor(dto) { \n super(dto);\n /** @private @type {number} */\n this._slPercent = dto.slpercent;\n /** @private @type {number} */\n this._slWithin = dto.slseconds;\n /** @private @type {number} */\n this._prioSecondsInQueue = dto.prioSecondsInQueue ? dto.prioSecondsInQueue : null;\n /** @private @type {number} */\n this._addWrap = dto.addWrap;\n /** @private @type {number} */\n this._forecastMethod = dto.forecastMethod;\n\n /** @type {CallGroupCondition[]} */\n let conditions;\n if (dto.conditions)\n conditions = dto.conditions.map(c => new CallGroupCondition(c));\n else\n conditions = [];\n\n /** @private @type {CallGroupCondition[]} */\n this._conditions = conditions.sort((a, b) => (a.tag1min > b.tag1min) ? 1 : ((b.tag1min > a.tag1min) ? -1 : 0));\n }\n\n get addWrapS() {\n if (this._addWrap)\n return this._addWrap / 1000;\n return null;\n }\n\n set addWrapS(newValue) {\n if (newValue)\n this._addWrap = Math.round(newValue * 1000);\n else\n this._addWrap = null;\n this.markAsHasChanges();\n }\n\n get slPercent() {\n return this._slPercent\n }\n\n set slPercent(newValue) {\n this._slPercent = newValue\n this.markAsHasChanges();\n }\n\n get prioSecondsInQueue() {\n return this._prioSecondsInQueue ? this._prioSecondsInQueue : 0;\n }\n\n set prioSecondsInQueue(newValue) {\n const v = Number(newValue);\n if (Number.isNaN(v)) { return; }\n this._prioSecondsInQueue = Math.round(v);\n this.markAsHasChanges();\n }\n\n get slWithin() {\n return this._slWithin\n }\n\n set slWithin(newValue) {\n this._slWithin = newValue\n this.markAsHasChanges();\n }\n\n get forecastMethod() {\n return this._forecastMethod\n }\n\n set forecastMethod(newValue) {\n this._forecastMethod = newValue\n this.markAsHasChanges();\n }\n\n get conditions() {\n return this._conditions\n }\n\n set conditions(newValue) {\n this._conditions = newValue\n this.markAsHasChanges();\n }\n\n get hasChanges() {\n return super.hasChanges || this._conditions.some(c => c.hasChanges || c.id == -1 || c.isToDelete);\n }\n\n /**\n * @param {number} switchId\n */\n setDefaultSwitchId(switchId) {\n /** @private @type {number} */\n this._defaultSwitchId = switchId;\n }\n\n addCondition() {\n let switchId = this._defaultSwitchId;\n if (this.conditions.length > 0) {\n switchId = this.conditions[this.conditions.length - 1].switchId;\n }\n\n this.conditions.push(new CallGroupCondition({ id: -1, switchId, tag1min: null, tag1max: null, tag2min: null, tag2max: null, tag3min: null, tag3max: null }));\n }\n\n /**\n * @param {{ newConditionIds?: any; id: number; }} result\n */\n confirmChanges(result) {\n let i = 0;\n for (const cond of this.conditions) {\n if (!cond.isToDelete && cond.hasChanges && cond.id == -1) {\n cond.id = result.newConditionIds[i];\n i++;\n }\n }\n\n super.confirmChanges(result);\n\n this._conditions = this._conditions.filter(x => !x.isToDelete);\n for (const cond of this._conditions) {\n cond.confirmChanges();\n }\n }\n\n /**\n * @param {CallGroupCondition} condition\n */\n deleteCondition(condition) {\n condition.toDelete();\n if (condition.id === -1) {\n const index = this.conditions.findIndex(x => x.isToDelete && x.id === -1);\n this.conditions.splice(index, 1);\n }\n }\n\n isValid() {\n return this.conditions.every(x => x.isValid());\n }\n\n toDelete() {\n super.toDelete();\n this.conditions.length = 0;\n }\n toApi() {\n let conditionsToDelete = [];\n let conditionsToInsert = [];\n let conditionsToUpdate = [];\n for (const cond of this.conditions) {\n if (cond.isToDelete) {\n if (cond.id !== -1) conditionsToDelete.push(cond.id);\n } else if (cond.hasChanges) {\n const toSave = { switchId: cond.switchId, tag1min: cond.tag1min, tag1max: cond.tag1max, tag2min: cond.tag2min, tag2max: cond.tag2max, tag3min: cond.tag3min, tag3max: cond.tag3max };\n if (cond.id == -1) {\n conditionsToInsert.push(toSave);\n }\n else {\n toSave.id = cond.id;\n conditionsToUpdate.push(toSave);\n }\n }\n }\n\n /** @type {import(\"@/model/dn-skill.js\").SkillDto & { slpercent:number; slseconds:number; addWrap:number|null; prioSecondsInQueue?:number|null;forecastMethod:Number; conditionsToInsert:any[]; conditionsToDelete?:number[]; conditionsToUpdate:any[]}} */\n // @ts-ignore\n const dto = super.toDto();\n dto.addWrap = this._addWrap;\n dto.prioSecondsInQueue = this._prioSecondsInQueue;\n dto.slpercent = this.slPercent;\n dto.slseconds = this.slWithin;\n dto.forecastMethod=this._forecastMethod;\n dto.conditionsToInsert = conditionsToInsert;\n dto.conditionsToDelete = conditionsToDelete;\n dto.conditionsToUpdate = conditionsToUpdate;\n\n return dto;\n }\n\n /** @returns {CallGroupDto} */\n toDto() {\n /** @type {CallGroupDto} */ // @ts-ignore\n const dto = super.toDto();\n dto.addWrap = this._addWrap;\n dto.prioSecondsInQueue = this._prioSecondsInQueue;\n dto.slpercent = this.slPercent;\n dto.slseconds = this.slWithin;\n dto.forecastMethod=this._forecastMethod\n return dto;\n }\n}\n\nclass CallGroupCondition {\n /**\n * @param {CallGroupConditionDto} dto\n */\n constructor(dto) {\n /** @private @type {number} */\n this._id = dto.id\n /** @private @type {number} */\n this._switchId = dto.switchId;\n /** @private @type {null|number|string} */\n this._tag1min = dto.tag1min\n /** @private @type {null|number|string} */\n this._tag1max = dto.tag1max\n /** @private @type {null|number|string} */\n this._tag2min = dto.tag2min\n /** @private @type {null|number|string} */\n this._tag2max = dto.tag2max\n /** @private @type {null|number|string} */\n this._tag3min = dto.tag3min\n /** @private @type {null|number|string} */\n this._tag3max = dto.tag3max\n /** @private @type {boolean} */\n this._hasChanges = false\n /** @private @type {boolean} */\n this._isToDelete = false\n }\n\n get id() {\n return this._id\n }\n set id(value) {\n this._id = value\n }\n\n get switchId() {\n return this._switchId\n }\n\n set switchId(newValue) {\n this.setValue('_switchId', newValue);\n }\n\n get tag1min() {\n return this._tag1min\n }\n\n set tag1min(newValue) {\n this.setValue('_tag1min', newValue);\n }\n\n get tag1max() {\n return this._tag1max\n }\n\n set tag1max(newValue) {\n this.setValue('_tag1max', newValue);\n }\n\n get tag2min() {\n return this._tag2min\n }\n\n set tag2min(newValue) {\n this.setValue('_tag2min', newValue);\n }\n\n get tag2max() {\n return this._tag2max\n }\n\n set tag2max(newValue) {\n this.setValue('_tag2max', newValue);\n }\n\n get tag3min() {\n return this._tag3min\n }\n\n set tag3min(newValue) {\n this.setValue('_tag3min', newValue);\n }\n\n get tag3max() {\n return this._tag3max\n }\n\n set tag3max(newValue) {\n this.setValue('_tag3max', newValue);\n }\n\n /**\n * @private\n * @param {string} prop\n * @param {null|number|string} value\n */\n setValue(prop, value) {\n if (value === '')\n value = null;\n\n if (this[prop] !== value) {\n this[prop] = value;\n this._hasChanges = true;\n }\n }\n\n get hasChanges() {\n return this._hasChanges\n }\n confirmChanges() {\n this._hasChanges = false\n }\n\n get isToDelete() {\n return this._isToDelete\n }\n toDelete() { this._isToDelete = true }\n\n getTagMax(prop) {\n if (prop === 'tag3min' || prop === 'tag3max')\n return 2147483647;\n return 9007199254740990;\n }\n\n isValid() {\n return this.hasValidValue('tag1min') && this.hasValidValue('tag1max') &&\n this.hasValidValue('tag2min') && this.hasValidValue('tag2max') &&\n this.hasValidValue('tag3min') && this.hasValidValue('tag3max');\n }\n\n /**\n * @private\n * @param {string} prop\n */\n hasValidValue(prop) {\n let value = this[prop];\n if (value === null)\n return true;\n if (typeof (value) === 'string') {\n value = parseInt(value);\n }\n if (value >= 0 && value <= this.getTagMax(prop)) {\n return true;\n }\n\n return false;\n }\n}\n","import { fetchAndCheckJson } from '@/js/dn-fetch.js';\n\n/**\n * @param {number} ccId\n */\nexport async function getCustomShifts(ccId) {\n /** @type {{id:number, name:string, tasks: any[], cmd:number}[]} */\n const rows = await fetchAndCheckJson(`customshifts?ccId=${ccId}`, 'GET');\n return rows.map(x => new CustomShift(null, x.id, x.name, x.tasks, ccId, x.cmd));\n}\n\nexport async function createNewCustomShift(newCustomShift) {\n await fetchAndCheckJson(`customshifts`, 'POST', { name: newCustomShift.name, ccid: newCustomShift.ccid, tasks: newCustomShift.tasks, cmd: newCustomShift.cmd }).then(id =>\n newCustomShift.id = id)\n}\n\nexport async function deleteCustomShift2(customShift) {\n await fetchAndCheckJson(`customshifts/${customShift.id}`, 'DELETE');\n}\n\nexport class CustomShift {\n constructor(usershift, id, name, tasks, contactcenterIds, cmd) {\n if (usershift) {\n this._id = usershift.id\n this._name = usershift.name\n this._tasks = []\n this._contactcenterIds = usershift.contactcenterIds\n this._cmd = usershift.cmd\n } else {\n this._id = id\n this._name = name\n this._tasks = tasks\n this._contactcenterIds = contactcenterIds\n this._cmd = cmd\n }\n this._hasChanges = false\n this._isToDelete = false\n }\n\n get id() {\n return this._id\n }\n\n get name() {\n return this._name\n }\n\n set name(newValue) {\n this._name = newValue\n this._hasChanges = true\n }\n\n get tasks() {\n return this._tasks\n }\n\n set tasks(newValue) {\n this._tasks = newValue\n this._hasChanges = true\n }\n\n get contactcenterIds() {\n return this._contactcenterIds\n }\n\n set contactcenterIds(newValue) {\n this._contactcenterIds = newValue\n this._hasChanges = true\n }\n\n get cmd() {\n return this._cmd\n }\n\n set cmd(newValue) {\n this._cmd = newValue\n this._hasChanges = true\n }\n\n get hasChanges() {\n return this._hasChanges\n }\n confirmChanges() { this._hasChanges = false }\n\n get isToDelete() {\n return this._isToDelete\n }\n toDelete() { this._isToDelete = true }\n}","import { fetchAndCheckJson } from '@/js/dn-fetch.js';\nimport { fromISODate, toISODate } from '@/shared/dn-shared-helper.js';\n\n/**\n * @param {{ email: string, password: string, userName: string, schema: string, customerName: string, \n * st: Date, tz: string, areaId: number, vat: string|null, address:string, person: string, useMode:number, useDepartments:boolean, initialLicenses: number,\n * paymentMethod:number , notify: boolean;countDays?:boolean;initialOverride?:boolean;authExternal?:boolean;\n * refreshTokenDays?:number; stripeId?:string;invoiceEmail?:string;note?:string; setUsers?:number}} data\n */\n\nexport async function addCustomer(data) {\n return await fetchAndCheckJson('customer', 'POST', data);\n}\n\n/**\n * @param {number} id\n * @param {boolean} connectUsers\n */\nexport async function copyCustomer(id, connectUsers) {\n return await fetchAndCheckJson('customer?copy=1', 'POST', { id, connectUsers });\n}\n\n/**\n * @param {string} schema\n */\nexport async function deleteCustomer(schema) {\n return await fetchAndCheckJson('customer/' + schema, 'DELETE');\n}\n\n/**\n * @return {Promise<Customer[]>}\n */\nexport async function getCustomers() {\n return await fetchAndCheckJson('customer', 'GET').then(list => list.map(x => new Customer(x)));\n}\n\n/**\n * @param {{id: number; email?: string; schema: string; name?: string; timezone?: string; endTime?:Date?, \n * features?:{featureId:number, fee:number, st:string, fi:string}[], extraStorage?:number, areaId?:number, \n * initialLicenses?:number, vat?:string, address?:string, person?:string, useMode?:number, useDepartments?:boolean, paymentMethod?:number, \n * update?:boolean;countDays?:boolean;initialOverride?:boolean;authExternal?:boolean;refreshTokenDays?:number;stripeId?:string;invoiceEmail?:string;note?:string;setUsers?:number}} data\n */\n\nexport async function patchCustomer(data) {\n return await fetchAndCheckJson(`customer/${data.schema}`, 'PATCH', data);\n}\n\nexport class Customer {\n\n constructor(data) {\n /** @readonly @type {number} */\n this.id = data.id;\n /** @private @type {string} */\n this._name = data.name;\n /** @type {string} */\n this.schema = data.schema;\n /** @type {string} */\n this.timezone = data.timezone;\n /** @type {string} */\n this.version = data.version;\n /** @type {string} */\n this._email = data.email;\n /** @private @type {number} */\n this._areaId = data.areaId;\n /** @private @type {number} */\n this._initialLicenses = data.initialLicenses;\n /** @private @type {number} */\n this._extraStorage = data.extraStorage;\n /** @private @type {number} */\n this._paymentMethod = data.paymentMethod;\n /** @private @type {string} */\n this._vat = data.vat;\n /** @private @type {string} */\n this._address = data.address;\n /** @private @type {string} */\n this._person = data.person;\n /** @readonly @type {boolean} */\n this.tzOk = data.tzOk;\n /** @private @type {boolean|null} */\n this._countDays = data.countDays;\n /** @private @type {boolean|null} */\n this._initialOverride = data.initialOverride;\n /** @private @type {boolean|null} */\n this._authExternal = data.authExternal;\n /** @private @type {number|null} */\n this._refreshTokenDays = data.refreshTokenDays;\n /** @private @type {number|null} */\n this._useMode = data.useMode;\n /** @private @type {boolean|null} */\n this._useDepartments = data.useDepartments;\n /** @private @type {string|null} */\n this._stripeId = data.stripeId;\n /** @private @type {string} */\n this._invoiceEmail = data.invoiceEmail;\n /** @private @type {string} */\n this._note = data.note;\n /** @private @type {number|null} */\n this._setUsers = data.setUsers;\n\n /** @type {CustomerFeature[]} */\n this.features = CUSTOMER_FEATURE_KEYS.map((x, id) => new CustomerFeature(this, id));\n for (const apiRow of data.features) {\n this.features[apiRow.featureId].init(apiRow);\n }\n\n /** @type {boolean} */\n this.hasChanges = false;\n }\n\n get email() {\n return this._email;\n }\n\n set email(value) {\n this.setValue('_email', value);\n }\n\n get address() {\n return this._address;\n }\n\n set address(value) {\n this.setValue('_address', value);\n }\n\n get authExternal() {\n return this._authExternal;\n }\n\n set authExternal(value) {\n this.setValue('_authExternal', value);\n }\n\n get countDays() {\n return this._countDays;\n }\n\n set countDays(value) {\n this.setValue('_countDays', value);\n }\n\n get areaId() {\n return this._areaId;\n }\n\n set areaId(value) {\n this.setValue('_areaId', value);\n }\n\n get endTime() {\n return this.features[0].fi;\n }\n\n get hasSms() {\n return this.features[2].hasFeat();\n }\n\n get initialLicenses() {\n return this._initialLicenses;\n }\n\n set initialLicenses(value) {\n this.setValue('_initialLicenses', value);\n }\n\n get initialOverride() {\n return this._initialOverride;\n }\n\n set initialOverride(value) {\n this.setValue('_initialOverride', value);\n }\n\n get name() {\n return this._name;\n }\n\n set name(value) {\n this.setValue('_name', value);\n }\n\n get person() {\n return this._person;\n }\n\n set person(value) {\n this.setValue('_person', value);\n }\n\n get extraStorage() {\n return this._extraStorage;\n }\n\n set extraStorage(value) {\n this.setValue('_extraStorage', value);\n }\n\n get paymentMethod() {\n return this._paymentMethod;\n }\n\n set paymentMethod(value) {\n this.setValue('_paymentMethod', value);\n }\n\n get refreshTokenDays() {\n return this._refreshTokenDays;\n }\n\n set refreshTokenDays(value) {\n this.setValue('_refreshTokenDays', value);\n }\n\n get vat() {\n return this._vat;\n }\n\n set vat(value) {\n this.setValue('_vat', value);\n }\n\n get isInvoicesCreated() {\n return this.initialLicenses > 0 && this.features.some(x => x.fee > 0);\n }\n\n get useMode() {\n return this._useMode;\n }\n\n set useMode(value) {\n this.setValue('_useMode', value);\n }\n\n get useDepartments() {\n return this._useDepartments;\n }\n set useDepartments(value) {\n this.setValue('_useDepartments', value);\n }\n\n get stripeId() {\n return this._stripeId;\n }\n set stripeId(value) {\n this.setValue('_stripeId', value);\n }\n\n get invoiceEmail() {\n return this._invoiceEmail;\n }\n set invoiceEmail(value) {\n this.setValue('_invoiceEmail', value);\n }\n\n get note() {\n return this._note;\n }\n set note(value) {\n this.setValue('_note', value);\n }\n\n get setUsers() {\n return this._setUsers;\n }\n set setUsers(value) {\n this.setValue('_setUsers', value);\n }\n\n async save() {\n const data = {\n email: this.email,\n address: this.address,\n areaId: this.areaId,\n authExternal: this.authExternal,\n countDays: this.countDays,\n id: this.id,\n initialLicenses: this.initialLicenses,\n initialOverride: this.initialOverride,\n features: this.features.filter(x => x.st).map(x => x.toApi()),\n name: this.name,\n person: this.person,\n schema: this.schema,\n extraStorage: this.extraStorage,\n paymentMethod: this.paymentMethod,\n refreshTokenDays: this.refreshTokenDays,\n vat: this.vat,\n useMode: this.useMode,\n useDepartments: this.useDepartments,\n stripeId: this.stripeId,\n invoiceEmail: this.invoiceEmail,\n note: this.note,\n setUsers: this.setUsers ? this.setUsers : null\n };\n const result = await patchCustomer(data);\n this._stripeId = result.stripeId;\n this.hasChanges = false;\n }\n\n /**\n * @private\n * @param {string} prop\n * @param {any} value\n */\n setValue(prop, value) {\n if (this[prop] !== value) {\n this[prop] = value;\n this.hasChanges = true;\n }\n }\n}\n\nclass CustomerFeature {\n /**\n * @param {Customer} parent\n * @param {number} featureId\n */\n constructor(parent, featureId) {\n /** @private @readonly @type {Customer} */\n this.parent = parent;\n /** @readonly @type {number} */\n this.featureId = featureId;\n /** @private @type {number} */\n this._fee = 0;\n /** @private @type {Date|null} */\n this._st = null;\n /** @private @type {Date|null} */\n this._fi = null;\n /** @private @type {boolean} */\n this._isInDB = false;\n }\n\n /**\n * @param {{ fee: number; st: string; fi: string |null; }} apiRow\n */\n init(apiRow) {\n this._isInDB = true;\n this._fee = apiRow.fee;\n this._st = fromISODate(apiRow.st);\n if (apiRow.fi !== null)\n this._fi = fromISODate(apiRow.fi);\n }\n\n canStartBeSetToNull(prop) {\n if (prop === 'st')\n return !this._isInDB;\n return true;\n }\n\n get fee() {\n return this._fee;\n }\n\n set fee(value) {\n this.setValue('_fee', value);\n }\n\n get fi() {\n return this._fi;\n }\n\n set fi(value) {\n this.setValue('_fi', value);\n }\n\n get st() {\n return this._st;\n }\n\n set st(value) {\n this.setValue('_st', value);\n }\n\n get name() {\n return CUSTOMER_FEATURE_KEYS[this.featureId];\n }\n\n hasFeat() {\n if (this.st === null)\n return false;\n\n const now = new Date();\n return this.st <= now && (this.fi === null || now <= this.fi)\n }\n\n toApi() {\n return {\n featureId: this.featureId,\n fee: this.fee,\n st: toISODate(this.st),\n fi: toISODate(this.fi),\n };\n }\n\n /**\n * @private\n * @param {string} prop\n * @param {any} value\n */\n setValue(prop, value) {\n if (this[prop] !== value) {\n this[prop] = value;\n this.parent.hasChanges = true;\n }\n }\n}\n\nconst CUSTOMER_FEATURE_KEYS = Object.freeze(['main', 'storage', 'sms', 'adherence']);\n\nexport const CUSTOMER_FEATURE = Object.freeze({ main: 0, storage: 1, sms: 2, adherence: 3 });","import { fetchAndCheckJson } from '@/js/dn-fetch.js';\n\n\nexport async function getDayTypes() {\n /** @type {{id:number;name:string;schemecolor:string;system:boolean}[]} */\n const result = await fetchAndCheckJson('daytypes', 'GET');\n return result.map(x => new DayType(null, x.id, x.name, x.schemecolor, x.system)).sort(function (a, b) {\n return b.system - a.system;\n });\n}\n\n/**\n * @param {DayType[]} daytypes\n */\nexport async function postDayTypes(daytypes) {\n return new Promise((resolve) => {\n let itemsToDelete = []\n let promesis = []\n for (let i = 0; i < daytypes.length; i++) {\n const dayType = daytypes[i];\n if (dayType.isToDelete) {\n promesis.push(fetchAndCheckJson(`daytypes/${dayType.id}`, 'DELETE'))\n itemsToDelete.push(dayType)\n } else if (daytypes[i].hasChanges) {\n if (daytypes[i].id == -1) {\n promesis.push(fetchAndCheckJson(`daytypes`, 'POST', { name: dayType.name, schemecolor: dayType.schemecolor }).then(x => dayType.id = x));\n } else {\n promesis.push(fetchAndCheckJson(`daytypes/${dayType.id}`, 'PUT', { name: dayType.name, schemecolor: dayType.schemecolor }));\n }\n\n dayType.confirmChanges();\n }\n }\n for (let i = 0; i < itemsToDelete.length; i++) {\n var index = daytypes.indexOf(itemsToDelete[i]);\n daytypes.splice(index, 1);\n }\n Promise.all(promesis).then(() => {\n resolve(daytypes);\n }).catch(error => {\n console.error(error.message)\n });\n });\n}\n\nexport class DayType {\n constructor(daytypes,id,name,schemecolor,system){\n if (daytypes){\n this._id = daytypes.id\n this._name = daytypes.name\n this._schemecolor = daytypes.schemecolor\n this._system = daytypes.system\n }\n else{\n this._id = id\n this._name = name\n this._schemecolor = schemecolor\n this._system = system\n }\n this._hasChanges = false\n this._isToDelete = false\n }\n\n get id() {\n return this._id\n }\n\n set id(newValue) {\n this._id = newValue\n }\n\n get system() {\n return this._system\n }\n\n set system(newValue) {\n this._system = newValue\n this._hasChanges = true\n }\n\n get name(){\n return this._name\n }\n\n set name(newValue){\n this._name = newValue\n this._hasChanges = true\n }\n\n get schemecolor(){\n return this._schemecolor\n }\n\n set schemecolor(newValue){\n this._schemecolor = newValue\n this._hasChanges = true\n }\n\n get hasChanges() {\n return this._hasChanges\n }\n confirmChanges(){this._hasChanges=false}\n\n get isToDelete() {\n return this._isToDelete\n }\n toDelete(){this._isToDelete=true}\n\n tostring(){\n return 'name:' + this._name + ' schemecolor: '+ this._schemecolor + 'system:' + this._system\n }\n}","\nimport { CUSTOMER_FEATURE } from '@/model/dn-customer';\nimport { fetchAndCheckJson } from '@/js/dn-fetch.js';\nimport { addDays, getDayDiff, getShortDate, toISODate } from '@/shared/dn-shared-helper.js';\nimport { COLORS } from '@/js/dn-colors.js';\nimport * as dn_uiHelper from \"@/js/dn-uihelper.js\";\n\nconst MONTH_NAMES = getMonthNames();\n\nexport async function getInvoicesByYear() {\n /** @type {{id:number, year:number, month:number,info:{}}[]} */\n const invoices = await fetchAndCheckJson(`invoice?onlyRelevantStatus=0`, 'GET');\n const byYear = [];\n /** @type {null|{year:number, invoices:{id:number, month:number}[]}} */\n let data = null;\n for (const invoice of invoices) {\n if (data === null || data.year !== invoice.year) {\n data = { year: invoice.year, invoices: [] };\n byYear.push(data);\n }\n\n invoice.dt = new Date(invoice.dt)\n\n let info = getInvoiceStatusInfo(invoice)\n data.invoices.push({ id: invoice.id, month: invoice.month, info: info });\n }\n\n return byYear;\n}\n\nexport async function getRelevantWorstInvoiceStatus() {\n const relevantInvoiceStatuses = await fetchAndCheckJson(`invoice?onlyRelevantStatus=1`, 'GET');\n let worstStatus = 0\n for (let i = 0; i < relevantInvoiceStatuses.length; i++) {\n let invoice = relevantInvoiceStatuses[i]\n invoice.dt = new Date(invoice.dt)\n let x = getInvoiceStatusInfo(invoice);\n if (x.status > worstStatus && !(x.status == INVOICE_STATUS.paid || x.status == INVOICE_STATUS.removed)) { worstStatus = x.status }\n }\n return worstStatus\n}\n\nexport async function getInvoices() {\n /** @type {{id:number, year:number, month:number}[]} */\n const invoiceList = await fetchAndCheckJson('invoice', 'GET');\n let invoices = []\n for (let i = 0; i < invoiceList.length; i++) {\n let inv = invoiceList[i]\n inv.invoiceInfo = getInvoiceStatusInfo(inv)\n invoices.push(inv)\n }\n return invoices;\n}\n\n\n\n\n\n/**\n * @param {number} id\n */\nexport async function getInvoice(id) {\n const r = await fetchAndCheckJson('invoice/' + id, 'GET');\n let x = new Invoice(r);\n return x;\n}\n\n/**\n * @param {string} currency\n * @param {number} unit_amount\n * @param {string} itemName\n * @param {string} stripeId\n * @param {string} memo\n */\nexport async function getPaymentLink(currency, unit_amount, itemName, stripeId, memo) {\n const r = await fetchAndCheckJson('payment_link', 'POST', { currency: currency, unit_amount: unit_amount, itemName: itemName, stripeId: stripeId, memo: memo });\n return r;\n}\n\n/**\n * @param {number} id\n * @param {number} status\n * @param {string} paymentLink\n */\nexport async function updateInvoice(id, status = undefined, paymentLink = undefined, users = undefined, scheduled = undefined, payDt = null, paymentLinkId = undefined) {\n const result = await fetchAndCheckJson(`invoice/${id}`, 'PATCH', { status: status, paymentlink: paymentLink, users: users, scheduled: scheduled, payDt: toISODate(payDt), paymentLinkId: paymentLinkId });\n return result\n}\n\n/**\n * @param {number} year\n * @param {number} month\n */\nexport function getTitleDate(year, month) {\n return MONTH_NAMES[month - 1] + '-' + year;\n}\n\nexport function getInvoiceStatus(invoice) {\n\n let x = invoice.status\n if (x === null) { x = 0 }\n if (invoice.payDt && new Date(invoice.payDt) > new Date(\"1980-01-01\")) {\n return INVOICE_STATUS.paid\n }\n\n if (x == INVOICE_STATUS.removed) {\n return x\n } else {\n let dueDate = dn_uiHelper.addDays(new Date(invoice.dt), invoice.paymentTerms)\n let daysDue = (new Date().getTime() - dueDate.getTime()) / (1000 * 60 * 60 * 24) - 7\n if (daysDue < 0) { return x }\n else if (daysDue < 14) { return INVOICE_STATUS.due }\n else { return INVOICE_STATUS.overdue30 }\n }\n}\n\nexport function getInvoiceStatusInfo(i) {\n let status = getInvoiceStatus(i)\n switch (status) {\n case 0:\n return { text: \"\", color: COLORS.lightinfo, status: INVOICE_STATUS.initiated }\n break;\n case 1:\n return { text: \"released\", color: COLORS.lightinfo, status: INVOICE_STATUS.released }\n break;\n case 2:\n return { text: \"downloaded\", color: COLORS.stroke4, status: INVOICE_STATUS.downloaded }\n break;\n case 3:\n return { text: \"due\", color: COLORS.stroke2, status: INVOICE_STATUS.due }\n break;\n case 4:\n return { text: \"overdue\", color: COLORS.stroke3, status: INVOICE_STATUS.overdue30 }\n break;\n case 5:\n return { text: \"paid\", color: COLORS.stroke5, status: INVOICE_STATUS.paid }\n break;\n case 6:\n return { text: \"paid\", color: COLORS.dark, status: INVOICE_STATUS.removed }\n break;\n default:\n break;\n }\n}\n\nexport class Invoice {\n /**\n * @param {{id:number, year:number, month:number, customerId:number, customerName:string, extraStorage:number, currency:string, vat:string|null, address:string, person:string, users:number, scheduled:number, paymentTerms:number, paymentLink:string, status:number, payDt:Date, features:{featureId:number, fee:number; dayCount:number|null}[], \n * stripeId:string, paymentLinkId:string, invoiceEmail:string, note:string, customWork:array}} r\n */\n constructor(r) {\n const invoiceDate = new Date(r.year, r.month - 1);\n /** @type {number} */\n this.daysInMonth = getDayDiff(new Date(r.year, r.month), invoiceDate);\n this.invoiceNumber = r.id;\n this.customerNumber = r.customerId;\n this.invoiceDate = getShortDate(invoiceDate);\n this.customer = r.customerName;\n this.customerAdress = r.address;\n this.name = r.person;\n this.paymentTerms = r.paymentTerms;\n this._status = r.status;\n this.payDt = r.payDt;\n this.dueDate = getShortDate(addDays(invoiceDate, this.paymentTerms));\n this.licences = r.users + r.scheduled;\n this.stripeId = r.stripeId;\n this.paymentLinkId = r.paymentLinkId;\n this.invoiceEmail = r.invoiceEmail;\n this.note = r.note;\n /** @private @type {{featureId:number, fee:number; dayCount:number|null}[]} */\n this._features = r.features;\n let dayFactors = [];\n for (let index = 0; index < r.features.length; index++) {\n const feature = r.features[index];\n let fee = feature.fee;\n if (feature.dayCount !== null && feature.dayCount < this.daysInMonth) {\n dayFactors[feature.featureId] = feature.dayCount / this.daysInMonth;\n } else {\n dayFactors[feature.featureId] = 1;\n }\n if (feature.featureId === CUSTOMER_FEATURE.main) { this.licenceFee = fee }\n if (feature.featureId === CUSTOMER_FEATURE.storage) { this.storageFee = fee }\n if (feature.featureId === CUSTOMER_FEATURE.sms) { this.smsFee = fee }\n if (feature.featureId === CUSTOMER_FEATURE.adherence) { this.adherenceFee = fee }\n }\n this.storageAmount = r.extraStorage;\n this.currency = r.currency;\n if (this.currency == 'USD') {\n this.iban = 'SE6650000000050598297065';\n } else {\n this.iban = 'SE9550000000051671037391';\n }\n this.bic = 'ESSESESS';\n this.paymentLink = r.paymentLink;\n this.totalCustomWork = 0;\n if(r.customWork.length>0){\n for(let i=0;i<r.customWork.length;i++){\n this.totalCustomWork += this.round2(r.customWork[i].workHours * r.customWork[i].workRate);\n }\n }\n this.customWork = r.customWork;\n this.title = getTitleDate(r.year, r.month);\n this.licenseTotal = this.round2(this.licenceFee * this.licences * dayFactors[CUSTOMER_FEATURE.main]);\n this.smsTotal = this.round2(this.smsFee * this.licences * dayFactors[CUSTOMER_FEATURE.sms]);\n this.adherenceTotal = this.round2(this.adherenceFee * this.licences * dayFactors[CUSTOMER_FEATURE.adherence]);\n this.storageTotal = this.round2(this.storageFee * this.storageAmount * this.licences * dayFactors[CUSTOMER_FEATURE.storage]);\n let total = this.round2(this.licenseTotal + (this.smsTotal ? this.smsTotal : 0) + (this.storageTotal ? this.storageTotal : 0) + (this.adherenceTotal ? this.adherenceTotal : 0));\n if (r.stripeId) { this.creditCardFee = this.round2(total * 0.035) }\n this.total = (this.licenseTotal + (this.smsTotal ? this.smsTotal : 0) + (this.storageTotal ? this.storageTotal : 0) + (this.adherenceTotal ? this.adherenceTotal : 0) + (this.creditCardFee ? this.creditCardFee : 0) + this.totalCustomWork);\n }\n\n\n\n\n\n /**\n * @param {number} amount\n */\n round2(amount) {\n return Math.round(amount * 100) / 100\n }\n\n /**\n * @param {number} featureId\n */\n getDayInfo(featureId) {\n for (const feature of this._features) {\n if (feature.featureId === featureId) {\n if (feature.dayCount !== null && feature.dayCount < this.daysInMonth) {\n return ` (${feature.dayCount} days)`;\n }\n return '';\n }\n }\n }\n}\n\nfunction getMonthNames() {\n const monthFormat = new Intl.DateTimeFormat(['en-US'], { month: 'short' });\n const monthNames = [];\n for (let m = 0; m < 12; m++) {\n const dt = new Date(2000, m);\n monthNames.push(monthFormat.format(dt).toLowerCase());\n }\n return Object.freeze(monthNames);\n}\n\nexport const INVOICE_STATUS = createInvoiceStatus();\nfunction createInvoiceStatus() {\n const enumObject = {\n initiated: 0,\n released: 1,\n downloaded: 2,\n due: 3,\n overdue30: 4,\n paid: 5,\n removed: 6,\n };\n\n return Object.freeze(enumObject);\n}\n\nexport async function checkInvoicesStatus() {\n await fetchAndCheckJson(`payment_link`, 'GET');\n}","export class LoginInfo {\n\n /**\n * @param {{ timestamp?: number;accessToken: string; refreshToken?: string; customerSchema?: string; loginKind?:number; isAgent?: boolean; }} data\n */\n constructor(data) {\n /** @type {string} */\n this._accessToken = data.accessToken;\n /** @type {string} */\n this._refreshToken = data.refreshToken;\n /** @private @type {number} */\n this.timestamp = data.timestamp !== undefined ? data.timestamp : Date.now();\n /** @type {string} */\n this.customerSchema = data.customerSchema !== undefined ? data.customerSchema : '';\n /** @private @type {number} */\n this._loginKind = data.loginKind !== undefined ? data.loginKind : LOGIN_KIND.normal;\n if (data.isAgent)\n this._loginKind = LOGIN_KIND.agent;\n }\n\n get accessToken() {\n return this._accessToken;\n }\n\n get refreshToken() {\n return this._refreshToken;\n }\n\n get isAgent() {\n return this._loginKind === LOGIN_KIND.agent;\n }\n\n get isSuperAdmin() {\n return this._loginKind === LOGIN_KIND.superAdmin;\n }\n\n /**\n * @param {{ isSuperAdmin: boolean; isAgent: boolean; }} currentUser\n */\n setLoginKind(currentUser) {\n if (currentUser.isSuperAdmin) {\n this._loginKind = LOGIN_KIND.superAdmin;\n } else if (currentUser.isAgent) {\n this._loginKind = LOGIN_KIND.agent;\n } else {\n this._loginKind = LOGIN_KIND.normal;\n }\n }\n\n needRefresh() {\n if (!this._refreshToken) { return false; }\n return Date.now() - this.timestamp > 1000 * 60 * 60 * 22;\n }\n\n /**\n * @param {{ accessToken: string; refreshToken: string; }} authResult\n */\n setAuthRefreshResult(authResult) {\n this.timestamp = Date.now();\n this._accessToken = authResult.accessToken;\n this._refreshToken = authResult.refreshToken;\n }\n\n toStore() {\n return { accessToken: this.accessToken, refreshToken: this.refreshToken,\n customerSchema: this.customerSchema, loginKind: this._loginKind, timestamp: this.timestamp };\n }\n}\n\nconst LOGIN_KIND = createLoginKindEnum();\n\nfunction createLoginKindEnum() {\n const enumObject = {\n normal: 0,\n agent: 1,\n superAdmin: 2,\n };\n\n return Object.freeze(enumObject);\n}","// @ts-check\nimport { fetchAndCheckJson } from '@/js/dn-fetch.js';\nimport { isSubset } from '@/js/dn-helper';\nimport { Shift } from '@/model/dn-shift.js';\n\n/**\n* @typedef {Object} OptimizableShiftDtoType\n* @property {number[]} dayList\n* @typedef {import(\"@/model/dn-shift.js\").ShiftDto & OptimizableShiftDtoType} OptimizableShiftDto\n*/\n\n/**\n* @typedef {{id:number|null, shifts:OptimizableShiftDto[], employeeIdList:number[]}} OptimizableShiftGroupDto\n*/\n\n/**\n * @param {number} ccId\n */\nexport async function getShiftBags(ccId) {\n /** @type {OptimizableShiftGroupDto[]} */\n const dto = await fetchAndCheckJson('optimizable-shift?ccId=' + ccId, 'GET');\n return new ShiftBags(dto);\n}\n\n/**\n * @param {OptimizableShiftGroupDto[]} rows\n */\nfunction createShiftBagByEmp(rows) {\n /** @type {Map<number, OptimizableShiftGroup>} */\n const byEmpId = new Map();\n for (const r of rows) {\n const optimizableShiftGroup = new OptimizableShiftGroup(r);\n for (const employeeId of optimizableShiftGroup.employeeIdList) {\n byEmpId.set(employeeId, optimizableShiftGroup);\n }\n }\n return byEmpId;\n}\n\nexport class ShiftBags {\n /**\n * @param {OptimizableShiftGroupDto[]} dto\n */\n constructor(dto) {\n /** @readonly @type {OptimizableShiftGroupDto[]} */\n this.dto = dto;\n }\n\n get byEmp() {\n if (this._byEmp === undefined) {\n /** @private @type {Map<number, OptimizableShiftGroup>} */\n this._byEmp = createShiftBagByEmp(this.dto);\n }\n\n return this._byEmp;\n }\n}\n\nexport class OptimizableShiftGroup {\n /**\n * @param {OptimizableShiftGroupDto} dto\n */\n constructor(dto) {\n /** @private @type {number|null} */\n this._id = dto.id;\n /** @type {OptimizableShift[]} */\n this.shifts = dto.shifts.map(s => new OptimizableShift(s));\n /** @readonly @type {number[]} */\n this.employeeIdList = dto.employeeIdList.slice();\n }\n\n get id() {\n return this._id;\n }\n\n clone() {\n return new OptimizableShiftGroup(this.toDto());\n }\n\n /**\n * @param {Date} dt\n * @param {import(\"@/model/dn-shift.js\").DayBounds} dayBounds\n * @param {Map<number, import(\"@/shared/dn-tasktype.js\").TaskType>} taskTypeMap\n */\n hasAllowedShifts(dt, dayBounds, taskTypeMap) {\n return this.shifts.some(x => x.isAllowed(dt, dayBounds, taskTypeMap));\n }\n\n /**\n * @param {Date} dt\n * @param {import(\"@/model/dn-shift.js\").DayBounds} dayBounds\n * @param {Map<number, import(\"@/shared/dn-tasktype.js\").TaskType>} taskTypeMap\n */\n getBounds(dt, dayBounds, taskTypeMap) {\n const bounds = { stMin: 96, fiMax: 0 };\n for (const shift of this.shifts) {\n if (shift.isAllowed(dt, dayBounds, taskTypeMap)) {\n shift.setMaxBounds(bounds, taskTypeMap);\n }\n }\n return bounds;\n }\n\n isValid() {\n return this.shifts.every(x => x.isValid());\n }\n\n /**\n * @param {number[]} checkedEmps\n */\n async save(checkedEmps) {\n const dto = this.toDto();\n checkedEmps.sort();\n this.employeeIdList.sort();\n if (!isSubset(checkedEmps, this.employeeIdList)) {\n dto.id = null;\n }\n\n if (dto.id === null) {\n for (const shift of dto.shifts) {\n shift.id = null;\n }\n }\n\n dto.employeeIdList = checkedEmps;\n await fetchAndCheckJson('optimizable-shift', 'POST', dto);\n }\n\n /** @returns {OptimizableShiftGroupDto} */\n toDto() {\n return {\n id: this.id,\n shifts: this.shifts.map(x => x.toDto()),\n employeeIdList: this.employeeIdList\n };\n }\n}\n\nexport class OptimizableShift extends Shift {\n /**\n * All units in quarter hours\n * @param {OptimizableShiftDto} data\n */\n constructor(data) {\n super(data)\n /** @type {number[]} If empty list is valid for all days. Values are Sunday = 0, Monday = 1, ... */\n this._dayList = (data.dayList === null || data.dayList.length === 0) ? [0, 1, 2, 3, 4, 5, 6] : data.dayList;\n }\n\n get dayList() {\n return this._dayList;\n }\n\n set dayList(value) {\n this.setValue('_dayList', value);\n }\n\n /**\n * @param {Date} dt\n * @param {import(\"@/model/dn-shift.js\").DayBounds} dayBounds\n * @param {Map<number, import(\"@/shared/dn-tasktype.js\").TaskType>} taskTypeMap\n */\n isAllowed(dt, dayBounds, taskTypeMap) {\n return this.isAllowedDate(dt) && this.isDayBoundsOk(dayBounds, taskTypeMap) && (this.isFix || this.stMin < this.fiMax);\n }\n\n /**\n * @private\n * @param {Date} dt\n */\n isAllowedDate(dt) {\n if (this.dayList.length === 0)\n return true;\n return this.dayList.includes(dt.getDay());\n }\n\n toDto() {\n /** @type {OptimizableShiftDto} */\n // @ts-ignore\n const dto = super.toDto();\n if (this._dayList.length === 7) {\n dto.dayList = [];\n } else {\n dto.dayList = this.dayList;\n }\n return dto;\n }\n}\n\n/**\n * @param {number} ttId\n */\nexport function createNewOptimizableShift(ttId) {\n return new OptimizableShift({ id: null, dayList: [], fixTasks: [], flexTasks: [{ st: 24, stSpan: 0, fi: 72, fiSpan: 0, dur: 48, durSpan: 0, step: 1, taskTypeId: ttId, kind: 0 }] });\n}\n\n/**\n * @param {number[]} checkedEmps\n */\nexport async function deleteShiftBag(checkedEmps) {\n /** @type {{id:number|null, shifts:OptimizableShiftDto[], employeeIdList:number[]}} */\n const data = {\n id: null,\n shifts: [],\n employeeIdList: checkedEmps\n };\n await fetchAndCheckJson('optimizable-shift', 'POST', data);\n}","export class RequestItem {\n /**\n * @param {number} id\n * @param {boolean|null} approved\n * @param {Date} created\n */\n constructor(id, approved, created) {\n /** @type {number} */\n this.id = id;\n /** @type {Date} */\n this.created = created;\n /** @type {boolean|null} */\n this.approved = approved;\n /** @private @type {boolean} */\n this._pending = false;\n }\n\n get days() {\n return 1;\n }\n\n get employeeCount() {\n return 1;\n }\n\n get employeesToDisplay() {\n return [];\n }\n\n get isRejected() {\n return this.approved === false;\n }\n\n get isApproved() {\n return this.approved === true;\n }\n\n get isOpen() {\n return !(this.isApproved || this.isRejected);\n }\n\n get isPending() {\n return this._pending;\n }\n\n get isPost() {\n return false;\n }\n\n get isTrade() {\n return false;\n }\n\n get iconName() {\n return '';\n }\n\n get key() {\n return this.id;\n }\n\n /**\n * @param {string} timezone\n * @returns {string[]}\n */\n getSelectionKeys(timezone) {\n return [];\n }\n\n /**\n * @param {{ id: number; }} employee\n */\n canDelete(employee = null) { // eslint-disable-line no-unused-vars\n return false;\n }\n\n canEdit() {\n return false;\n }\n\n canEvaluate() {\n return false;\n }\n\n canReopen() {\n return false;\n }\n\n /**\n * @param {{ id: number; }} employee\n */\n canReply(employee = null) { // eslint-disable-line no-unused-vars\n return false;\n }\n\n /**\n * @param {boolean} approved\n * @param {{ id: number; }| undefined} employee\n */\n canReplyWithAnswer(approved, employee) {\n if (!employee)\n return true;\n\n return this.canReplyWithAnswerEmp(approved, employee);\n }\n\n /**\n * @protected\n * @param {boolean} approved\n * @param {{ id: number; }} employee\n */\n canReplyWithAnswerEmp(approved, employee) { // eslint-disable-line no-unused-vars\n return false;\n }\n\n async deleteRequest() {\n }\n\n /**\n * @param {number} index\n */\n getEmployeeIdByIndex(index) { // eslint-disable-line no-unused-vars\n return 0;\n }\n\n getMsgToDisplay() {\n return '';\n }\n\n getReplyMsg() {\n return '';\n }\n\n /**\n * @param {number} index\n */\n getNumberOfStarsByIndex(index) { // eslint-disable-line no-unused-vars\n return 0;\n }\n\n /**\n * @param {{ id: number; }} employee\n * @returns {{id:number;msg:string;numberOfStars?:number}}\n */\n getReplyObj(employee) { // eslint-disable-line no-unused-vars\n return undefined;\n }\n\n /**\n * @param {any} srEmp\n * @param {string} language\n * @param {string} timeZone\n * @returns {string[]}\n */\n getTasksInfo(srEmp, language, timeZone) { // eslint-disable-line no-unused-vars\n return [];\n }\n\n /**\n * @param {string} key\n * @param {string} timezone\n */\n hasSelectionKey(key, timezone) { // eslint-disable-line no-unused-vars\n return false;\n }\n\n async reopen() {\n }\n\n setAsNonPending() {\n this._pending = false;\n }\n\n /** @protected */\n setPendingState() {\n this._pending = this.approved !== null;\n }\n\n /** @returns {Date[]} */\n affectedScheduleInterval() {\n return [];\n }\n\n /**\n * @param {import(\"@/model/dn-schedule-task.js\").ScheduleTasks} scheduleTasks\n * @param {import(\"@/shared/dn-tasktype.js\").TaskTypes} taskTypes\n * @param {import(\"@/shared/dn-employee.js\").Employee} employee\n * @param {boolean|null} approve\n * @param {{id:number;msg:string;numberOfStars?:number}} reply\n * @returns {Promise<{ok:boolean; affectedDates?:Set<string>; toastMsg?:string;}>}\n */\n async toggleApproval(scheduleTasks, taskTypes, employee, approve, reply) { // eslint-disable-line no-unused-vars\n return { ok: false };\n }\n}","import { fetchAndCheckJson } from '@/js/dn-fetch.js';\nimport { isSubset } from '@/js/dn-helper';\nimport { Shift } from '@/model/dn-shift.js';\nimport {getShiftWorkTime} from '@/model/dn-shift.js';\nimport { fromISODate, getDayDiff, toISODate } from '@/shared/dn-shared-helper.js';\n\n/**\n* @typedef {{id?:number, st:string, weeks:number, employeeIdList:number[], days:{dayIndex:number, shiftId:number}[], shifts:import(\"@/model/dn-shift.js\").ShiftDto[]}} RotationDto\n*/\n\n/**\n* @typedef {Object} SaveRotationDtoType\n* @property {number[]} days\n* @typedef {import(\"@/model/dn-shift.js\").ShiftDto & SaveRotationDtoType} SaveRotationShiftDto\n*/\n\nfunction createNewRotation() {\n return new Rotation({ st: '2020-01-06', weeks: 0, shifts: [], employeeIdList: [], days: [] });\n}\n\n/**\n * @param {number} ccId\n * @returns {Promise<Rotations>}\n */\nexport async function getRotations(ccId) {\n const dto = await fetchAndCheckJson('rotation?ccId=' + ccId, 'GET');\n return new Rotations(dto);\n}\n\n/**\n * @param {RotationDto[]} rows\n */\nfunction createRotationByEmp(rows) {\n /** @type {Map<number, Rotation>} */\n const byEmpId = new Map();\n for (const r of rows) {\n const rotation = new Rotation(r);\n for (const employeeId of rotation.employeeIdList) {\n byEmpId.set(employeeId, rotation);\n }\n }\n\n return byEmpId;\n}\n\nexport class Rotations {\n /**\n * @param {RotationDto[]} dto\n */\n constructor(dto) {\n /** @readonly @type {RotationDto[]} */\n this.dto = dto;\n }\n\n get byEmp() {\n if (this._byEmp === undefined) {\n /** @private @type {Map<number, Rotation>} */\n this._byEmp = createRotationByEmp(this.dto);\n }\n\n return this._byEmp;\n }\n\n /**\n * @param {number} employeeId\n */\n create(employeeId) {\n const rotation = this.byEmp.get(employeeId);\n if (rotation) {\n for (const r of this.dto) {\n if (r.id === rotation.id) {\n return new Rotation(r);\n }\n }\n } else {\n return createNewRotation();\n }\n }\n}\n\nexport class Rotation {\n /**\n * @param {RotationDto} dto\n */\n constructor(dto) {\n /** @type {Map<number, import(\"@/model/dn-shift.js\").Shift>} */\n const byShiftId = new Map();\n for (const s of dto.shifts) {\n byShiftId.set(s.id, new Shift(s));\n }\n\n /** @type {Shift[]} */\n const shifts = new Array(dto.weeks * 7).fill(null);\n for (const d of dto.days) {\n shifts[d.dayIndex] = byShiftId.get(d.shiftId);\n }\n\n /** @private @type {number|null} */\n this._id = dto.id ? dto.id : null;\n /** @type {number} */\n this.weeks = dto.weeks;\n /** @type {Date} */\n this.st = fromISODate(dto.st);\n /** @type {Shift[]} */\n this.shifts = shifts;\n /** @readonly @type {number[]} */\n this.employeeIdList = dto.employeeIdList;\n }\n\n get id() {\n return this._id;\n }\n\n /**\n * @param {Date} dt\n */\n getShift(dt) {\n if (dt.getTime() < this.st.getTime())\n return null;\n const days = getDayDiff(dt, this.st);\n const index = days % (7 * this.weeks);\n return this.shifts[index];\n }\n\n /**\n * @param {Shift[]} shiftByDay\n * @param {number[]} checkedEmps\n */\n async save(shiftByDay, checkedEmps) {\n let id = this.id;\n checkedEmps.sort();\n if (!isSubset(checkedEmps, this.employeeIdList)) {\n id = null;\n }\n\n const shifts = [];\n /** @type {SaveRotationShiftDto[]} */\n const shiftDtos = [];\n for (let dayIndex = 0; dayIndex < shiftByDay.length; dayIndex++) {\n const s = shiftByDay[dayIndex];\n if (s && !s.isEmpty) {\n let found = false;\n for (let i = 0; i < shifts.length; i++) {\n const s2 = shifts[i];\n if (s.isEqual(s2)) {\n found = true;\n shiftDtos[i].days.push(dayIndex);\n break;\n }\n }\n\n if (!found) {\n shifts.push(s);\n /** @type {SaveRotationShiftDto} */\n // @ts-ignore\n const dto = s.toDto();\n dto.days = [dayIndex];\n shiftDtos.push(dto);\n }\n }\n }\n\n if (id === null) {\n for (const s of shiftDtos) {\n s.id = null;\n }\n } else {\n const idList = [];\n for (const s of shiftDtos) {\n if (s.id !== null) {\n if (idList.includes(s.id)) {\n s.id = null;\n } else {\n idList.push(s.id);\n }\n }\n }\n }\n\n const data = {\n id: id,\n st: toISODate(this.st),\n weeks: shiftByDay.length / 7,\n shifts: shiftDtos,\n employeeIdList: checkedEmps\n };\n await fetchAndCheckJson('rotation', 'POST', data);\n }\n\n /**\n * @param {Map<number, import(\"@/shared/dn-tasktype.js\").TaskType>} taskTypeMap\n * @param {import(\"@/model/dn-break-settings.js\").BreakSettings[]} breakSettings\n */\n getWeeklyWorkTime(breakSettings,taskTypeMap){\n if(breakSettings&&taskTypeMap){\n for(const bs of breakSettings){\n bs.calculateUnpaidDuration(taskTypeMap)\n }\n }\n let minWork =0 \n let maxWork =0\n let includeFlexShift=false\n for (const sh of this.shifts) {\n if(sh){\n let work = getShiftWorkTime(sh,taskTypeMap,breakSettings)\n minWork+=work.minWork\n maxWork+=work.maxWork\n if(work.includeFlexShift){includeFlexShift=true}\n }\n }\n if(this.weeks>1){\n minWork=minWork/this.weeks\n maxWork=maxWork/this.weeks\n }\n return {'minWork':minWork,'maxWork':maxWork,'includeFlexShift':includeFlexShift}\n }\n}\n\n/**\n * @param {number[]} checkedEmps\n */\nexport async function deleteRotation(checkedEmps) {\n /** @type {RotationDto} */\n const data = {\n id: null,\n st: toISODate(new Date()),\n days: [],\n weeks: 0,\n shifts: [],\n employeeIdList: checkedEmps\n };\n await fetchAndCheckJson('rotation', 'POST', data);\n}","import { EventBus } from \"@/js/dn-event-bus.js\";\nimport { fetchAndCheckJson } from '@/js/dn-fetch.js';\nimport { getSelectionKey } from '@/js/dn-helper.js';\nimport { getTask, getTimeNow } from '@/js/dn-schedule-helper.js';\nimport { getDateOfInstant } from '#shared/dn-timezone';\nimport { getDurationInMinutes } from '@/js/dn-uihelper.js';\nimport { getShiftBounds } from \"#shared/dn-employee-schedule\";\nimport { RequestItem } from '@/model/dn-request-item.js';\nimport { addDays, getShortDate, getStartOfDay, sortDateIntervals } from '@/shared/dn-shared-helper.js';\nimport { Task } from '@/shared/dn-task';\nimport { TASK_KIND } from '@/shared/dn-tasktype.js';\nimport { useDataStore } from \"@/stores/dataStore.js\";\nimport { useScheduleStore } from \"@/stores/scheduleStore.js\";\n\nexport class ScheduleRequest extends RequestItem {\n\n /**\n * @param {ScheduleRequestEmployee[]} employees\n * @param {number} callCenterId\n * @param {number} kind\n * @param {number|null} days\n * @param {string} msg\n * @param {boolean|null} approved\n * @param {Date|undefined} created\n * @param {Date|undefined} updated\n */\n constructor(employees, callCenterId, kind, days = null, msg = '', approved = null, id = undefined, created = undefined, updated = undefined) {\n super(id, approved, created);\n /** @type {Date | undefined} */\n this.updated = updated;\n /** @readonly @type {ScheduleRequestEmployee[]} */\n this.employees = employees;\n /** @readonly @type {number} */\n this.callCenterId = callCenterId;\n /** @readonly @type {number} */\n this.kind = kind;\n /** @private @readonly @type {number} */\n this._days = days ? days : 1;\n /** @type {string} */\n this.msg = msg;\n /** @private @type {boolean} */\n this._evaluate = false;\n if (this.kind === REQUEST_KIND.post) {\n /** @type {Date} */\n let dt = undefined;\n for (const srEmp of this.employees) {\n for (const t of srEmp.tasks) {\n if (t.scheduleTask !== null && (dt === undefined || t.scheduleTask.st < dt)) {\n dt = t.scheduleTask.st;\n }\n }\n }\n for (const srEmp of this.employees) {\n srEmp.starts.push(dt);\n }\n } else {\n for (const srEmp of this.employees) {\n const dtFrom = getStartFrom(srEmp.employeeId);\n if (dtFrom !== undefined)\n srEmp.starts.push(dtFrom);\n const dtTo = getStartTo(srEmp);\n if (dtTo !== undefined)\n srEmp.starts.push(dtTo);\n }\n }\n\n function getStartFrom(employeeId) {\n let dt = undefined;\n for (const srEmp of employees) {\n if (srEmp.employeeId !== employeeId) {\n for (const t of srEmp.tasks) {\n if (t.scheduleTask !== null && t.scheduleTask.empId === employeeId && (dt === undefined || t.scheduleTask.st < dt)) {\n dt = t.scheduleTask.st;\n }\n }\n }\n }\n\n return dt;\n }\n\n function getStartTo(srEmp) {\n let dt = undefined;\n for (const t of srEmp.tasks) {\n if (dt === undefined || t.st < dt) {\n dt = t.st;\n }\n }\n\n return dt;\n }\n }\n\n get days() {\n return this._days\n }\n\n get employeeCount() {\n return this.employees.length;\n }\n\n get iconName() {\n switch (this.kind) {\n case REQUEST_KIND.post:\n return 'swap';\n case REQUEST_KIND.sick:\n return 'sick';\n case REQUEST_KIND.free:\n return 'free';\n case REQUEST_KIND.vacation:\n return 'vacation';\n case REQUEST_KIND.trade:\n return 'swap';\n case REQUEST_KIND.work:\n {\n if (this.isApproved) {\n return 'work_glad';\n } else if (this.isRejected) {\n return 'work_sad'\n }\n else {\n return 'work';\n }\n }\n }\n\n return 'work';\n }\n\n get isPost() {\n return this.kind === REQUEST_KIND.post;\n }\n\n get isRejected() {\n if (this.approved === null) {\n return this.employees.some(x => x.approved === false);\n }\n return this.approved == false\n }\n get isTrade() {\n if (this.employees.length <= 1)\n return false;\n let empIds = [];\n for (const srEmp of this.employees) {\n for (const srTask of srEmp.tasks) {\n if (srTask.scheduleTask !== null && !empIds.some(x => x === srTask.scheduleTask.empId)) {\n empIds.push(srTask.scheduleTask.empId);\n }\n }\n }\n\n return empIds.length > 1;\n }\n\n /** @returns {Date[]} */\n affectedScheduleInterval() {\n /** @type {Date} */\n let st;\n /** @type {Date} */\n let fi;\n for (const srEmp of this.employees) {\n for (const requestTask of srEmp.tasks) {\n if (requestTask.scheduleTask) {\n const t = requestTask.scheduleTask;\n if (!st || st < t.st) {\n st = t.st;\n }\n if (!fi || fi > t.fi) {\n fi = t.fi;\n }\n }\n }\n }\n if (st && fi) {\n return [getStartOfDay(st), getStartOfDay(fi)];\n }\n return [];\n }\n\n /**\n * @param {import(\"#shared/dn-employee-schedule\").EmployeeSchedule} schedule\n */\n canBePicked(schedule) {\n if (this.approved !== null)\n return false;\n\n if (this.employees[0].employeeId === schedule.emp.id)\n return false;\n\n for (let index = 1; index < this.employees.length; index++) {\n if (this.employees[index].employeeId === null) {\n return this.possibleWithSchedule(schedule);\n }\n }\n\n return false;\n }\n get evaluate() {\n return this._evaluate\n }\n set evaluate(value) {\n this._evaluate = value\n }\n\n /**\n * @param {string} timezone\n * @returns {string[]}\n */\n getSelectionKeys(timezone) {\n const keys = [];\n const maxCount = this.approved === true ? 2 : this.employees.length;\n let count = 0;\n\n for (const srEmp of this.employees) {\n if (count >= maxCount) { break; }\n count += 1;\n if (srEmp.employeeId !== null) {\n for (const st of srEmp.starts) {\n const stLocal = getDateOfInstant(st, timezone);\n let d = 0;\n while (d < this.days) {\n const dt = d > 0 ? addDays(stLocal, d) : stLocal;\n const key = getSelectionKey(dt, srEmp.employeeId);\n if (!keys.includes(key)) { keys.push(key) }\n d++;\n }\n\n }\n }\n }\n return keys\n }\n\n canReopen() {\n return !this.isPending && !this.isOpen;\n }\n\n /**\n * @param {{ showSick: boolean; showVacation: boolean; showFree: boolean; showWork: boolean; showBasedOnSelection: boolean; showFuture: boolean; showHistoric: boolean; showPending: boolean; showApproved: boolean; showRejected: boolean;tagId: number }} filter\n * @param {Date} future\n * @param {number} selectedEmpId\n */\n isFilterOk(filter, future, selectedEmpId) {\n\n\n if (this.approved === null && !this.canReply()) {\n return false;\n }\n\n if (this.kind === REQUEST_KIND.sick) {\n if (!filter.showSick) { return false; }\n } else if (this.kind === REQUEST_KIND.vacation) {\n if (!filter.showVacation) { return false; }\n } else if (this.kind === REQUEST_KIND.free) {\n if (!filter.showFree) { return false; }\n } else if (this.kind === REQUEST_KIND.work || this.kind === REQUEST_KIND.trade || this.kind === REQUEST_KIND.post) {\n if (!filter.showWork) { return false; }\n }\n\n let okByDate = true\n let okBySelectedEmps = true\n if (filter.showBasedOnSelection) {\n okBySelectedEmps = false\n for (const srEmp of this.employees) {\n if (srEmp.employeeId === selectedEmpId) {\n okBySelectedEmps = true;\n break;\n }\n }\n }\n let okByTag= true\n if(filter.tagId>0){\n okByTag=false\n for (const srEmp of this.employees) {\n let tagList= [filter.tagId]\n let emp= useScheduleStore().employees.list.find(x => x.id==srEmp.employeeId)\n if (emp&&emp.hasAnyTag(tagList)) {\n okByTag=true\n }\n }\n };\n \n let dtRange = this.getDateRange()\n if (dtRange[0] > future && !filter.showFuture) { okByDate = false }\n if (dtRange[1] < getTimeNow() && !filter.showHistoric) { okByDate = false }\n\n let okByApproval = false;\n if (filter.showPending && this.isPending) { okByApproval = true }\n if (this.isApproved && filter.showApproved) { okByApproval = true }\n if (this.isRejected && filter.showRejected) { okByApproval = true }\n if (this.isOpen) { okByApproval = true }\n\n return okByApproval && okBySelectedEmps && okByDate&&okByTag;\n }\n\n /**\n * @private\n * @param {import(\"#shared/dn-employee-schedule\").EmployeeSchedule} schedule\n */\n possibleWithSchedule(schedule) {\n const di = schedule.dateInterval;\n const dt = di.byIndex ? di.byIndex(0).dtLocal : di.st;\n const employeeId = schedule.emp.id;\n for (const srEmp of this.employees) {\n if (srEmp.employeeId === employeeId || srEmp.employeeId === null) {\n let ok = false;\n if (di.byIndex) {\n for (const start of srEmp.starts) {\n if (start >= di.byIndex(0).dt && start < di.byIndex(1).dt) {\n ok = true;\n }\n }\n } else {\n for (const start of srEmp.starts) {\n if (start.getFullYear() === dt.getFullYear() && start.getMonth() === dt.getMonth() && start.getDate() === dt.getDate()) {\n ok = true;\n }\n }\n }\n\n if (!ok)\n return false;\n\n for (const srTask of srEmp.tasks) {\n for (const t of schedule.tasks) {\n if (t.overlaps(srTask.st, srTask.fi))\n return false;\n }\n }\n\n return true;\n }\n }\n\n return false;\n }\n /**\n * @param {string} key\n * @param {string} timezone\n */\n hasSelectionKey(key, timezone) {\n const maxCount = this.approved === true ? 2 : this.employees.length;\n let count = 0;\n for (const srEmp of this.employees) {\n if (count >= maxCount) { break; }\n count += 1;\n if (srEmp.employeeId !== null) {\n for (const st of srEmp.starts) {\n const stLocal = getDateOfInstant(st, timezone);\n let d = 0;\n while (d < this.days) {\n const dt = d > 0 ? addDays(stLocal, d) : stLocal;\n if (getSelectionKey(dt, srEmp.employeeId) === key)\n return true;\n d++;\n }\n }\n }\n }\n return false;\n }\n\n getDateRange() {\n let returnRange = [new Date(1970, 1, 1, 0, 0, 0, 0), new Date(2270, 1, 1, 0, 0, 0, 0)]\n for (const srEmp of this.employees) {\n for (const dt of srEmp.starts) {\n if (dt > returnRange[0]) { returnRange[0] = dt }\n const dtEnd = this.days > 1 ? addDays(dt, this.days - 1) : dt;\n if (dtEnd < returnRange[1]) { returnRange[1] = dtEnd }\n }\n }\n return returnRange\n }\n\n /** @private */\n clearPick() {\n if (this.kind === REQUEST_KIND.post) {\n const replyEmp = this.employees[1];\n replyEmp.employeeId = null;\n replyEmp.msg = '';\n replyEmp.numberOfStars = 0;\n }\n }\n\n /**\n * @param {import(\"@/shared/dn-task.js\").Task[]} scheduleTasks\n * @param {Set<string>} affectedDates\n */\n approveToggle(scheduleTasks, affectedDates) {\n if (!this.isValid(scheduleTasks))\n return false;\n const revert = this.approved === true;\n if (revert) { this.clearPick(); }\n this.performChange(scheduleTasks, getTask, revert);\n this.addToAffectedDates(affectedDates);\n this.approved = revert ? null : true;\n this.evaluate = false;\n this.setPendingState();\n return true;\n }\n\n canEdit() {\n return this.isOpen && !this.isTrade;\n }\n\n /**\n * @param {number} index\n */\n getEmployeeIdByIndex(index) {\n return this.employees[index].employeeId;\n }\n\n /**\n * @param {number} index\n */\n getNumberOfStarsByIndex(index) {\n return this.employees[index].numberOfStars;\n }\n\n /**\n * @param {ScheduleRequestEmployee} picked\n */\n selectPickEmployee(picked) {\n const replyEmp = this.employees[1];\n replyEmp.employeeId = picked.employeeId;\n replyEmp.approved = true;\n replyEmp.msg = picked.msg;\n replyEmp.numberOfStars = picked.numberOfStars;\n }\n\n /**\n * @param {import(\"@/shared/dn-task.js\").Task[]} scheduleTasks\n * @param {Set<string>} affectedDates\n */\n rejectToggle(scheduleTasks, affectedDates) {\n const revert = this.approved === false;\n if (this.approved === true) {\n if (!this.isValid(scheduleTasks))\n return false;\n this.clearPick();\n this.performChange(scheduleTasks, getTask, true);\n this.addToAffectedDates(affectedDates);\n }\n\n this.approved = revert ? null : false;\n this.evaluate = false\n this.setPendingState();\n return true;\n }\n\n async reopen() {\n await reopenScheduleRequest(this.id);\n this.approved = null;\n if (this.kind === REQUEST_KIND.post) {\n const replyEmp = this.employees[1];\n replyEmp.employeeId = null;\n replyEmp.msg = '';\n replyEmp.numberOfStars = 0;\n }\n const scheduleStore = useScheduleStore();\n await scheduleStore.refreshScheduleTasks();\n await scheduleStore.loadScheduleRequests(true);\n }\n\n /**\n * @param {import(\"@/shared/dn-task.js\").Task[] } scheduleTasks\n */\n isValid(scheduleTasks) {\n return this.employees.every(x => x.isValid(scheduleTasks));\n }\n\n /**\n * @private\n * @param {import(\"@/shared/dn-task.js\").Task[]} scheduleTasks\n * @param {(st: Date, fi: Date, ttid: number, empid: number) => import(\"@/shared/dn-task.js\").Task} createTask\n * @param {boolean} revert\n */\n performChange(scheduleTasks, createTask, revert = false) {\n for (const srEmp of this.employees) {\n if (revert)\n srEmp.revertChange();\n else\n srEmp.changedTasks = srEmp.performChange(scheduleTasks, createTask, this.days);\n }\n\n this.evaluate = false;\n }\n\n /**\n * @param {import(\"@/shared/dn-task.js\").Task[]} scheduleTasks\n */\n performChangeOnTasks(scheduleTasks) {\n if (!this.isValid(scheduleTasks))\n return false;\n for (const srEmp of this.employees) {\n srEmp.performChange(scheduleTasks, createTask, this.days);\n }\n\n return true;\n /**\n * @param {Date} st\n * @param {Date} fi\n * @param {number} ttid\n * @param {number} empid\n */\n function createTask(st, fi, ttid, empid) {\n let newTask = new Task({ empid, st, fi, tasktypeId: ttid });\n scheduleTasks.push(newTask);\n return newTask\n }\n }\n\n /**\n * @param {Map<number,import(\"@/shared/dn-tasktype.js\").TaskType>} taskTypeMap\n */\n getAffectedAffinities(taskTypeMap) {\n /** @type {Set<number|null>} */\n const affinities = new Set();\n for (const srEmp of this.employees) {\n for (const requestTask of srEmp.tasks) {\n const tt = taskTypeMap.get(requestTask.tasktypeId);\n if (tt && tt.kind === TASK_KIND.task) {\n affinities.add(tt.affinity);\n }\n if (requestTask.scheduleTask && requestTask.scheduleTask.tasktypeId) {\n const tt = taskTypeMap.get(requestTask.scheduleTask.tasktypeId);\n if (tt && tt.kind === TASK_KIND.task) {\n affinities.add(tt.affinity);\n }\n }\n }\n }\n return affinities;\n }\n\n getAffectedDates() {\n /** @type {number[]} */\n const affectedDates = [];\n for (const srEmp of this.employees) {\n for (const requestTask of srEmp.tasks) {\n let dtTime = getStartOfDay(requestTask.st).getTime();\n if (!affectedDates.includes(dtTime))\n affectedDates.push(dtTime);\n dtTime = getStartOfDay(requestTask.fi).getTime();\n if (!affectedDates.includes(dtTime))\n affectedDates.push(dtTime);\n }\n }\n return affectedDates.map(x => new Date(x));\n }\n\n getAffectedIntervals() {\n /** @type {{st:number, fi:number}[]} */\n const intervals = [];\n for (const srEmp of this.employees) {\n for (const requestTask of srEmp.tasks) {\n intervals.push({ st: requestTask.st.getTime(), fi: requestTask.fi.getTime() })\n }\n }\n\n let i = 0;\n while (i < intervals.length - 1) {\n const interval1 = intervals[i];\n let j = i + 1;\n let modified = false;\n do {\n const interval2 = intervals[j];\n if (interval1.st < interval2.fi && interval1.fi > interval2.st) {\n interval1.st = Math.min(interval1.st, interval2.st);\n interval2.fi = Math.max(interval1.fi, interval2.fi);\n intervals.splice(j, 1);\n modified = true;\n break;\n }\n\n j += 1;\n } while (j < intervals.length);\n\n if (!modified)\n i += 1;\n }\n\n return intervals.map(x => { return { st: new Date(x.st), fi: new Date(x.fi) } });\n }\n\n /**\n * @private\n * @param {Set<string>} affectedDates\n */\n addToAffectedDates(affectedDates) {\n for (const dt of this.getAffectedDates()) {\n affectedDates.add(getShortDate(dt));\n }\n }\n\n /**\n * @param {{ id: number; }} employee\n */\n canDelete(employee = null) {\n if (this.canReply(employee)) {\n return false;\n }\n\n if (!employee) {\n return true;\n }\n\n if (this.employees[0].employeeId !== employee.id)\n return false;\n\n return this.approved === null;\n }\n\n canEvaluate() {\n return true;\n }\n\n /**\n * @param {{ id: number; }} employee\n */\n canReply(employee = null) {\n if (this.approved !== null)\n return this.isPending;\n\n if (!employee) {\n if (this.kind === REQUEST_KIND.post) {\n return this.employees.length > 2;\n } else {\n for (const srEmp of this.employees) {\n if (!srEmp.approved) {\n return false;\n }\n }\n\n return true;\n }\n }\n\n if (this.employees[0].employeeId === employee.id)\n return false;\n\n for (let index = 1; index < this.employees.length; index++) {\n if (this.employees[index].employeeId === employee.id || this.employees[index].employeeId === null) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * @param {boolean} approved\n * @param {{ id: number; }} employee\n */\n canReplyWithAnswerEmp(approved, employee) {\n if (this.kind === REQUEST_KIND.post) {\n for (const srEmp of this.employees) {\n if (srEmp.employeeId === employee.id) {\n return approved === false;\n }\n }\n return approved && this.approved === null;\n } else if (this.kind === REQUEST_KIND.trade) {\n return this.employees.some(x => x.approved !== approved && (x.employeeId === employee.id || x.employeeId === null));\n }\n\n return false;\n }\n\n async deleteRequest() {\n await deleteScheduleRequest(this);\n }\n\n /**\n * @param {number} employeeId\n */\n needsReply(employeeId) {\n if (this.approved !== null)\n return false;\n for (const srEmp of this.employees) {\n if (srEmp.employeeId === employeeId)\n return srEmp.approved === null;\n }\n\n return false;\n }\n\n /**\n * @param {{ id: number; }} employee\n */\n getReplyObj(employee) {\n if (employee) {\n const srEmp = this.getEmployee(employee);\n return srEmp ? srEmp : new ScheduleRequestEmployee(employee.id, [], '', 0);\n } else {\n return this;\n }\n }\n\n /**\n * @param {{ id: number; }} employee\n */\n getEmployee(employee) {\n if (!employee)\n return null;\n\n return this.employees.find(x => x.employeeId === employee.id);\n }\n\n getMsgToDisplay() {\n const msg = this.employees[0].msg;\n if (msg)\n return msg;\n\n switch (this.kind) {\n case REQUEST_KIND.post:\n return 'posted shift';\n case REQUEST_KIND.sick:\n return 'sick';\n case REQUEST_KIND.free:\n return 'time off';\n case REQUEST_KIND.vacation:\n return 'vacation';\n case REQUEST_KIND.trade:\n return 'trade';\n }\n\n return 'work';\n }\n\n getReplyMsg() {\n return this.msg;\n }\n\n get employeesToDisplay() {\n if (this.employees.length <= 1 || this.isTrade)\n return this.employees;\n return [this.employees[1]];\n }\n\n pickEmployees() {\n return this.employees.slice(2);\n }\n\n /**\n * @param {ScheduleRequestEmployee} srEmp\n * @param {string} language\n * @param {string} timeZone\n */\n getTasksInfo(srEmp, language, timeZone) {\n const taskTypeMap = useDataStore().taskTypeMap;\n const dtFormat = new Intl.DateTimeFormat(language, { hour: 'numeric', minute: '2-digit', timeZone });\n\n let taskInfoList = [];\n if (this.employees.length > 1) {\n if (this.isTrade) {\n for (const srEmp2 of this.employees) {\n for (const t of srEmp2.tasks) {\n if (t.scheduleTask !== null && t.scheduleTask.empId === srEmp.employeeId) {\n const tt = taskTypeMap.get(t.tasktypeId);\n taskInfoList.push(getTaskString(t.scheduleTask.st, t.scheduleTask.fi, tt));\n }\n }\n }\n } else {\n for (const t of srEmp.tasks) {\n const tt = taskTypeMap.get(t.tasktypeId);\n taskInfoList.push(getTaskString(t.st, t.fi, tt));\n }\n }\n } else {\n for (const t of srEmp.tasks) {\n const tt = taskTypeMap.get(t.tasktypeId);\n if (t.scheduleTask !== null) {\n if (t.st.getTime() === t.fi.getTime()) {\n taskInfoList.push(getTaskString(t.scheduleTask.st, t.scheduleTask.fi, tt, false));\n } else if (tt.kind === TASK_KIND.break) {\n taskInfoList.push(getTaskString(t.scheduleTask.st, t.scheduleTask.fi, tt) + ' -> ' + getTaskString(t.st, t.fi, tt));\n } else {\n if (t.st.getTime() < t.scheduleTask.st.getTime()) {\n taskInfoList.push(getTaskString(t.st, t.scheduleTask.st, tt, true));\n } else if (t.st.getTime() > t.scheduleTask.st.getTime()) {\n taskInfoList.push(getTaskString(t.scheduleTask.st, t.st, tt, false));\n }\n\n if (t.fi.getTime() < t.scheduleTask.fi.getTime()) {\n taskInfoList.push(getTaskString(t.fi, t.scheduleTask.fi, tt, false));\n } else if (t.fi.getTime() > t.scheduleTask.fi.getTime()) {\n taskInfoList.push(getTaskString(t.scheduleTask.fi, t.fi, tt, true));\n }\n }\n } else {\n taskInfoList.push(getTaskString(t.st, t.fi, tt, true));\n }\n }\n }\n\n return taskInfoList;\n\n /**\n * @param {Date} st\n * @param {Date} fi\n * @param {import(\"@/shared/dn-tasktype.js\").TaskType} tt\n */\n function getTaskString(st, fi, tt, add = null) {\n let operation = '';\n if (add !== null) {\n operation = add ? '+ ' : '- ';\n }\n\n const opText = tt.name.substring(0, 2);\n if (tt.kind === TASK_KIND.break)\n return `${operation}${opText}: ${dtFormat.format(st)} (${getDurationInMinutes(st, fi)} min)`;\n return `${operation}${opText}: ${dtFormat.format(st)} - ${dtFormat.format(fi)}`;\n }\n }\n\n getApiReply() {\n const reply = { id: this.id, approved: this.approved, msg: this.msg };\n if (this.kind === REQUEST_KIND.post && this.approved) {\n const pickEmp = this.employees[1];\n reply.pick = { id: pickEmp.id, employeeId: pickEmp.employeeId, msg: pickEmp.msg, numberOfStars: pickEmp.numberOfStars };\n }\n return reply;\n }\n\n /**\n * @param {ScheduleRequest} other\n */\n needToBeRevertedBeforeUpdate(other) {\n if (!this.isPending || !this.isApproved)\n return false;\n\n for (const srEmp of this.employees) {\n const otherSREmp = other.employees.find(x => x.id === srEmp.id);\n if (otherSREmp.updated.getTime() !== srEmp.updated.getTime()) {\n if (srEmp.employeeId !== otherSREmp.employeeId || otherSREmp.approved !== srEmp.approved)\n return true;\n }\n }\n\n if (other.updated.getTime() !== this.updated.getTime()) {\n if (this.approved !== other.approved)\n return true;\n }\n\n return false;\n }\n\n /**\n * @param {import(\"@/model/dn-schedule-task.js\").ScheduleTasks} scheduleTasks\n * @param {import(\"@/shared/dn-tasktype.js\").TaskTypes} taskTypes\n * @param {import(\"@/shared/dn-employee.js\").Employee} employee\n * @param {boolean|null} approve\n * @param {{id:number;msg:string;numberOfStars?:number}} reply\n * @returns {Promise<{ok:boolean; affectedDates?:Set<string>; toastMsg?:string}>}\n */\n async toggleApproval(scheduleTasks, taskTypes, employee, approve, reply) {\n if (employee) {\n return await this.sendReply(employee, approve, reply);\n }\n\n if (approve && this.kind === REQUEST_KIND.post && this.approved !== true) {\n if (this.employeeCount > 3) {\n EventBus.emit('selectScheduleRequestPick', this);\n return;\n }\n this.selectPickEmployee(this.employees[2]);\n }\n\n /** @type {Set<string>} */\n const affectedDates = new Set();\n /** @type {boolean} */\n let ok;\n if (approve) {\n ok = this.approveToggle(scheduleTasks.list, affectedDates);\n } else {\n ok = this.rejectToggle(scheduleTasks.list, affectedDates);\n }\n\n return { ok, affectedDates };\n }\n\n /**\n * @private\n * @param {import(\"@/shared/dn-employee.js\").Employee} employee\n * @param {boolean|null} approved\n * @param {{id:number;msg:string;numberOfStars?:number;employeeId?:number;approved?:number}} reply\n */\n async sendReply(employee, approved, reply) {\n const srEmp = reply.id ? this.employees.find(x => x.id === reply.id) : reply;\n const isPick = this.kind === REQUEST_KIND.post;\n let toastMsg;\n if (isPick) {\n toastMsg = approved ? 'Shift picked' : 'Shift pick removed';\n } else {\n toastMsg = 'Trade has been ' + (approved ? 'accepted.' : 'rejected.');\n }\n\n let ok = true;\n try {\n let employeeId = employee.id;\n const data = { id: srEmp.id, kind: this.kind, employeeId: employeeId, approved: approved, msg: srEmp.msg, stars: srEmp.numberOfStars };\n await updateScheduleRequestEmployee(this.id, data);\n srEmp.employeeId = employeeId;\n srEmp.approved = approved;\n const scheduleStore = useScheduleStore();\n scheduleStore.loadScheduleRequests();\n if (approved && isPick)\n EventBus.emit(\"shiftPicked\");\n } catch (error) {\n toastMsg = 'Something went wrong.';\n ok = false;\n console.log(error);\n }\n return { toastMsg, ok };\n }\n\n /**\n * @param {ScheduleRequest} other\n */\n update(other) {\n if (other.id !== this.id)\n return;\n\n for (const srEmp of this.employees) {\n const otherSREmp = other.employees.find(x => x.id === srEmp.id);\n if (otherSREmp.updated.getTime() !== srEmp.updated.getTime()) {\n srEmp.approved = otherSREmp.approved;\n srEmp.numberOfStars = otherSREmp.numberOfStars;\n srEmp.employeeId = otherSREmp.employeeId;\n srEmp.msg = otherSREmp.msg;\n srEmp.updated = otherSREmp.updated;\n }\n }\n\n if (other.updated.getTime() !== this.updated.getTime()) {\n this.msg = other.msg;\n this.approved = other.approved;\n this.updated = other.updated;\n }\n }\n}\n\nexport class ScheduleRequestEmployee {\n\n /**\n * @param {number|null} employeeId\n * @param {ScheduleRequestTask[]} tasks\n * @param {string} msg\n * @param {number} numberOfStars\n */\n constructor(employeeId, tasks, msg, numberOfStars, approved = null, updated = undefined, id = undefined) {\n /** @type {number|null} */\n this.id = id;\n /** @type {number|null} */\n this.employeeId = employeeId;\n /** @type {Date | undefined} */\n this.updated = updated;\n /** @type {boolean | null} */\n this.approved = approved;\n /** @type {string} */\n this.msg = msg;\n /** @readonly @type {ScheduleRequestTask[]} */\n this.tasks = tasks;\n /** @type {number} */\n this.numberOfStars = numberOfStars;\n /** @readonly @type {Date[]} 1 or 2 elements. */\n this.starts = [];\n /** @type {import(\"@/shared/dn-task.js\").Task[]} */\n this.changedTasks = undefined;\n }\n\n revertChange() {\n for (const t of this.changedTasks) {\n if (t.id <0) {\n t.toDelete();\n } else {\n const requestTask = this.tasks.find(x => x.scheduleTask !== null && x.scheduleTask.id === t.id);\n t.resurrect();\n t.st = new Date(requestTask.scheduleTask.st);\n t.fi = new Date(requestTask.scheduleTask.fi);\n t.tasktypeId = requestTask.scheduleTask.tasktypeId;\n t.empid = requestTask.scheduleTask.empId;\n t.confirmChanges();\n }\n }\n\n this.changedTasks = undefined;\n }\n\n /**\n * @param {import(\"@/shared/dn-task.js\").Task[]} scheduleTasks\n */\n isValid(scheduleTasks) {\n for (const t of this.tasks) {\n if (t.scheduleTask !== null && !scheduleTasks.some(x => x.id === t.scheduleTask.id))\n return false;\n }\n return true;\n }\n\n /**\n * @param {import(\"@/shared/dn-task.js\").Task[]} scheduleTasks\n * @param {(st: Date, fi: Date, ttid: number, empid: number) => import(\"@/shared/dn-task.js\").Task} createTask\n * @param {number} days\n */\n performChange(scheduleTasks, createTask, days) {\n let changedTasks = [];\n for (let d = 0; d < days; d++) {\n for (const requestTask of this.tasks) {\n const st = d > 0 ? addDays(requestTask.st, d) : requestTask.st;\n const fi = d > 0 ? addDays(requestTask.fi, d) : requestTask.fi;\n let task;\n if (requestTask.scheduleTask === null) {\n task = createTask(st, fi, requestTask.tasktypeId, this.employeeId);\n } else {\n task = scheduleTasks.find(x => x.id === requestTask.scheduleTask.id);\n task.resurrect();\n task.st = new Date(st);\n task.fi = new Date(fi);\n task.tasktypeId = requestTask.tasktypeId;\n task.empid = this.employeeId;\n if (task.st.getTime() === task.fi.getTime()) {\n task.toDelete();\n }\n }\n\n changedTasks.push(task);\n }\n\n }\n\n return changedTasks;\n }\n}\n\nexport class ScheduleRequestTask {\n\n /**\n * @param {Date} st\n * @param {Date} fi\n * @param {number} tasktypeId\n * @param {null|ScheduleRequestScheduleTask} scheduleTask\n */\n constructor(st, fi, tasktypeId, scheduleTask = null) {\n /** @readonly @type {Date} */\n this.st = st;\n /** @readonly @type {Date} */\n this.fi = fi;\n /** @readonly @type {number} */\n this.tasktypeId = tasktypeId;\n /** @readonly @type {null|ScheduleRequestScheduleTask} */\n this.scheduleTask = scheduleTask;\n }\n}\n\nexport class ScheduleRequestScheduleTask {\n\n /**\n * @param {number} id\n * @param {number} empId,\n * @param {Date} st\n * @param {Date} fi\n * @param {number} tasktypeId\n */\n constructor(id, empId, st, fi, tasktypeId) {\n /** @readonly @type {number} */\n this.id = id;\n /** @readonly @type {number} */\n this.empId = empId;\n /** @readonly @type {Date} */\n this.st = st;\n /** @readonly @type {Date} */\n this.fi = fi;\n /** @readonly @type {number} */\n this.tasktypeId = tasktypeId;\n }\n}\n\n/**\n * @param {ScheduleRequest} scheduleRequest\n */\nasync function deleteScheduleRequest(scheduleRequest) {\n await fetchAndCheckJson(`schedule-request/${scheduleRequest.id}?updated=${scheduleRequest.updated.toISOString()}`, 'DELETE');\n}\n\n/**\n * @param {number[]} idList\n */\nexport async function deleteScheduleRequests(idList) {\n await fetchAndCheckJson(`schedule-request/0?list=${idList.join()}`, 'DELETE');\n}\n\n/**\n * @param {number} ccId\n * @param {number} employeeId\n * @param {boolean | undefined} onlyOpenRequests\n * @param {Date | undefined} st\n * @param {Date | undefined} fi\n * @return {Promise<ScheduleRequest[]>}\n */\nexport async function getScheduleRequest(ccId, employeeId = undefined, onlyOpenRequests = undefined, st = undefined, fi = undefined) {\n const employeeQuery = employeeId ? '&employeeId=' + employeeId : '';\n\n let openQuery = '';\n if (onlyOpenRequests)\n openQuery = '&open=1'\n\n let stQuery = '';\n if (st !== undefined)\n stQuery = '&st=' + st.toISOString();\n\n let fiQuery = '';\n if (fi != undefined)\n fiQuery = '&fi=' + fi.toISOString();\n\n return await fetchAndCheckJson(`schedule-request?ccId=${ccId}${employeeQuery}${openQuery}${stQuery}${fiQuery}`, 'GET').then(x => x.map(convertScheduleRequestFromApi));\n}\n\n/**\n * @param {number} id\n * @param {{id:number; kind:number; employeeId:number; approved: null|boolean; msg: string; stars: number}} data\n */\nasync function updateScheduleRequestEmployee(id, data) {\n await fetchAndCheckJson(`schedule-request/${id}`, 'PATCH', data);\n}\n\n/**\n * @param {number} id\n */\nasync function reopenScheduleRequest(id) {\n await fetchAndCheckJson(`schedule-request/${id}`, 'PATCH');\n}\n\n/**\n * @param {ScheduleRequest} scheduleRequest\n */\nexport async function patchScheduleRequestEdit(scheduleRequest) {\n await fetchAndCheckJson(`schedule-request/${scheduleRequest.id}?edit=1`, 'PATCH', convertScheduleRequestToApi(scheduleRequest));\n}\n\n/**\n * @param {ScheduleRequest} request\n * @return {Promise<ScheduleRequest>}\n */\nexport async function postScheduleRequest(request) {\n return await fetchAndCheckJson('schedule-request', 'POST', convertScheduleRequestToApi(request)).then(convertScheduleRequestFromApi);\n}\n\n/**\n * @param {ScheduleRequest[]} requests\n */\nexport async function postScheduleRequests(requests) {\n const data = requests.map(x => convertScheduleRequestToApi(x));\n return await fetchAndCheckJson('schedule-request?multiple=1', 'POST', data);\n}\n\n/**\n * @param {ScheduleRequest} r\n * @return {{approved:boolean|null; callCenterId:number; kind:number, days:number|null, msg:string, employees:{approved: boolean|null; employeeId:number;msg: string; stars: number;\n * tasks: ScheduleRequestTask[]}[]}}\n */\nfunction convertScheduleRequestToApi(r) {\n const employees = [];\n for (const re of r.employees) {\n employees.push({ approved: re.approved, employeeId: re.employeeId, msg: re.msg, stars: re.numberOfStars, tasks: re.tasks });\n }\n\n return { approved: r.approved, callCenterId: r.callCenterId, kind: r.kind, days: r.days, msg: r.msg, employees: employees };\n}\n\n/**\n * @param {{id:number; approved:boolean|null; kind: number, days:number|null; callCenterId:number; msg:string, created:string, updated:string,\n * employees:{id:number; approved: boolean|null; employeeId:number|null;msg: string; stars: number; updated: string;\n * tasks: { st:string, fi:string, tasktypeId:number, scheduleTask:null|{id:number, empId:number, st:string, fi:string, tasktypeId:number} }[]}[]}} r\n */\nfunction convertScheduleRequestFromApi(r) {\n const employees = [];\n for (const re of r.employees) {\n const tasks = [];\n for (const rt of re.tasks) {\n let scheduleTask = null;\n if (rt.scheduleTask) {\n scheduleTask = new ScheduleRequestScheduleTask(rt.scheduleTask.id, rt.scheduleTask.empId, new Date(rt.scheduleTask.st), new Date(rt.scheduleTask.fi), rt.scheduleTask.tasktypeId);\n }\n\n tasks.push(new ScheduleRequestTask(new Date(rt.st), new Date(rt.fi), rt.tasktypeId, scheduleTask));\n }\n\n employees.push(new ScheduleRequestEmployee(re.employeeId, tasks, re.msg, re.stars, re.approved, new Date(re.updated), re.id));\n }\n\n return new ScheduleRequest(employees, r.callCenterId, r.kind, r.days, r.msg, r.approved, r.id, new Date(r.created), new Date(r.updated));\n}\n\nexport const REQUEST_KIND = createRequestKindEnum();\n\nfunction createRequestKindEnum() {\n const enumObject = {\n unavailability: -3,\n availability: -2,\n pick: -1,\n work: 0,\n sick: 1,\n vacation: 2,\n post: 3,\n trade: 4,\n free: 5,\n isAvailabilityRequest: function (/** @type {number} */ kind) {\n return kind === this.availability || kind === this.unavailability;\n }\n };\n\n return Object.freeze(enumObject);\n}\n\n/**\n * @param {import(\"#shared/dn-employee-schedule\").EmployeeSchedule} schedule\n * @param {Date} dt\n * @param {{ msg:string; stars:number; days:number|null; st: Date; fi: Date; }?} requestConfig\n */\nexport function createPostRequest(schedule, dt, requestConfig = undefined) {\n const original = getScheduleRequestBounds(schedule, dt)\n if (!requestConfig) {\n requestConfig = { msg: '', stars: 0, days: null, st: original.st, fi: original.fi };\n }\n const tasksToReduce = [];\n const publishedTasks = [];\n for (const t of original.tasks.concat(original.breaks)) {\n if (t.overlaps(original.st, original.fi)) {\n if (t.isContainedIn(original)) {\n publishedTasks.push(createScheduleRequestTask(t.st, t.fi, t));\n } else {\n const st = t.st < original.st ? original.st : t.st;\n const fi = t.fi > original.fi ? original.fi : t.fi;\n publishedTasks.push(new ScheduleRequestTask(st, fi, t.tasktypeId));\n\n const usedExistingTask = t.st < original.st;\n if (usedExistingTask) {\n tasksToReduce.push(createScheduleRequestTask(t.st, original.st, t));\n }\n\n if (t.fi > original.fi) {\n if (usedExistingTask) {\n tasksToReduce.push(new ScheduleRequestTask(original.fi, t.fi, t.tasktypeId));\n } else {\n tasksToReduce.push(createScheduleRequestTask(original.fi, t.fi, t));\n }\n }\n }\n }\n }\n\n return createRequestCommon(schedule, requestConfig, REQUEST_KIND.post, tasksToReduce, publishedTasks);\n}\n\n/**\n* @param {import(\"#shared/dn-employee-schedule\").EmployeeSchedule} schedule\n* @param {{msg:string; stars:number; days:number|null; }} requestConfig\n* @param {number} requestKind\n* @param {ScheduleRequestTask[]} tasks\n* @param {ScheduleRequestTask[]|null} publishedTasks\n*/\nexport function createRequestCommon(schedule, requestConfig, requestKind, tasks, publishedTasks = null) {\n const employees = [];\n employees.push(new ScheduleRequestEmployee(schedule.emp.id, tasks, requestConfig.msg, requestConfig.stars, true));\n if (publishedTasks !== null) {\n employees.push(new ScheduleRequestEmployee(null, publishedTasks, '', 0));\n }\n\n return new ScheduleRequest(employees, schedule.emp.ccid, requestKind, requestConfig.days);\n}\n\n/**\n* @param {Date} st\n* @param {Date} fi\n* @param {import(\"@/shared/dn-task.js\").Task} t\n*/\nexport function createScheduleRequestTask(st, fi, t) {\n return new ScheduleRequestTask(st, fi, t.tasktypeId, new ScheduleRequestScheduleTask(t.id, t.empid, t.st, t.fi, t.tasktypeId));\n}\n\n/**\n* @param {import(\"#shared/dn-employee-schedule\").EmployeeSchedule} employeeSchedule\n* @param {Date} dt\n*/\nexport function getScheduleRequestBounds(employeeSchedule, dt) {\n const shiftBounds = getShiftBounds(dt, employeeSchedule.tasks);\n const tasks = employeeSchedule.tasks.filter(t => t.st >= shiftBounds.st && t.st < shiftBounds.fi);\n sortDateIntervals(tasks);\n const breaks = employeeSchedule.breaks.filter(t => t.st >= shiftBounds.st && t.st < shiftBounds.fi);\n sortDateIntervals(breaks);\n const hasShift = shiftBounds.fi > shiftBounds.st;\n if (!hasShift) {\n shiftBounds.st = new Date(dt);\n shiftBounds.st.setMinutes(employeeSchedule.emp.absenceStart());\n shiftBounds.fi = new Date(shiftBounds.st.getTime() + employeeSchedule.emp.absenceDuration * 60000);\n }\n\n return { hasShift, st: shiftBounds.st, fi: shiftBounds.fi, tasks, breaks };\n}\n","import { fetchAndCheckJson } from '@/js/dn-fetch.js';\nimport { fromISODate, toISODate } from '@/shared/dn-shared-helper.js';\n\nfunction createSettingsColumnsEnum() {\n const enumObject = {\n delete: 1,\n number: 2,\n date: 3,\n department: 4,\n cc: 5,\n text: 6,\n payrollRuleKind: 7,\n payrollRuleWeekLimit: 9,\n timeOfDay: 11,\n forecastMethod:12,\n checkbox: 13,\n };\n\n return Object.freeze(enumObject);\n}\n\nexport const SETTINGS_COLUMN_KIND = createSettingsColumnsEnum();\n\nfunction createSettingsDetailEnum() {\n const enumObject = {\n breakSetting: 1,\n callGroup: 2,\n bo: 3,\n payrollRule: 4,\n };\n\n return Object.freeze(enumObject);\n}\n\nexport const SETTINGS_DETAIL_KIND = createSettingsDetailEnum();\n\n/**\n* @typedef {{key:string; value:number}} SettingDto\n*/\n\nexport async function getSettings() {\n /** @type {SettingDto[]} */\n const rows = await fetchAndCheckJson(`settings`, 'GET');\n return rows;\n}\n\n/**\n * @param {SettingDto[]} data\n */\nexport async function postSettings(data) {\n if (data.length === 0) { return; }\n await fetchAndCheckJson(`settings`, 'POST', data);\n}\n\n/**\n * @param {boolean} value\n */\nexport async function saveReportCalendarDays(value) {\n await postSettings([{ key: GENERAL_SETTINGS.reportCalendarDays, value: value ? 1 : 0 }])\n}\n\n/**\n * @param {boolean} value\n */\nexport async function saveReportCsvSemicolon(value) {\n await postSettings([{ key: GENERAL_SETTINGS.reportCsvSemicolon, value: value ? 1 : 0 }])\n}\n\n/**\n * @param {number} value\n */\nexport async function savenumHoursWeeklyOvertime(value) {\n await postSettings([{ key: GENERAL_SETTINGS.numHoursWeeklyOvertime, value: value}])\n}\n\n/**\n * @param {boolean} value\n */\nexport async function saveWeekendAsHoliday(value) {\n await postSettings([{ key: GENERAL_SETTINGS.weekendAsHoliday, value: value ? 1 : 0}])\n}\n\nexport const GENERAL_SETTINGS = createGeneralSettingsEnum();\n\nfunction createGeneralSettingsEnum() {\n const enumObject = {\n historicWeeks: 'historicWeeks',\n forecastWeeks: 'forecastWeeks',\n numberOfHistoricSpecialDays: 'numberOfHistoricSpecialDays',\n occupacyFte: 'occupacyFte',\n adherancePercent: 'adherancePercent',\n percentOfAbandonsToInclude: 'percentOfAbandonsToInclude',\n adherenceBase: 'adherenceBase',\n graceMinutes: 'graceMinutes',\n adherenceLimit: 'adherenceLimit',\n overTargetFactor: 'overTargetFactor',\n closeGaps: 'closeGaps',\n noShiftsOutsideTarget: 'noShiftsOutsideTarget',\n reportCalendarDays: 'reportCalendarDays',\n reportCsvSemicolon:'reportCsvSemicolon',\n unScheduledBreakMinutes:'unScheduledBreakMinutes',\n numHoursWeeklyOvertime: 'numHoursWeeklyOvertime',\n weekendAsHoliday: 'weekendAsHoliday'\n };\n\n return Object.freeze(enumObject);\n}\n\nexport const GENERAL_EMPAPP_SETTINGS = createGeneralEmpSettingsEnum();\n/* ADDED ALLREQUESTSDISABLED */\nfunction createGeneralEmpSettingsEnum() {\n const enumObject = {\n publishingWeekDay: 'publishingWeekDay',\n publishingNumberOfDays: 'publishingNumberOfDays',\n publishingFixedDateMs: 'publishingFixedDateMs',\n allRequestsDisabled: 'allRequestsDisabled',\n requestClosedNumberOfDays: 'requestClosedNumberOfDays',\n requestvaccationClosedNumberOfDays: 'requestvaccationClosedNumberOfDays',\n sickRequestDisabled: 'sickRequestDisabled',\n tradeDisabled: 'tradeDisabled',\n hideTeamSchedule: 'hideTeamSchedule',\n showOnlyOwnTeam: 'showOnlyOwnTeam',\n weekStartDay: 'weekStartDay',\n statsPayrollCodes:'statsPayrollCodes',\n statsAdherence:'statsAdherence',\n statsDetailedAdherence:'statsDetailedAdherence',\n statsPayrollCodesPublishingNumberOfDays:'statsPayrollCodesPublishingNumberOfDays',\n };\n\n return Object.freeze(enumObject);\n}\n\nexport class GeneralOptions {\n constructor(forecastSetting, adherenceSetting, historicWeeks, forecastWeeks, numberOfHistoricSpecialDays, occupacyFte, \n adherancePercent, percentOfAbandonsToInclude, adherenceBase, graceMinutes, unScheduledBreakMinutes, \n adherenceLimit, numHoursWeeklyOvertime, weekendAsHoliday, closeGaps) {\n if (forecastSetting && adherenceSetting) {\n this._historicWeeks = forecastSetting.historicWeeks\n this._forecastWeeks = forecastSetting.forecastWeeks\n this._numberOfHistoricSpecialDays = forecastSetting.numberOfHistoricSpecialDays\n this._occupacyFte = forecastSetting.occupacyFte\n this._adherancePercent = forecastSetting.adherancePercent\n this._percentOfAbandonsToInclude = forecastSetting.percentOfAbandonsToInclude\n this._adherenceBase = adherenceSetting.adherenceBase\n this._graceMinutes = adherenceSetting.graceMinutes\n this._unScheduledBreakMinutes = adherenceSetting.unScheduledBreakMinutes\n this._closeGaps = adherenceSetting.closeGaps\n this._adherenceLimit = adherenceSetting.adherenceLimit\n this._numHoursWeeklyOvertime = adherenceSetting.numHoursWeeklyOvertime\n this._weekendAsHoliday = adherenceSetting.weekendAsHoliday\n }\n else {\n /** @private @type {number} */\n this._historicWeeks = historicWeeks;\n /** @private @type {number} */\n this._forecastWeeks = forecastWeeks;\n /** @private @type {number} */\n this._numberOfHistoricSpecialDays = numberOfHistoricSpecialDays;\n /** @private @type {number} */\n this._occupacyFte = occupacyFte;\n /** @private @type {number} */\n this._adherancePercent = adherancePercent;\n /** @private @type {number} */\n this._percentOfAbandonsToInclude = percentOfAbandonsToInclude;\n /** @private @type {number} */\n this._adherenceBase = adherenceBase;\n /** @private @type {number} */\n this._graceMinutes = graceMinutes;\n /** @private @type {number} */\n this._unScheduledBreakMinutes = unScheduledBreakMinutes;\n /** @private @type {number} */\n this._closeGaps = closeGaps;\n /** @private @type {number} */\n this._adherenceLimit = adherenceLimit;\n /** @private @type {number} */\n this._numHoursWeeklyOvertime = numHoursWeeklyOvertime;\n /** @private @type {boolean} */\n this._weekendAsHoliday = weekendAsHoliday;\n }\n /** @private @type {boolean} */\n this._hasChangesForecast = false;\n this._hasChangesAdherence = false;\n }\n\n get historicWeeks() {\n return this._historicWeeks\n }\n set historicWeeks(newValue) {\n if (this._historicWeeks !== newValue) {\n this._historicWeeks = newValue;\n this._hasChangesForecast = true;\n }\n }\n\n get forecastWeeks() {\n return this._forecastWeeks\n }\n set forecastWeeks(newValue) {\n if (this._forecastWeeks !== newValue) {\n this._forecastWeeks = newValue;\n this._hasChangesForecast = true;\n }\n }\n\n get numberOfHistoricSpecialDays() {\n return this._numberOfHistoricSpecialDays\n }\n set numberOfHistoricSpecialDays(newValue) {\n if (this._numberOfHistoricSpecialDays !== newValue) {\n this._numberOfHistoricSpecialDays = newValue;\n this._hasChangesForecast = true;\n }\n }\n\n get occupacyFte() {\n return this._occupacyFte\n }\n set occupacyFte(newValue) {\n if (this._occupacyFte !== newValue) {\n this._occupacyFte = newValue\n this._hasChangesForecast = true\n }\n }\n\n get adherancePercent() {\n return this._adherancePercent\n }\n set adherancePercent(newValue) {\n if (this._adherancePercent !== newValue) {\n this._adherancePercent = newValue\n this._hasChangesForecast = true\n }\n }\n\n get percentOfAbandonsToInclude() {\n return this._percentOfAbandonsToInclude\n }\n set percentOfAbandonsToInclude(newValue) {\n if (this._percentOfAbandonsToInclude !== newValue) {\n this._percentOfAbandonsToInclude = newValue\n this._hasChangesForecast = true\n }\n }\n\n get adherenceBase() {\n return this._adherenceBase\n }\n set adherenceBase(newValue) {\n if (this._adherenceBase !== newValue) {\n this._adherenceBase = newValue\n this._hasChangesAdherence = true\n }\n }\n\n get graceMinutes() {\n return this._graceMinutes\n }\n set graceMinutes(newValue) {\n if (this._graceMinutes !== newValue) {\n this._graceMinutes = newValue\n this._hasChangesAdherence = true\n }\n }\n\n get unScheduledBreakMinutes() {\n return this._unScheduledBreakMinutes\n }\n set unScheduledBreakMinutes(newValue) {\n if (this._unScheduledBreakMinutes !== newValue) {\n this._unScheduledBreakMinutes = newValue\n this._hasChangesAdherence = true\n }\n }\n\n get closeGaps() {\n return this._closeGaps\n }\n set closeGaps(newValue) {\n if (this._closeGaps !== newValue) {\n this._closeGaps = newValue\n this._hasChangesAdherence = true\n }\n }\n\n get adherenceLimit() {\n return this._adherenceLimit\n }\n set adherenceLimit(newValue) {\n if (this._adherenceLimit !== newValue) {\n this._adherenceLimit = newValue\n this._hasChangesAdherence = true\n }\n }\n\n get hasChanges() {\n return this._hasChangesForecast || this._hasChangesAdherence\n }\n\n get hasChangesForecast() {\n return this._hasChangesForecast\n }\n\n get hasChangesAdherence() {\n return this._hasChangesAdherence\n }\n confirmChanges() {\n this._hasChangesForecast = false\n this._hasChangesAdherence = false\n }\n\n get numHoursWeeklyOvertime() {\n return this._numHoursWeeklyOvertime\n }\n set numHoursWeeklyOvertime(newValue) {\n if (this._numHoursWeeklyOvertime !== newValue) {\n this._numHoursWeeklyOvertime = newValue\n }\n }\n\n get weekendAsHoliday() {\n return this._weekendAsHoliday\n }\n set weekendAsHoliday(newValue) {\n if (this._weekendAsHoliday !== newValue) {\n this._weekendAsHoliday = newValue\n }\n }\n\n}\n\nexport class GeneralEmpAppSettings {\n /**\n * @param {{ publishingWeekDay: number; publishingNumberOfDays: number; requestClosedNumberOfDays: number; requestvaccationClosedNumberOfDays: number\n * ; sickRequestDisabled: boolean; weekStartDay: number; publishingFixedDate: Date; allRequestsDisabled: boolean; tradeDisabled: boolean; hideTeamSchedule: boolean; showOnlyOwnTeam: boolean\n * ;statsPayrollCodes:boolean; statsAdherence:boolean; statsDetailedAdherence:boolean; statsPayrollCodesPublishingNumberOfDays:number }} setting\n */\n constructor(setting) {\n\n /** @private @type {number} */\n this._publishingWeekDay = setting.publishingWeekDay\n\n /** @private @type {number} */\n this._publishingNumberOfDays = setting.publishingNumberOfDays\n\n /** @private @type {Date} */\n this._publishingFixedDate = setting.publishingFixedDate\n\n /** @private @type {Boolean} */\n this._usePublishFixedDate = false\n if(setting.publishingFixedDate){this._usePublishFixedDate = true}\n\n /** @private @type {boolean} */\n this._allRequestsDisabled = setting.allRequestsDisabled\n\n /** @private @type {number} */\n this._requestClosedNumberOfDays = setting.requestClosedNumberOfDays\n\n /** @private @type {number} */\n this._requestvaccationClosedNumberOfDays = setting.requestvaccationClosedNumberOfDays\n\n /** @private @type {boolean} */\n this._sickRequestDisabled = setting.sickRequestDisabled\n\n /** @private @type {boolean} */\n this._tradeDisabled = setting.tradeDisabled\n\n /** @private @type {boolean} */\n this.hideTeamSchedule = setting.hideTeamSchedule\n\n /** @private @type {boolean} */\n this.statsPayrollCodes = setting.statsPayrollCodes\n\n /** @private @type {boolean} */\n this.statsAdherence = setting.statsAdherence\n\n /** @private @type {boolean} */\n this.statsDetailedAdherence = setting.statsDetailedAdherence\n\n /** @private @type {number} */\n this.statsPayrollCodesPublishingNumberOfDays = setting.statsPayrollCodesPublishingNumberOfDays\n\n /** @private @type {boolean} */\n this._showOnlyOwnTeam = setting.showOnlyOwnTeam\n\n /** @private @type {number} */\n this._weekStartDay = setting.weekStartDay\n\n /** @private @type {boolean} */\n this._hasChanges = false;\n }\n\n get publishingWeekDay() {\n return this._publishingWeekDay\n }\n set publishingWeekDay(newValue) {\n if (this._publishingWeekDay !== newValue) {\n this._publishingWeekDay = newValue\n this._hasChanges = true\n }\n }\n\n get publishingNumberOfDays() {\n return this._publishingNumberOfDays\n }\n set publishingNumberOfDays(newValue) {\n if (this._publishingNumberOfDays !== newValue) {\n this._publishingNumberOfDays = newValue\n this._hasChanges = true\n }\n }\n\n get publishingFixedDate() {\n return this._publishingFixedDate\n }\n set publishingFixedDate(newValue) {\n if (this._publishingFixedDate !== newValue) {\n this._publishingFixedDate = newValue\n this._hasChanges = true\n }\n }\n\n set publishingFixedDateNoChange(newValue) {\n this._publishingFixedDate = newValue\n }\n\n get usePublishFixedDate() {\n return this._usePublishFixedDate \n }\n set usePublishFixedDate(newValue) {\n if (this._usePublishFixedDate !== newValue) {\n this._usePublishFixedDate = newValue\n this._hasChanges = true\n }\n }\n\n get allRequestsDisabled() {\n return this._allRequestsDisabled\n }\n set allRequestsDisabled(newValue) {\n if (this._allRequestsDisabled !== newValue) {\n this._allRequestsDisabled = newValue\n this._hasChanges = true\n }\n }\n\n get requestClosedNumberOfDays() {\n return this._requestClosedNumberOfDays\n }\n set requestClosedNumberOfDays(newValue) {\n if (this._requestClosedNumberOfDays !== newValue) {\n this._requestClosedNumberOfDays = newValue\n this._hasChanges = true\n }\n }\n\n get requestvaccationClosedNumberOfDays() {\n return this._requestvaccationClosedNumberOfDays\n }\n set requestvaccationClosedNumberOfDays(newValue) {\n if (this._requestvaccationClosedNumberOfDays !== newValue) {\n this._requestvaccationClosedNumberOfDays = newValue\n this._hasChanges = true\n }\n }\n\n get sickRequestDisabled() {\n return this._sickRequestDisabled\n }\n set sickRequestDisabled(newValue) {\n if (this._sickRequestDisabled !== newValue) {\n this._sickRequestDisabled = newValue\n this._hasChanges = true\n }\n }\n\n get tradeDisabled() {\n return this._tradeDisabled\n }\n set tradeDisabled(newValue) {\n if (this._tradeDisabled !== newValue) {\n this._tradeDisabled = newValue\n this._hasChanges = true\n }\n }\n\n get hideTeamSchedule() {\n return this._hideTeamSchedule\n }\n set hideTeamSchedule(newValue) {\n if (this._hideTeamSchedule !== newValue) {\n this._hideTeamSchedule = newValue\n this._hasChanges = true\n }\n }\n\n get statsPayrollCodes() {\n return this._statsPayrollCodes\n }\n set statsPayrollCodes(newValue) {\n if (this._statsPayrollCodes !== newValue) {\n this._statsPayrollCodes = newValue\n this._hasChanges = true\n }\n }\n\n get statsAdherence() {\n return this._statsAdherence\n }\n set statsAdherence(newValue) {\n if (this._statsAdherence !== newValue) {\n this._statsAdherence = newValue\n this._hasChanges = true\n }\n }\n\n get statsDetailedAdherence() {\n return this._statsDetailedAdherence\n }\n set statsDetailedAdherence(newValue) {\n if (this._statsDetailedAdherence !== newValue) {\n this._statsDetailedAdherence = newValue\n this._hasChanges = true\n }\n }\n\n get statsPayrollCodesPublishingNumberOfDays() {\n return this._statsPayrollCodesPublishingNumberOfDays\n }\n set statsPayrollCodesPublishingNumberOfDays(newValue) {\n if (this._statsPayrollCodesPublishingNumberOfDays !== newValue) {\n this._statsPayrollCodesPublishingNumberOfDays = newValue\n this._hasChanges = true\n }\n }\n\n get showOnlyOwnTeam() {\n return this._showOnlyOwnTeam\n }\n set showOnlyOwnTeam(newValue) {\n if (this._showOnlyOwnTeam !== newValue) {\n this._showOnlyOwnTeam = newValue\n this._hasChanges = true\n }\n }\n\n get weekStartDay() {\n return this._weekStartDay;\n }\n set weekStartDay(newValue) {\n if (this._weekStartDay !== newValue) {\n this._weekStartDay = newValue\n this._hasChanges = true\n }\n }\n\n get hasChanges() {\n return this._hasChanges\n }\n confirmChanges() { this._hasChanges = false }\n}\n\nexport class HolidaySettings{\n /**\n * @param {number} id\n * @param {Date} date\n * @param {string} description\n */\n constructor(id, date, description) {\n /** @private @type {number} */\n this._id = id;\n /** @private @type {Date} */\n this._date = date;\n /** @private @type {string} */\n this._description = description;\n /** @private @type {boolean} */\n this._hasChanges = false;\n /** @private @type {boolean} */\n this._isToDelete = false;\n }\n\n get id(){\n return this._id\n }\n\n get date() {\n return this._date\n }\n\n set date(newValue) {\n this._date = newValue;\n this._hasChanges = true;\n }\n\n get description() {\n return this._description\n }\n\n set description(newValue) {\n this._description = newValue;\n this._hasChanges = true;\n }\n\n get hasChanges() {\n return this._hasChanges\n }\n confirmChanges(){this._hasChanges=false}\n\n get isToDelete() {\n return this._isToDelete\n }\n\n toDelete() {\n this._isToDelete = true\n }\n\n}\n\nexport async function getHolidays() {\n /** @type {{id:number;date:string;description:string}[]} */\n const result = await fetchAndCheckJson(`holiday`, 'GET');\n const holidays = result.map(x => new HolidaySettings(x.id, fromISODate(x.date),x.description));\n return holidays;\n}\n\n\n/**\n * @param {HolidaySettings[]} holidays\n */\nexport async function saveHolidays(holidays) {\n return new Promise((resolve) => {\n let itemsToDelete = []\n let promesis = []\n for (let i = 0; i < holidays.length; i++) {\n const holiday = holidays[i];\n if (holiday.isToDelete) {\n promesis.push(fetchAndCheckJson(`holiday/${holiday.id}`, 'DELETE'))\n itemsToDelete.push(holiday)\n } else if (holidays[i].hasChanges) {\n if (holidays[i].id == -1) {\n promesis.push(fetchAndCheckJson(`holiday`, 'POST', { date: toISODate(holiday.date), description: holiday.description }));\n } else {\n promesis.push(fetchAndCheckJson(`holiday/${holiday.id}`, 'PUT', { date: toISODate(holiday.date), description: holiday.description }));\n }\n holiday.confirmChanges();\n }\n }\n for (let i = 0; i < itemsToDelete.length; i++) {\n var index = holidays.indexOf(itemsToDelete[i]);\n holidays.splice(index, 1);\n }\n Promise.all(promesis).then(() => {\n resolve(holidays);\n }).catch(error => {\n console.error(error.message)\n });\n });\n}","import { getBreakSettingsMinWork, getBreakSettingsMaxWork } from '@/model/dn-break-settings.js';\nimport { TASK_KIND } from '@/shared/dn-tasktype.js';\n\n/**\n* @typedef {{maxDurQ:number; maxWorkMinutes:number; minStMinute:number; maxFiMinute:number; minStQ:number; maxFiQ:number; unavailabilites:{stQ:number;fiQ:number}[]\n* }} DayBounds\n*/\n\n/**\n * @typedef {{id?:number; automaticBreaks?:boolean; openForBO?: boolean;\n * fixTasks: null|{st:number, dur:number, taskTypeId:number}[];\n * flexTasks: null|{taskTypeId:number, st:number|null, stSpan:number|null, fi:number|null, fiSpan:number|null, dur:number|null, durSpan:number|null, step:number|null, kind:number}[]\n * }} ShiftDto Flex shift unit is quarter hours fix shift in minutes.\n*/\n\nexport class Shift {\n /**\n * All units in quarter hours\n * @param {ShiftDto} data\n */\n constructor(data) {\n /** @type {number|null} */\n this.id = data.id;\n /** @private @type {boolean|null} */\n this._automaticBreaks = data.automaticBreaks !== undefined ? data.automaticBreaks : null;\n /** @private @type {boolean|null} */\n this._openForBO = data.openForBO !== undefined ? data.openForBO : null;\n /** @private @type {{st:number, dur:number, taskTypeId:number}[]} */\n this._fixTasks = [];\n if (data.fixTasks) {\n for (const t of data.fixTasks) {\n this._fixTasks.push({ st: t.st, dur: t.dur, taskTypeId: t.taskTypeId });\n }\n }\n /** @private @type {number} */\n this._stMin = 0;\n /** @private @type {number} */\n this._stMax = 0;\n /** @private @type {number} */\n this._fiMin = 0;\n /** @private @type {number} */\n this._fiMax = 0;\n /** @private @type {number} */\n this._durMin = 0;\n /** @private @type {number} */\n this._durMax = 0;\n /** @private @type {number} */\n this._step = 1;\n /** @type {number|null} */\n this.taskTypeId = null;\n /** @type {number|null} */\n this.taskType2Id = null;\n /** @type {number} */\n this.dur2Min = 0;\n /** @type {number} */\n this.dur2Max = 0;\n\n if (data.flexTasks) {\n for (const flexTask of data.flexTasks) {\n if (flexTask.kind === 0) {\n this.taskTypeId = flexTask.taskTypeId;\n if (flexTask.st !== null) { this._stMin = flexTask.st; }\n if (flexTask.stSpan !== null) { this._stMax = this.stMin + flexTask.stSpan; }\n if (flexTask.fi !== null) { this._fiMin = flexTask.fi; }\n if (flexTask.fiSpan !== null) { this._fiMax = this.fiMin + flexTask.fiSpan; }\n if (flexTask.dur !== null) { this._durMin = flexTask.dur; }\n if (flexTask.durSpan !== null) { this._durMax = this.durMin + flexTask.durSpan; }\n if (flexTask.step !== null) { this._step = flexTask.step; }\n } else {\n this.taskType2Id = flexTask.taskTypeId;\n if (flexTask.dur !== null) { this.dur2Min = flexTask.dur; }\n if (flexTask.durSpan !== null) { this.dur2Max = this.dur2Min + flexTask.durSpan; }\n }\n }\n }\n\n /** @type {boolean} */\n this.hasTask2 = this.taskType2Id > 0\n /** @type {boolean} */\n this.flexSt = this.stMin !== this.stMax\n /** @type {boolean} */\n this.flexFi = this.fiMin !== this.fiMax\n /** @type {boolean} */\n this.flexDur = this.durMin !== this.durMax\n /** @type {boolean} */\n this.isFix = this.fixTasks.length !== 0;\n }\n\n get automaticBreaks() {\n if (!this.isFix) { return true; }\n return this._automaticBreaks === true;\n }\n\n set automaticBreaks(value) {\n this.setValue('_automaticBreaks', value);\n }\n\n get openForBO() {\n if (this.isFix) { return false; }\n return this._openForBO === true;\n }\n\n set openForBO(value) {\n this.setValue('_openForBO', value);\n }\n\n get fixTasks() {\n return this._fixTasks;\n }\n\n set fixTasks(value) {\n let hasChanged = value.length !== this._fixTasks.length;\n if (!hasChanged) {\n for (let i = 0; i < value.length; i++) {\n const t = value[i];\n const t2 = this._fixTasks[i];\n if (t.st !== t2.st || t.dur !== t2.dur || t.taskTypeId !== t2.taskTypeId) {\n hasChanged = true;\n break;\n }\n }\n }\n if (hasChanged) {\n this.setValue('_fixTasks', value);\n this._fixShift = undefined;\n }\n }\n\n get stMin() {\n return this._stMin;\n }\n set stMin(value) {\n this.setValue('_stMin', value);\n }\n\n get stMax() {\n return this._stMax;\n }\n set stMax(value) {\n this.setValue('_stMax', value);\n }\n\n get fiMin() {\n return this._fiMin;\n }\n set fiMin(value) {\n this.setValue('_fiMin', value);\n }\n\n get fiMax() {\n return this._fiMax;\n }\n set fiMax(value) {\n this.setValue('_fiMax', value);\n }\n\n get durMin() {\n return this._durMin;\n }\n set durMin(value) {\n this.setValue('_durMin', value);\n }\n\n get durMax() {\n return this._durMax;\n }\n set durMax(value) {\n this.setValue('_durMax', value);\n }\n\n get step() {\n return this._step;\n }\n set step(value) {\n this.setValue('_step', value);\n }\n\n /**\n * @protected\n * @param {string} prop\n * @param {any} value\n */\n setValue(prop, value) {\n if (value !== this[prop]) {\n /** @type {boolean} */\n this.hasChanges = true;\n this[prop] = value;\n }\n }\n\n /**\n * @param {Map<number, import(\"@/shared/dn-tasktype.js\").TaskType>} taskTypeMap\n */\n getFixShift(taskTypeMap) {\n if (!this._fixShift) {\n let paidWorkMinutes = 0;\n const breaks = [];\n const tasks = [];\n /** @type {{st:number;fi:number}[]} */\n const shiftBoundMinutes = [];\n let stMinute = 1440;\n let fiMinute = 0;\n let durMinutes = 0;\n for (const t of this.fixTasks) {\n const taskFiMinute = t.st + t.dur;\n durMinutes += t.dur;\n if (t.st < stMinute) { stMinute = t.st; }\n if (taskFiMinute > fiMinute) { fiMinute = taskFiMinute; }\n const tt = taskTypeMap.get(t.taskTypeId);\n const task = {\n stMinute: t.st,\n durMinute: t.dur,\n st: Math.round(t.st / 15),\n fi: Math.round(taskFiMinute / 15),\n tasktypeId: t.taskTypeId,\n workFactor: tt.work / 100,\n }\n\n if (tt.kind === TASK_KIND.break) {\n if (!tt.paidBreak) {\n paidWorkMinutes -= t.dur;\n }\n breaks.push(task);\n } else if (tt.kind === TASK_KIND.task) {\n paidWorkMinutes += t.dur;\n tasks.push(task);\n if (shiftBoundMinutes.length === 0 || shiftBoundMinutes[shiftBoundMinutes.length-1].fi !== t.st) {\n shiftBoundMinutes.push({st:t.st, fi:taskFiMinute});\n } else {\n shiftBoundMinutes[shiftBoundMinutes.length-1].fi = taskFiMinute;\n }\n }\n }\n\n const stMin = Math.round(stMinute / 15);\n const fiMax = Math.round(fiMinute / 15);\n\n /** @type {{st:number; fi:number; ttId:number; workFactor:number}[]} */\n const tasksWithoutBreaks = [];\n for (const t of tasks) {\n let nextSt = t.st;\n do {\n let st = nextSt;\n let fi = t.fi;\n for (const b of breaks) {\n if (b.fi > st && b.st < fi) {\n fi = b.st\n nextSt = b.fi;\n }\n }\n if (st < fi) {\n tasksWithoutBreaks.push({ st, fi, ttId: t.tasktypeId, workFactor: t.workFactor })\n if (nextSt < fi) {\n break;\n }\n }\n } while (nextSt < t.fi);\n }\n\n /** @private */\n this._fixShift = {\n paidWorkMinutes: paidWorkMinutes,\n tasks,\n breaks,\n stMinute,\n fiMinute,\n stMin,\n fiMax,\n durMinutes,\n shiftBoundMinutes,\n tasksWithoutBreaks,\n };\n }\n\n return this._fixShift;\n }\n\n /**\n * @param {number} value\n */\n isAllowedEnd(value) {\n if (value + 1 < this.fiMin)\n return false;\n\n if (this.step === 1)\n return true;\n\n return (1 + value - this.stMin) % this.step === 0;\n }\n\n get isEmpty() {\n if (this.isFix) {\n return this.fixTasks.length === 0;\n }\n return this.fiMax <= this.stMin;\n }\n\n /**\n * @param {DayBounds} dayBounds\n * @param {Map<number, import(\"@/shared/dn-tasktype.js\").TaskType>} taskTypeMap\n */\n isDayBoundsOk(dayBounds, taskTypeMap) {\n if (this.isFix) {\n const fixShift = this.getFixShift(taskTypeMap);\n if (this.automaticBreaks) {\n if (fixShift.durMinutes > dayBounds.maxDurQ * 15) { return false; }\n } else {\n if (fixShift.paidWorkMinutes > dayBounds.maxWorkMinutes) { return false; }\n }\n \n if (fixShift.stMinute < dayBounds.minStMinute) { return false; }\n if (fixShift.fiMinute > dayBounds.maxFiMinute) { return false; }\n for (const unavailability of dayBounds.unavailabilites) {\n for (const t of fixShift.tasks) {\n if (t.st < unavailability.fiQ && t.fi > unavailability.stQ) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n if (this.durMin > dayBounds.maxDurQ) { return false; }\n if (dayBounds.minStQ > this.stMax) { return false; }\n if (dayBounds.maxFiQ < this.fiMin) { return false; }\n if (this.stMax < this.fiMin) {\n for (const unavailability of dayBounds.unavailabilites) {\n if (this.stMax < unavailability.fiQ && this.fiMin > unavailability.stQ) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n /**\n * @param {{ stMin: number; fiMax: number; }} bounds\n * @param {Map<number, import(\"@/shared/dn-tasktype.js\").TaskType>} taskTypeMap\n */\n setMaxBounds(bounds, taskTypeMap) {\n let shift;\n if (this.isFix) {\n shift = this.getFixShift(taskTypeMap);\n } else {\n shift = this;\n }\n if (bounds.stMin > shift.stMin)\n bounds.stMin = shift.stMin;\n if (bounds.fiMax < shift.fiMax)\n bounds.fiMax = shift.fiMax;\n }\n\n /** @param {Shift} other */\n isEqual(other) {\n if (other.isFix !== this.isFix)\n return false;\n if (other.automaticBreaks !== this.automaticBreaks) {\n return false;\n }\n if (other.openForBO !== this.openForBO) {\n return false;\n }\n if (this.isFix) {\n if (this.fixTasks.length !== other.fixTasks.length)\n return false;\n for (let i = 0; i < this.fixTasks.length; i++) {\n const t = this.fixTasks[i];\n const t2 = other.fixTasks[i];\n if (t.st != t2.st || t.dur != t2.dur || t.taskTypeId !== t2.taskTypeId)\n return false;\n }\n return true;\n }\n\n if (this.hasTask2 != other.hasTask2) {\n return false;\n }\n\n if (this.hasTask2) {\n if (this.taskType2Id !== other.taskType2Id || this.dur2Min !== other.dur2Min || this.dur2Max !== other.dur2Max) {\n return false;\n }\n }\n\n return this.taskTypeId === other.taskTypeId && this.stMin === other.stMin && this.stMax === other.stMax &&\n this.fiMin === other.fiMin && this.fiMax === other.fiMax &&\n this.durMin === other.durMin && this.durMax === other.durMax && this.step === other.step;\n }\n\n isValid() {\n if (this.isFix)\n return true;\n\n return this.step >= 1\n && this.stMin >= 0 && this.stMin <= this.stMax && this.stMax < 96\n && this.fiMin >= 0 && this.fiMin <= this.fiMax\n && this.durMin <= this.durMax;\n }\n\n /** @returns {ShiftDto} */\n toDto() {\n const fixTasks = this.isFix ? this.fixTasks : [];\n /** @type {{taskTypeId:number, st:number|null, stSpan:number|null, fi:number|null, fiSpan:number|null, dur:number|null, durSpan:number|null, step:number|null, kind:number}[]} */\n const flexTasks = [];\n if (fixTasks.length === 0) {\n flexTasks.push({ taskTypeId: this.taskTypeId, st: this.stMin, fi: this.fiMin, dur: this.durMin, stSpan: this.stMax - this.stMin, fiSpan: this.fiMax - this.fiMin, durSpan: this.durMax - this.durMin, step: this.step, kind: 0 });\n if (this.hasTask2) {\n flexTasks.push({ taskTypeId: this.taskType2Id, st: null, fi: null, dur: this.dur2Min, stSpan: null, fiSpan: null, durSpan: this.dur2Max - this.dur2Min, step: null, kind: 1 });\n }\n }\n return {\n id: this.id,\n automaticBreaks: this._automaticBreaks,\n openForBO: this._openForBO,\n fixTasks: fixTasks,\n flexTasks: flexTasks,\n };\n }\n\n /**\n * @param {Map<number, import(\"@/shared/dn-tasktype.js\").TaskType>} taskTypeMap\n */\n getDurationText(taskTypeMap) {\n let hours = 0;\n if (this.isFix) {\n for (const t of this.fixTasks) {\n if (taskTypeMap.get(t.taskTypeId).type !== 'break') {\n hours += t.dur / 60;\n }\n }\n\n } else if (this.durMin === this.durMax) {\n hours = this.durMin / 4;\n } else {\n return this.durMin / 4 + ' - ' + this.durMax / 4 + ' h'\n }\n\n if (hours > 0) {\n return Math.round(100 * hours) / 100 + ' h';\n }\n return '';\n }\n}\n\n/**\n * @param {number} ttId\n */\nexport function createShift(ttId) {\n const shift = new Shift({ id: null, fixTasks: [], flexTasks: [] });\n shift.isFix = true;\n shift.taskTypeId = ttId;\n return shift;\n}\n\n\n/**\n * @param {Shift} sh\n * @param {Map<number, import(\"@/shared/dn-tasktype.js\").TaskType>} taskTypeMap\n * @param {import(\"@/model/dn-break-settings.js\").BreakSettings[]} breakSettings\n */\nexport function getShiftWorkTime(sh, taskTypeMap, breakSettings) {\n let minWork = 0\n let maxWork = 0\n let includeFlexShift = false\n if (sh) {\n if (sh.isFix) {\n let fixShift = sh.getFixShift(taskTypeMap)\n if (fixShift) {\n minWork += fixShift.paidWorkMinutes\n maxWork += fixShift.paidWorkMinutes\n }\n } else {\n includeFlexShift = true\n let durMin = sh.durMin * 15;\n let durMax = sh.durMax * 15;\n if (breakSettings && taskTypeMap) {\n durMin = getBreakSettingsMinWork(breakSettings, durMin);\n durMax = getBreakSettingsMaxWork(breakSettings, durMax);\n }\n minWork += durMin;\n maxWork += durMax;\n }\n }\n\n return { minWork, maxWork, includeFlexShift };\n}","/**\n* @typedef {{ id: number; ccid:number; name:string; description?:string; affinityId?:number|null; optimizationPriority?:number|null;}} SkillDto\n*/\n\nexport class Skill {\n /**\n * @param {SkillDto} dto\n */\n constructor(dto) {\n /** @private @type {number} */\n this._id = dto.id;\n /** @private @type {string} */\n this._name = dto.name;\n /** @private @type {string} */\n this._description = dto.description ? dto.description : null;\n /** @private @type {number} */\n this._optimizationPriority = dto.optimizationPriority ? dto.optimizationPriority : null;\n /** @private @type {number} */\n this._contactCenterId = dto.ccid;\n /** @private @type {number|null} */\n this._affinity = dto.affinityId ? dto.affinityId : null;\n /** @private @type {boolean} */\n this._hasChanges = false;\n /** @private @type {boolean} */\n this._isToDelete = false;\n }\n\n get id() {\n return this._id;\n }\n\n get numericSort() {\n let x = parseInt(this._name)\n return '00000000'.slice(0, 8 - x.toString().length) + x.toString() + this._name.slice(x.toString().length)\n }\n\n get affinity() {\n return this._affinity;\n }\n\n set affinity(newValue) {\n this._affinity = newValue;\n this.markAsHasChanges();\n }\n\n // should only be called if the affinity has been removed on the server.\n clearAffinity() {\n this._affinity = null;\n }\n\n get name() {\n return this._name;\n }\n\n set name(newValue) {\n this._name = newValue;\n this.markAsHasChanges();\n }\n\n get description() {\n return this._description;\n }\n\n set description(newValue) {\n this._description = newValue;\n this.markAsHasChanges();\n }\n\n get optimizationPriority() {\n return this._optimizationPriority ? this._optimizationPriority : 1;\n }\n\n set optimizationPriority(newValue) {\n const v = Number(newValue);\n if (Number.isNaN(v) || v < 1) { return; }\n this._optimizationPriority = Math.round(v);\n this.markAsHasChanges();\n }\n\n get contactCenterId() {\n return this._contactCenterId\n }\n\n set contactCenterId(newValue) {\n this._contactCenterId = newValue;\n this.markAsHasChanges();\n }\n\n get hasChanges() {\n return this._hasChanges;\n }\n\n /**\n * @param {{ id: number; }} result\n */\n confirmChanges(result) {\n this._id = result.id;\n this._hasChanges = false;\n }\n\n markAsHasChanges() {\n this._hasChanges = true;\n }\n\n get isToDelete() {\n return this._isToDelete;\n }\n\n toDelete() {\n this._isToDelete = true;\n this._hasChanges = this.id >= 0;\n }\n\n /** @returns {SkillDto} */\n toDto() {\n const id = this.id >= 0 ? this.id : undefined;\n return {\n id,\n ccid: this.contactCenterId,\n description: this.description,\n name: this.name,\n affinityId: this.affinity,\n optimizationPriority: this._optimizationPriority,\n };\n }\n}","import { fetchAndCheckJson } from '@/js/dn-fetch.js';\n\nexport const IMPORT_CONFIG_KIND = createImportConfigEnum();\n\n/**\n * @param {SwitchConfig[]} switchConfigs\n */\nexport function addNewSwitchConfig(switchConfigs) {\n let minId = 0;\n for (const sc of switchConfigs) {\n minId = Math.min(sc.id, minId);\n }\n\n switchConfigs.push(new SwitchConfig({ id: minId - 1, active: true, timezone: 'UTC', importConfigs: [] }));\n}\n\nfunction createImportConfigEnum() {\n const enumObject = {\n apiCalls: 0,\n startel: 1,\n peoplePraise: 2,\n apiAgentEvents: 3,\n fileImportCalls: 4,\n fileImportAgentEvents: 5,\n };\n\n return Object.freeze(enumObject);\n}\n\nexport function getImportConfigKinds() {\n /** @type {{id:number, name:string}[]} */\n const switchKinds = [];\n switchKinds.push({ id: IMPORT_CONFIG_KIND.apiCalls, name: 'simTree api' });\n switchKinds.push({ id: IMPORT_CONFIG_KIND.startel, name: 'startel cmc api' });\n switchKinds.push({ id: IMPORT_CONFIG_KIND.peoplePraise, name: 'People Praise' });\n switchKinds.push({ id: IMPORT_CONFIG_KIND.apiAgentEvents, name: 'simTree api' });\n switchKinds.push({ id: IMPORT_CONFIG_KIND.fileImportCalls, name: 'file import' });\n switchKinds.push({ id: IMPORT_CONFIG_KIND.fileImportAgentEvents, name: 'file import' });\n return switchKinds;\n}\n\n/**\n * @param {number} importConfigKind\n */\nfunction isImportOfCallData(importConfigKind) {\n switch (importConfigKind) {\n case IMPORT_CONFIG_KIND.apiCalls:\n case IMPORT_CONFIG_KIND.startel:\n case IMPORT_CONFIG_KIND.fileImportCalls:\n return true;\n default:\n return false;\n }\n}\n\n/**\n * @typedef {{switchId:number, kind:number, url:string|null, username:string|null, pwd:string|null, lastTime:Date|null, errorMsg?:string|null, calcWrap:boolean|null; minSystemHold:number|null}} ImportConfigtDto\n */\n\n/**\n * @typedef {{id:number;active:boolean;timezone:string; name?:string;importConfigs:ImportConfigtDto[]; deletedImportConfigKinds?:number[]}} SwitchConfigDto\n */\n\nexport async function getSwitches() {\n /** @type {SwitchConfigDto[]} */\n const switches = await fetchAndCheckJson(`switch-config`, 'GET');\n return switches.map(x => new SwitchConfig(x));\n}\n\n/**\n * @param {SwitchConfigDto} data\n */\nasync function postSwitch(data) {\n await fetchAndCheckJson(`switch-config`, 'POST', data);\n}\n\n/**\n * @param {SwitchConfigDto} data\n */\nasync function patchSwitch(data) {\n await fetchAndCheckJson(`switch-config/${data.id}`, 'PATCH', data);\n}\n\nexport class SwitchConfig {\n /**\n * @param {SwitchConfigDto} dto\n */\n constructor(dto) {\n /** @readonly @type {number} */\n this.id = dto.id;\n /** @private @type {string} */\n this._name = dto.name;\n /** @private @type {string} */\n this._timezone = dto.timezone;\n /** @private @type {boolean} */\n this._active = dto.active;\n /** @type {ImportConfigtDto[]} */\n this.importConfigs = dto.importConfigs;\n /** @private @type {Set<number>} */\n this._deletedImportConfigKinds = new Set();\n /** @private @type {Map<number, ImportConfigtDto>} */\n this._changedImportConfigs = new Map();\n /** last time for call data @type {Date|null} */\n let lastTime = null;\n for (const ic of dto.importConfigs) {\n if (ic.lastTime) {\n ic.lastTime = new Date(ic.lastTime);\n if (isImportOfCallData(ic.kind)) {\n if (lastTime === null || ic.lastTime < lastTime) {\n lastTime = ic.lastTime;\n }\n }\n }\n }\n\n /** @readonly @type {Date|null} */\n this.lastTime = lastTime;\n if (dto.id === null) {\n /** @private @type {boolean} */\n this._hasChanges = true;\n }\n }\n\n get active() {\n return this._active;\n }\n set active(value) {\n if (this._active !== value) {\n this._hasChanges = true;\n this._active = value;\n }\n }\n\n get hasChanges() {\n return this._hasChanges === true;\n }\n\n get name() {\n return this._name;\n }\n set name(value) {\n if (this._name !== value) {\n this._hasChanges = true;\n this._name = value;\n }\n }\n\n get timezone() {\n return this._timezone;\n }\n set timezone(value) {\n if (this._timezone !== value) {\n this._hasChanges = true;\n this._timezone = value;\n }\n }\n\n /**\n * @param {ImportConfigtDto} dto\n */\n addmportConfig(dto) {\n this.importConfigs.push(dto);\n this._changedImportConfigs.set(dto.kind, dto);\n this.markAsHasChanges();\n }\n\n copy() {\n return new SwitchConfig(this.toDto());\n }\n\n /**\n * @param {number} kind\n */\n deleteImportConfig(kind) {\n const index = this.importConfigs.findIndex(x => x.kind === kind);\n this._deletedImportConfigKinds.add(kind);\n this.importConfigs.splice(index, 1);\n this.markAsHasChanges();\n }\n\n /**\n * @param {ImportConfigtDto} dto\n */\n updateImportConfig(dto) {\n const index = this.importConfigs.findIndex(x => x.kind === dto.kind);\n this.importConfigs[index] = dto;\n this._changedImportConfigs.set(dto.kind, dto);\n this.markAsHasChanges();\n }\n\n /**\n * @param {boolean} calls\n */\n filteredImportConfigs(calls) {\n return this.importConfigs.filter(x => isImportOfCallData(x.kind) === calls);\n }\n\n /**\n * @param {{id:number, name:string}[]} all\n * @param {boolean} calls\n */\n possibleImportConfigsToAdd(all, calls) {\n return all.filter(x => isImportOfCallData(x.id) === calls && !this.importConfigs.some(y => y.kind === x.id));\n }\n\n markAsHasChanges() {\n this._hasChanges = true;\n }\n\n orderById() {\n return this.importConfigs.some(x => x.kind === IMPORT_CONFIG_KIND.startel);\n }\n\n /** @private @returns {SwitchConfigDto} */\n toDto() {\n const importConfigs = this.importConfigs.map(x => ({ ...x }));\n return { id: this.id, name: this.name, timezone: this.timezone, active: this.active, importConfigs }\n }\n\n /** @private */\n toSave() {\n /** @type {ImportConfigtDto[]} */\n const importConfigs = [];\n for (const ic of this._changedImportConfigs.values()) {\n importConfigs.push(ic);\n }\n\n /** @type {SwitchConfigDto} */\n const dto = { id: this.id, name: this.name, timezone: this.timezone, active: this.active, importConfigs };\n if (this._deletedImportConfigKinds.size > 0) {\n dto.deletedImportConfigKinds = Array.from(this._deletedImportConfigKinds);\n }\n\n return dto;\n }\n\n async save() {\n const dto = this.toSave();\n if (this.id <= 0) {\n await postSwitch(dto);\n } else {\n await patchSwitch(dto);\n }\n this._hasChanges = false;\n }\n}\n","import { COLORS } from '@/js/dn-colors.js';\nimport { fetchAndCheckJson } from '@/js/dn-fetch.js';\n\n/**\n* @typedef {{id: number; name: string; colorId: number; abbr: string; }} TagDto\n*/\n\nexport class Tag {\n /**\n * @param {number|null} id\n * @param {string} name\n * @param {number} colorId\n * @param {string} abbr\n */\n constructor(id, name, colorId, abbr) {\n /** @readonly @type {number|null} */\n this.id = id;\n /** @private @type {string} */\n this._name = name;\n /** @type {number} */\n this._colorId = colorId;\n /** @private @type {string} */\n this._abbr = abbr;\n\n /** @private @type {boolean} */\n this._hasChanges = false;\n /** @private @type {boolean} */\n this._isToDelete = false;\n }\n\n get name() {\n return this._name;\n }\n\n set name(newValue) {\n this._name = newValue;\n this._hasChanges = true;\n }\n\n get colorId() {\n return this._colorId;\n }\n\n get abbr() {\n return this._abbr;\n }\n\n set abbr(newValue) {\n this._abbr = newValue;\n this._hasChanges = true;\n }\n\n clone() {\n return new Tag(this.id, this.name, this.colorId, this.abbr);\n }\n\n get schemecolor() {\n return COLORS.byId(this.colorId);\n }\n set schemecolor(value) {\n const colorId = COLORS.idBySchemecolor(value);\n if (colorId !== this.colorId) {\n this._colorId = colorId;\n this._hasChanges = true;\n }\n }\n\n get colorType() {\n return 'is-' + this.schemecolor;\n }\n\n get hasChanges() {\n return this._hasChanges;\n }\n get isToDelete() {\n return this._isToDelete;\n }\n toDelete() {\n this._isToDelete = true;\n this._hasChanges = true;\n }\n}\n\n/** @returns {Promise<TagDto[]>} */\nexport async function getTags() {\n return await fetchAndCheckJson('tag', 'GET');\n}\n\n/** @returns {Promise<number[][]>} */\nexport async function getTagUsage() {\n return await fetchAndCheckJson('tag-usage', 'GET');\n}\n\n/**\n * @param {Tag[]} tags\n */\nexport async function postTags(tags) {\n /** @type {{ delete: number[]; rows: {id: null|number, name:string, colorId:number, abbr:string}[]}} */\n let data = {\n delete: [],\n rows: []\n }\n for (const tag of tags) {\n if (tag.isToDelete) {\n if (tag.id !== null)\n data.delete.push(tag.id);\n } else if (tag.hasChanges) {\n data.rows.push({ id: tag.id, name: tag.name, colorId: tag.colorId, abbr: tag.abbr });\n }\n }\n\n await fetchAndCheckJson('tag', 'POST', data);\n}\n\n/**\n * @param {Map<number, Tag>} tagById\n * @param {string} text\n * @param {number[]} disallowedTagIds\n */\nexport function getFilteredTags(tagById, text, disallowedTagIds = undefined) {\n /** @type {Tag[]} */\n const tags = [];\n const textToSeach = text.toLocaleLowerCase();\n for (const tag of tagById.values()) {\n if (disallowedTagIds !== undefined && disallowedTagIds.includes(tag.id))\n continue;\n if (textToSeach.length === 0 || tag.name.toLocaleLowerCase().indexOf(textToSeach) >= 0) {\n tags.push(tag);\n }\n }\n\n return tags;\n}\n\n/**\n * @param {TagDto[]} tags\n */\nexport function convertTagsFromAPI(tags) {\n return new Map(tags.map(convertTagFromAPI).map(x => [x.id, x]));\n}\n\n/**\n * @param {TagDto} tag\n */\nfunction convertTagFromAPI(tag) {\n return new Tag(tag.id, tag.name, tag.colorId, tag.abbr);\n}\n\nconst TAG_USAGE_DESCRIPTION = createTagUsageDescription();\n\nfunction createTagUsageDescription() {\n const tagUsageDescription = ['break settings'];\n return Object.freeze(tagUsageDescription);\n}\n\n/**\n * @param {number[]} tagIds\n * @param {number[][]} tagUsage\n */\nexport function getTagUsageWarnings(tagIds, tagUsage) {\n /** @type {{description: string, tagIds: number[]}[]} */\n const warnings = [];\n for (let i = 0; i < TAG_USAGE_DESCRIPTION.length; i++) {\n const used = tagUsage[i];\n const ids = tagIds.filter(id => used.includes(id));\n if (ids.length > 1) {\n warnings.push({ description: TAG_USAGE_DESCRIPTION[i], tagIds: ids })\n }\n }\n\n return warnings;\n}\n\n/**\n * @param {Map<number, Tag>} tagById\n * @param {{description: string, tagIds: number[]}[]} tagUsageWarnings\n */\nexport function getTagsUsageTooltip(tagById, tagUsageWarnings) {\n if (tagUsageWarnings.length === 0)\n return '';\n\n return tagUsageWarnings.map(w => 'Conflicting ' + w.description + ': ' + w.tagIds.map(tagId => tagById.get(tagId).name).join(', ')).join(', ')\n}","import { employeeFromDto } from '@/shared/dn-employee.js';\nimport { fetchAndCheckJson } from '@/js/dn-fetch.js';\n\nconst ACCESS_RIGHT = createAccessRightEnum();\n\n/**\n * @typedef {{id:number;admin:boolean;email:string;contactcenterIds?:number[];api:boolean;forecasting:string;name:string;reports:string;scheduling:string;settings:string;initials:string;colorId:number;tagIdList?:number[]}} UserDto\n */\n\n/**\n * @param {string} email\n * @param {boolean} api\n */\nexport function createNewUser(email, api) {\n if (api) {\n return new User({\n id: -1, admin: false, api: api, email: email,\n forecasting: '', name: 'API', reports: '', scheduling: '', settings: '', initials:null, colorId:null\n });\n }\n return new User({\n id: -1, admin: false, api: api, email: email,\n forecasting: 'w', name: '', reports: 'r', scheduling: 'w', settings: 'r', initials:null, colorId:null\n });\n}\n\nexport async function getUsers() {\n /** @type {UserDto[]} */\n const result = await fetchAndCheckJson('users', 'GET');\n return result.map(r => new User(r));\n}\n\nexport async function getCurrentUser() {\n const user = await fetchAndCheckJson('users?currentUser=1', 'GET');\n \n return new LoggedInUser(user);\n}\n\n/**\n * @param {number} id\n * @param {number} authMethod\n * @param {number} loginId\n * @param {string} secret\n * @param {number} reqNotify\n */\nexport async function patchUser(id, authMethod, loginId, secret, reqNotify = undefined) {\n /** @type {{ok:boolean}} */\n const result = await fetchAndCheckJson('users/' + id, 'PATCH', { authMethod, loginId, secret, reqNotify });\n return result.ok;\n}\n\n/**\n * @param {User[]} users\n */\nexport async function saveUsers(users) {\n const toDelete = [];\n const toCreate = [];\n const toPatch = [];\n for (const u of users) {\n if (u.isToDelete) {\n toDelete.push(u.id);\n } else if (u.hasChanges) {\n if (u.id === -1) {\n toCreate.push({\n name: u.name, email: u.email, password: u.pwd, contactCenterIds: u.contactcenterIds, tagIdList: u.tagIdList,\n forecasting: u.forecasting, scheduling: u.scheduling, reports: u.reports, settings: u.settings,\n notify: u.notify, notifyEmail: u.notifyEmail, api: u.api, initials: u.initials, colorId: u.colorId\n });\n } else {\n toPatch.push({\n id: u.id, name: u.name, email: u.email, contactCenterIds: u.contactcenterIds, tagIdList: u.tagIdList,\n forecasting: u.forecasting, scheduling: u.scheduling, reports: u.reports, settings: u.settings, initials: u.initials, colorId: u.colorId\n });\n }\n }\n }\n /**\n * @type {{created:{id:number, email:string, notifyResult:boolean|null}[], errors:{email:string; emailAlreadyExists:boolean;}[]}}\n */\n const result = await fetchAndCheckJson('users', 'POST', { toDelete: toDelete, toCreate: toCreate, toPatch: toPatch });\n let i = users.length - 1;\n while (i >= 0) {\n const u = users[i];\n if (u.isToDelete) {\n users.splice(i, 1);\n } else if (u.hasChanges) {\n if (u.id === -1) {\n for (const createdResult of result.created) {\n if (createdResult.email === u.email) {\n u.id = createdResult.id;\n break;\n }\n }\n }\n if (!result.errors.some(x => x.email === u.email)) {\n u.confirmChanges();\n }\n }\n\n i--;\n }\n\n return result;\n}\n\nexport class User {\n /**\n * @param {UserDto} user\n */\n constructor(user) {\n /** @type {number} */\n this.id = user.id;\n /** @private @type {string} */\n this._name = user.name;\n /** @private @type {string} */\n this._email = user.email\n /** @protected @type {number[]} */\n this._contactcenterIds = user.contactcenterIds ? user.contactcenterIds : [];\n /** @private @type {string} */\n this._forecasting = user.forecasting\n /** @private @type {string} */\n this._scheduling = user.scheduling\n /** @private @type {string} */\n this._reports = user.reports\n /** @private @type {string} */\n this._settings = user.settings\n /** @private @type {string} */\n this._initials = user.initials;\n /** @private @type {number} */\n this._colorId = user.colorId;\n /** @readonly @type {boolean} */\n this.admin = user.admin;\n /** @type {boolean} */\n this.api = user.api;\n /** @private @type {number[]} */\n this._tagIdList = user.tagIdList ? user.tagIdList : [];\n /** @private @type {string} */\n this._pwd = '';\n /** @private @type {boolean} */\n this._hasChanges = false;\n /** @private @type {boolean} */\n this._isToDelete = false;\n /** @type {boolean|undefined} */\n this.notify = undefined;\n /** @type {string|undefined} */\n this.notifyEmail = undefined;\n }\n\n get colorId() {\n return this._colorId;\n }\n set colorId(newValue) {\n this._colorId = newValue;\n this.markAsHasChanges();\n }\n\n get initials() {\n return this._initials;\n }\n set initials(newValue) {\n this._initials = newValue;\n this.markAsHasChanges();\n }\n\n get name() {\n return this._name\n }\n set name(newValue) {\n this._name = newValue\n this.markAsHasChanges();\n }\n\n get email() {\n return this._email\n }\n set email(newValue) {\n this._email = newValue\n this.markAsHasChanges();\n }\n\n get pwd() {\n return this._pwd\n }\n\n set pwd(newValue) {\n this._pwd = newValue\n this.markAsHasChanges();\n }\n\n get contactcenterIds() {\n return this._contactcenterIds\n }\n set contactcenterIds(newValue) {\n this._contactcenterIds = newValue\n this.markAsHasChanges();\n }\n\n get tagIdList() {\n return this._tagIdList;\n }\n set tagIdList(newValue) {\n this._tagIdList = newValue;\n this.markAsHasChanges();\n }\n\n getNumAccessRight(val) {\n let x = 0\n if (val == ACCESS_RIGHT.readonly) { x = 1 }\n if (val == ACCESS_RIGHT.write) { x = 2 }\n return x\n }\n getStringAccessRight(val) {\n let x = ACCESS_RIGHT.none\n if (val == 1) { x = ACCESS_RIGHT.readonly }\n if (val == 2) { x = ACCESS_RIGHT.write }\n return x\n }\n getNumAccessRightScheduling(val) {\n let x = 0\n if (val == ACCESS_RIGHT.readonly) { x = 1 }\n if (val == ACCESS_RIGHT.supervisor) { x = 2 }\n if (val == ACCESS_RIGHT.write) { x = 3 }\n return x\n }\n getStringAccessRightScheduling(val) {\n let x = ACCESS_RIGHT.none\n if (val == 1) { x = ACCESS_RIGHT.readonly }\n if (val == 2) { x = ACCESS_RIGHT.supervisor }\n if (val == 3) { x = ACCESS_RIGHT.write }\n return x\n }\n\n get schedulingNum() {\n return this.getNumAccessRightScheduling(this._scheduling)\n }\n get forecastingNum() {\n return this.getNumAccessRight(this._forecasting)\n }\n get settingsNum() {\n return this.getNumAccessRight(this._settings)\n }\n get reportsNum() {\n return this.getNumAccessRight(this._reports)\n }\n\n set forecastingNum(newValue) {\n this._forecasting = this.getStringAccessRight(newValue)\n this.markAsHasChanges();\n }\n\n set schedulingNum(newValue) {\n this._scheduling = this.getStringAccessRightScheduling(newValue)\n this.markAsHasChanges();\n }\n set reportsNum(newValue) {\n this._reports = this.getStringAccessRight(newValue)\n this.markAsHasChanges();\n }\n set settingsNum(newValue) {\n this._settings = this.getStringAccessRight(newValue)\n this.markAsHasChanges();\n }\n\n get scheduling() {\n return this._scheduling\n }\n get forecasting() {\n return this._forecasting\n }\n get settings() {\n return this._settings\n }\n get reports() {\n return this._reports\n }\n set forecasting(newValue) {\n this._forecasting = newValue\n this.markAsHasChanges();\n }\n\n set scheduling(newValue) {\n this._scheduling = newValue\n this.markAsHasChanges();\n }\n set reports(newValue) {\n this._reports = newValue\n this.markAsHasChanges();\n }\n set settings(newValue) {\n this._settings = newValue\n this.markAsHasChanges();\n }\n get hasChanges() {\n return this._hasChanges;\n }\n confirmChanges() {\n this._hasChanges = false;\n this.notify = undefined;\n }\n\n get isToDelete() {\n return this._isToDelete\n }\n markAsHasChanges() {\n this._hasChanges = true;\n }\n toDelete() { this._isToDelete = true }\n}\n\nexport class LoggedInUser extends User {\n constructor(user) {\n super(user)\n /** @type {boolean} */\n this.isSuperAdmin = user.isSuperAdmin;\n /** @private @type {import(\"../shared/dn-employee.js\").Employee|null} */\n this._employee = null;\n\n /** @type {string|null} */\n this.endTime = user.endTime;\n\n /** @type {number[]} */\n const features = user.features;\n\n /** @readonly @type {boolean} */\n this.sms = features.includes(2);\n\n /** @readonly @private @type {boolean} */\n this._adherence = features.includes(3);\n\n /** @type {number} */\n this.authMethod = user.authMethod !== null ? user.authMethod : 0;\n\n /** @type {boolean} */\n this.isEmail = user.isEmail !== false;\n\n /** @type {number} */\n this.useMode = user.useMode;\n\n /** @type {boolean} */\n this.useDepartments = user.useDepartments;\n\n /** @type {number} */\n this.reqNotify = user.reqNotify !== null ? user.reqNotify : 0;\n\n\n if (user.employee) {\n this.employee = employeeFromDto(user.employee);\n }\n\n /** @type {string} */\n const customerTimezone = user.customerTimezone;\n\n /** @readonly @type {string} */\n this.timezone = user.tzMode > 0 ? customerTimezone : null;\n\n /** @readonly @type {string} */\n this.timezoneUI = this.isAgent && user.tzMode === 2 ? customerTimezone : undefined;\n }\n\n get hasAdherence() {\n return this._adherence && !this._employee;\n }\n\n get hasAccessForecasting() {\n return this.forecasting !== ACCESS_RIGHT.none;\n }\n get hasAccessReports() {\n return this.reports !== ACCESS_RIGHT.none;\n }\n get hasAccessScheduling() {\n return this.scheduling !== ACCESS_RIGHT.none;\n }\n get hasAccessSettings() {\n return this.settings !== ACCESS_RIGHT.none;\n }\n\n get canEditForecasting() {\n return this.forecasting === ACCESS_RIGHT.write;\n }\n get canEditScheduling() {\n return (this.scheduling === ACCESS_RIGHT.write) || (this.scheduling === ACCESS_RIGHT.supervisor);\n }\n get canEditSettings() {\n return this.settings === ACCESS_RIGHT.write;\n }\n get isSupervisor() {\n return this.scheduling === ACCESS_RIGHT.supervisor;\n }\n\n get isAgent() {\n return this.employee !== null;\n }\n\n //if not null, agent login\n get employee() {\n return this._employee\n }\n set employee(newValue) {\n this._employee = newValue\n if (newValue)\n this._contactcenterIds = [newValue.ccid]\n }\n}\n\n/**\n * @param {string} current\n * @param {string} text\n */\nexport function getSecretFormatting(current, text) {\n let password2WithMask = '';\n let password2 = '';\n for (const c of text) {\n if (c >= '0' && c <= '9') {\n if (password2WithMask.length === 3) {\n password2WithMask += ' - '\n }\n password2WithMask += c;\n password2 += c;\n }\n }\n if (current === password2WithMask) {\n password2WithMask += ' ';\n }\n\n return { password2, password2WithMask };\n}\n\nfunction createAccessRightEnum() {\n const enumObject = {\n none: '',\n readonly: 'r',\n supervisor: 's',\n write: 'w',\n };\n\n return Object.freeze(enumObject);\n}\n","import { addDays } from '#shared/dn-shared-helper';\nimport { createSchedule } from \"#shared/dn-employee-schedule\";\n\n/**\n * @typedef {{ dayBefore:import(\"#shared/dn-timezone\").TimezoneDayInfo;day:import(\"#shared/dn-timezone\").TimezoneDayInfo;dayAfter:import(\"#shared/dn-timezone\").TimezoneDayInfo }} HolidayInfo\n */\n\n/**\n * @typedef {{adherenceOptions:{adherenceBase:number}; currentCC:{tagIds:number[]}; holidays:{ date: Date; }[]; generalEmpAppSettings:{weekStartDay:number}; taskTypes:import(\"#shared/dn-tasktype\").TaskTypes}} PayrollReportData\n */\n\n/**\n * @typedef {{numHoursWeeklyOvertime:number;weekendAsHoliday:boolean}} ReportOptions\n */\n\n/**\n * @typedef {{id?:number;payrollRuleId?:number;workType:number|null;taskTypes?:number[];stMinute:number|null;stDay:number|null;fiMinute:number|null;fiDay:number|null;subtract:boolean|null;shiftBounds:boolean}} PayrollRuleDetailDto\n */\n\n/**\n * @typedef {{id?:number;agreementId?:number;code:string;name:string;kind:number;weekLimitAbove:boolean|null;details?:PayrollRuleDetailDto[]}} PayrollRuleDto\n */\n\n/**\n * @typedef {{id:number;name:string;tagId:number|null;payrollPeriod:number;payrollPeriodShiftBounds:boolean;payrollRules?:PayrollRuleDto[];isReport?:boolean;kind:number}} AgreementDto\n */\n\n/**\n * @typedef {{empid:string;empName:string;code:string;payrollName:string;amount:number;unit:string}} PayrollReportRow\n */\n\nexport const AGREEMENT_KIND = createAgreementKind();\n\nfunction createAgreementKind() {\n const e = {\n payroll: 0,\n report: 1,\n accumulation: 2,\n };\n\n return Object.freeze(e);\n}\n\nexport const PAYROLL_RULE_KIND = createPayrollRuleKind();\n\nfunction createPayrollRuleKind() {\n const e = {\n hours: 0,\n dayCount: 1,\n /** @type {(t:(arg0:string) => string) => {id:number;name:string}[]} */\n getOptions: null\n };\n\n e.getOptions = function (t) {\n return [dd(e.hours, t('settings.hours')), dd(e.dayCount, t('settings.day-count'))];\n }\n\n return Object.freeze(e);\n}\n\nexport const PAYROLL_RULE_WORK_TYPE = createPayrollRuleWorkType();\n\nfunction createPayrollRuleWorkType() {\n const e = {\n paidWork: 0,\n attendance: 1,\n taskTypes: 2,\n flex: 3,\n };\n\n return Object.freeze(e);\n}\n\nexport const PAYROLL_RULE_DAY_KIND = createPayrollRuleDayKind();\n\nfunction createPayrollRuleDayKind() {\n const e = {\n sunday: 0,\n monday: 1,\n tuesday: 2,\n wednesday: 3,\n thursday: 4,\n friday: 5,\n saturday: 6,\n holiday: 7,\n dayBeforeHoliday: 8,\n dayAfterHoliday: 9,\n /** @type {(t:(arg0:string) => string) => {id:number;name:string}[]} */\n getOptions: null\n };\n\n e.getOptions = function (t) {\n const result = []\n for (let i = 0; i < 7; i++) {\n const dt = new Date(2024, 0, 7 + i);\n result.push(dd(i, dt.toLocaleDateString('en-US', { weekday: 'long' })));\n }\n result.push(dd(e.holiday, t('settings.holiday')));\n result.push(dd(e.dayBeforeHoliday, t('settings.day-before-holiday')));\n result.push(dd(e.dayAfterHoliday, t('settings.day-after-holiday')));\n\n return result;\n }\n\n return Object.freeze(e);\n}\n\nexport function getWeekLimitAboveOptions(t) {\n return [{ id: true, name: 'above' }, { id: false, name: 'below' }];\n}\n\n/**\n * @param {number} id\n * @param {string} name\n */\nfunction dd(id, name) {\n return { id, name };\n}\n\nexport class Agreements {\n constructor() {\n /** @type {Map<number, AgreementDto>} */\n this.byId = null;\n /** @private @type {Map<number, AgreementDto>} */\n this._byTagId = null;\n this.loadCounter = 0;\n }\n\n get byTagId() {\n if (this._byTagId === null && this.isLoaded) {\n /** @type {Map<number, AgreementDto>} */\n const byTagId = new Map();\n for (const dto of this.byId.values()) {\n if (dto.kind === AGREEMENT_KIND.payroll) {\n byTagId.set(dto.tagId, dto);\n }\n }\n this._byTagId = byTagId;\n }\n return this._byTagId;\n }\n\n get isLoaded() {\n return this.byId !== null;\n }\n\n get hasPayrollRules() {\n if (!this.isLoaded) { return undefined; }\n for (const agreement of this.byId.values()) {\n if (agreement.payrollRules.length > 0) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * @param {number} kind\n * @returns {AgreementDto[]}\n */\n asList(kind) {\n if (this.byId) {\n /** @type {AgreementDto[]} */\n const list = [];\n for (const dto of this.byId.values()) {\n if (dto.kind === kind) {\n list.push(dto);\n }\n }\n return list;\n }\n return undefined;\n }\n\n /** @param {AgreementDto[]} dtoList */\n load(dtoList) {\n const byId = new Map();\n for (const dto of dtoList) {\n byId.set(dto.id, dto);\n }\n this.byId = byId;\n this._byTagId = null;\n this.loadCounter += 1;\n }\n\n /**\n * @private\n * @param {number[]} tagIdList\n * @param {AgreementDto} defaultAgreement\n */\n getByTagId(tagIdList, defaultAgreement = undefined) {\n const byTagId = this.byTagId;\n for (const tagId of tagIdList) {\n const dto = byTagId.get(tagId);\n if (dto) { return dto; }\n }\n if (defaultAgreement === undefined) {\n defaultAgreement = this._byTagId.get(null);\n if (defaultAgreement === undefined) {\n defaultAgreement = null;\n }\n }\n\n return defaultAgreement;\n }\n\n /**\n * @param {{tagIds:number[]}} employee\n * @param {{tagIds:number[]}} cc\n */\n getPayrollPeriod(employee, cc) {\n const defaultAgreement = this.getByTagId(cc.tagIds);\n const agreement = this.getByTagId(employee.tagIds, defaultAgreement);\n return agreement ? agreement.payrollPeriod : 0;\n }\n\n /**\n * @param {import(\"#shared/dn-date-interval\").DateInterval} timeRange\n * @param {import(\"#shared/dn-employee\").Employee[]} employees\n * @param {import(\"#shared/dn-task\").Task[]} scheduleTasks\n * @param {PayrollReportData} data\n * @param {ReportOptions} reportOptions\n * @param {AgreementDto} agreementToUse\n */\n getPayrollReportData(timeRange, employees, scheduleTasks, data, reportOptions, agreementToUse = null) {\n return this.getPayrollReportDataImpl(timeRange, employees, scheduleTasks, data, reportOptions, agreementToUse).rows;\n }\n\n /**\n * @param {import(\"#shared/dn-date-interval\").DateInterval} timeRange\n * @param {import(\"#shared/dn-employee\").Employee[]} employees\n * @param {import(\"#shared/dn-task\").Task[]} scheduleTasks\n * @param {PayrollReportData} data\n * @param {ReportOptions} reportOptions\n * @param {AgreementDto} agreementToUse\n */\n getPayrollReportDataOneRow(timeRange, employees, scheduleTasks, data, reportOptions, agreementToUse = null) {\n return this.getPayrollReportDataImpl(timeRange, employees, scheduleTasks, data, reportOptions, agreementToUse).oneRowReport;\n }\n\n /**\n * @private\n * @param {import(\"#shared/dn-date-interval\").DateInterval} timeRange\n * @param {import(\"#shared/dn-employee\").Employee[]} employees\n * @param {import(\"#shared/dn-task\").Task[]} scheduleTasks\n * @param {PayrollReportData} data\n * @param {ReportOptions} reportOptions\n * @param {AgreementDto} agreementToUse\n */\n getPayrollReportDataImpl(timeRange, employees, scheduleTasks, data, reportOptions, agreementToUse = null) {\n const cc = data.currentCC;\n const holidays = data.holidays;\n const taskTypes = data.taskTypes;\n const adherenceBase = data.adherenceOptions.adherenceBase;\n const weeklyLimit = reportOptions.numHoursWeeklyOvertime ? reportOptions.numHoursWeeklyOvertime : 40;\n const sortedHolidays = getSortedHolidays(timeRange, holidays, reportOptions.weekendAsHoliday);\n const timeRangeWeeks = timeRange.splitIntoWeeks(data.generalEmpAppSettings.weekStartDay);\n\n const defaultAgreement = agreementToUse ? agreementToUse : this.getByTagId(cc.tagIds);\n /** @type {import(\"#shared/dn-employee\").Employee[]} */\n const employeesWithAgreement = [];\n /** @type {Map<number, PayrollRuleCalcGroup[]>} */\n const payrollRuleGroupsById = new Map();\n /** @type {Map<number, PayrollRuleCalcGroup[]>} */\n const payrollRuleGroupsEmpId = new Map();\n\n for (const emp of employees) {\n const agreement = agreementToUse ? agreementToUse : this.getByTagId(emp.tagIds, defaultAgreement);\n if (agreement) {\n employeesWithAgreement.push(emp);\n let groups = payrollRuleGroupsById.get(agreement.id);\n if (groups === undefined) {\n groups = [];\n for (const dto of agreement.payrollRules) {\n /** @type {PayrollRuleCalcGroup} */\n let group = undefined;\n if (dto.code.length > 0) {\n group = groups.find(x => x.code === dto.code && x.kind === dto.kind);\n }\n if (!group) {\n group = new PayrollRuleCalcGroup(dto);\n groups.push(group);\n }\n if (dto.weekLimitAbove === null) {\n const payrollRule = new PayrollRuleCalc(taskTypes.byId, dto, timeRange, agreement.payrollPeriodShiftBounds, weeklyLimit, sortedHolidays, adherenceBase);\n group.payrollRules.push(payrollRule);\n } else {\n for (const tr of timeRangeWeeks) {\n const payrollRule = new PayrollRuleCalc(taskTypes.byId, dto, tr, agreement.payrollPeriodShiftBounds, weeklyLimit, sortedHolidays, adherenceBase);\n group.payrollRules.push(payrollRule);\n }\n }\n }\n for (const group of groups) {\n group.calcName();\n }\n\n payrollRuleGroupsById.set(agreement.id, groups);\n }\n payrollRuleGroupsEmpId.set(emp.id, groups);\n }\n }\n\n /** @type {import(\"@/components/Reporting/TableReport.vue\").ReportColumnDefinition[]} */\n const reportColumnDefinitions = [];\n for (const rules of payrollRuleGroupsById.values()) {\n for (const r of rules) {\n reportColumnDefinitions.push({ name: r.id.toString(), header: r.code, width: 50 });\n }\n }\n\n const schedules = createSchedule(timeRange, scheduleTasks, taskTypes, employeesWithAgreement, true);\n /** @type {PayrollReportRow[]} */\n const rows = [];\n /** @type {{empid:string;empName:string;[p:string]:any}[]} */\n const rows2 = [];\n /** @type {Map<number, {empid:string;empName:string;[p:string]:any}>} */\n const row2ByEmp = new Map();\n\n for (const employeeSchedule of schedules) {\n const groups = payrollRuleGroupsEmpId.get(employeeSchedule.emp.id);\n const empid = employeeSchedule.emp.empid;\n const empName = employeeSchedule.emp.name;\n for (const payrollRuleGroup of groups) {\n let amount = 0;\n for (const payrollRule of payrollRuleGroup.payrollRules) {\n amount += payrollRule.getAmount(employeeSchedule)\n }\n if (amount !== 0) {\n amount = Math.round(10000 * amount) / 10000;\n const code = payrollRuleGroup.code;\n const payrollName = payrollRuleGroup.name;\n const unit = payrollRuleGroup.unit;\n rows.push({ empid, empName, code, payrollName, amount, unit });\n let row2 = row2ByEmp.get(employeeSchedule.emp.id);\n if (row2 === undefined) {\n row2 = { empid, empName };\n row2ByEmp.set(employeeSchedule.emp.id, row2)\n rows2.push(row2)\n }\n row2[payrollRuleGroup.id] = amount;\n }\n }\n }\n\n return { rows, oneRowReport: { reportColumnDefinitions, rows: rows2 } };\n }\n\n /**\n * @param {number} agreementId\n */\n remove(agreementId) {\n if (this.byId) {\n this.byId.delete(agreementId);\n this._byTagId = null;\n this.loadCounter += 1;\n\n }\n }\n}\n\nclass PayrollRuleCalc {\n /**\n * @param {Map<number, import(\"#shared/dn-tasktype\").TaskType>} taskTypeById\n * @param {PayrollRuleDto} payrollRule\n * @param {import(\"#shared/dn-date-interval\").DateInterval} timeRange\n * @param {boolean} payrollPeriodShiftBounds\n * @param {number} weeklyLimit\n * @param {HolidayInfo[]} sortedHolidays\n * @param {number} adherenceBase\n */\n constructor(taskTypeById, payrollRule, timeRange, payrollPeriodShiftBounds, weeklyLimit, sortedHolidays, adherenceBase) {\n /** @type {string} */\n this.code = payrollRule.code;\n /** @type {string} */\n this.name = payrollRule.name;\n /** @type {number} */\n this.weeklyLimit = weeklyLimit;\n /** @type {boolean} */\n this.weeklyLimitAbove = payrollRule.weekLimitAbove;\n const unitDays = payrollRule.kind === PAYROLL_RULE_KIND.dayCount;\n const useShiftBounds = payrollRule.kind === PAYROLL_RULE_KIND.dayCount || payrollPeriodShiftBounds;\n\n /** @type {PayrollRuleDetail[]} */\n this.details = [];\n for (const detail of payrollRule.details) {\n if (detail.shiftBounds) {\n this.details.push(new PayrollRuleShiftBound(detail, taskTypeById, timeRange,\n sortedHolidays, adherenceBase, unitDays));\n } else {\n this.details.push(new PayrollRuleTime(detail, taskTypeById, timeRange,\n sortedHolidays, adherenceBase, unitDays, useShiftBounds));\n }\n }\n }\n\n /**\n * @param {import(\"#shared/dn-employee-schedule\").EmployeeSchedule} employeeSchedule\n */\n getAmount(employeeSchedule) {\n let amount = 0;\n for (const d of this.details) {\n amount += d.getAmount(employeeSchedule);\n }\n if (this.weeklyLimitAbove === true) {\n amount = Math.max(0, amount - this.weeklyLimit);\n } else if (this.weeklyLimitAbove === false) {\n amount = Math.min(amount, this.weeklyLimit);\n }\n return amount;\n }\n}\n\nclass PayrollRuleDetail {\n /**\n * @param {PayrollRuleDetailDto} payrollRule\n * @param {Map<number, import(\"#shared/dn-tasktype\").TaskType>} taskTypeById\n * @param {import(\"#shared/dn-date-interval\").DateInterval} timeRange\n * @param {boolean} unitDays\n * @param {number} adherenceBase\n */\n constructor(payrollRule, taskTypeById, timeRange, unitDays, adherenceBase) {\n /** @type {number} */\n this.adherenceBase = adherenceBase;\n /** @type {boolean} */\n this.calcAttendance = payrollRule.workType === PAYROLL_RULE_WORK_TYPE.attendance;\n /** @private @type {boolean} */\n this.calcFlex = payrollRule.workType === PAYROLL_RULE_WORK_TYPE.flex;\n /** @readonly @private @type {boolean} */\n this.subtract = payrollRule.subtract;\n /** @type {Map<number, Set<number>>} */\n this.taskTypesByKind = new Map();\n /** @type {boolean} */\n this.unitDays = unitDays;\n for (const taskTypeId of payrollRule.taskTypes) {\n const tt = taskTypeById.get(taskTypeId);\n let ttSet = this.taskTypesByKind.get(tt.kind);\n if (ttSet === undefined) {\n ttSet = new Set();\n this.taskTypesByKind.set(tt.kind, ttSet);\n }\n ttSet.add(tt.id);\n }\n /** @type {import(\"#shared/dn-date-interval\").DateInterval} */\n this.timeRange = timeRange;\n }\n\n /**\n * @protected\n * @param {import(\"#shared/dn-employee-schedule\").EmployeeSchedule} employeeSchedule\n */\n getInternalAmount(employeeSchedule) {\n return 0;\n }\n\n /**\n * @param {import(\"#shared/dn-employee-schedule\").EmployeeSchedule} employeeSchedule\n */\n getAmount(employeeSchedule) {\n if (this.calcFlex && employeeSchedule.emp.agreedWorkWeek === null) {\n return 0;\n }\n let amount = this.getInternalAmount(employeeSchedule);\n if (this.calcFlex) {\n amount -= this.timeRange.numberOfDays * employeeSchedule.emp.agreedWorkWeek / (7 * 60);\n }\n if (this.subtract) {\n return -amount;\n }\n return amount;\n }\n}\n\nclass PayrollRuleTime extends PayrollRuleDetail {\n /**\n * @param {PayrollRuleDetailDto} payrollRule\n * @param {Map<number, import(\"#shared/dn-tasktype\").TaskType>} taskTypeById\n * @param {import(\"#shared/dn-date-interval\").DateInterval} timeRange\n * @param {HolidayInfo[]} sortedHolidays\n * @param {number} adherenceBase\n * @param {boolean} unitDays\n * @param {boolean} useShiftBounds\n */\n constructor(payrollRule, taskTypeById, timeRange, sortedHolidays, adherenceBase, unitDays, useShiftBounds) {\n super(payrollRule, taskTypeById, timeRange, unitDays, adherenceBase);\n\n /** @type {boolean} */\n this.useShiftBounds = useShiftBounds;\n /** @readonly @type {{st:Date;fi:Date}[]} */\n this.timeToRemove = [];\n if (!this.useShiftBounds) {\n this.addTimeToRemove(addDays(timeRange.st, -1000), timeRange.st);\n const fi = timeRange.fi;\n this.addTimeToRemove(fi, addDays(fi, 1000));\n }\n if (payrollRule.stDay !== null && payrollRule.fiDay !== null) {\n if (payrollRule.stDay < 7) {\n let numberOfDays = timeRange.numberOfDays + 1;\n /** @type {Date} */\n let st = null;\n for (let i = -7; i < numberOfDays; i++) {\n const dayInfo = timeRange.byIndex(i);\n const day = dayInfo.dtLocal.getDay();\n if (st === null && payrollRule.fiDay === day) {\n if (payrollRule.fiMinute !== null) {\n st = timeRange.getDate(dayInfo, 0, payrollRule.fiMinute);\n } else {\n st = timeRange.byIndex(i + 1).dt;\n }\n }\n if (st !== null && payrollRule.stDay === day) {\n /** @type {Date} */\n let fi;\n if (payrollRule.stMinute !== null) {\n fi = timeRange.getDate(dayInfo, 0, payrollRule.stMinute);\n } else {\n fi = dayInfo.dt;\n }\n if (st < fi) {\n this.addTimeToRemove(st, fi);\n st = null;\n }\n }\n if (st === null && payrollRule.fiDay === day) {\n if (payrollRule.fiMinute !== null) {\n st = timeRange.getDate(dayInfo, 0, payrollRule.fiMinute);\n } else {\n st = timeRange.byIndex(i + 1).dt;\n }\n }\n }\n if (st !== null) {\n this.addTimeToRemove(st, addDays(timeRange.st, numberOfDays + 1000));\n }\n } else {\n if (isPayrollHolidaySettingsOk(payrollRule)) {\n let st = addDays(timeRange.st, -1000);\n let fi = null;\n for (const holiday of sortedHolidays) {\n fi = getHolidayTime(timeRange, holiday, payrollRule.stDay, payrollRule.stMinute);\n if (st < fi) {\n this.addTimeToRemove(st, fi);\n }\n st = getHolidayTime(timeRange, holiday, payrollRule.fiDay, payrollRule.fiMinute);\n }\n fi = addDays(timeRange.st, timeRange.numberOfDays + 1000);\n this.addTimeToRemove(st, fi);\n }\n }\n } else if (payrollRule.stMinute !== null && payrollRule.fiMinute !== null && payrollRule.stMinute !== payrollRule.fiMinute) {\n const overMidnight = payrollRule.fiMinute < payrollRule.stMinute;\n const startIndex = overMidnight ? 0 : -1;\n for (let i = startIndex; i <= timeRange.numberOfDays; i++) {\n const dayInfo = timeRange.byIndex(i);\n if (overMidnight) {\n const fi = timeRange.getDate(dayInfo, 0, payrollRule.fiMinute);\n const st = timeRange.getDate(dayInfo, 0, payrollRule.stMinute);\n this.addTimeToRemove(fi, st);\n } else {\n const nextDayInfo = timeRange.byIndex(i + 1);\n const fi = timeRange.getDate(dayInfo, 0, payrollRule.fiMinute);\n const nextDaySt = timeRange.getDate(nextDayInfo, 0, payrollRule.stMinute);\n this.addTimeToRemove(fi, nextDaySt);\n }\n }\n }\n }\n\n /**\n * @private\n * @param {Date} st\n * @param {Date} fi\n */\n addTimeToRemove(st, fi) {\n if (st < fi) {\n this.timeToRemove.push({ st, fi });\n }\n }\n\n /**\n * @param {import(\"#shared/dn-employee-schedule\").EmployeeSchedule} employeeSchedule\n */\n getInternalAmount(employeeSchedule) {\n return employeeSchedule.getPayrollTime(this);\n }\n}\n\nclass PayrollRuleShiftBound extends PayrollRuleDetail {\n /**\n * @param {PayrollRuleDetailDto} payrollRule\n * @param {Map<number, import(\"#shared/dn-tasktype\").TaskType>} taskTypeById\n * @param {import(\"#shared/dn-date-interval\").DateInterval} timeRange\n * @param {HolidayInfo[]} sortedHolidays\n * @param {number} adherenceBase\n * @param {boolean} unitDays\n */\n constructor(payrollRule, taskTypeById, timeRange, sortedHolidays, adherenceBase, unitDays) {\n super(payrollRule, taskTypeById, timeRange, unitDays, adherenceBase)\n\n const timeRangeFi = timeRange.fi;\n\n /** @type {{st:Date;fi:Date}[]} */\n this.timeIntervals = [];\n if (payrollRule.stDay !== null && payrollRule.fiDay !== null) {\n if (payrollRule.stDay < 7) {\n let numberOfDays = timeRange.numberOfDays + 1;\n /** @type {Date} */\n let st = null;\n for (let i = -7; i < numberOfDays; i++) {\n const dayInfo = timeRange.byIndex(i);\n const day = dayInfo.dtLocal.getDay();\n if (st === null && payrollRule.stDay === day) {\n if (payrollRule.stMinute !== null) {\n st = timeRange.getDate(dayInfo, 0, payrollRule.stMinute);\n } else {\n st = dayInfo.dt;\n }\n if (st < timeRange.st) { st = timeRange.st; }\n }\n if (st !== null && payrollRule.fiDay === day) {\n /** @type {Date} */\n let fi;\n if (payrollRule.fiMinute !== null) {\n fi = timeRange.getDate(dayInfo, 0, payrollRule.fiMinute);\n } else {\n fi = timeRange.byIndex(i + 1).dt;\n }\n if (fi > timeRangeFi) { fi = timeRangeFi; }\n this.addtimeIntervals(st, fi);\n st = null;\n }\n if (st === null && payrollRule.stDay === day) {\n if (payrollRule.stMinute !== null) {\n st = timeRange.getDate(dayInfo, 0, payrollRule.stMinute);\n } else {\n st = dayInfo.dt;\n }\n if (st < timeRange.st) { st = timeRange.st; }\n }\n }\n if (st !== null) {\n this.addtimeIntervals(st, timeRangeFi);\n }\n } else {\n if (isPayrollHolidaySettingsOk(payrollRule)) {\n /** @type {Date} */\n let st = null;\n /** @type {Date} */\n let fi = null;\n for (const holiday of sortedHolidays) {\n let newSt = getHolidayTime(timeRange, holiday, payrollRule.stDay, payrollRule.stMinute);\n if (newSt < timeRange.st) { newSt = timeRange.st; }\n if (fi) {\n if (fi < newSt) {\n this.addtimeIntervals(st, fi);\n st = newSt;\n }\n } else {\n st = newSt;\n }\n fi = getHolidayTime(timeRange, holiday, payrollRule.fiDay, payrollRule.fiMinute);\n if (fi > timeRangeFi) { fi = timeRangeFi; }\n }\n\n if (fi) {\n this.addtimeIntervals(st, fi);\n }\n }\n }\n } else if (payrollRule.stMinute !== null && payrollRule.fiMinute !== null && payrollRule.stMinute !== payrollRule.fiMinute) {\n const fiNextDay = payrollRule.fiMinute < payrollRule.stMinute;\n if (fiNextDay) {\n const dayInfo = timeRange.byIndex(0);\n const fi = timeRange.getDate(dayInfo, 0, payrollRule.fiMinute);\n this.addtimeIntervals(timeRange.st, fi);\n }\n for (let i = 0; i < timeRange.numberOfDays; i++) {\n const dayInfo = timeRange.byIndex(i);\n const st = timeRange.getDate(dayInfo, 0, payrollRule.stMinute);\n\n const fiDay = fiNextDay ? timeRange.byIndex(i + 1) : dayInfo;\n /** @type {Date} */\n let fi = timeRange.getDate(fiDay, 0, payrollRule.fiMinute);\n if (fi > timeRange.fi) {\n fi = timeRange.fi;\n }\n this.addtimeIntervals(st, fi);\n }\n } else {\n this.addtimeIntervals(timeRange.st, timeRangeFi);\n }\n }\n\n /**\n * @private\n * @param {Date} st\n * @param {Date} fi\n */\n addtimeIntervals(st, fi) {\n if (st < fi) {\n this.timeIntervals.push({ st, fi });\n }\n }\n\n /**\n * @param {import(\"#shared/dn-employee-schedule\").EmployeeSchedule} employeeSchedule\n */\n getInternalAmount(employeeSchedule) {\n return employeeSchedule.getPayrollShiftBound(this);\n }\n}\n\nclass PayrollRuleCalcGroup {\n /**\n * @param {PayrollRuleDto} payrollRule\n */\n constructor(payrollRule) {\n /** @readonly @type {number} */\n this.id = payrollRule.id;\n /** @readonly @type {string} */\n this.code = payrollRule.code;\n /** @type {string} */\n this.name = payrollRule.name;\n /** @readonly @type {number} */\n this.kind = payrollRule.kind;\n /** @readonly @type {string} */\n this.unit = payrollRule.kind === PAYROLL_RULE_KIND.dayCount ? 'days' : 'hours';\n /** @readonly @type {PayrollRuleCalc[]} */\n this.payrollRules = [];\n }\n\n calcName() {\n if (this.payrollRules.length <= 1) { return; }\n let name = this.name;\n for (const r of this.payrollRules) {\n if (name.length === 0 || r.name.startsWith(name)) { continue; }\n const length = Math.min(name.length, r.name.length)\n let count = 0;\n let newlength = 0;\n for (let i = 0; i < length; i++) {\n if (name[i] !== r.name[i]) { break; }\n if (name[i] === ' ') { newlength = count; }\n count += 1;\n }\n if (newlength !== length) {\n name = name.substring(0, newlength);\n }\n }\n\n if (name.length > 0) {\n this.name = name;\n } else {\n this.name = this.code;\n }\n }\n}\n\n/**\n * Get start time of holidays near the timerange\n * @param {import(\"#shared/dn-date-interval\").DateInterval} timeRange\n * @param {{ date: Date; }[]} holidays\n * @param {boolean} weekendAsHoliday\n */\nfunction getSortedHolidays(timeRange, holidays, weekendAsHoliday) {\n const dayBeforeInterval = timeRange.byIndex(-1);\n const dayAfterInterval = timeRange.byIndex(timeRange.numberOfDays + 1);\n\n /** @type {HolidayInfo[]} */\n const sortedHolidays = [];\n /** @type {Set<number>} */\n const uniqueDays = weekendAsHoliday ? new Set() : undefined;\n for (const holiday of holidays) {\n const dtLocal = holiday.date;\n\n if (dtLocal >= dayBeforeInterval.dtLocal && dtLocal < dayAfterInterval.dtLocal) {\n const holidayInfo = createHolidayInfo(timeRange, dtLocal);\n sortedHolidays.push(holidayInfo);\n if (uniqueDays) {\n uniqueDays.add(holidayInfo.day.dtLocal.getTime());\n }\n }\n }\n if (weekendAsHoliday) {\n let dtLocal = dayBeforeInterval.dtLocal;\n while (dtLocal < dayAfterInterval.dtLocal) {\n const day = dtLocal.getDay();\n if ((day === 0 || day === 6) && !uniqueDays.has(dtLocal.getTime())) {\n const holidayInfo = createHolidayInfo(timeRange, dtLocal);\n sortedHolidays.push(holidayInfo);\n }\n dtLocal = addDays(dtLocal, 1);\n }\n }\n\n sortedHolidays.sort((a, b) => a.day.dtLocal.getTime() - b.day.dtLocal.getTime());\n return sortedHolidays;\n}\n\n/**\n * @param {import(\"#shared/dn-date-interval\").DateInterval} timeRange\n * @param {Date} dtLocal\n * @returns {HolidayInfo}\n */\nfunction createHolidayInfo(timeRange, dtLocal) {\n const dayBefore = timeRange.byDate(addDays(dtLocal, -1));\n const day = timeRange.byDate(dtLocal);\n const dayAfter = timeRange.byDate(addDays(dtLocal, 1));\n return { dayBefore, day, dayAfter };\n}\n\n/**\n * @param {import(\"#shared/dn-date-interval\").DateInterval} timeRange\n * @param {HolidayInfo} holidayInfo\n * @param {number} dayKind\n * @param {number} minutes\n */\nfunction getHolidayTime(timeRange, holidayInfo, dayKind, minutes) {\n if (dayKind === PAYROLL_RULE_DAY_KIND.dayBeforeHoliday) {\n return timeRange.getDate(holidayInfo.dayBefore, 0, minutes);\n } else if (dayKind === PAYROLL_RULE_DAY_KIND.holiday) {\n return timeRange.getDate(holidayInfo.day, 0, minutes);\n } else if (dayKind === PAYROLL_RULE_DAY_KIND.dayAfterHoliday) {\n return timeRange.getDate(holidayInfo.dayAfter, 0, minutes);\n }\n return undefined;\n}\n\n/**\n * @param {PayrollRuleDetailDto} payrollRuleDetail\n */\nfunction isPayrollHolidaySettingsOk(payrollRuleDetail) {\n const stDay = holidayDiff(payrollRuleDetail.stDay);\n const fiDay = holidayDiff(payrollRuleDetail.fiDay);\n if (stDay < fiDay) { return true; }\n if (stDay === fiDay && payrollRuleDetail.stMinute < payrollRuleDetail.fiMinute) {\n return true;\n }\n return false;\n}\n\n/**\n * @param {number} dayKind\n */\nfunction holidayDiff(dayKind) {\n switch (dayKind) {\n case PAYROLL_RULE_DAY_KIND.dayBeforeHoliday:\n return -1;\n case PAYROLL_RULE_DAY_KIND.holiday:\n return 0;\n case PAYROLL_RULE_DAY_KIND.dayAfterHoliday:\n return 1;\n default:\n return undefined;\n }\n}\n","import { addDays } from '#shared/dn-shared-helper';\nimport { getDateOfInstant, getDateTimezoneInfo, getDateTimeInTimezone } from \"#shared/dn-timezone\";\n\nexport class DateInterval {\n /**\n * @param {Date} date\n * @param {number} numberOfDays\n * @param {string} [timezone]\n */\n constructor(date, numberOfDays, timezone = undefined) {\n /** @readonly @private @type {string} */\n this.timezone = timezone;\n /** @readonly @type {number} */\n this.numberOfDays = numberOfDays;\n\n /** @readonly @private @type {{dt:Date;dtLocal:Date;shortDate:string}[]} */\n this.days = [];\n for (let i = 0; i < numberOfDays + 2; i++) {\n const dtLocal = addDays(date, i - 1);\n this.days.push(getDateTimezoneInfo(dtLocal, timezone));\n }\n\n //daylight saving correction in hours, if transition is within planning range\n /** @readonly @type {Map<string, number>} */\n this.dayLightSavingCorrs = new Map();\n const stTime = this.st.getTime();\n for (let d = -1; d < this.numberOfDays + 1; d += 1) {\n const dayInfo = this.byIndex(d);\n const dt = dayInfo.dt;\n this.dayLightSavingCorrs.set(dayInfo.shortDate, dt.getTime() / (60 * 60 * 1000) - (d * 24) - Math.round(stTime / (60 * 60 * 1000)))\n }\n }\n\n get st() {\n return this.byIndex(0).dt;\n }\n\n get fi() {\n return this.byIndex(this.numberOfDays).dt;\n }\n\n /**\n * @param {number} index\n */\n byIndex(index) {\n const dayIndex = index + 1;\n if (dayIndex >= 0 && dayIndex < this.days.length) {\n return this.days[dayIndex];\n }\n const dtLocal = addDays(this.byIndex(0).dtLocal, index);\n return this.byDate(dtLocal);\n }\n\n /**\n * @param {Date} dtLocal\n */\n byDate(dtLocal) {\n return getDateTimezoneInfo(dtLocal, this.timezone);\n }\n\n /**\n * @param {import(\"#shared/dn-timezone\").TimezoneDayInfo} day\n * @param {number} hours\n * @param {number} minutes\n */\n getDate(day, hours, minutes) {\n if (hours === 0 && minutes === 0) {\n return day.dt;\n }\n return getDateTimeInTimezone(day, hours, minutes, this.timezone);\n }\n\n /**\n * @param {number} weekStartDay\n */\n splitIntoWeeks(weekStartDay) {\n /** @type {DateInterval[]} */\n const weeks = [];\n let st = this.byIndex(0).dtLocal;\n let day = st.getDay();\n let numberOfDays = 0;\n for (let i = 0; i < this.numberOfDays; i++) {\n day += 1;\n if (day > 6) { day = 0; }\n numberOfDays += 1;\n if (day === weekStartDay) {\n weeks.push(new DateInterval(st, numberOfDays, this.timezone));\n st = this.byIndex(i + 1).dtLocal;\n numberOfDays = 0;\n }\n }\n if (numberOfDays > 0) {\n weeks.push(new DateInterval(st, numberOfDays, this.timezone));\n }\n\n return weeks;\n }\n\n /**\n * @param {Date} dt\n */\n startOfDay(dt) {\n return getDateOfInstant(dt, this.timezone);\n }\n}\n","import { addDays, getDayDiff, getQuarterHour, getShortDate, getStartOfDay, sumDateIntervals } from '#shared/dn-shared-helper';\nimport { Task } from \"#shared/dn-task\";\nimport { TASK_KIND } from '#shared/dn-tasktype';\n\n/**\n * @typedef {{\n * days:{dt:Date; endOfDay:Date; day:number; isWeekend:boolean; weekIndex:number; tzDayInfo:import(\"#shared/dn-timezone\").TimezoneDayInfo}[];\n * weeks:Date[];\n * paidWorkInterval:{st:Date;numberOfWeeks:number;dayIndexSt:number;dayIndexFi:number;weekIndexSt:number;weekIndexFi:number}}\n * } CalcInfo\n */\n\n/**\n * @typedef {{st:number; fi:number}[][]} AvailabilityByDay\n */\n\n/**\n * @typedef {{st:Date; fi:Date; tasktypeId:number}} TaskSimple\n */\n\n/**\n * @typedef { { workInMinutes:number; workIntervals:TaskSimple[]}} BOEmpDayWork\n */\n\n/**\n * @typedef {{st:Date; fi:Date; isToDelete?:boolean}} DeletableDateInterval\n */\n\n/**\n * @typedef {{numberOfDays:number;st:Date;byIndex?:(index:number) => import(\"#shared/dn-timezone\").TimezoneDayInfo; getDate?:(day:import(\"#shared/dn-timezone\").TimezoneDayInfo, hours:number, minutes:number) => Date}} DateInterval\n */\n\nexport class EmployeeSchedule {\n /**\n * @param {Map<number, import(\"#shared/dn-tasktype\").TaskType>} taskTypeById\n * @param {import(\"#shared/dn-employee\").Employee} emp\n * @param {import(\"#shared/dn-task\").Task[]} tasks\n * @param {DateInterval} dateInterval\n * @param {number} index\n * @param {CalcInfo|undefined} [calcInfo]\n * @param {AvailabilityByDay} [availabilityByDay]\n * @param {{boData:import(\"@/js/dn-bo-data.js\").BOData;plannedAndTarget:import(\"@/js/dn-planned-and-target.js\").PlannedAndTarget;}} [extra]\n */\n constructor(taskTypeById, emp, tasks, dateInterval, index, calcInfo = undefined, availabilityByDay = undefined, extra = undefined) {\n /** @readonly @private @type {Map<number, import(\"#shared/dn-tasktype\").TaskType>} */\n this.taskTypeById = taskTypeById;\n /** @readonly @type {import(\"#shared/dn-employee\").Employee} */\n this.emp = emp;\n /** @readonly @type {import(\"#shared/dn-task\").Task[][]} */\n this.tasksByKind = [];\n for (let i = 0; i < 7; i++) {\n this.tasksByKind[i] = [];\n }\n /** @private @type {number|undefined} */\n this._paidwork = undefined;\n /** @type {number} */\n this.index = index;\n /** @type {Date} */\n this.focusedDate = dateInterval.st;\n /** @readonly @type {DateInterval} */\n this.dateInterval = dateInterval;\n\n if (calcInfo !== undefined) {\n /** @private @readonly @type {CalcInfo} */\n this.calcInfo = calcInfo;\n /** @private @readonly @type {{hasWork: boolean; shiftBounds: {st:Date; fi:Date}; work:number; workIntervals:import(\"@/js/dn-planned-and-target.js\").WorkInterval[]; boWork:BOEmpDayWork}[]} */\n this.byDay = Array(dateInterval.numberOfDays);\n /** @private @readonly @type {(undefined|number)[]} */\n this._paidWorkWeek = Array(calcInfo.weeks.length);\n /** @type {Map<number, import(\"@/js/dn-bo-data.js\").BOSkillData>} */\n let boByTaskType = undefined;\n if (extra) {\n if (extra.boData.hasAny) {\n boByTaskType = extra.boData.filteredBySkills(this.emp.skills);\n if (boByTaskType.size === 0) {\n boByTaskType = undefined;\n }\n }\n if (extra.plannedAndTarget.hasAny) {\n /** @private @readonly @type {import(\"@/js/dn-planned-and-target.js\").PlannedAndTarget} */\n this.plannedAndTarget = extra.plannedAndTarget;\n }\n }\n if (boByTaskType) {\n /** @private @readonly @type {(undefined|number)[]} */\n this._boWorkWeek = Array(calcInfo.weeks.length);\n }\n\n /** @private @readonly @type {import(\"#shared/dn-task\").Task[]} */\n this.initialTasks = tasks;\n\n /** @private @readonly @type {AvailabilityByDay} */\n this.availabilityByDay = availabilityByDay;\n\n /** @private @readonly @type {Map<number, import(\"@/js/dn-bo-data\").BOSkillData>} */\n this.boByTaskType = boByTaskType;\n }\n\n for (const task of tasks) {\n this.addTask(task);\n }\n\n if (this.boByTaskType) {\n for (let i = 0; i < dateInterval.numberOfDays; i++) {\n this.getDayByIndex(i);\n }\n }\n }\n\n get numberOfDays() {\n return this.dateInterval.numberOfDays;\n }\n\n get tasks() {\n return this.tasksByKind[TASK_KIND.task];\n }\n\n get breaks() {\n return this.tasksByKind[TASK_KIND.break];\n }\n\n get absences() {\n return this.tasksByKind[TASK_KIND.absence];\n }\n\n get payments() {\n return this.tasksByKind[TASK_KIND.payment];\n }\n\n get log() {\n return this.tasksByKind[TASK_KIND.log];\n }\n\n get inRotation() {\n return this.tasksByKind[TASK_KIND.inRotation];\n }\n\n get correction() {\n return this.tasksByKind[TASK_KIND.correction];\n }\n\n /**\n * @param {Date} dt\n * @param {(value: Task, index: number, array: Task[]) => value is Task} isInShift\n */\n copyForReplacement(dt, isInShift) {\n return new EmployeeSchedule(this.taskTypeById, this.emp, this.tasks.concat(this.breaks).filter(isInShift), {st:dt, numberOfDays:1}, -1);\n }\n\n /**\n * In calcMode use only this function for adding tasks\n * @private\n * @param {import(\"#shared/dn-task\").Task} task\n */\n addTask(task) {\n const tt = this.taskTypeById.get(task.tasktypeId);\n if (tt.kind >= 0 && tt.kind < this.tasksByKind.length) {\n const taskList = this.tasksByKind[tt.kind];\n taskList.push(task);\n }\n return null;\n }\n\n /**\n * @param {number} dayIndex\n * @param {{st:number, dur:number; taskTypeId:number}[]} tasks\n * @param {number} minutesPerUnit\n */\n addTasks(dayIndex, tasks, minutesPerUnit = 1) {\n const dayInfo = this.getDayInfo(dayIndex);\n let affectsnextday = false;\n for (const t of tasks) {\n const st = this.dateInterval.getDate(dayInfo.tzDayInfo, 0, t.st * minutesPerUnit);\n const fi = this.dateInterval.getDate(dayInfo.tzDayInfo, 0, (t.st + t.dur) * minutesPerUnit);\n if (st < fi) {\n const task = new Task({ empid: this.emp.id, st, fi, tasktypeId: t.taskTypeId });\n this.addTask(task);\n }\n if (fi > dayInfo.endOfDay) { affectsnextday = true; }\n }\n this.clearDayComputations(dayIndex);\n if (affectsnextday) { this.clearDayComputations(dayIndex + 1); }\n if (this.boByTaskType || this.plannedAndTarget) {\n this.getDayByIndex(dayIndex);\n if (affectsnextday) { this.getDayByIndex(dayIndex + 1); }\n }\n }\n\n get calcMode() {\n return this.calcInfo !== undefined;\n }\n\n /**\n * @private\n * @param {DateInterval} dateInterval\n * @param {boolean} calcPayment\n * @param {boolean} calendarDays\n */\n calculateWork(dateInterval, calcPayment = false, calendarDays = false) {\n let work = 0.0;\n if (this.calcMode && !calcPayment) {\n for (let d = 0; d < dateInterval.numberOfDays; d += 1) {\n const day = this.getDay(addDays(dateInterval.st, d));\n work += day.work;\n }\n } else {\n let daySt = dateInterval.st;\n for (let d = 0; d < dateInterval.numberOfDays; d += 1) {\n const dayFi = dateInterval.byIndex ? dateInterval.byIndex(d + 1).dt : addDays(daySt, 1);\n const shift = calendarDays ? { st: daySt, fi: dayFi } : this.getShiftBoundsByDate(daySt);\n work += this.calculateShiftPaidTime(shift, daySt, dayFi, calcPayment, calendarDays);\n daySt = dayFi;\n }\n }\n\n return Math.round(work * 100) / 100;\n }\n\n /**\n * @private\n * @param {{st:Date; fi:Date}} shift\n * @param {Date} daySt\n * @param {Date} dayFi\n * @param {boolean} [calcPayment]\n * @param {boolean} [calendarDays]\n */\n\n calculateShiftPaidTime(shift, daySt, dayFi, calcPayment = false, calendarDays = false) {\n /** @type {TaskSimple[]} */\n let tasks;\n /** @type {TaskSimple[]} */\n const breaks = [];\n\n if (shift.st < shift.fi) {\n const tasks2 = calcPayment ? this.payments : this.tasks;\n tasks = cutToBounds(tasks2.filter(x => !x.isToDelete), shift);\n\n for (const t of this.breaks) {\n if (!t.isToDelete && t.overlaps(shift.st, shift.fi)) {\n breaks.push(t);\n }\n }\n } else {\n tasks = [];\n }\n\n /** @type {TaskSimple[]} */\n let absences;\n if (calendarDays) {\n absences = cutToBounds(this.absences.filter(x => !x.isToDelete), shift);\n } else {\n absences = [];\n for (const t of this.absences) {\n if (!t.isToDelete && t.st >= daySt && t.st < dayFi) {\n absences.push(t);\n }\n }\n }\n\n return getWorkImpl(this.taskTypeById, { tasks, breaks, absences }, calcPayment);\n }\n\n /**\n * @private\n * @param {number} dayIndex\n * @returns {BOEmpDayWork} \n * \n */\n calculateBOWork(dayIndex) {\n const boByTaskType = this.boByTaskType;\n if (boByTaskType && boByTaskType.size > 0 && dayIndex >= 0) {\n const dayCalcInfo = this.getDayInfo(dayIndex);\n const st = dayCalcInfo.dt;\n const fi = dayCalcInfo.endOfDay;\n const boTasks = this.tasks.filter(x => !x.isToDelete && x.overlaps(st, fi) && boByTaskType.has(x.tasktypeId));\n\n if (boTasks.length > 0) {\n const intervals = cutToBounds(boTasks, { st, fi });\n const workIntervals = subtractTasks(intervals, this.breaks);\n if (workIntervals) {\n let workInMinutes = 0;\n const msPerMinute = 1000 * 60;\n for (const wi of workIntervals) {\n workInMinutes += (wi.fi.getTime() - wi.st.getTime()) / msPerMinute;\n const boSkillData = this.boByTaskType.get(wi.tasktypeId);\n boSkillData.addPlanned(dayIndex, wi, 1);\n }\n return { workInMinutes, workIntervals };\n }\n }\n }\n\n return null;\n }\n\n /**\n * @private\n * @param {number} dayIndex\n * \n */\n calculateWorkIntervals(dayIndex) {\n if (!this.plannedAndTarget || dayIndex < 0) { return undefined; }\n const dayCalcInfo = this.getDayInfo(dayIndex);\n const st = dayCalcInfo.dt;\n const fi = dayCalcInfo.endOfDay;\n /** @type {TaskSimple[]} */\n let taskIntervals = [];\n for (const t of this.tasks) {\n if (!t.isToDelete && t.overlaps(st, fi)) {\n const tt = this.taskTypeById.get(t.tasktypeId);\n if (tt.work > 0) {\n taskIntervals.push({ st: t.st, fi: t.fi, tasktypeId: t.tasktypeId });\n }\n }\n }\n\n /** @type {import(\"@/js/dn-planned-and-target.js\").WorkInterval[]} */\n const workIntervals = [];\n if (taskIntervals.length > 0) {\n taskIntervals = cutToBounds(taskIntervals, { st, fi });\n const breaksOnDay = this.breaks.filter(t => !t.isToDelete && t.overlaps(st, fi));\n taskIntervals = subtractTasks(taskIntervals, breaksOnDay);\n for (const t of taskIntervals) {\n const tt = this.taskTypeById.get(t.tasktypeId);\n const stQ = getQuarterHour(t.st);\n const fiQ = t.fi >= dayCalcInfo.endOfDay ? 96 : getQuarterHour(t.fi);\n workIntervals.push({ stQ, fiQ, work: tt.work / 100 });\n }\n this.plannedAndTarget.addPlanned(dayIndex, this.emp.skills, workIntervals, 1);\n }\n return workIntervals;\n }\n\n /**\n * @param {number} dayIndex\n */\n getDayInfo(dayIndex) {\n return this.calcInfo.days[dayIndex];\n }\n\n get optimizationInterval() {\n return this.calcInfo.paidWorkInterval;\n }\n\n get paidwork() {\n if (this._paidwork === undefined) {\n if (this.calcInfo) {\n const interval = this.calcInfo.paidWorkInterval;\n this.calculatePaidWork({numberOfDays:interval.numberOfWeeks * 7, st:interval.st});\n } else {\n this.calculatePaidWork(this.dateInterval);\n }\n }\n\n return this._paidwork;\n }\n\n /**\n * @param {number} weekIndex\n */\n paidWorkWeek(weekIndex) {\n let weekWork = this._paidWorkWeek[weekIndex];\n if (weekWork === undefined) {\n weekWork = this.calculateWork({numberOfDays:7, st:this.calcInfo.weeks[weekIndex]});\n this._paidWorkWeek[weekIndex] = weekWork;\n }\n return weekWork;\n }\n\n /**\n * @param {number} dayIndex\n * @param {{ st: Date; fi: Date; }} interval\n */\n removeBreaks(dayIndex, interval) {\n if (deleteTasksOnInterval(this.breaks, interval)) {\n const dayInfo = this.getDayInfo(dayIndex);\n this.clearDayComputations(dayIndex);\n const endsAtNextDay = interval.fi > dayInfo.endOfDay\n if (endsAtNextDay) {\n this.clearDayComputations(dayIndex + 1);\n }\n if (this.boByTaskType || this.plannedAndTarget) {\n this.getDayByIndex(dayIndex);\n if (endsAtNextDay) { this.getDayByIndex(dayIndex + 1); }\n }\n }\n }\n\n /**\n * @param {number} dayIndex\n */\n removeShift(dayIndex) {\n const interval = this.getDayByIndex(dayIndex).shiftBounds;\n if (interval.st.getTime() >= interval.fi.getTime())\n return;\n\n let changed = deleteTasksOnInterval(this.tasks, interval);\n changed = deleteTasksOnInterval(this.breaks, interval) || changed;\n changed = deleteTasksOnInterval(this.payments, interval) || changed;\n changed = deleteTasksOnInterval(this.absences, interval) || changed;\n if (changed) {\n const dayInfo = this.getDayInfo(dayIndex);\n this.clearDayComputations(dayIndex);\n if (interval.fi > dayInfo.endOfDay) {\n this.clearDayComputations(dayIndex + 1);\n }\n }\n }\n\n /**\n * @private\n * @param {number} dayIndex\n */\n clearDayComputations(dayIndex) {\n this._paidwork = undefined;\n if (!this.calcMode)\n return;\n\n if (dayIndex >= 0 && dayIndex < this.numberOfDays) {\n const dayData = this.byDay[dayIndex];\n if (dayData) {\n if (dayData.boWork) {\n for (const wi of dayData.boWork.workIntervals) {\n const boSkillData = this.boByTaskType.get(wi.tasktypeId);\n boSkillData.addPlanned(dayIndex, wi, -1);\n }\n }\n if (dayData.workIntervals && dayData.workIntervals.length > 0) {\n this.plannedAndTarget.addPlanned(dayIndex, this.emp.skills, dayData.workIntervals, -1);\n }\n }\n this.byDay[dayIndex] = undefined;\n const weekIndex = this.getDayInfo(dayIndex).weekIndex;\n this._paidWorkWeek[weekIndex] = undefined;\n if (this._boWorkWeek) {\n this._boWorkWeek[weekIndex] = undefined;\n }\n }\n }\n\n /**\n * @private\n * @param {Date} dt\n */\n getDay(dt) {\n const dayIndex = this.getDayIndex(dt);\n return this.getDayByIndex(dayIndex);\n }\n\n /**\n * @param {number} dayIndex\n */\n getDayByIndex(dayIndex) {\n if (dayIndex < 0 || dayIndex >= this.numberOfDays)\n return undefined;\n let dayData = this.byDay[dayIndex];\n if (dayData === undefined) {\n const dayInfo = this.getDayInfo(dayIndex);\n const shiftBounds = getShiftBounds(dayInfo.dt, this.tasks);\n const work = this.calculateShiftPaidTime(shiftBounds, dayInfo.dt, dayInfo.endOfDay);\n const boWork = this.calculateBOWork(dayIndex);\n const workIntervals = this.calculateWorkIntervals(dayIndex);\n dayData = {\n hasWork: work > 0,\n shiftBounds,\n work,\n workIntervals,\n boWork\n };\n this.byDay[dayIndex] = dayData;\n }\n return dayData;\n }\n\n /**\n * @private\n * @param {Date} dt\n */\n getDayIndex(dt) {\n return getDayDiff(dt, this.dateInterval.st);\n }\n\n /**\n * @private {number}\n */\n getAgreedWorkMinutesDiff() {\n const agreedWorkMinutes = this.agreedWorkMinutes;\n if (agreedWorkMinutes === null) { return null; }\n return agreedWorkMinutes - this.paidwork * 60;\n }\n\n /**\n * @private {number}\n */\n get agreedWorkMinutes() {\n if (this.emp.agreedWorkWeek === null) { return null; }\n const numberOfWeeks = this.calcInfo.paidWorkInterval.numberOfWeeks;\n const maxTotalWorkMinutes = this.emp.agreedWorkWeek * numberOfWeeks;\n return maxTotalWorkMinutes;\n }\n\n /**\n * @param {number} dayIndex\n * @param {import(\"@/model/dn-break-settings.js\").BreakSettings[]} breakSettings\n * @returns {import(\"@/model/dn-shift.js\").DayBounds}\n */\n getDayBounds(dayIndex, breakSettings) {\n const areedWorkMinutesLeft = this.getAgreedWorkMinutesDiff();\n let maxWorkMinutes = areedWorkMinutesLeft !== null ? areedWorkMinutesLeft : 1440;\n const weekIndex = this.getDayInfo(dayIndex).weekIndex;\n maxWorkMinutes = Math.min(maxWorkMinutes, this.getMaxWorkWeekLeft(weekIndex));\n let maxDurQ = Math.floor(getMaxDurForWork(breakSettings, maxWorkMinutes) / 15);\n\n let minStMinute = 0;\n const dt = this.getDayInfo(dayIndex).dt;\n const dayBefore = this.getDayByIndex(dayIndex - 1);\n if (dayBefore) {\n if (dayBefore.hasWork) {\n const afterNightRest = (dayBefore.shiftBounds.fi.getTime() - dt.getTime()) / 60000 + this.emp.nightRest;\n if (afterNightRest > minStMinute) {\n minStMinute = afterNightRest;\n }\n }\n }\n let maxFiMinute = 2880;\n const dayAfter = this.getDayByIndex(dayIndex + 1);\n if (dayAfter) {\n if (dayAfter.hasWork) {\n const beforeNightRest = (dayAfter.shiftBounds.st.getTime() - dt.getTime()) / 60000 - this.emp.nightRest;\n if (beforeNightRest < maxFiMinute) {\n maxFiMinute = beforeNightRest;\n }\n }\n }\n\n let minStQ = Math.ceil(minStMinute / 15);\n let maxFiQ = Math.floor(maxFiMinute / 15);\n /** @type {{stQ:number;fiQ:number}[]} */\n const unavailabilites = [];\n if (this.availabilityByDay !== undefined) {\n const availabilites = this.availabilityByDay[dayIndex];\n if (availabilites.length > 0) {\n if (minStQ < availabilites[0].st) {\n minStQ = availabilites[0].st;\n minStMinute = minStQ * 15;\n }\n if (maxFiQ > availabilites[availabilites.length - 1].fi) {\n maxFiQ = availabilites[availabilites.length - 1].fi;\n maxFiMinute = maxFiQ * 15;\n }\n\n if (availabilites.length > 1) {\n for (let i = 1; i < availabilites.length; i++) {\n const stQ = availabilites[i - 1].fi;\n const fiQ = availabilites[i].st;\n if (fiQ > minStQ && stQ < maxFiQ) {\n unavailabilites.push({ stQ, fiQ });\n }\n }\n }\n } else {\n maxDurQ = 0;\n maxWorkMinutes = 0;\n }\n }\n\n return { maxDurQ, maxWorkMinutes, minStMinute, maxFiMinute, minStQ, maxFiQ, unavailabilites };\n }\n\n /**\n * @param {number} dayIndex\n * @param {number} st\n * @param {number} fi\n */\n isAvailable(dayIndex, st, fi) {\n if (this.availabilityByDay === undefined) { return true; }\n const availabilityByDay = this.availabilityByDay[dayIndex];\n for (const interval of availabilityByDay) {\n if (interval.st <= st && fi <= interval.fi) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * @param {number} dayIndex\n * @param {{maxWorkMinutes:number;maxWorkMinutesByWeekIndex:number[]}} [possibleWork]\n */\n getMinWorkLeft(dayIndex, possibleWork = undefined) {\n const weekIndex = this.getDayInfo(dayIndex).weekIndex;\n /** @type {number} */\n let workLeft = this.agreedWorkMinutes;\n if (workLeft !== null) {\n if (possibleWork !== undefined) {\n workLeft = Math.min(workLeft, possibleWork.maxWorkMinutes);\n }\n workLeft -= this.paidwork * 60;\n }\n const workLeftWeek = this.getMinWorkWeekLeft(weekIndex, possibleWork);\n if (workLeft !== null) {\n return Math.max(workLeft, workLeftWeek);\n }\n\n return workLeftWeek;\n }\n\n /**\n * @private\n * @param {number} weekIndex\n * @param {{maxWorkMinutesByWeekIndex:number[]}} [possibleWork]\n */\n getMinWorkWeekLeft(weekIndex, possibleWork = undefined) {\n let minWorkWeek = this.emp.minWorkWeek;\n if (minWorkWeek !== null) {\n if (possibleWork) {\n minWorkWeek = Math.min(minWorkWeek, possibleWork.maxWorkMinutesByWeekIndex[weekIndex]);\n }\n return minWorkWeek - this.paidWorkWeek(weekIndex) * 60;\n }\n return 0;\n }\n\n /**\n * @private\n * @param {number} weekIndex\n */\n getMaxWorkWeekLeft(weekIndex) {\n if (this.emp.maxWorkWeek !== null) {\n return this.emp.maxWorkWeek - this.paidWorkWeek(weekIndex) * 60;\n }\n return Number.POSITIVE_INFINITY;\n }\n\n /**\n * @param {{adherenceBase:number;taskTypesByKind:Map<number, Set<number>>;timeRange:import(\"#shared/dn-date-interval\").DateInterval; timeToRemove:{st:Date;fi:Date}[];unitDays:boolean;useShiftBounds:boolean;calcAttendance:boolean}} payrollRule\n */\n getPayrollTime(payrollRule) {\n const timeRange = payrollRule.timeRange;\n let timeToRemove = payrollRule.timeToRemove;\n if (payrollRule.useShiftBounds) {\n timeToRemove = timeToRemove.slice();\n let st = timeRange.st;\n let bounds = getShiftBounds2(timeRange.byIndex(-1).dt, st, this.tasks, this);\n if (bounds.st < bounds.fi && bounds.fi > st) {\n st = bounds.fi;\n }\n timeToRemove.push({ st: addDays(st, -1000), fi: st });\n\n let fi = timeRange.fi;\n bounds = getShiftBounds2(timeRange.byIndex(timeRange.numberOfDays - 1).dt, fi, this.tasks, this);\n if (bounds.st < bounds.fi && bounds.fi > fi) {\n fi = bounds.fi;\n }\n timeToRemove.push({ st: fi, fi: addDays(fi, 1000) });\n }\n\n /** @type {TaskSimple[]} */\n let tasks;\n if (payrollRule.taskTypesByKind.size > 0) {\n tasks = this.getPayrollTasks(payrollRule);\n if (payrollRule.unitDays) {\n tasks = subtractTasks(tasks, timeToRemove);\n return sumDays(tasks, timeRange);\n }\n } else if (payrollRule.unitDays) {\n if (payrollRule.calcAttendance) {\n const allAttendanceTasks = this.getAttendanceTasks(payrollRule.adherenceBase);\n const attendanceTasks = subtractTasks(allAttendanceTasks, timeToRemove);\n tasks = subtractTasks(this.tasks, timeToRemove).filter(x => !this.taskTypeById.get(x.tasktypeId).requiresLog);\n return sumDays(attendanceTasks.concat(tasks), timeRange);\n } else {\n tasks = subtractTasks(this.tasks, timeToRemove);\n /** @type {{st:Date, fi:Date}[]} */\n const toCount = [];\n for (let i = 0; i < timeRange.numberOfDays; i++) {\n const dt = timeRange.byIndex(i).dt;\n const nextDt = timeRange.byIndex(i + 1).dt;\n const bounds = getShiftBounds2(dt, nextDt, tasks, this);\n if (bounds.st < bounds.fi) {\n toCount.push(bounds);\n }\n }\n for (const t of subtractTasks(this.absences, timeToRemove)) {\n if (this.taskTypeById.get(t.tasktypeId).paidBreak) {\n toCount.push(t);\n }\n }\n return sumDays(toCount, timeRange);\n }\n } else if (payrollRule.calcAttendance) {\n const allAttendanceTasks = this.getAttendanceTasks(payrollRule.adherenceBase);\n const attendanceTasks = subtractTasks(allAttendanceTasks, timeToRemove);\n tasks = subtractTasks(this.tasks, timeToRemove);\n const breaks = subtractTasks(this.breaks, timeToRemove);\n return calculateAttendance(allAttendanceTasks, attendanceTasks, tasks, breaks, this.taskTypeById);\n } else {\n /** @type {TaskSimple[]} */\n const paidAbsence = [];\n /** @type {TaskSimple[]} */\n const toRemove = [];\n for (const t of this.breaks) {\n if (!this.taskTypeById.get(t.tasktypeId).paidBreak) {\n toRemove.push(t);\n }\n }\n for (const t of this.absences) {\n if (this.taskTypeById.get(t.tasktypeId).paidBreak) {\n paidAbsence.push(t);\n } else {\n toRemove.push(t);\n }\n }\n\n tasks = subtractTasks(this.tasks, toRemove);\n for (const t of subtractTasks(paidAbsence, this.tasks)) {\n tasks.push(t);\n }\n }\n\n tasks = subtractTasks(tasks, timeToRemove);\n return sumTasks(tasks);\n }\n\n /**\n * @private\n * @param {{ taskTypesByKind: Map<number, Set<number>>; unitDays: boolean; }} payrollRule\n */\n getPayrollTasks(payrollRule) {\n /** @type {TaskSimple[]} */\n const tasks = [];\n for (const [kind, ttSet] of payrollRule.taskTypesByKind) {\n let tasks2 = this.tasksByKind[kind].filter(x => ttSet.has(x.tasktypeId)).map(x => ({st: x.stCorrect, fi: x.fiCorrect, tasktypeId:x.tasktypeId}));\n if ((kind === TASK_KIND.task || kind === TASK_KIND.absence)) {\n /** @type {TaskSimple[]} */\n const toRemove = [];\n if (!payrollRule.unitDays) {\n for (const t of this.breaks) {\n if (!this.taskTypeById.get(t.tasktypeId).paidBreak) {\n toRemove.push(t);\n }\n }\n }\n if (kind === TASK_KIND.task) {\n for (const t of this.absences) {\n toRemove.push(t);\n }\n }\n tasks2 = subtractTasks(tasks2, toRemove);\n }\n tasks2 = subtractTasks(tasks2, tasks);\n for (const t of tasks2) {\n tasks.push(t);\n }\n }\n return tasks;\n }\n\n /**\n * @param {{adherenceBase:number;taskTypesByKind:Map<number, Set<number>>;timeRange:import(\"#shared/dn-date-interval\").DateInterval; timeIntervals:{st:Date;fi:Date}[];unitDays:boolean;calcAttendance:boolean}} payrollRule\n */\n getPayrollShiftBound(payrollRule) {\n const msPerHour = 1000 * 60 * 60;\n const timeRange = payrollRule.timeRange;\n let sum = 0;\n const allAttendanceTasks = payrollRule.calcAttendance ? this.getAttendanceTasks(payrollRule.adherenceBase) : undefined;\n const payrollTasks = payrollRule.taskTypesByKind.size > 0 ? this.getPayrollTasks(payrollRule) : undefined;\n for (let i = 0; i < timeRange.numberOfDays; i++) {\n const dt = timeRange.byIndex(i).dt;\n const nextDt = timeRange.byIndex(i + 1).dt;\n const shiftBounds = getShiftBounds2(dt, nextDt, this.tasks, this);\n if (shiftBounds.st < shiftBounds.fi) {\n let shiftOk = false;\n for (const ti of payrollRule.timeIntervals) {\n if (ti.st <= shiftBounds.st && shiftBounds.st < ti.fi) {\n shiftOk = true;\n break;\n }\n }\n if (shiftOk) {\n let value = 0;\n if (payrollRule.taskTypesByKind.size > 0) {\n for (const t of payrollTasks) {\n if (shiftBounds.st < t.fi && shiftBounds.fi > t.st) {\n value += (t.fi.getTime() - t.st.getTime()) / msPerHour;\n }\n }\n } else if (payrollRule.calcAttendance) {\n /** @type {TaskSimple[]} */\n const attendanceTasks = [];\n for (const t of allAttendanceTasks) {\n if (shiftBounds.st < t.fi && shiftBounds.fi > t.st) {\n attendanceTasks.push(t);\n }\n }\n /** @type {TaskSimple[]} */\n const tasks = [];\n for (const t of this.tasks) {\n if (shiftBounds.st < t.fi && shiftBounds.fi > t.st) {\n tasks.push(t);\n }\n }\n /** @type {TaskSimple[]} */\n const breaks = [];\n for (const t of this.breaks) {\n if (shiftBounds.st < t.fi && shiftBounds.fi > t.st) {\n breaks.push(t);\n }\n }\n value = calculateAttendance(allAttendanceTasks, attendanceTasks, tasks, breaks, this.taskTypeById);\n } else {\n value = this.calculateShiftPaidTime(shiftBounds, dt, nextDt);\n }\n\n if (value > 0) {\n if (payrollRule.unitDays) {\n sum += 1;\n } else {\n sum += value;\n }\n }\n }\n }\n }\n\n return sum;\n }\n\n /**\n * @param {number} dayIndex\n */\n isOkToWork(dayIndex) {\n return this.isEmpty(this.getDayInfo(dayIndex).dt) && this.isOkDaysInRow(dayIndex) && this.isOkWeekendsInRow(dayIndex);\n }\n\n /**\n * @private If days in row is ok if the given day is work.\n * @param {number} dayIndex\n */\n isOkDaysInRow(dayIndex) {\n if (this.emp.ghost) { return true; }\n const max = this.emp.maxDaysInRow;\n let count = 1;\n let d = dayIndex - 1;\n while (d >= 0) {\n if (this.getDayByIndex(d).hasWork) {\n count += 1;\n if (count > max)\n return false;\n } else {\n break;\n }\n d -= 1;\n }\n\n d = dayIndex + 1;\n while (d < this.numberOfDays) {\n if (this.getDayByIndex(d).hasWork) {\n count += 1;\n if (count > max)\n return false;\n } else {\n break;\n }\n d += 1;\n }\n\n return true;\n }\n\n /**\n * @private If weekend in row is ok if the given day is work.\n * @param {number} dayIndex\n */\n isOkWeekendsInRow(dayIndex) {\n if (this.emp.ghost) { return true; }\n const max = this.emp.maxWeekendsInRow;\n if (max === null || !this.getDayInfo(dayIndex).isWeekend) {\n return true;\n }\n\n let count = 1;\n let saturdayIndex = dayIndex;\n if (this.getDayInfo(dayIndex).day === 0) {\n saturdayIndex -= 1;\n }\n let d = saturdayIndex - 7;\n while (d >= -1) {\n if (this.getDayByIndex(d + 1).hasWork || (d >= 0 && this.getDayByIndex(d).hasWork)) {\n count += 1;\n if (count > max)\n return false;\n } else {\n break;\n }\n d -= 7;\n }\n\n d = saturdayIndex + 7;\n while (d < this.numberOfDays) {\n if (this.getDayByIndex(d).hasWork || (d + 1 < this.numberOfDays && this.getDayByIndex(d + 1).hasWork)) {\n count += 1;\n if (count > max)\n return false;\n } else {\n break;\n }\n d += 7;\n }\n\n return count <= max;\n }\n\n /**\n * @private\n * @param {number} dayIndex\n */\n isOkMinNightRest(dayIndex) {\n const minNightRest = this.emp.nightRest;\n if (minNightRest < 0) { return true; }\n const dayInfo = this.getDayByIndex(dayIndex);\n if (!dayInfo.hasWork) { return true; }\n const dayBefore = this.getDayByIndex(dayIndex - 1);\n if (dayBefore !== undefined && dayBefore.hasWork) {\n const nightRest = (dayInfo.shiftBounds.st.getTime() - dayBefore.shiftBounds.fi.getTime()) / 60000;\n if (nightRest < minNightRest) {\n return false;\n }\n }\n const dayAfter = this.getDayByIndex(dayIndex + 1);\n if (dayAfter !== undefined && dayAfter.hasWork) {\n const nightRest = (dayAfter.shiftBounds.st.getTime() - dayInfo.shiftBounds.fi.getTime()) / 60000;\n if (nightRest < minNightRest) {\n return false;\n }\n }\n\n return true;\n }\n\n checkRuleCompliance() {\n const agreedWorkDiff = this.getAgreedWorkMinutesDiff();\n let ok = true;\n if (agreedWorkDiff !== null) {\n if (agreedWorkDiff !== 0) { ok = false; }\n }\n\n const interval = this.calcInfo.paidWorkInterval;\n\n const weeks = [];\n for (let weekIndex = interval.weekIndexSt; weekIndex < interval.weekIndexFi; weekIndex++) {\n const minWorkWeekLeft = Math.max(0, this.getMinWorkWeekLeft(weekIndex));\n const maxWorkWeekViolation = Math.max(0, -this.getMaxWorkWeekLeft(weekIndex));\n if (minWorkWeekLeft > 0 || maxWorkWeekViolation > 0) {\n const weekStart = this.calcInfo.weeks[weekIndex];\n weeks.push({ weekStart, minWorkWeekLeft, maxWorkWeekViolation });\n ok = false;\n }\n }\n\n const days = [];\n for (let dayIndex = interval.dayIndexSt; dayIndex < interval.dayIndexFi; dayIndex++) {\n if (this.getDayByIndex(dayIndex).hasWork) {\n const dayInfo = this.getDayInfo(dayIndex);\n const isOkDaysInRow = this.isOkDaysInRow(dayIndex);\n const isOkWeekendsInRow = !dayInfo.isWeekend || this.isOkWeekendsInRow(dayIndex);\n const isOkMinNightRest = this.isOkMinNightRest(dayIndex);\n if (!isOkDaysInRow || !isOkWeekendsInRow || !isOkMinNightRest) {\n days.push({ dt: dayInfo.dt, isOkDaysInRow, isOkWeekendsInRow, isOkMinNightRest });\n ok = false;\n }\n }\n\n }\n\n return { employeeId: this.emp.id, ok, agreedWorkDiff, weeks, days };\n }\n\n /**\n * @private\n * @param {number} dayIndex\n */\n getBOWork(dayIndex) {\n const weekIndex = this.getDayInfo(dayIndex).weekIndex;\n let boWork = this._boWorkWeek[weekIndex];\n if (boWork === undefined) {\n boWork = 0;\n for (let i = 0; i < 7; i++) {\n const dayIndex = i + weekIndex * 7;\n const dayData = this.getDayByIndex(dayIndex);\n if (dayData.boWork) {\n boWork += dayData.boWork.workInMinutes;\n }\n }\n this._boWorkWeek[weekIndex] = boWork;\n }\n\n return boWork;\n }\n\n /**\n * @param {number} dayIndex\n */\n getBOWorkLeft(dayIndex) {\n if (this.emp.maxBOWeek) {\n return this.emp.maxBOWeek - this.getBOWork(dayIndex);\n }\n return undefined;\n }\n\n /**\n * @param {number} dayIndex\n * @param {{st:number, fi:number, ttId: number}} t\n */\n getBOScore(dayIndex, t) {\n if (this.boByTaskType) {\n const boSkillData = this.boByTaskType.get(t.ttId);\n if (boSkillData) {\n return boSkillData.getScore(dayIndex, t.st, t.fi);\n }\n }\n return -1;\n }\n\n /**\n * @param {number} dayIndex\n * @param {number} numberOfAgents\n */\n getBOTaskScore(dayIndex, numberOfAgents) {\n if (!this.boByTaskType) { return null; }\n const boWorkLeft = this.getBOWorkLeft(dayIndex);\n if (boWorkLeft <= 0) { return null; }\n /** @type {import(\"@/js/dn-optimize-shift\").SecondTaskScore[]} */\n const scores = [];\n for (const boSkillData of this.boByTaskType.values()) {\n const taskScore = boSkillData.getTaskScore(dayIndex, numberOfAgents, boWorkLeft);\n if (taskScore) {\n scores.push(taskScore);\n }\n }\n return scores;\n }\n\n /**\n * @param {number} dayIndex\n * @param {{id:number; optimizationPriority:number}} skill\n * @param {number} stQ\n * @param {number[]} arrayQ\n */\n getMinTargetScore(dayIndex, skill, stQ, arrayQ) {\n if (!this.plannedAndTarget) { return; }\n if (!this.emp.skills.includes(skill.id)) { return; }\n this.plannedAndTarget.setScores(dayIndex, skill, stQ, arrayQ)\n }\n\n /**\n * @private\n * @param {Date} dt\n */\n getShiftBoundsByDate(dt) {\n if (this.calcMode)\n return this.getDay(dt).shiftBounds;\n return getShiftBounds(dt, this.tasks);\n }\n\n /**\n * @param {DateInterval} dateInterval\n */\n calculatePaidWork(dateInterval) {\n this._paidwork = this.calculateWork(dateInterval);\n }\n\n /**\n * @param {{ st: Date; fi: Date; }} interval\n * @param {number} adherenceBase\n */\n getAttendance(interval, adherenceBase) {\n const allAttendanceTasks = this.getAttendanceTasks(adherenceBase);\n const attendanceTasks = cutToBounds(allAttendanceTasks, interval);\n const tasks = cutToBounds(this.tasks, interval);\n const breaks = cutToBounds(this.breaks, interval);\n return calculateAttendance(allAttendanceTasks, attendanceTasks, tasks, breaks, this.taskTypeById);\n }\n\n /**\n * @private\n * @param {number} adherenceBase\n * @returns {TaskSimple[]}\n */\n getAttendanceTasks(adherenceBase) {\n const attendanceTasks = adherenceBase === 1 ? this.inRotation : this.log;\n return attendanceTasks.map(x => ({ st: x.stCorrect, fi: x.fiCorrect, tasktypeId: x.tasktypeId }));\n }\n\n /**\n * @param {{ st: Date; fi: Date; }} interval\n */\n getLogTime(interval) {\n return calculateTimeInInterval(this.log, interval);\n }\n\n /**\n * @param {{ st: Date; fi: Date; }} interval\n */\n getRotationTime(interval) {\n return calculateTimeInInterval(this.inRotation, interval);\n }\n\n /**\n * @param {boolean} calendarDays\n */\n getPaidWork(calendarDays) {\n return this.calculateWork(this.dateInterval, false, calendarDays);\n }\n\n /**\n * @param {boolean} calendarDays\n */\n getOvertime(calendarDays) {\n return this.calculateWork(this.dateInterval, true, calendarDays);\n }\n\n /**\n * @param {Date} dt\n */\n hasWork(dt) {\n return this.getDay(dt).work > 0;\n }\n\n /**\n * @param {Date} dt\n */\n isEmpty(dt) {\n const fi = addDays(dt, 1);\n for (const t of this.tasks) {\n if (t.st >= dt && t.st < fi) {\n return false;\n }\n }\n\n for (const t of this.absences) {\n if (t.st >= dt && t.st < fi) {\n return false;\n }\n }\n\n return true;\n }\n\n getAddedOrDeletedTasks() {\n /** @type {Map<string, import(\"#shared/dn-task\").Task>} */\n const initialByKey = new Map();\n for (const t of this.initialTasks) {\n initialByKey.set(getKey(t), t);\n }\n\n /** @type {import(\"#shared/dn-task\").Task[]} */\n const added = [];\n compareWithInital(this.tasks);\n compareWithInital(this.breaks);\n compareWithInital(this.absences);\n\n /** @type {import(\"#shared/dn-task\").Task[]} */\n const deleted = [];\n for (const t of initialByKey.values()) {\n deleted.push(t);\n }\n\n return { added, deleted };\n\n /** @param {import(\"#shared/dn-task\").Task} t */\n function getKey(t) {\n return t.st.getTime() + '_' + t.tasktypeId;\n }\n\n /** @param {import(\"#shared/dn-task\").Task[]} tasks */\n function compareWithInital(tasks) {\n for (const t of tasks) {\n const key = getKey(t);\n const t2 = initialByKey.get(key);\n if (t2 !== undefined && t.fi.getTime() == t2.fi.getTime()) {\n initialByKey.delete(key);\n } else {\n added.push(t);\n }\n }\n }\n }\n}\n\nexport class EmployeeScheduleList {\n constructor() {\n /** @private @type {EmployeeSchedule[]} */\n this._list = [];\n }\n\n get list() {\n return this._list;\n }\n\n clear() {\n this._list = [];\n }\n\n /**\n * @param {number} numberOfDays\n * @param {Date} stDate\n * @param {Task[]} scheduleTasks\n * @param {import(\"#shared/dn-tasktype\").TaskTypes} taskTypes\n * @param {import(\"#shared/dn-employee\").Employee[]} employees\n * @param {boolean} includeInactive\n */\n load(numberOfDays, stDate, scheduleTasks, taskTypes, employees, includeInactive) {\n this._list = createSchedule({numberOfDays, st:stDate}, scheduleTasks, taskTypes, employees, includeInactive);\n }\n}\n\n/**\n * @param {TaskSimple[]} allAttendanceTasks\n * @param {TaskSimple[]} attendanceTasks\n * @param {TaskSimple[]} tasks\n * @param {TaskSimple[]} breaks\n * @param {Map<number,import(\"#shared/dn-tasktype\").TaskType>} taskTypeMap\n */\nfunction calculateAttendance(allAttendanceTasks, attendanceTasks, tasks, breaks, taskTypeMap) {\n const attendanceBreaksTolerance = 1000 * 60 * 60 * 6;\n\n /** @type {{ st: Date; fi: Date; tasktypeId: number;}[]} */\n const paidBreaksOnLog = [];\n /** @type {{ st: Date; fi: Date; tasktypeId: number;}[]} */\n const unpaidBreaks = [];\n for (const br of breaks) {\n if (taskTypeMap.get(br.tasktypeId).paidBreak) {\n let hasBefore = false;\n let hasAfter = false;\n for (const t of allAttendanceTasks) {\n if (t.st < br.st && br.st.getTime() - t.fi.getTime() < attendanceBreaksTolerance) {\n hasBefore = true;\n }\n if (t.fi > br.fi && t.st.getTime() - br.fi.getTime() < attendanceBreaksTolerance) {\n hasAfter = true;\n }\n if (hasBefore && hasAfter) {\n paidBreaksOnLog.push(br);\n break;\n }\n }\n } else {\n unpaidBreaks.push(br);\n }\n }\n const noLogTasks = subtractTasks(tasks.filter(x => !taskTypeMap.get(x.tasktypeId).requiresLog), unpaidBreaks);\n return Math.round(100 * sumDateIntervals(attendanceTasks.concat(paidBreaksOnLog).concat(noLogTasks)) / (60 * 60 * 1000)) / 100;\n}\n\n/**\n * @param {import(\"#shared/dn-task\").Task[]} tasks\n * @param {{st:Date; fi:Date}} interval\n */\nfunction calculateTimeInInterval(tasks, interval) {\n const log = cutToBounds(tasks.map(x => ({ st: x.stCorrect, fi: x.fiCorrect, tasktypeId: x.tasktypeId })), interval);\n return Math.round(100 * sumDateIntervals(log) / (60 * 60 * 1000)) / 100;\n}\n\n/**\n* @param {import(\"#shared/dn-task\").Task[]} tasks\n* @param {{st:Date, fi:Date}} interval\n*/\nfunction deleteTasksOnInterval(tasks, interval) {\n let changed = false;\n for (let i = tasks.length - 1; i >= 0; i--) {\n const t = tasks[i];\n if (t.isContainedIn(interval)) {\n t.toDelete();\n tasks.splice(i, 1);\n changed = true;\n }\n }\n\n return changed;\n}\n\n/**\n * @typedef {{\n* availabilites:import(\"@/model/dn-availability\").Availabilities; \n* availabilityRequests:import(\"@/model/dn-availability-request\").AvailabilityRequests;\n* boData:import(\"@/js/dn-bo-data.js\").BOData;\n* callcenterId:number;\n* employeeCallcenters:import(\"@/model/dn-employee-cc\").EmployeeCallcenters;\n* plannedAndTarget: import(\"@/js/dn-planned-and-target.js\").PlannedAndTarget;\n* timezone: string;\n* }} CreateScheduleExtraParameter\n*/\n\n/**\n * @param {DateInterval} dateInterval Must start of a week if availabilites is not undefined\n * @param {import(\"#shared/dn-task\").Task[]} scheduleTasks\n * @param {import(\"#shared/dn-tasktype\").TaskTypes} taskTypes\n * @param {import(\"#shared/dn-employee\").Employee[]} employees\n * @param {boolean} includeInactive\n * @param {CreateScheduleExtraParameter} [extra] Don't make any changes from the outside to the task arrays in the returned objects if this is set.\n */\nexport function createSchedule(dateInterval, scheduleTasks, taskTypes, employees, includeInactive, extra = undefined) {\n const numberOfDays = dateInterval.numberOfDays;\n const stDate = dateInterval.st;\n const tasksByEmpId = getTasksByEmpId(numberOfDays, stDate, scheduleTasks, employees, includeInactive);\n /** @type {CalcInfo} */\n let calcInfo = undefined;\n /** @type {Map<number, AvailabilityByDay>} */\n let availByEmp = undefined;\n /** @type {Date} */\n let fiDate = undefined;\n if (extra !== undefined) {\n availByEmp = new Map();\n const numberOfWeeks = Math.ceil(numberOfDays / 7);\n /** @type {{dt:Date; endOfDay:Date; day:number; isWeekend:boolean; weekIndex:number; tzDayInfo:import(\"#shared/dn-timezone\").TimezoneDayInfo}[]} */\n const days = [];\n let weekIndex = 0;\n for (let i = 0; i < numberOfDays; i++) {\n const tzDayInfo = dateInterval.byIndex(i);\n const dt = tzDayInfo.dt;\n const endOfDay = dateInterval.byIndex(i+1).dt;\n const day = dt.getDay();\n const isWeekend = day === 0 || day === 6;\n const dayData = { dt, endOfDay, day, isWeekend, weekIndex, tzDayInfo };\n days.push(dayData);\n\n if (i % 7 === 6) {\n weekIndex += 1;\n }\n }\n\n const weeks = []\n for (let i = 0; i < numberOfWeeks; i++) {\n weeks.push(addDays(stDate, 7 * i));\n }\n fiDate = addDays(stDate, numberOfWeeks * 7);\n const paidWorkInterval = { st: addDays(stDate, 7), numberOfWeeks: numberOfWeeks - 2, dayIndexSt: 7, dayIndexFi: 7 * (numberOfWeeks - 1), weekIndexSt: 1, weekIndexFi: numberOfWeeks - 1 };\n calcInfo = { days, weeks, paidWorkInterval };\n for (const availability of extra.availabilites.items) {\n /** @type {AvailabilityByDay} */\n const availByDay = []\n const dayCount = availability.weeks * 7;\n if (dayCount === 0) {\n continue;\n }\n\n let dayIndex = availability.getDayIndex(stDate);\n for (let i = 0; i < numberOfDays; i++) {\n availByDay.push(availability.getByDayIndex(dayIndex));\n dayIndex = (dayIndex + 1) % dayCount;\n }\n\n for (const empId of availability.employeeIdList) {\n availByEmp.set(empId, availByDay);\n }\n }\n }\n\n /** @type {EmployeeSchedule[]} */\n const schedule = [];\n for (const empTasks of tasksByEmpId.values()) {\n\n /** @type {AvailabilityByDay} */\n let availabilityByDay = undefined;\n if (availByEmp) {\n availabilityByDay = availByEmp.get(empTasks.employee.id);\n const arEmp = extra.availabilityRequests.getByEmp(empTasks.employee.id);\n if (arEmp) {\n availabilityByDay = createAvailabilityByDay(availabilityByDay, numberOfDays);\n arEmp.adjustQuarterHoursByDateAvailability(stDate, availabilityByDay);\n }\n\n const ec = extra.employeeCallcenters.getByEmp(empTasks.employee.id);\n if (ec) {\n const ccIntervals = ec.getOnInterval(empTasks.employee.ccid, stDate, fiDate, extra.callcenterId);\n if (ccIntervals.length > 0) {\n availabilityByDay = createAvailabilityByDay(availabilityByDay, numberOfDays);\n for (const ccInterval of ccIntervals) {\n let dt = getStartOfDay(ccInterval.st);\n let qSt = getQuarterHour(ccInterval.st);\n let nextDt = addDays(dt, 1);\n let dayIndex = getDayDiff(stDate, dt);\n while (dt < ccInterval.fi) {\n let nextNextDt = addDays(nextDt, 1);\n let qFi = 0;\n if (nextNextDt <= ccInterval.fi) {\n qFi = 96 * 2;\n } else if (nextDt <= ccInterval.fi) {\n qFi = 96 + getQuarterHour(ccInterval.fi);\n } else {\n qFi = getQuarterHour(ccInterval.fi);\n }\n\n const avails = availabilityByDay[dayIndex];\n let i = avails.length - 1;\n while (i >= 0) {\n const avail = avails[i];\n if (avail.st >= qSt && avail.fi <= qFi) {\n avails.splice(i, 1);\n } else if (avail.st < qSt && qFi < avail.fi) {\n avails.splice(i, 0, { st: qFi, fi: avail.fi });\n avail.fi = qSt;\n } else if (avail.st < qFi && avail.fi > qSt) {\n if (avail.st < qSt) {\n avail.fi = qSt;\n } else {\n avail.st = qFi;\n }\n }\n i--;\n }\n qSt = 0;\n dt = nextDt;\n nextDt = nextNextDt;\n dayIndex += 1;\n }\n }\n }\n }\n }\n\n schedule.push(new EmployeeSchedule(taskTypes.byId, empTasks.employee, empTasks.tasks, dateInterval, empTasks.index, calcInfo, availabilityByDay, extra))\n }\n return schedule;\n}\n\n/**\n * @param {AvailabilityByDay} availabilityByDay\n * @param {number} numberOfDays\n */\nfunction createAvailabilityByDay(availabilityByDay, numberOfDays) {\n if (availabilityByDay) {\n availabilityByDay = availabilityByDay.map(x => x.slice());\n } else {\n availabilityByDay = [];\n for (let i = 0; i < numberOfDays; i++) {\n availabilityByDay.push([{ st: 0, fi: 96 * 2 }]);\n }\n }\n return availabilityByDay;\n}\n\n/**\n * @param {TaskSimple[]} tasks\n * @param {{st:Date; fi:Date}} shift\n */\nexport function cutToBounds(tasks, shift) {\n /** @type {TaskSimple[]} */\n const shiftTasks = [];\n for (const t of tasks) {\n if (shift.st < t.fi && shift.fi > t.st) {\n if (t.st >= shift.st && t.fi <= shift.fi) {\n shiftTasks.push(t);\n } else {\n const taskCopy = { st: t.st, fi: t.fi, tasktypeId: t.tasktypeId };\n if (shift.st > taskCopy.st)\n taskCopy.st = shift.st;\n if (shift.fi < taskCopy.fi)\n taskCopy.fi = shift.fi;\n shiftTasks.push(taskCopy);\n }\n }\n }\n return shiftTasks;\n}\n\n/**\n * @param {Date} endDt\n * @param {DeletableDateInterval[]} tasks tasks should to be sorted\n * @param {boolean} ignoreToDelete\n */\nfunction getConnectedEnd(endDt, tasks,ignoreToDelete=false) {\n for (const task of tasks) {\n if ((!task.isToDelete||ignoreToDelete) && task.st <= endDt && task.fi > endDt) {\n endDt = task.fi;\n }\n }\n\n return endDt;\n}\n\n/**\n * @param {{ emp: import(\"#shared/dn-employee\").Employee; tasks: import(\"#shared/dn-task\").Task[]; breaks: import(\"#shared/dn-task\").Task[]; absences: import(\"#shared/dn-task\").Task[]; }} dayEmpSchedule\n * @param {Date} daySt\n * @param {Map<number, import(\"#shared/dn-tasktype\").TaskType>} taskTypeMap only task kinds used\n * @param {number} length\n * @param {import(\"@/model/dn-employee-cc.js\").EmployeeCallcenters} employeeCallcenters\n * @param {number} ccId\n * @param {number[]} [taskTypeIds]\n */\nexport function getEmpWorkArray(dayEmpSchedule, daySt, taskTypeMap, length, employeeCallcenters, ccId, taskTypeIds = null) {\n /** @type {number[]} */\n const workArray = Array(length).fill(0);\n let tasks = []\n if (taskTypeIds !== null) { tasks = dayEmpSchedule.tasks.filter(t => taskTypeIds.includes(t.tasktypeId)) } else { tasks = dayEmpSchedule.tasks }\n\n if (tasks.length > 0) {\n const msPerIndex = 1000 * 60 * 15;\n for (const t of tasks) {\n if (!t.isToDelete) {\n const stQ = Math.max(0, Math.round((t.st.getTime() - daySt.getTime()) / msPerIndex));\n const fiQ = Math.min(length, (t.fi.getTime() - daySt.getTime()) / msPerIndex);\n if (taskTypeIds !== null) {\n for (let i = stQ; i < fiQ; i++) { workArray[i] = 1 }\n } else {\n const tt = taskTypeMap.get(t.tasktypeId);\n if (tt !== undefined) {\n const work = tt.work / 100;\n for (let i = stQ; i < fiQ; i++) { workArray[i] = work; }\n }\n }\n }\n }\n for (const t of dayEmpSchedule.breaks) {\n if (!t.isToDelete) {\n const stQ = Math.max(0, Math.round((t.st.getTime() - daySt.getTime()) / msPerIndex));\n const fiQ = Math.min(length, (t.fi.getTime() - daySt.getTime()) / msPerIndex);\n for (let i = stQ; i < fiQ; i++) { workArray[i] = 0 }\n }\n }\n for (const t of dayEmpSchedule.absences) {\n if (!t.isToDelete) {\n const stQ = Math.max(0, Math.round((t.st.getTime() - daySt.getTime()) / msPerIndex));\n const fiQ = Math.min(length, (t.fi.getTime() - daySt.getTime()) / msPerIndex);\n for (let i = stQ; i < fiQ; i++) { workArray[i] = 0 }\n }\n }\n\n const empCC = employeeCallcenters.getByEmp(dayEmpSchedule.emp.id);\n if (empCC) {\n const dayFi = addDays(daySt, 1);\n const ccIntervals = empCC.getOnInterval(dayEmpSchedule.emp.ccid, daySt, dayFi, ccId);\n for (const ccInterval of ccIntervals) {\n const stQ = ccInterval.st > daySt ? getQuarterHour(ccInterval.st) : 0;\n const fiQ = ccInterval.fi < dayFi ? getQuarterHour(ccInterval.fi) : 96;\n for (let i = stQ; i < fiQ; i++) { workArray[i] = 0; }\n }\n }\n }\n return workArray;\n}\n\n/**\n * @param {{ emp: import(\"#shared/dn-employee\").Employee; tasks: import(\"#shared/dn-task\").Task[]; breaks: import(\"#shared/dn-task\").Task[]; absences: import(\"#shared/dn-task\").Task[]; }} dayEmpSchedule\n * @param {Date} daySt\n * @param {number} length\n * @param {import(\"@/model/dn-employee-cc.js\").EmployeeCallcenters} employeeCallcenters\n * @param {number} ccId\n */\nfunction getEmpBreakArray(dayEmpSchedule, daySt, length, employeeCallcenters, ccId) {\n\n /** @type {number[]} */\n const breakArray = Array(length).fill(0);\n const msPerIndex = 1000 * 60 * 5;\n\n const breakArrayDetailed = Array(length * 3).fill(0);\n for (const t of dayEmpSchedule.breaks) {\n if (!t.isToDelete) {\n const stQ = Math.max(0, Math.round((t.st.getTime() - daySt.getTime()) / msPerIndex));\n const fiQ = Math.min(length * 3, (t.fi.getTime() - daySt.getTime()) / msPerIndex);\n for (let i = stQ; i < fiQ; i++) { breakArrayDetailed[i] = 1; }\n }\n }\n for (const t of dayEmpSchedule.absences) {\n if (!t.isToDelete) {\n const stQ = Math.max(0, Math.round((t.st.getTime() - daySt.getTime()) / msPerIndex));\n const fiQ = Math.min(length * 3, (t.fi.getTime() - daySt.getTime()) / msPerIndex);\n for (let i = stQ; i < fiQ; i++) { breakArrayDetailed[i] = 0; }\n }\n }\n for (let i = 0; i < length; i++) {\n breakArray[i] = (breakArrayDetailed[i * 3] + breakArrayDetailed[i * 3 + 1] + breakArrayDetailed[i * 3 + 2]) / 3\n }\n\n const empCC = employeeCallcenters.getByEmp(dayEmpSchedule.emp.id);\n if (empCC) {\n const dayFi = addDays(daySt, 1);\n const ccIntervals = empCC.getOnInterval(dayEmpSchedule.emp.ccid, daySt, dayFi, ccId);\n for (const ccInterval of ccIntervals) {\n const stQ = ccInterval.st > daySt ? getQuarterHour(ccInterval.st) : 0;\n const fiQ = ccInterval.fi < dayFi ? getQuarterHour(ccInterval.fi) : 96;\n for (let i = stQ; i < fiQ; i++) { breakArray[i] = 0; }\n }\n }\n\n return breakArray;\n}\n\n/**\n * @param {EmployeeSchedule[]} schedule\n * @param {Map<number, import(\"#shared/dn-tasktype\").TaskType>} taskTypeMap\n * @param {Date} dtStart\n * @param {number} numberOfDays\n * @param {number} length\n * @param {import(\"@/model/dn-employee-cc.js\").EmployeeCallcenters} employeeCallcenters\n * @param {number} ccId\n * @param {number[]} [taskTypeIds]\n */\nexport function getEmpWorkMap(schedule, taskTypeMap, dtStart, numberOfDays, length, employeeCallcenters, ccId, taskTypeIds = null) {\n const emps = schedule.map(function (x) { return x.emp });\n /** @type {Map<number, Map<string, number[]>>} */\n const empWorkMap = new Map\n for (let e = 0; e < emps.length; e++) {\n empWorkMap.set(emps[e].id, new Map)\n }\n\n let dt = dtStart;\n let dtEnd = dtStart\n for (let d = 0; d < numberOfDays; d++) {\n dtEnd = addDays(dt, 1);\n const dtKey = getShortDate(dt);\n const daySchedule = schedule.map(function (x) { return { emp: x.emp, tasks: x.tasks.filter(isAtDt), breaks: x.breaks.filter(isAtDt), absences: x.absences.filter(isAtDt) } });\n for (const dayEmpSchedule of daySchedule) {\n const workArray = getEmpWorkArray(dayEmpSchedule, dt, taskTypeMap, length, employeeCallcenters, ccId, taskTypeIds);\n empWorkMap.get(dayEmpSchedule.emp.id).set(dtKey, workArray);\n }\n\n dt = dtEnd;\n }\n return empWorkMap;\n\n /**\n * @param {import(\"#shared/dn-task\").Task} t\n */\n function isAtDt(t) {\n return t.overlaps(dt, dtEnd);\n }\n}\n\n/**\n * @param {EmployeeSchedule[]} schedule\n * @param {Date} dtStart\n * @param {number} numberOfDays\n * @param {number} length\n * @param {import(\"@/model/dn-employee-cc\").EmployeeCallcenters} employeeCallcenters\n * @param {number} ccId\n */\nexport function getEmpBreakMap(schedule, dtStart, numberOfDays, length, employeeCallcenters, ccId) {\n const emps = schedule.map(function (x) { return x.emp });\n /** @type {Map<number, Map<string, number[]>>} */\n const empBreakMap = new Map\n for (let e = 0; e < emps.length; e++) {\n empBreakMap.set(emps[e].id, new Map)\n }\n\n let dt = dtStart;\n let dtEnd = dtStart\n for (let d = 0; d < numberOfDays; d++) {\n dtEnd = addDays(dt, 1);\n const dtKey = getShortDate(dt);\n const daySchedule = schedule.map(function (x) { return { emp: x.emp, tasks: x.tasks.filter(isAtDt), breaks: x.breaks.filter(isAtDt), absences: x.absences.filter(isAtDt) } });\n for (const dayEmpSchedule of daySchedule) {\n const breakArray = getEmpBreakArray(dayEmpSchedule, dt, length, employeeCallcenters, ccId);\n empBreakMap.get(dayEmpSchedule.emp.id).set(dtKey, breakArray);\n }\n\n dt = dtEnd;\n }\n return empBreakMap;\n\n /**\n * @param {import(\"#shared/dn-task\").Task} t\n */\n function isAtDt(t) {\n return t.overlaps(dt, dtEnd);\n }\n}\n\n/**\n * @param {Date} dt\n * @param {{tasks: DeletableDateInterval[]; absences: DeletableDateInterval[];}} schedule\n */\nexport function getMinShiftStart(dt, schedule) {\n const minTaskStart = getPossibleShiftStart(dt, schedule.tasks, true, true);\n const minAbsenceStart = getPossibleShiftStart(dt, schedule.absences, false, true);\n if (minTaskStart > dt)\n dt = minTaskStart;\n if (minAbsenceStart > dt) {\n dt = minAbsenceStart;\n }\n\n return new Date(dt);\n}\n\n/**\n * @param {Date} startDt\n * @param {DeletableDateInterval[]} tasks\n * @param {boolean} connectEnd\n * @param {boolean} addExtraTime\n */\nfunction getPossibleShiftStart(startDt, tasks, connectEnd = true, addExtraTime = false) {\n let hasTask = false;\n for (const task of tasks) {\n if (!task.isToDelete && task.st < startDt && startDt <= task.fi) {\n startDt = task.fi;\n hasTask = true;\n }\n }\n\n if (hasTask) {\n if (connectEnd)\n startDt = getConnectedEnd(startDt, tasks);\n if (addExtraTime)\n return new Date(startDt.getTime() + 1000 * 60 * 15);\n return startDt;\n }\n return startDt;\n}\n\n/**\n * @param {Date} dt\n * @param {DeletableDateInterval[]} tasks tasks that connect over midnight\n * @param {{absences:DeletableDateInterval[];breaks:DeletableDateInterval[];payments:DeletableDateInterval[]}} schedule\n * @param {boolean} ignoreToDelete\n */\nexport function getShiftBounds(dt, tasks, schedule = undefined,ignoreToDelete=false) {\n return getShiftBounds2(dt, addDays(dt, 1), tasks, schedule, ignoreToDelete);\n}\n\n/**\n * @param {Date} dt\n * @param {Date} dtEnd\n * @param {DeletableDateInterval[]} tasks tasks that connect over midnight\n * @param {{absences:DeletableDateInterval[];breaks:DeletableDateInterval[];payments:DeletableDateInterval[]}} schedule\n * @param {boolean} ignoreToDelete\n */\nexport function getShiftBounds2(dt, dtEnd, tasks, schedule = undefined, ignoreToDelete=false) {\n const shift = { st: new Date(8640000000000000), fi: new Date(-8640000000000000) }\n const startDt = getPossibleShiftStart(dt, tasks);\n\n setShiftBounds(shift, startDt, dtEnd, tasks,ignoreToDelete);\n if (schedule) {\n setShiftBounds(shift, startDt, dtEnd, schedule.absences,ignoreToDelete);\n setShiftBounds(shift, startDt, dtEnd, schedule.breaks,ignoreToDelete);\n setShiftBounds(shift, startDt, dtEnd, schedule.payments,ignoreToDelete);\n }\n\n shift.fi = getConnectedEnd(shift.fi, tasks,ignoreToDelete);\n return shift;\n}\n\n/**\n * @param {number} numberOfDays\n * @param {Date} stDate\n * @param {import(\"#shared/dn-task\").Task[]} scheduleTasks\n * @param {import(\"#shared/dn-employee\").Employee[]} employees\n * @param {boolean} includeInactive\n */\nfunction getTasksByEmpId(numberOfDays, stDate, scheduleTasks, employees, includeInactive) {\n const prevDate = addDays(stDate, -1);\n const fiDate = addDays(stDate, numberOfDays + 1);\n\n /** @type {Map<number, {index:number, employee:import(\"#shared/dn-employee\").Employee, tasks:import(\"#shared/dn-task\").Task[]}>} */\n const byEmpId = new Map();\n for (let e = 0; e < employees.length; e++) {\n if (employees[e].active || includeInactive) {\n byEmpId.set(employees[e].id, { index: e, employee: employees[e], tasks: [] });\n }\n }\n for (const task of scheduleTasks) {\n const employeeSchedule = byEmpId.get(task.empid);\n if (employeeSchedule !== undefined) {\n if ((task.isInDB || !task.isToDelete) && task.overlaps(prevDate, fiDate)) {\n employeeSchedule.tasks.push(task);\n }\n }\n }\n\n return byEmpId;\n}\n\n/**\n * @param {import(\"@/model/dn-break-settings.js\").BreakSettings[]} breakSettings\n * @param {number} workMinutes\n */\nfunction getMaxDurForWork(breakSettings, workMinutes) {\n if (workMinutes === 0)\n return 0;\n let max = workMinutes;\n for (const bs of breakSettings) {\n const dur = bs.unpaidDurationMinutes + workMinutes;\n if (dur > max && bs.minShiftDurationMinutes <= dur && dur <= bs.maxShiftDurationMinutes) {\n max = dur;\n }\n }\n\n return max;\n}\n\n/**\n * @param {Map<number, import(\"#shared/dn-tasktype\").TaskType>} taskTypeMap\n * @param {{tasks:import(\"#shared/dn-task\").Task[]; breaks:import(\"#shared/dn-task\").Task[]; absences: import(\"#shared/dn-task\").Task[]}} empSchedule\n */\nexport function getWork(taskTypeMap, empSchedule) {\n const tasks = empSchedule.tasks.filter(x => !x.isToDelete);\n const breaks = empSchedule.breaks.filter(x => !x.isToDelete);\n const absences = empSchedule.absences.filter(x => !x.isToDelete);\n return getWorkImpl(taskTypeMap, { tasks, breaks, absences });\n}\n\n/**\n * @param {Map<number, import(\"#shared/dn-tasktype\").TaskType>} taskTypeMap\n * @param {import(\"#shared/dn-task\").Task[]} tasks\n * @param {import(\"#shared/dn-task\").Task[]} toRemove\n */\n\nexport function getWorkFromTasks(taskTypeMap, tasks, toRemove) {\n const filteredTasks = tasks.filter(x => !x.isToDelete);\n if (filteredTasks.length === 0)\n return 0;\n\n const filteredToRemove = toRemove.filter(x => !x.isToDelete);\n return getWorkImplFromTasks(taskTypeMap, tasks, filteredToRemove);\n}\n\n/**\n * @param {Map<number, import(\"#shared/dn-tasktype\").TaskType>} taskTypeMap\n * @param {{tasks:TaskSimple[]; breaks:TaskSimple[]; absences: TaskSimple[]}} empSchedule\n * @param {boolean} usePaid\n */\nfunction getWorkImpl(taskTypeMap, empSchedule, usePaid = false) {\n const tasks = empSchedule.tasks;\n /** @type {TaskSimple[]} */\n const paidAbsence = [];\n /** @type {TaskSimple[]} */\n const toRemove = [];\n for (const t of empSchedule.breaks) {\n if (!taskTypeMap.get(t.tasktypeId).paidBreak) {\n toRemove.push(t);\n }\n }\n for (const t of empSchedule.absences) {\n if (taskTypeMap.get(t.tasktypeId).paidBreak) {\n paidAbsence.push(t);\n } else {\n toRemove.push(t);\n }\n }\n let work = 0;\n if (tasks.length > 0) {\n const remains = subtractTasks(tasks, toRemove);\n if (usePaid) {\n const msPerHour = 1000 * 60 * 60;\n return remains.reduce((sum, t) => sum + (t.fi.getTime() - t.st.getTime()) / msPerHour * taskTypeMap.get(t.tasktypeId).paid / 100, 0);\n }\n work = sumTasks(remains);\n }\n\n if (paidAbsence.length > 0) {\n const remains = subtractTasks(paidAbsence, tasks);\n work += sumTasks(remains);\n }\n\n return work;\n}\n\n/**\n * @param {Map<number, import(\"#shared/dn-tasktype\").TaskType>} taskTypeMap\n * @param {{st:Date; fi:Date; tasktypeId:number}[]} tasks\n * @param {{st:Date; fi:Date; tasktypeId:number}[]} toRemove\n */\nfunction getWorkImplFromTasks(taskTypeMap, tasks, toRemove) {\n if (tasks.length === 0)\n return 0;\n\n const filteredToRemove = toRemove.filter(x => !taskTypeMap.get(x.tasktypeId).paidBreak);\n const remains = subtractTasks(tasks, filteredToRemove);\n\n return sumTasks(remains);\n}\n\n\n/**\n * @param {{st:Date;}[]} tasks\n * @param {import(\"#shared/dn-date-interval\").DateInterval} dateInterval\n */\nfunction sumDays(tasks, dateInterval) {\n const days = new Set();\n for (const t of tasks) {\n days.add(dateInterval.startOfDay(t.st).getTime());\n }\n return days.size;\n}\n\n/**\n * @param {{st:Date; fi:Date}[]} tasks\n */\nfunction sumTasks(tasks) {\n const msPerHour = 1000 * 60 * 60;\n return tasks.reduce((sum, t) => sum + (t.fi.getTime() - t.st.getTime()) / msPerHour, 0);\n}\n\n/**\n * @param {{ fi: Date; st: Date; }} shift\n * @param {Date} dt\n * @param {Date} dtEnd\n * @param {{st:Date; fi:Date; isToDelete?:boolean}[]} tasks\n * @param {boolean} ignoreToDelete\n */\nfunction setShiftBounds(shift, dt, dtEnd, tasks, ignoreToDelete) {\n for (const task of tasks) {\n if ((!task.isToDelete||ignoreToDelete) && task.st >= dt && task.st < dtEnd) {\n if (task.st < shift.st) {\n shift.st = task.st;\n }\n if (task.fi > shift.fi) {\n shift.fi = task.fi;\n }\n }\n }\n}\n\n/**\n * @param {TaskSimple[]} toCount\n * @param {{st:Date; fi:Date}[]} toRemove\n */\nexport function subtractTasks(toCount, toRemove) {\n const remains = toCount.map(t => ({ st: t.st, fi: t.fi, tasktypeId: t.tasktypeId }));\n for (const s of toRemove) {\n let i = 0;\n while (i < remains.length) {\n const t = remains[i];\n if (s.st < t.fi && s.fi > t.st) {\n if (t.st < s.st) {\n if (s.fi < t.fi) {\n const newFi = t.fi;\n t.fi = s.st;\n remains.push({ st: s.fi, fi: newFi, tasktypeId: t.tasktypeId })\n } else {\n t.fi = s.st;\n }\n } else if (s.fi < t.fi) {\n t.st = s.fi;\n } else {\n remains.splice(i, 1);\n continue;\n }\n }\n i++;\n }\n\n if (remains.length === 0)\n break;\n }\n\n return remains;\n}\n","import { ModelObject } from '#shared/dn-model-object';\nimport { fromISODate, toISODate } from '#shared/dn-shared-helper';\n\n/**\n * @typedef {{ id: number; empid?: string; ccid: number; name: string; agreedWorkWeek?:number|null, minWorkWeek?:number|null, maxWorkWeek?:number|null, optimizationOrder?:number,\n* email?: string; notify?:boolean, switchid?: string; rotations?: number; skills?: number[]; active?: boolean; tagIds?: number[]; userid?: number|null; password?:string,\n* maxDaysInRow?:number|null, maxWeekendsInRow?:number|null, nightRest?:number|null, address1?:string|null, address2?:string|null, address3?:string|null, agreedSms?:boolean|null, phoneNum?:string|null,\n* ghost?:boolean; username?:string|null; birthDate?:string|null; hireDate?:string|null; terminationDate?:string|null; note?:string|null, maxBOWeek?:number|null;absenceDuration?:number|null;\n* availabilityId?:number|null;shiftBagId?:number|null;rotationId?:number|null\n* }} EmployeeDto\n*/\n\n/**\n* @typedef {{employeeId:number; added:number[]; removed:number[]}} EmployeeSkillDto\n*/\n\nexport class Employee extends ModelObject {\n /**\n * @param {EmployeeDto} dto\n */\n constructor(dto) {\n super(dto.id);\n /** @private @type {string|null} */\n this._empid = dto.empid ? dto.empid : null;\n /** @private @type {number|null} */\n this._ccid = dto.ccid;\n /** @private @type {string} */\n this._name = dto.name;\n /** @private @type {number|null} */\n this._agreedWorkWeek = dto.agreedWorkWeek ? dto.agreedWorkWeek : null;\n /** @private @type {number|null} */\n this._minWorkWeek = dto.minWorkWeek ? dto.minWorkWeek : null;\n /** @private @type {number|null} */\n this._maxWorkWeek = dto.maxWorkWeek ? dto.maxWorkWeek : null;\n /** @private @type {number} */\n this._optimizationOrder = dto.optimizationOrder ? dto.optimizationOrder : 0;\n /** @private @type {number|null} */\n this._maxDaysInRow = dto.maxDaysInRow ? dto.maxDaysInRow : null;\n /** @private @type {number|null} */\n this._maxWeekendsInRow = dto.maxWeekendsInRow ? dto.maxWeekendsInRow : null;\n /** @private @type {number|null} */\n this._nightRest = dto.nightRest ? dto.nightRest : null;\n /** @private @type {number|null} */\n this._maxBOWeek = dto.maxBOWeek ? dto.maxBOWeek : null;\n /** @private @type {number|null} */\n this._absenceDuration = dto.absenceDuration ? dto.absenceDuration : null;\n /** @private @type {string|null} */\n this._email = dto.email ? dto.email : null;\n /** @private @type {string|null} */\n this._username = dto.username ? dto.username : null;\n let switchid = dto.switchid ? dto.switchid : null;\n if (switchid !== null) {\n switchid = switchid.trim();\n if (switchid === '') {\n switchid = null;\n }\n }\n\n /** @private @type {string|null} */\n this._switchid = switchid;\n /** @private @type {number[]} */\n this._skills = dto.skills ? dto.skills : [];\n /** @private @type {boolean|null} */\n this._active = dto.active !== false;\n /** @private @type {string} */\n this._password = '';\n /** @private @type {number[]} */\n this._tagIds = dto.tagIds ? dto.tagIds : [];\n /** @private @type {string|null} */\n this._address1 = dto.address1 ? dto.address1 : null;\n /** @private @type {string|null} */\n this._address2 = dto.address2 ? dto.address2 : null;\n /** @private @type {string|null} */\n this._address3 = dto.address3 ? dto.address3 : null;\n /** @private @type {boolean|null} */\n this._agreedSms = dto.agreedSms ? dto.agreedSms : null;\n /** @private @type {string|null} */\n this._phoneNum = dto.phoneNum ? dto.phoneNum : null;\n /** @type {number|null|undefined} */\n this.userId = dto.userid;\n /** @type {boolean} */\n this.ghost = dto.ghost ? dto.ghost : false;\n\n /** @private @type {Date|null} */\n this._birthDate = dto.birthDate ? fromISODate(dto.birthDate) : null;\n /** @private @type {Date|null} */\n this._hireDate = dto.hireDate ? fromISODate(dto.hireDate) : null;\n /** @private @type {Date|null} */\n this._terminationDate = dto.terminationDate ? fromISODate(dto.terminationDate) : null;\n /** @private @type {string|null} */\n this._note = dto.note;\n\n /** @type {number} */\n this.changeVersion = 0;\n /** @type {boolean} */\n this.notify = false;\n /** @private @type {boolean} */\n this._separateUsername = this.userId && this.email !== this.username;\n /** @private @type {number[]} */\n this._warnings = []\n /** @private @type {boolean} */\n this._checked = false\n\n }\n\n clone() {\n const dto = this.toDto();\n dto.skills = this.skills.slice();\n dto.tagIds = this.tagIds.slice();\n return new Employee(dto);\n }\n\n get birthDate() {\n return this._birthDate;\n }\n\n set birthDate(newValue) {\n this.setEmpDateValue('_birthDate', newValue);\n }\n\n get hireDate() {\n return this._hireDate;\n }\n\n set hireDate(newValue) {\n this.setEmpDateValue('_hireDate', newValue);\n }\n\n get separateUsername() {\n return this._separateUsername;\n }\n\n set separateUsername(newValue) {\n this.setEmpValue('_separateUsername', newValue);\n }\n\n get terminationDate() {\n return this._terminationDate;\n }\n\n set terminationDate(newValue) {\n this.setEmpDateValue('_terminationDate', newValue);\n }\n\n get note() {\n return this._note;\n }\n\n set note(newValue) {\n this.setEmpValue('_note', newValue);\n }\n\n get empid() {\n return this._empid\n }\n\n set empid(newValue) {\n if (newValue === '') { newValue = null; }\n this.setEmpValue('_empid', newValue);\n }\n\n get ccid() {\n return this._ccid\n }\n\n set ccid(newValue) {\n this.setEmpValue('_ccid', newValue);\n }\n\n get name() {\n return this._name\n }\n\n set name(newValue) {\n this.setEmpValue('_name', newValue);\n }\n\n get agworkhours() {\n return getHours(this.agreedWorkWeek);\n }\n\n set agworkhours(value) {\n this.setHours('_agreedWorkWeek', value);\n }\n\n /** agreed work per week in minutes */\n get agreedWorkWeek() {\n if (this.isExtra)\n return null;\n return this._agreedWorkWeek;\n }\n\n set agreedWorkWeek(value) {\n this.setEmpValue('_agreedWorkWeek', value);\n }\n\n get minWorkWeek() {\n if (this.isExtra)\n return null;\n return this._minWorkWeek;\n }\n\n set minWorkWeek(newValue) {\n this.setEmpValue('_minWorkWeek', newValue);\n }\n\n get minWorkWeekHours() {\n return getHours(this.minWorkWeek);\n }\n\n set minWorkWeekHours(value) {\n this.setHours('_minWorkWeek', value);\n }\n\n get maxWorkWeek() {\n return this._maxWorkWeek;\n }\n\n set maxWorkWeek(newValue) {\n this.setEmpValue('_maxWorkWeek', newValue);\n }\n\n get maxWorkWeekHours() {\n return getHours(this.maxWorkWeek);\n }\n\n set maxWorkWeekHours(value) {\n this.setHours('_maxWorkWeek', value);\n }\n\n get maxBOWeek() {\n return this._maxBOWeek;\n }\n\n set maxBOWeek(newValue) {\n this.setEmpValue('_maxBOWeek', newValue);\n }\n\n get maxBOWeekHours() {\n return getHours(this.maxBOWeek);\n }\n\n /**\n * @param {number} value\n */\n set maxBOWeekHours(value) {\n this.setHours('_maxBOWeek', value);\n }\n\n get absenceDuration() {\n return this._absenceDuration ? this._absenceDuration : 480;\n }\n\n set absenceDuration(newValue) {\n this.setEmpValue('_absenceDuration', newValue);\n }\n\n get absenceDurationHours() {\n return getHours(this._absenceDuration);\n }\n\n /**\n * @param {number} value\n */\n set absenceDurationHours(value) {\n this.setHours('_absenceDuration', value);\n }\n\n absenceStart() {\n const dur = this.absenceDuration;\n return Math.max(0, 60 * Math.floor((60 * 12 - dur / 2) / 60));\n }\n\n get optimizationOrder() {\n if (this.ghost) { return 4; }\n return this._optimizationOrder;\n }\n\n set optimizationOrder(newValue) {\n this.setEmpValue('_optimizationOrder', newValue);\n }\n\n get maxDaysInRow() {\n if (this._maxDaysInRow === null) {\n return 4;\n }\n return this._maxDaysInRow;\n }\n\n set maxDaysInRow(newValue) {\n if (this.maxDaysInRow !== newValue) {\n this.setEmpValue('_maxDaysInRow', newValue);\n }\n }\n\n get maxWeekendsInRow() {\n return this._maxWeekendsInRow;\n }\n\n set maxWeekendsInRow(newValue) {\n this.setEmpValue('_maxWeekendsInRow', newValue);\n }\n\n /**\n * Gets the min night rest in minutes.\n * @returns {number}\n * */\n get nightRest() {\n if (this._nightRest === null) {\n if (this.ghost) { return 15; }\n return 11 * 60;\n }\n return this._nightRest;\n }\n\n set nightRest(value) {\n if (this.nightRest !== value) {\n this.setEmpValue('_nightRest', value);\n }\n }\n\n get nightRestHours() {\n return getHours(this.nightRest);\n }\n\n set nightRestHours(value) {\n this.setHours('_nightRest', value);\n }\n\n get email() {\n return this._email;\n }\n\n set email(newValue) {\n if (!newValue) { newValue = null; }\n this.setEmpValue('_email', newValue);\n }\n\n get username() {\n return this._username;\n }\n\n set username(newValue) {\n if (!newValue) { newValue = null; }\n this.setEmpValue('_username', newValue);\n }\n\n get switchid() {\n return this._switchid;\n }\n\n set switchid(newValue) {\n if (newValue !== null) {\n newValue = newValue.trim();\n if (newValue === '') {\n newValue = null;\n }\n }\n this.setEmpValue('_switchid', newValue);\n }\n\n get switchIdList() {\n if (this.switchid) {\n return this.switchid.split(';');\n }\n\n return [];\n }\n\n set switchIdList(idList) {\n if (idList.length === 0) {\n this.switchid = null;\n } else {\n this._switchid = idList.join(';');\n }\n }\n\n get skills() {\n return this._skills\n }\n\n set skills(newValue) {\n this.setEmpNumberArrayValue('_skills', newValue);\n }\n\n get tagIds() {\n return this._tagIds\n }\n\n set tagIds(newValue) {\n this.setEmpNumberArrayValue('_tagIds', newValue);\n }\n\n get active() {\n return this._active\n }\n\n set active(newValue) {\n this.setEmpValue('_active', newValue);\n }\n\n get password() {\n return this._password\n }\n\n set password(newValue) {\n if (newValue === '') { newValue = null; }\n this.setEmpValue('_password', newValue);\n }\n\n get isExtra() {\n return this.optimizationOrder !== 0;\n }\n\n set isExtra(newValue) {\n if (newValue) {\n this.optimizationOrder = 1;\n } else {\n this.optimizationOrder = 0;\n }\n }\n\n get address1() {\n return this._address1;\n }\n\n set address1(newValue) {\n if (newValue === '') { newValue = null; }\n this.setEmpValue('_address1', newValue);\n }\n\n get address2() {\n return this._address2;\n }\n\n set address2(newValue) {\n if (newValue === '') { newValue = null; }\n this.setEmpValue('_address2', newValue);\n }\n\n get address3() {\n return this._address3;\n }\n\n set address3(newValue) {\n if (newValue === '') { newValue = null; }\n this.setEmpValue('_address3', newValue);\n }\n\n get agreedSms() {\n return this._agreedSms;\n }\n\n set agreedSms(newValue) {\n this.setEmpValue('_agreedSms', newValue);\n }\n\n get phoneNum() {\n return this._phoneNum;\n }\n\n set phoneNum(newValue) {\n this.setEmpValue('_phoneNum', newValue);\n }\n\n set warnings(newValue) {\n this._warnings = newValue\n }\n get warnings() {\n return this._warnings\n }\n\n set checked(newValue) {\n this._checked = newValue\n }\n get checked() {\n return this._checked\n }\n\n hasChangesWorkTime() {\n return this.hasChangesPart(['_agreedWorkWeek', '_maxWorkWeek', '_minWorkWeek', '_optimizationOrder', '_maxBOWeek', '_absenceDuration']);\n }\n\n hasChangesTags() {\n return this.hasChangesPart(['_tagIds']);\n }\n\n hasChangesWorkDays() {\n return this.hasChangesPart(['_maxDaysInRow', '_maxWeekendsInRow', '_nightRest']);\n }\n\n hasChangesGeneral() {\n return this.hasChangesPart(['_name', '_empid', '_switchid', '_phoneNum', '_active', '_email', '_username',\n '_password', '_address1', '_address2', '_address3', '_birthDate', '_hireDate', '_separateUsername', '_terminationDate', '_note']);\n }\n\n /**\n * @param {number[]} skills\n */\n hasSameSkills(skills) {\n if (skills.length !== this.skills.length)\n return false;\n\n for (const skill of this.skills) {\n if (!skills.includes(skill))\n return false;\n }\n\n return true;\n }\n\n /**\n * @param {Employee} other\n */\n hasSameWorkTimes(other) {\n return !this.ghost && !other.ghost && other.agreedWorkWeek === this.agreedWorkWeek &&\n other.maxWorkWeek === this.maxWorkWeek &&\n other.minWorkWeek === this.minWorkWeek &&\n other.optimizationOrder === this.optimizationOrder &&\n other.maxBOWeek === this.maxBOWeek &&\n other._absenceDuration === this._absenceDuration;\n }\n\n /**\n * @param {Employee} other\n */\n hasSameWorkDaySettings(other) {\n return !this.ghost && !other.ghost && other.maxDaysInRow === this.maxDaysInRow &&\n other.maxWeekendsInRow === this.maxWeekendsInRow &&\n other.nightRest === this.nightRest;\n }\n\n /**\n * @param {Employee} other\n */\n copyWorkWorkDaySettings(other) {\n this.maxDaysInRow = other.maxDaysInRow;\n this.maxWeekendsInRow = other.maxWeekendsInRow;\n this.nightRest = other.nightRest;\n }\n\n /**\n * @param {Employee} other\n */\n copyWorkHours(other) {\n this.agreedWorkWeek = other.agreedWorkWeek;\n this.maxWorkWeek = other.maxWorkWeek;\n this.minWorkWeek = other.minWorkWeek;\n this.optimizationOrder = other.optimizationOrder;\n this.maxBOWeek = other.maxBOWeek;\n this.absenceDuration = other._absenceDuration;\n }\n\n isUsernameOk() {\n return !this.separateUsername || !this.username || this.username.length > 3\n }\n\n /**\n * @param {number[]} tagIdList\n */\n hasAnyTag(tagIdList) {\n if (tagIdList.length === 0) {\n return true;\n }\n for (const tagId of tagIdList) {\n if (this.tagIds.includes(tagId)) {\n return true;\n }\n }\n return false;\n }\n\n /** @returns {EmployeeSkillDto} */\n toEmployeeSkillDto() {\n if (this.originalMap !== undefined) {\n const original = this.originalMap.get('_skills');\n if (original) {\n /** @type {number[]} */\n const originalSkills = original.value;\n const added = [];\n for (const skillId of this.skills) {\n if (!originalSkills.includes(skillId)) {\n added.push(skillId);\n }\n }\n const removed = [];\n for (const skillId of originalSkills) {\n if (!this.skills.includes(skillId)) {\n removed.push(skillId);\n }\n }\n return { employeeId: this.id, added, removed };\n }\n }\n\n return undefined;\n }\n\n /**\n * @returns {EmployeeDto}\n */\n toDto(patchSave = false) {\n let username = this.username;\n if (!this.separateUsername) {\n if (this.userId) {\n username = this.email;\n } else {\n username = null;\n }\n }\n\n const dto = {\n id: this.id, empid: this.empid, ccid: this.ccid, name: this.name,\n agreedWorkWeek: this.agreedWorkWeek, maxBOWeek: this._maxBOWeek, absenceDuration: this._absenceDuration, minWorkWeek: this.minWorkWeek, maxWorkWeek: this.maxWorkWeek, optimizationOrder: this._optimizationOrder,\n maxDaysInRow: this._maxDaysInRow, maxWeekendsInRow: this._maxWeekendsInRow, nightRest: this._nightRest,\n email: this.email, notify: this.notify, switchid: this.switchid,\n active: this.active, password: this.password, tagIds: this.tagIds.slice(), userid: this.userId,\n address1: this._address1, address2: this._address2, address3: this._address3, agreedSms: this.agreedSms, phoneNum: this._phoneNum, ghost: this.ghost, username: username,\n birthDate: toISODate(this.birthDate), hireDate: toISODate(this.hireDate), terminationDate: toISODate(this.terminationDate), note: this.note\n };\n\n if (!patchSave) { // don't allow saving skills in patch\n dto.skills = this.skills.slice();\n }\n\n return dto;\n }\n\n /**\n * @private\n * @param {string} prop\n * @param {Date} value\n */\n setEmpDateValue(prop, value) {\n if (this.setDateValue(prop, value)) {\n this.changeVersion += 1;\n }\n }\n\n /**\n * @private\n * @param {string} prop\n * @param {string | number | boolean} value\n */\n setEmpValue(prop, value) {\n if (this.setValue(prop, value)) {\n this.changeVersion += 1;\n }\n }\n\n /**\n * @private\n * @param {string} prop\n * @param {number[]} value\n */\n setEmpNumberArrayValue(prop, value) {\n if (this.setNumberArrayValue(prop, value)) {\n this.changeVersion += 1;\n }\n }\n\n /**\n * @private\n * @param {string} prop\n * @param {any} value\n */\n setHours(prop, value) {\n let numberValue;\n switch (typeof (value)) {\n case 'number':\n numberValue = value;\n break;\n case 'string':\n numberValue = parseFloat(value);\n break;\n default:\n numberValue = null;\n break;\n }\n\n if (isNaN(numberValue)) {\n numberValue = null;\n }\n\n if (numberValue !== null) {\n numberValue *= 60;\n }\n\n this.setEmpValue(prop, numberValue);\n }\n\n workTimeOk() {\n if (this.agreedWorkWeek > 0) {\n if (this.minWorkWeek > 0) {\n if (this.minWorkWeek > this.agreedWorkWeek) {\n return false;\n }\n }\n if (this.maxWorkWeek > 0) {\n if (this.maxWorkWeek < this.agreedWorkWeek) {\n return false;\n }\n }\n }\n if (this.minWorkWeek > 0 && this.maxWorkWeek > 0) {\n if (this.minWorkWeek > this.maxWorkWeek) {\n return false;\n }\n }\n return true;\n }\n}\n\n/**\n * @param {EmployeeDto} dto\n */\nexport function employeeFromDto(dto) {\n return new Employee(dto);\n}\n\n/**\n * @param {number} value\n */\nfunction getHours(value) {\n return value ? value / 60 : null;\n}","export class ModelObject {\n /**\n * @param {number} id\n */\n constructor(id) {\n \n /** @protected @type {number} */\n this._id = id;\n\n /** @private @type {boolean} */\n this._hasChanges = this._id < 0;\n\n /** @private @type {boolean} */\n this._isToDelete = false;\n }\n\n /** @return {number} */\n get id() {\n return this._id;\n }\n set id(value) {\n this._id = value;\n }\n\n /** @return {boolean} */\n get isToDelete() {\n return this._isToDelete;\n }\n\n /** @return {boolean} */\n get hasChanges() {\n return this._hasChanges;\n }\n\n isInDB() {\n return this._id >= 0;\n }\n\n /**\n * @private\n * @param {string} prop\n * @param {any} value\n * @param {(arg0: any) => any} [eqProjection]\n */\n setValueImpl(prop, value, eqProjection) {\n const originalValue = this[prop];\n let projOriginalValue = originalValue;\n let projValue = value;\n if (eqProjection) {\n projOriginalValue = eqProjection(originalValue);\n projValue = eqProjection(projValue);\n }\n\n const diff = projOriginalValue !== projValue;\n if (diff) {\n this[prop] = value;\n if (this.originalMap === undefined) {\n /** @type {Map<string, {value:any;projValue:any}>} */\n this.originalMap = new Map();\n this.originalMap.set(prop, { value: originalValue, projValue: projOriginalValue });\n } else {\n const original = this.originalMap.get(prop);\n if (original === undefined) {\n this.originalMap.set(prop, { value: originalValue, projValue: projOriginalValue });\n } else if (original.projValue === projValue) {\n this.originalMap.delete(prop);\n }\n }\n this.setHasChanges();\n }\n return diff;\n }\n\n /**\n * @protected\n * @param {string} prop\n * @param {number|string|boolean} value\n */\n setValue(prop, value) {\n return this.setValueImpl(prop, value);\n }\n\n /**\n * @protected\n * @param {string} prop\n * @param {Date} value\n */\n setDateValue(prop, value) {\n return this.setValueImpl(prop, value, dateProj);\n }\n\n /**\n * @protected\n * @param {string} prop\n * @param {number[]} value\n */\n setNumberArrayValue(prop, value) {\n return this.setValueImpl(prop, value, numberArrayProj);\n }\n\n /**\n * @private\n * @param {string} prop\n * @param {any} value\n * @param {(arg0: any) => any} [eqProjection]\n */\n setOriginalValueImpl(prop, value, eqProjection) {\n let x = this[prop];\n let projValue = value;\n if (eqProjection) {\n x = eqProjection(x);\n projValue = eqProjection(value);\n }\n\n const diff = x !== projValue;\n if (diff) {\n if (this.originalMap === undefined || !this.originalMap.has(prop)) {\n this[prop] = value;\n } else {\n this.originalMap.set(prop, { value: value, projValue: projValue });\n }\n\n this.setHasChanges();\n } else {\n if (this.originalMap !== undefined && this.originalMap.has(prop)) {\n this.originalMap.delete(prop);\n this.setHasChanges();\n }\n }\n return diff;\n }\n\n /**\n * @protected\n * @param {string} prop\n * @param {number|string|boolean} value\n */\n setOriginalValue(prop, value) {\n return this.setOriginalValueImpl(prop, value);\n }\n\n /**\n * @protected\n * @param {string} prop\n * @param {Date} value\n */\n setOriginalDateValue(prop, value) {\n return this.setOriginalValueImpl(prop, value, dateProj);\n }\n\n /**\n * @param {{itemHasChanged:(hasChanges:boolean) => void; itemChanged?: (model:ModelObject) => void}} container\n */\n setContainer(container) {\n /** @private @type {{itemHasChanged:(hasChanges:boolean) => void; itemChanged?: (model:ModelObject) => void}} */\n this._container = container;\n }\n\n hasContainer(){ \n return this._container!==undefined\n }\n\n /** @protected */\n setHasChanges() {\n /** @type {boolean} */\n let hasChanges;\n if (this.id < 0) {\n hasChanges = !this.isToDelete;\n } else {\n hasChanges = this.isToDelete || (this.originalMap !== undefined && this.originalMap.size > 0);\n }\n if (this._container !== undefined && this._container.itemChanged !== undefined) {\n this._container.itemChanged(this);\n }\n if (this._hasChanges !== hasChanges) {\n this._hasChanges = hasChanges;\n if (this._container !== undefined) {\n this._container.itemHasChanged(hasChanges);\n }\n }\n }\n\n /**\n * @protected\n * @param {string[]} fields\n */\n hasChangesPart(fields) {\n if (this.originalMap !== undefined) {\n for (const field of fields) {\n if (this.originalMap.has(field)) { return true; }\n }\n }\n\n return false;\n }\n\n confirmChanges() {\n this.originalMap = undefined;\n this.setHasChanges();\n }\n\n revert() {\n if (this.originalMap !== undefined) {\n for (const [prop, original] of this.originalMap) {\n this[prop] = original.value;\n }\n this.confirmChanges();\n }\n }\n\n resurrect() {\n this._isToDelete = false;\n this.setHasChanges();\n }\n\n toDelete() {\n if (this.id < 0) {\n this.originalMap = undefined;\n }\n this._isToDelete = true;\n this.setHasChanges();\n }\n undoToDelete(){\n this._isToDelete = false;\n this.setHasChanges();\n }\n}\n\n/**\n * @param {Date|null} dt\n */\nfunction dateProj(dt) {\n return dt !== null ? dt.getTime() : null;\n}\n\n/**\n * @param {number[]} list\n */\nfunction numberArrayProj(list) {\n list.sort();\n return list.join('_');\n}","\n/**\n * @param {Date} dt\n * @param {number} days\n */\nexport function addDays(dt, days) {\n const result = new Date(dt)\n result.setDate(dt.getDate() + days)\n return result;\n}\n\n/**\n * @param {Date} dt1\n * @param {Date} dt2\n */\nexport function getDayDiff(dt1, dt2) {\n const diffTime = Math.abs(dt2.getTime() - dt1.getTime());\n const diffDays = Math.round(diffTime / (1000 * 60 * 60 * 24));\n return diffDays;\n}\n\n/**\n * convert string of format YYYY-MM-DD to Date with\n * @param {string} isoDate\n */\nexport function fromISODate(isoDate) {\n if (!isoDate)\n return null;\n return new Date(isoDate + 'T00:00:00');\n}\n\n/**\n * @param {Date} dt\n */\nexport function getQuarterHour(dt) {\n return dt.getHours() * 4 + Math.round(dt.getMinutes() / 15);\n}\n\n/**\n * @param {Date} dt\n */\nexport function getShortDate(dt) {\n var mm = dt.getMonth() + 1; // getMonth() is zero-based\n var dd = dt.getDate();\n return [dt.getFullYear(), (mm > 9 ? '' : '0') + mm, (dd > 9 ? '' : '0') + dd].join('-');\n}\n\n/**\n * @param {Date} dt\n */\nexport function getStartOfDay(dt) {\n var startOfDay = new Date(dt);\n startOfDay.setHours(0, 0, 0, 0);\n return startOfDay;\n}\n\n/**\n * Sorts all intervals in place.\n * @param {{st:Date; fi:Date}[]} dateIntervals\n */\nexport function sortDateIntervals(dateIntervals) {\n dateIntervals.sort((a, b) => {\n let diff = a.st.getTime() - b.st.getTime();\n if (diff === 0) {\n diff = b.fi.getTime() - a.fi.getTime();\n }\n return diff;\n });\n}\n\n/**\n * @param {{st:Date; fi:Date}[]} dateIntervals\n */\nexport function sumDateIntervals(dateIntervals) {\n sortDateIntervals(dateIntervals)\n let sum = 0;\n let lastTime = 0;\n for (const interval of dateIntervals) {\n let stMs = interval.st.getTime();\n let fiMs = interval.fi.getTime();\n if (lastTime > stMs) {\n stMs = lastTime;\n }\n if (stMs < fiMs) {\n sum += fiMs - stMs;\n lastTime = fiMs;\n }\n }\n return sum;\n}\n\n/**\n * convert local time to a string of format YYYY-MM-DD\n * @param {Date} date\n */\nexport function toISODate(date) {\n if (!date)\n return null;\n return date.toLocaleDateString('sv-SE', { year: 'numeric', month: 'numeric', day: 'numeric' });\n}\n","import { ModelObject } from '#shared/dn-model-object';\n\n/**\n* @typedef {{id?:number; empid:number; st:string|Date; fi:string|Date|null; tasktypeId:number; comment?:string; reasonCode?:string; corrSt?:number; corrFi?:number;userId?:number;updated?:string|Date}} TaskDto\n*/\n\nconst msPerMinute = 60 * 1000;\nconst msPerHours = 60 * msPerMinute;\nconst msPerNormalDay = 24 * msPerHours;\nlet negativeId = -1\n\n/**\n * @param {TaskDto} dto\n */\nfunction getNegativeId(dto) {\n let returnValue = -1;\n if (dto.empid) {\n negativeId = negativeId - 1;\n returnValue = negativeId;\n }\n return returnValue;\n}\n\nexport class Task extends ModelObject {\n /**\n * @param {TaskDto} dto\n */\n constructor(dto) {\n super(dto.id ? dto.id : getNegativeId(dto))\n /** @private @type {number} */\n this._empid = dto.empid;\n /** @private @type {Date} */\n this._st = convertToDate(dto.st);\n /** @private @type {Date|null} */\n this._fi = convertToDate(dto.fi);\n /** @type {string} */\n this._comment = convertToString(dto.comment);\n /** @private @type {number} */\n this._tasktypeId = dto.tasktypeId;\n /** @private @type {number} */\n this._corrSt = convertToNumber(dto.corrSt);\n /** @private @type {number} */\n this._corrFi = convertToNumber(dto.corrFi);\n /** @private @type {string|undefined} */\n this._reasonCode = dto.reasonCode;\n /** @private @type {Date} */\n this._updated = dto.updated ? new Date(dto.updated) : null;\n /** @private @type {number} */\n this._userId = dto.userId;\n\n /** @private @type {Date} */\n this._lastSt = this._st\n\n /** @private @type {Date|null} */\n this._lastFi = this._fi\n\n /** @private @type {number} */\n this._logStToggleIndex = 0\n\n /** @private @type {number} */\n this._logFiToggleIndex = 0\n }\n\n /**\n * @param {TaskDto} dto\n */\n update(dto) {\n this._id = dto.id;\n this.setOriginalValue('_empid', dto.empid)\n this.setOriginalDateValue('_st', convertToDate(dto.st));\n this.setOriginalDateValue('_fi', convertToDate(dto.fi));\n this.setOriginalValue('_tasktypeId', dto.tasktypeId);\n this.setOriginalValue('_comment', convertToString(dto.comment));\n this.setOriginalValue('_corrSt', convertToNumber(dto.corrSt));\n this.setOriginalValue('_corrFi', convertToNumber(dto.corrFi));\n this._reasonCode = dto.reasonCode ? dto.reasonCode : undefined;\n this._updated = dto.updated ? new Date(dto.updated) : null;\n this._userId = dto.userId;\n this.setHasChanges();\n }\n\n get updated() {\n return this._updated;\n }\n\n get userId() {\n return this._userId;\n }\n\n get empid() {\n return this._empid\n }\n\n set empid(value) {\n this.setValue('_empid', value);\n }\n\n /**\n * @return {Date}\n */\n get st() {\n return this._st\n }\n\n set st(newValue) {\n const oldValue = this._st;\n if (this.setDateValue('_st', newValue)) {\n this._lastSt = oldValue;\n }\n }\n\n /**\n * @return {Date}\n */\n get fi() {\n if (this._fi === null) {\n const now = new Date();\n if (now.getTime() - this._st.getTime() > msPerNormalDay) {\n this._fi = new Date(this._st.getTime() + msPerNormalDay);\n } else {\n return new Date(msPerMinute * Math.round(now.getTime() / msPerMinute))\n }\n }\n return this._fi;\n }\n set fi(newValue) {\n const oldValue = this._fi;\n if (this.setDateValue('_fi', newValue)) {\n this._lastFi = oldValue;\n }\n }\n\n get stCorrect() {\n return this.corrSt !== 0 ? new Date(60000 * this.corrSt + this.st.getTime()) : this.st;\n }\n set stCorrect(newValue) {\n this.corrSt = (newValue.getTime() - this.st.getTime()) / 60000\n }\n\n get fiCorrect() {\n return this.corrFi !== 0 ? new Date(60000 * this.corrFi + this.fi.getTime()) : this.fi;\n }\n set fiCorrect(newValue) {\n this.corrFi = (newValue.getTime() - this.fi.getTime()) / 60000\n }\n\n get stCorrectTime() {\n return this.st.getTime() + 60000 * this.corrSt;\n }\n\n get fiCorrectTime() {\n return this.fi.getTime() + 60000 * this.corrFi;\n }\n\n get tasktypeId() {\n return this._tasktypeId;\n }\n\n set tasktypeId(newValue) {\n this.setValue('_tasktypeId', newValue);\n }\n\n get dur() {\n return (this.fi.getTime() - this.st.getTime()) / msPerHours;\n }\n set dur(newValue) {\n this.fi = new Date(msPerHours * newValue + this.st.getTime());\n }\n\n get durationDate() {\n const durHours = (this.fi.getTime() - this.st.getTime()) / msPerHours;\n return unitToDate(durHours);\n }\n set durationDate(newValue) {\n const durHours = dateToUnit(newValue)\n this.fi = new Date(msPerHours * durHours + this.st.getTime());\n }\n\n /**\n * @return {Date}\n */\n get lastSt() {\n return this._lastSt;\n }\n\n /**\n * @return {Date}\n */\n get lastFi() {\n return this._lastFi;\n }\n\n /**\n * @return {string}\n */\n get comment() {\n return this._comment;\n }\n\n set comment(newValue) {\n this.setValue('_comment', newValue);\n }\n\n get reasonCode() {\n return this._reasonCode;\n }\n\n /**\n * @return {number}\n */\n get corrSt() {\n return this._corrSt;\n }\n\n set corrSt(newValue) {\n this.setValue('_corrSt', newValue);\n }\n\n /**\n * @return {number}\n */\n get corrFi() {\n return this._corrFi;\n }\n\n set corrFi(newValue) {\n this.setValue('_corrFi', newValue);\n }\n\n /**\n * @return {number}\n */\n get logStToggleIndex() {\n return this._logStToggleIndex\n }\n\n set logStToggleIndex(newValue) {\n this._logStToggleIndex = newValue\n }\n\n /**\n * @return {number}\n */\n get logFiToggleIndex() {\n return this._logFiToggleIndex\n }\n\n set logFiToggleIndex(newValue) {\n this._logFiToggleIndex = newValue\n }\n\n revertTo(st, fi, tasktypeId, isNew, isDeleted) {\n if (isDeleted) { super.undoToDelete(); }\n else if (isNew) { super.toDelete(); }\n else {\n if (st) { this.setDateValue('_st', st); }\n if (fi) { this.setDateValue('_fi', fi) }\n if (tasktypeId) { this.setValue('_tasktypeId', tasktypeId) }\n }\n }\n\n redoRevertTo(st, fi, tasktypeId, isNew, isDeleted) {\n if (isDeleted) { super.toDelete(); }\n else if (isNew) { super.undoToDelete(); }\n else {\n if (st) { this.setDateValue('_st', st); }\n if (fi) { this.setDateValue('_fi', fi) }\n if (tasktypeId) { this.setValue('_tasktypeId', tasktypeId) }\n }\n }\n\n /**\n * @param {{st:Date, fi:Date}} interval\n */\n contains(interval) {\n return this.stCorrectTime <= interval.st.getTime() && interval.fi.getTime() <= this.fiCorrectTime;\n }\n\n copy() {\n return new Task(this.toDto());\n }\n\n /**\n * @param {{st:Date, fi:Date}} interval\n */\n isContainedIn(interval) {\n return !this.isToDelete && this.stCorrectTime >= interval.st.getTime() && interval.fi.getTime() >= this.fiCorrectTime;\n }\n\n /**\n * @param {Date} st\n * @param {Date} fi\n */\n overlaps(st, fi) {\n return (st.getTime() < this.fiCorrectTime && fi.getTime() > this.stCorrectTime);\n }\n\n /** @returns {TaskDto} */\n toDto() {\n /** @type {TaskDto} */\n const t = {\n empid: this.empid,\n st: this._st,\n fi: this._fi,\n tasktypeId: this.tasktypeId,\n }\n\n if (this.id > 0) { t.id = this.id; }\n if (this.corrSt !== 0) { t.corrSt = this.corrSt; }\n if (this.corrFi !== 0) { t.corrFi = this.corrFi; }\n if (this.comment) { t.comment = this.comment; }\n if (this.reasonCode) { t.reasonCode = this.reasonCode; }\n\n return t;\n }\n\n adjustLogCorrection() {\n if (this.corrSt !== 0 && this._fi !== null && this._st.getTime() === this._fi.getTime()) {\n const msDay = this.st.getTime();\n const msPerMin = 60 * 1000;\n const st = new Date(msDay + msPerMin * this.corrSt);\n this.st = st;\n this.fi = st;\n this.corrFi = this.corrFi - this.corrSt;\n this.corrSt = 0;\n }\n }\n}\n\n/**\n * @param {string|null|undefined} text\n */\nfunction convertToString(text) {\n return text ? text : '';\n}\n\n/**\n * @param {Date|string|null} dt\n */\nfunction convertToDate(dt) {\n if (dt) {\n return new Date(dt);\n }\n return null;\n}\n\n/**\n * @param {number|null|undefined} number\n */\nfunction convertToNumber(number) {\n return number ? number : 0;\n}\n\n/**\n * @param {number} unit\n */\nfunction unitToDate(unit) {\n const hours = Math.floor(unit);\n const minutes = (unit - hours) * 60;\n return new Date(2030, 1, 1, hours, minutes);\n}\n\n/**\n * @param {Date} time\n */\nfunction dateToUnit(time) {\n return time.getHours() + time.getMinutes() / 60;\n}\n","/**\n* @typedef {{id:number; name:string; paid:number; schemecolor:string|null; work:number; kind:number; systemKind?:number|null; affinityId?:number|null; requiresLog?:boolean|null; bo?:boolean }} TaskTypeDto\n*/\n\nexport const TASK_SYSTEM_KIND = createTaskSystemKind();\nfunction createTaskSystemKind() {\n const enumObject = {\n operator: 0,\n shortBreak: 1,\n longBreak: 2,\n vacation: 3,\n sick: 4,\n free: 5,\n overtime: 6,\n log: 7,\n inRotation: 8,\n correction: 9,\n };\n\n return Object.freeze(enumObject);\n}\n\nexport const TASK_KIND = createTaskKind();\nfunction createTaskKind() {\n const enumObject = {\n task: 0,\n break: 1,\n absence: 2,\n payment: 3,\n log: 4,\n inRotation: 5,\n correction: 6,\n };\n\n return Object.freeze(enumObject);\n}\n\n/**\n * @param {number} kind\n */\nfunction getKindAsType(kind) {\n switch (kind) {\n case TASK_KIND.task:\n return 'task';\n case TASK_KIND.break:\n return 'break';\n case TASK_KIND.absence:\n return 'absence';\n case TASK_KIND.payment:\n return 'payment';\n }\n\n return '';\n}\n\n/**\n * @param {number|null} systemKind\n */\nfunction getSystemKindAsSubtype(systemKind) {\n if (systemKind === null)\n return '';\n switch (systemKind) {\n case TASK_SYSTEM_KIND.operator:\n return 'op';\n case TASK_SYSTEM_KIND.shortBreak:\n return 'sb';\n case TASK_SYSTEM_KIND.longBreak:\n return 'lb';\n case TASK_SYSTEM_KIND.vacation:\n return 'v';\n case TASK_SYSTEM_KIND.sick:\n return 's';\n case TASK_SYSTEM_KIND.free:\n return 'f';\n case TASK_SYSTEM_KIND.overtime:\n return 'ot';\n }\n\n return '';\n}\n\nexport class TaskTypes {\n constructor() {\n /** @type {TaskTypeDto[]} */\n this.dtoList = [];\n }\n\n get isLoaded() {\n return this.dtoList.length !== 0;\n }\n\n get list() {\n if (this._list === undefined) {\n /** @private @type {TaskType[]} */\n this._list = this.dtoList.map(x => new TaskType(x));\n }\n return this._list;\n }\n\n get byId() {\n if (this._byId === undefined) {\n /** @type {Map<number, TaskType>} */\n const map = new Map();\n for (const tt of this.list) {\n map.set(tt.id, tt);\n }\n /** @private @type {Map<number, TaskType>} */\n this._byId = map;\n }\n return this._byId;\n }\n\n get bySystemKind() {\n if (this._bySystemKind === undefined) {\n /** @type {Map<number, TaskType>} */\n const map = new Map();\n for (const tt of this.list) {\n if (tt.systemKind !== null) {\n map.set(tt.systemKind, tt);\n }\n }\n /** @private @type {Map<number, TaskType>} */\n this._bySystemKind = map;\n }\n return this._bySystemKind;\n }\n\n /**\n * @param {TaskTypeDto[]} dtoList\n */\n init(dtoList) {\n this.dtoList = dtoList;\n this._list = undefined;\n this._byId = undefined;\n this._bySystemKind = undefined;\n }\n}\n\nexport class TaskType {\n /**\n * @param {TaskTypeDto} dto\n */\n constructor(dto) {\n /** @private @type {number} */\n this._id = dto.id\n /** @private @type {string} */\n this._name = dto.name\n /** @private @type {number} */\n this._work = dto.work\n /** @private @type {string} */\n this._schemecolor = getSchemeColor(dto);\n /** @private @readonly @type {string} */\n this._type = getKindAsType(dto.kind);\n /** @private @readonly @type {string} */\n this._subtype = getSystemKindAsSubtype(dto.systemKind)\n /** @private @type {number} */\n this._paid = dto.paid\n /** @readonly @type {number} */\n this.kind = dto.kind;\n /** @readonly @type {number| null} */\n this.systemKind = dto.systemKind !== undefined ? dto.systemKind : null;\n /** @private @type {number|null} */\n this._affinity = dto.affinityId !== undefined ? dto.affinityId : null;\n /** @private @type {boolean} */\n this._hasChanges = this._id === -1;\n /** @private @type {boolean} */\n this._isToDelete = false;\n /** @private @type {boolean} */\n this._requiresLog = dto.requiresLog !== undefined && dto.requiresLog !== null ? dto.requiresLog : true;\n /** @readonly @type {boolean} */\n this.bo = dto.bo;\n }\n\n get id() {\n return this._id\n }\n\n set id(newValue) {\n this._id = newValue\n }\n\n get affinity() {\n return this._affinity;\n }\n\n set affinity(newValue) {\n this._affinity = newValue;\n this._hasChanges = true;\n }\n\n // should only be called if the affinity has been removed on the server.\n clearAffinity() {\n this._affinity = null;\n }\n\n get system() {\n return this.systemKind !== null;\n }\n\n get name() {\n return this._name\n }\n\n set name(newValue) {\n this._name = newValue\n this._hasChanges = true\n }\n\n get work() {\n return this._work\n }\n\n set work(newValue) {\n this._work = newValue\n this._hasChanges = true\n }\n\n //string with name of color\n get schemecolor() {\n return this._schemecolor\n }\n set schemecolor(newValue) {\n this._schemecolor = newValue\n /** @private @type {undefined|string} */\n this._color = undefined;\n this._hasChanges = true\n }\n\n /**\n * real color\n * @param {(schemecolor: string) => string} getColorFromName\n */\n getColor(getColorFromName) {\n if (this._color === undefined) {\n this._color = getColorFromName(this._schemecolor);\n }\n return this._color;\n }\n\n get type() {\n return this._type\n }\n\n get subtype() {\n return this._subtype\n }\n\n get paidBreak() {\n return this.paid !== 0;\n }\n\n set paidBreak(newValue) {\n if (newValue) {\n this.paid = 100;\n }\n else {\n this.paid = 0;\n }\n }\n\n get paid() {\n return this._paid\n }\n\n set paid(newValue) {\n this._paid = newValue;\n this._hasChanges = true;\n }\n\n get requiresLog() {\n return this._requiresLog\n }\n\n set requiresLog(newValue) {\n this._requiresLog = newValue;\n this._hasChanges = true;\n }\n\n get hasChanges() {\n return this._hasChanges\n }\n confirmChanges() {\n this._hasChanges = false\n }\n\n get isToDelete() {\n return this._isToDelete\n }\n toDelete() {\n this._isToDelete = true;\n this._hasChanges = true;\n }\n\n /** @returns {TaskTypeDto} */\n toDto() {\n return {\n id: this.id, name: this.name, work: this.work, schemecolor: this.schemecolor, paid: this.paid,\n kind: this.kind, systemKind: this.systemKind, affinityId: this.affinity, requiresLog: this.requiresLog\n };\n }\n}\n\n/**\n * @param {TaskTypeDto} dto\n */\nfunction getSchemeColor(dto) {\n if (dto.schemecolor !== null)\n return dto.schemecolor;\n if (dto.systemKind === TASK_SYSTEM_KIND.free) {\n return 'free'\n }\n return 'lightinfo';\n}\n","import moment from 'moment-timezone';\nimport { getShortDate, getStartOfDay } from '#shared/dn-shared-helper';\n\n/** @typedef {{dt:Date;dtLocal:Date;shortDate:string}} TimezoneDayInfo*/\n\n/**\n * @param {Date} dt\n * @param {string} timezone\n */\nexport function getLocalOffset(dt, timezone) {\n if (!timezone) { return 0; }\n const localUTCOffset = moment(dt).utcOffset();\n const tzUTCOffset = moment.tz(dt, timezone).utcOffset()\n return tzUTCOffset - localUTCOffset;\n}\n\n/**\n * Gets the start of the day in the given timezone\n * @param {Date} dtLocal Only the date part is used \n * @param {string} timezone\n * @returns {TimezoneDayInfo}\n */\nexport function getDateTimezoneInfo(dtLocal, timezone) {\n const shortDate = getShortDate(dtLocal);\n const dt = timezone ? moment.tz(shortDate, timezone).toDate() : dtLocal;\n return { dt, dtLocal, shortDate };\n}\n\n/**\n * @param {TimezoneDayInfo} day\n * @param {number} hours\n * @param {number} minutes\n * @param {string} timezone\n */\nexport function getDateTimeInTimezone(day, hours, minutes, timezone) {\n if (minutes > 60) {\n const h = Math.floor(minutes / 60);\n hours += h;\n minutes -= 60 * h;\n }\n if (timezone) {\n return moment.tz(day.shortDate, timezone).hours(hours).minutes(minutes).toDate();\n }\n const dt = new Date(day.dtLocal);\n dt.setHours(hours, minutes);\n return dt;\n}\n\n/**\n * @param {Date} dt\n * @param {string} timezone\n */\nexport function getTimeOfDay(dt, timezone) {\n /** @type {number} */\n let hours;\n /** @type {number} */\n let minutes;\n if (timezone) {\n const m = moment.tz(dt, timezone);\n hours = m.hours();\n minutes = m.minutes();\n } else {\n hours = dt.getHours();\n minutes = dt.getMinutes();\n }\n return { hours, minutes };\n}\n\n/**\n * @param {Date} dt\n * @param {string} timezone\n */\nexport function getDateOfInstant(dt, timezone) {\n if (timezone) {\n const m = moment.tz(dt, timezone);\n return new Date(m.year(), m.month(), m.date());\n } else {\n return getStartOfDay(dt);\n }\n}","import { fetchAndCheckJson } from '@/js/dn-fetch.js';\nimport { addDays } from '@/shared/dn-shared-helper.js';\n\n/**\n* @typedef {{employeeId:number; st:string, fi:string; callcenterId:number}} EmployeeCallcenterRow\n*/\n\n/**\n* @typedef {{employeeId:number; intervals:{st:string;fi:string}[]; callcenterId:number}} EmployeeCallcenterDto\n*/\n\n/**\n* @typedef {{st:Date;fi:Date;callcenterId:number}} CallcenterInterval\n*/\n\n/**\n* @typedef {{employeeId:number; ccIntervals:CallcenterInterval[]}} EmployeeCallcenterEmpDto\n*/\n\nexport class EmployeeCallcenters {\n /** \n * @param {EmployeeCallcenterEmpDto[]} [empCCToList]\n */\n constructor(empCCToList = undefined) {\n /** @private @type {Map<number, EmployeeCallcenter>} */\n this._byEmployeeId = undefined;\n if (empCCToList !== undefined) {\n this._byEmployeeId = new Map();\n for (const ec of empCCToList) {\n this._byEmployeeId.set(ec.employeeId, new EmployeeCallcenter(ec.ccIntervals));\n }\n }\n }\n\n get isLoaded() {\n return this._byEmployeeId !== undefined;\n }\n\n /**\n * @param {number} employeeId\n */\n getByEmp(employeeId) {\n if (!this.isLoaded) { return undefined; }\n return this._byEmployeeId.get(employeeId);\n }\n\n /**\n * @param {{id:number,ccid:number}} emp\n * @param {Date} dt start of the day\n */\n getCCByDate(emp, dt) {\n const empCC = this.getByEmp(emp.id);\n if (empCC) {\n const midday = new Date(dt.getFullYear(), dt.getMonth(), dt.getDate(), 12);\n return empCC.getCCByDate(emp.ccid, midday);\n }\n\n return emp.ccid;\n }\n\n async load() {\n const records = await getEmployeeCallcenter();\n this.init(records);\n }\n\n /**\n * @param {EmployeeCallcenterRow[]} records\n */\n init(records) {\n /** @private @type {Map<number, EmployeeCallcenter>} */\n const byEmployeeId = new Map();\n for (const r of records) {\n let ec = byEmployeeId.get(r.employeeId);\n if (ec === undefined) {\n ec = new EmployeeCallcenter();\n byEmployeeId.set(r.employeeId, ec);\n }\n ec.add(r);\n }\n this._byEmployeeId = byEmployeeId;\n }\n\n /**\n * @param {number} employeeId\n * @param {Date[]} dates\n * @param {number} callcenterId\n */\n async save(employeeId, dates, callcenterId) {\n dates.sort((a, b) => a.getTime() - b.getTime());\n\n /** @type {{st:Date;fi:Date}[]} */\n const intervals = [];\n for (const d of dates) {\n const n = intervals.length;\n if (n === 0 || intervals[n - 1].fi.getTime() < d.getTime()) {\n intervals.push({ st: d, fi: addDays(d, 1) });\n } else {\n intervals[n - 1].fi = addDays(d, 1);\n }\n }\n\n /** @type {EmployeeCallcenterDto} */\n const data = { employeeId: employeeId, intervals: [], callcenterId };\n for (const i of intervals) {\n data.intervals.push({ st: i.st.toISOString(), fi: i.fi.toISOString() });\n }\n await postEmployeeCallcenter(data);\n await this.load();\n }\n\n toDto() {\n /** @type {EmployeeCallcenterEmpDto[]} */\n const empCCList = [];\n for (const [employeeId, ec] of this._byEmployeeId) {\n empCCList.push({ employeeId, ccIntervals: ec.getListCopy() });\n }\n return empCCList;\n }\n}\n\nclass EmployeeCallcenter {\n /**\n * @param {CallcenterInterval[]} [list]\n */\n constructor(list = []) {\n /** @private @readonly @type {CallcenterInterval[]} sorted by st*/\n this._list = list;\n }\n\n /**\n * @param {EmployeeCallcenterRow} dto\n */\n add(dto) {\n this._list.push({ st: new Date(dto.st), fi: new Date(dto.fi), callcenterId: dto.callcenterId });\n }\n\n /**\n * @param {number} defaultId\n * @param {Date} dt\n */\n getCCByDate(defaultId, dt) {\n for (const r of this._list) {\n if (r.st <= dt && dt < r.fi) {\n return r.callcenterId;\n }\n }\n return defaultId;\n }\n\n getListCopy() {\n return this._list.slice();\n }\n\n /**\n * @param {number} defaultId\n * @param {Date} st\n * @param {Date} fi\n * @param {number} excludeId\n */\n getOnInterval(defaultId, st, fi, excludeId) {\n /** @type {CallcenterInterval[]} */\n const intervals = [];\n let last = st;\n for (const r of this._list) {\n if (r.fi > last) {\n if (r.st < fi) {\n if (last < r.st) {\n addToIntervals(r.st, defaultId);\n }\n if (r.fi < fi) {\n addToIntervals(r.fi, r.callcenterId);\n } else {\n addToIntervals(fi, r.callcenterId);\n }\n } else {\n break;\n }\n }\n }\n if (last < fi) {\n addToIntervals(fi, defaultId);\n }\n return intervals;\n /**\n * @param {Date} fiInterval\n * @param {number} callcenterId\n */\n function addToIntervals(fiInterval, callcenterId) {\n if (excludeId !== callcenterId) {\n intervals.push({ st: last, fi: fiInterval, callcenterId });\n }\n last = fiInterval;\n }\n }\n}\n\n/**\n * @returns {Promise<EmployeeCallcenterRow[]>}\n */\nasync function getEmployeeCallcenter() {\n return await fetchAndCheckJson(`employee-callcenter`, 'GET');\n}\n\n/**\n * @param {EmployeeCallcenterDto} data\n */\nasync function postEmployeeCallcenter(data) {\n return await fetchAndCheckJson(`employee-callcenter`, 'POST', data);\n}\n","import { fetchAndCheckJson } from '@/js/dn-fetch.js';\n\n/**\n* @typedef {{\n* employeeCallcenters:import(\"@/model/dn-employee-cc\").EmployeeCallcenterRow[];\n* tasktypes:import(\"@/shared/dn-tasktype.js\").TaskTypeDto[];\n* tags:import(\"@/model/dn-tag.js\").TagDto[];\n* }} InitialData\n*/\n\n/** @returns {Promise<InitialData>} */\nexport async function getInitialData() {\n return await fetchAndCheckJson(`initial-data`, 'GET');\n}","import { fetchAndCheckJson } from '@/js/dn-fetch.js';\n\n/**\n * @param {number} id\n */\nexport async function deleteAgreement(id) {\n await fetchAndCheckJson('agreement/' + id, 'DELETE');\n}\n\n/**\n * @param {import(\"@/shared/dn-tasktype.js\").TaskType} taskType\n */\nexport async function deleteTaskType(taskType) {\n return await fetchAndCheckJson(`tasktypes/${taskType.id}`, 'DELETE');\n}\n\nexport async function getAgreements() {\n /** @type {import(\"#shared/dn-agreement\").AgreementDto[]} */\n const dtoList = await fetchAndCheckJson('agreement', 'GET');\n return dtoList;\n}\n\nexport async function getTaskTypes() {\n /** @type {import(\"@/shared/dn-tasktype.js\").TaskTypeDto[]} */\n const dtoList = await fetchAndCheckJson(`tasktypes`, 'GET');\n return dtoList;\n}\n\n/**\n * @param {import(\"@/shared/dn-tasktype.js\").TaskType} taskType\n */\nexport async function patchTaskType(taskType) {\n return await fetchAndCheckJson(`tasktypes/${taskType.id}`, 'PATCH', taskType.toDto());\n}\n\n/**\n * @param {import(\"@/model/dn-agreement-edit.js\").SaveAgreementDto[]} agreementsToSave\n */\nexport async function postAgreements(agreementsToSave) {\n await fetchAndCheckJson('agreement', 'POST', agreementsToSave);\n}\n\n/**\n * @param {import(\"@/shared/dn-tasktype.js\").TaskType} taskType\n */\nexport async function postTaskType(taskType) {\n return await fetchAndCheckJson(`tasktypes`, 'POST', taskType.toDto());\n}\n","import { defineStore } from 'pinia';\nimport { shallowReactive } from 'vue';\nimport { getAffinities } from '@/model/dn-affinity.js';\nimport { Agreements } from '#shared/dn-agreement';\nimport { getBreakSettings } from '@/model/dn-break-settings.js';\nimport { getLanguageCode } from '@/i18n.js';\nimport { BackOfficeSkills } from '@/model/dn-bo.js';\nimport { getCallCenters } from '@/model/dn-callcenter.js';\nimport { getCallGroups } from '@/model/dn-callgroup.js';\nimport { getDayTypes } from '@/model/dn-daytype.js';\nimport { EmployeeCallcenters } from '@/model/dn-employee-cc.js';\nimport { getInitialData } from \"@/model/dn-initial-data.js\";\nimport { deleteAgreement, deleteTaskType, getAgreements, getTaskTypes, patchTaskType, postAgreements, postTaskType } from '@/js/dn-fetch-data.js';\nimport { getCurrentCCId, removeCurrentCCId, setCurrentCCId, removeLoginInfo, getTimeDisplaySetting, setTimeDisplaySetting } from '@/js/dn-localStorage.js';\nimport { getInitialDateInterval } from \"@/js/dn-schedule-helper.js\";\nimport { GENERAL_SETTINGS, GENERAL_EMPAPP_SETTINGS, getSettings, postSettings, getHolidays } from '@/model/dn-setting.js';\nimport { getRelevantWorstInvoiceStatus } from '@/model/dn-invoice.js';\nimport { getSwitches } from '@/model/dn-switch.js';\nimport { convertTagsFromAPI, getTags, getTagUsage } from '@/model/dn-tag.js';\nimport { TaskTypes } from '@/shared/dn-tasktype.js';\nimport { getCurrentUser, getUsers } from '@/model/dn-user.js';\nimport { useForecastStore } from '@/stores/forecastStore.js';\nimport { useReportStore } from \"@/stores/reportStore.js\";\n\nexport const useDataStore = defineStore('data', {\n state: () => ({\n adherenceOptions: { adherenceBase: 0, graceMinutes: 3, adherenceLimit: 90, unScheduledBreakMinutes:20, closeGaps:3 },\n /** @type {import(\"@/model/dn-affinity.js\").Affinity[]} */\n affinities:null,\n agreements:shallowReactive(new Agreements()),\n backOfficeSkills: shallowReactive(new BackOfficeSkills()),\n /** @type {import(\"@/model/dn-break-settings.js\").BreakSettings[]} */\n breakSettings: null,\n /** @type {import(\"@/model/dn-callcenter\").CallCenter[]} */\n callCenters: null,\n /** @type {import(\"@/model/dn-callgroup.js\").CallGroup[]} */\n callGroups: [],\n /** @type {import(\"@/model/dn-callcenter\").CallCenter} */\n currentCC: null,\n /** @type {import(\"@/model/dn-user.js\").LoggedInUser} */\n currentUser: null,\n /** @type {Date} */\n dateNow: null,\n /** @type {import(\"@/model/dn-daytype\").DayType[]} */\n dayTypes: null,\n employeeCallcenters: shallowReactive(new EmployeeCallcenters()),\n generalEmpAppSettings: {\n publishingWeekDay: 0,\n publishingNumberOfDays: 7,\n allRequestsDisabled: false,\n publishingFixedDate: null,\n requestClosedNumberOfDays: 2,\n requestvaccationClosedNumberOfDays: 60,\n sickRequestDisabled: false,\n tradeDisabled: false,\n hideTeamSchedule: false,\n showOnlyOwnTeam: false,\n weekStartDay: 0,\n statsPayrollCodes:false,\n statsAdherence:false,\n statsDetailedAdherence:false,\n statsPayrollCodesPublishingNumberOfDays:0,\n },\n generalSettingsLoaded: false,\n /** @type {string} */\n language: null,\n refreshedDueToError: false,\n relevantInvoiceStatus:0,\n lastRelevantInvoiceStatuscheck:new Date(\"1970-01-01\"),\n planningSettings: {\n noShiftsOutsideTarget: true,\n overTargetFactor: 0,\n },\n /** @type {readonly import(\"@/model/dn-switch.js\").SwitchConfig[]} */\n switches: null,\n /** @type {Map<number, import(\"@/model/dn-tag.js\").Tag>} */\n tagById: null,\n /** @type {number[][]} */\n tagUsage: null,\n taskTypes: shallowReactive(new TaskTypes()),\n userGuide: {\n display: false,\n },\n /** @type {import(\"@/model/dn-user.js\").User[]} */\n users: null,\n /** @type {import(\"@/model/dn-setting.js\").HolidaySettings[]} */\n holidays: null,\n hourFormat: \"\"\n }),\n getters: {\n getMode(){\n //0 for normal, 1 for basic\n if(this.currentUser == null) { return null; }\n \n return this.currentUser.useMode;\n },\n empTabs() {\n if (this.getMode === 0) {\n //full func\n return {\n general: 0,\n skillsMatrix: 1,\n rotations:2,\n availability: 3,\n shifts:4\n };\n } else{\n //basic\n return {\n general: 0,\n rotations:1,\n availability: 2\n };\n }\n },\n callCentersRelevant() { \n let callgroups=this.callGroupsAllowed\n let ccIds=[]\n for(let i=0;i<callgroups.length;i++){\n let ccId =callgroups[i].contactCenterId\n if(!ccIds.includes(ccId)){ccIds.push(ccId)}\n }\n return useDataStore().callCentersAllowed.filter(x => ccIds.includes(x.id))\n },\n callCentersAllowed() {\n const callCenters = this.callCenters;\n if (this.currentUser === null || callCenters === null) { return []; }\n const idList = this.currentUser.contactcenterIds;\n if (idList.length === 0) { return callCenters; }\n return callCenters.filter(c => idList.includes(c.id));\n },\n /** @returns {import(\"@/model/dn-callgroup.js\").CallGroup[]} */\n callGroupsAllowed() {\n const currentUser = this.currentUser;\n if (currentUser === null) { return []; }\n if (currentUser.contactcenterIds.length === 0) {\n // @ts-ignore\n return this.callGroups;\n }\n // @ts-ignore\n return this.callGroups.filter(x => currentUser.contactcenterIds.includes(x.contactCenterId));\n },\n /** @returns {import(\"@/model/dn-callgroup.js\").CallGroup[]} */\n callGroupsCurrentCC() {\n const currentCC = this.currentCC;\n if (currentCC === null) { return []; }\n return this.callGroups.filter(x => x.contactCenterId === currentCC.id);\n },\n skillsCurrentCC() {\n const currentCC = this.currentCC;\n /** @type {import(\"@/model/dn-skill.js\").Skill[]} */\n const skills = [];\n if (currentCC && this.backOfficeSkills.isLoaded) {\n const ccId = currentCC.id;\n for (const skill of this.callGroups) {\n if (skill.contactCenterId === ccId) {\n skills.push(skill);\n }\n }\n for (const skill of this.backOfficeSkills.createList([ccId])) {\n skills.push(skill);\n }\n }\n return skills;\n },\n /** @returns {import(\"@/model/dn-daytype\").DayType} */\n dayTypeDefault() {\n return this.dayTypes !== null ? this.dayTypes[0] : undefined;\n },\n latestImportDate() {\n const switches = this.switches;\n if (switches === null) { return null; }\n let dt = new Date();\n for (let i = 0; i < switches.length; i++) {\n if (switches[i].lastTime) {\n if (switches[i].lastTime < dt) { dt = new Date(switches[i].lastTime) }\n }\n }\n return dt;\n },\n /** @returns {import(\"@/shared/dn-tasktype.js\").TaskType[]} */\n taskTypeList() {\n return this.taskTypes.list;\n },\n /** @returns {Map<number,import(\"@/shared/dn-tasktype.js\").TaskType>} */\n taskTypeMap() {\n return this.taskTypes.byId;\n },\n },\n actions: {\n /**\n * @param {number} id\n */\n async deleteAgreement(id) {\n await deleteAgreement(id);\n this.agreements.remove(id);\n },\n async init() {\n const initialData = await getInitialData();\n this.employeeCallcenters.init(initialData.employeeCallcenters);\n this.taskTypes.init(initialData.tasktypes);\n this.tagById = convertTagsFromAPI(initialData.tags);\n },\n async loadAffinities() {\n this.affinities = await getAffinities();\n },\n async loadBreakSettings() {\n this.breakSettings = await getBreakSettings();\n },\n async loadCallCenters() {\n this.callCenters = await getCallCenters();\n const currentUser = this.currentUser;\n let currentCCId;\n if (currentUser.employee) {\n currentCCId = currentUser.employee.ccid;\n } else {\n currentCCId = getCurrentCCId();\n }\n\n const cc = this.callCenters.find(x => x.id == currentCCId);\n this.currentCC = cc ? cc : null;\n },\n async loadHolidays() {\n this.holidays = await getHolidays();\n },\n async loadRelevantInvoiceStatus() { \n this.relevantInvoiceStatus = await getRelevantWorstInvoiceStatus();\n this.lastRelevantInvoiceStatuscheck=new Date()\n },\n logOut() {\n removeLoginInfo();\n removeCurrentCCId();\n this.currentUser = null;\n },\n /**\n * @param {import(\"@/model/dn-callcenter\").CallCenter} cc\n */\n setCurrentCC(cc) {\n this.currentCC = cc;\n setCurrentCCId(cc.id);\n },\n async loadAgreements() {\n const dtoList = await getAgreements();\n await this.agreements.load(dtoList);\n },\n async loadCallGroups() {\n this.callGroups = await getCallGroups();\n },\n async loadCurrentUser() {\n this.currentUser = await getCurrentUser();\n },\n loadDateNow() {\n this.dateNow = getInitialDateInterval()[0];\n },\n async loadDayTypes() {\n this.dayTypes = await getDayTypes();\n },\n loadLanguage() {\n this.language = getLanguageCode();\n },\n setHourFormat(format){\n this.hourFormat = format;\n setTimeDisplaySetting(format);\n },\n loadHourFormat() {\n this.hourFormat = getTimeDisplaySetting();\n },\n async loadGeneralSettings() {\n const forecastStore = useForecastStore();\n const forecastOptions = forecastStore.forecastOptions;\n const adherenceOptions = this.adherenceOptions;\n const reportStore = useReportStore();\n const reportOptions = reportStore.reportOptions;\n const generalEmpAppSettings = this.generalEmpAppSettings;\n const rows = await getSettings();\n for (const r of rows) {\n switch (r.key) {\n case GENERAL_SETTINGS.historicWeeks:\n forecastOptions.historicWeeks = r.value;\n break;\n case GENERAL_SETTINGS.forecastWeeks:\n forecastOptions.forecastWeeks = r.value;\n break;\n case GENERAL_SETTINGS.numberOfHistoricSpecialDays:\n forecastOptions.numberOfHistoricSpecialDays = r.value;\n break;\n case GENERAL_SETTINGS.occupacyFte:\n forecastOptions.occupacyFte = r.value;\n break;\n case GENERAL_SETTINGS.adherancePercent:\n forecastOptions.adherancePercent = r.value;\n break;\n case GENERAL_SETTINGS.percentOfAbandonsToInclude:\n forecastOptions.percentOfAbandonsToInclude = r.value;\n break;\n case GENERAL_SETTINGS.adherenceBase:\n adherenceOptions.adherenceBase = r.value;\n break;\n case GENERAL_SETTINGS.graceMinutes:\n adherenceOptions.graceMinutes = r.value;\n break;\n case GENERAL_SETTINGS.unScheduledBreakMinutes:\n adherenceOptions.unScheduledBreakMinutes = r.value;\n break;\n case GENERAL_SETTINGS.closeGaps:\n adherenceOptions.closeGaps = r.value;\n break;\n case GENERAL_SETTINGS.adherenceLimit:\n adherenceOptions.adherenceLimit = r.value;\n break;\n case GENERAL_SETTINGS.overTargetFactor:\n this.planningSettings.overTargetFactor = r.value;\n break;\n case GENERAL_SETTINGS.noShiftsOutsideTarget:\n this.planningSettings.noShiftsOutsideTarget = r.value !== 0;\n break;\n case GENERAL_SETTINGS.reportCalendarDays:\n reportOptions.reportCalendarDays = r.value !== 0;\n break;\n case GENERAL_SETTINGS.reportCsvSemicolon:\n reportOptions.reportCsvSemicolon = r.value !== 0;\n break;\n case GENERAL_SETTINGS.numHoursWeeklyOvertime:\n reportOptions.numHoursWeeklyOvertime = r.value;\n break;\n case GENERAL_SETTINGS.weekendAsHoliday:\n reportOptions.weekendAsHoliday = r.value !== 0;\n break; \n case GENERAL_EMPAPP_SETTINGS.publishingWeekDay:\n generalEmpAppSettings.publishingWeekDay = r.value;\n break;\n case GENERAL_EMPAPP_SETTINGS.publishingNumberOfDays:\n generalEmpAppSettings.publishingNumberOfDays = r.value;\n break;\n case GENERAL_EMPAPP_SETTINGS.publishingFixedDateMs:\n if(r.value){\n generalEmpAppSettings.publishingFixedDate = new Date(r.value*1000);\n }\n break;\n case GENERAL_EMPAPP_SETTINGS.requestClosedNumberOfDays:\n generalEmpAppSettings.requestClosedNumberOfDays = r.value;\n break;\n case GENERAL_EMPAPP_SETTINGS.allRequestsDisabled:\n generalEmpAppSettings.allRequestsDisabled = r.value > 0;\n break;\n case GENERAL_EMPAPP_SETTINGS.requestvaccationClosedNumberOfDays:\n generalEmpAppSettings.requestvaccationClosedNumberOfDays = r.value;\n break;\n case GENERAL_EMPAPP_SETTINGS.sickRequestDisabled:\n generalEmpAppSettings.sickRequestDisabled = r.value > 0;\n break;\n case GENERAL_EMPAPP_SETTINGS.tradeDisabled:\n generalEmpAppSettings.tradeDisabled = r.value > 0;\n break;\n //ADDED\n case GENERAL_EMPAPP_SETTINGS.hideTeamSchedule:\n generalEmpAppSettings.hideTeamSchedule = r.value > 0;\n break;\n case GENERAL_EMPAPP_SETTINGS.showOnlyOwnTeam:\n generalEmpAppSettings.showOnlyOwnTeam = r.value > 0;\n break;\n case GENERAL_EMPAPP_SETTINGS.weekStartDay:\n generalEmpAppSettings.weekStartDay = r.value;\n break;\n\n case GENERAL_EMPAPP_SETTINGS.statsPayrollCodes:\n generalEmpAppSettings.statsPayrollCodes = r.value > 0;\n break; \n case GENERAL_EMPAPP_SETTINGS.statsAdherence:\n generalEmpAppSettings.statsAdherence =r.value > 0;\n break; \n case GENERAL_EMPAPP_SETTINGS.statsDetailedAdherence:\n generalEmpAppSettings.statsDetailedAdherence = r.value > 0;\n break; \n case GENERAL_EMPAPP_SETTINGS.statsPayrollCodesPublishingNumberOfDays:\n generalEmpAppSettings.statsPayrollCodesPublishingNumberOfDays = r.value;\n break; \n }\n }\n this.generalSettingsLoaded = true;\n },\n async loadSwitches() {\n const switches = await getSwitches();\n this.switches = Object.freeze(switches);\n },\n async loadTags() {\n const tags = await getTags();\n this.tagById = convertTagsFromAPI(tags);\n },\n async loadTagUsage() {\n this.tagUsage = await getTagUsage();\n },\n async loadTaskTypes() {\n const dtoList = await getTaskTypes();\n this.taskTypes.init(dtoList);\n },\n async initUsers() {\n if (this.users !== null) { return; }\n this.users = await getUsers();\n },\n /**\n * @param {import(\"@/model/dn-agreement-edit.js\").SaveAgreementDto[]} agreementsToSave\n */\n async saveAgreements(agreementsToSave) {\n await postAgreements(agreementsToSave);\n await this.loadAgreements();\n },\n /**\n * @param {import(\"@/model/dn-setting\").GeneralEmpAppSettings} generalEmpAppSettings\n */\n async saveGeneralEmpAppSettings(generalEmpAppSettings) {\n const storedSettings = this.generalEmpAppSettings;\n /** @type {import(\"@/model/dn-setting.js\").SettingDto[]} */\n const data = [];\n\n if (generalEmpAppSettings.hasChanges) {\n if (generalEmpAppSettings.publishingWeekDay != storedSettings.publishingWeekDay) {\n storedSettings.publishingWeekDay = generalEmpAppSettings.publishingWeekDay\n data.push({ key: GENERAL_EMPAPP_SETTINGS.publishingWeekDay, value: generalEmpAppSettings.publishingWeekDay });\n }\n if (generalEmpAppSettings.publishingNumberOfDays != storedSettings.publishingNumberOfDays) {\n storedSettings.publishingNumberOfDays = generalEmpAppSettings.publishingNumberOfDays\n data.push({ key: GENERAL_EMPAPP_SETTINGS.publishingNumberOfDays, value: generalEmpAppSettings.publishingNumberOfDays });\n }\n const publishingFixedDate = generalEmpAppSettings.usePublishFixedDate ? generalEmpAppSettings.publishingFixedDate : null;\n if (publishingFixedDate !== storedSettings.publishingFixedDate) {\n storedSettings.publishingFixedDate = publishingFixedDate;\n let value =null\n if(publishingFixedDate){value=Math.round(generalEmpAppSettings.publishingFixedDate.getTime()/1000)}\n data.push({ key: GENERAL_EMPAPP_SETTINGS.publishingFixedDateMs, value: value });\n }\n if (generalEmpAppSettings.allRequestsDisabled != storedSettings.allRequestsDisabled) {\n storedSettings.allRequestsDisabled = generalEmpAppSettings.allRequestsDisabled;\n const x = generalEmpAppSettings.allRequestsDisabled ? 1 : 0;\n data.push({ key: GENERAL_EMPAPP_SETTINGS.allRequestsDisabled, value: x });\n }\n if (generalEmpAppSettings.requestClosedNumberOfDays != storedSettings.requestClosedNumberOfDays) {\n storedSettings.requestClosedNumberOfDays = generalEmpAppSettings.requestClosedNumberOfDays\n data.push({ key: GENERAL_EMPAPP_SETTINGS.requestClosedNumberOfDays, value: generalEmpAppSettings.requestClosedNumberOfDays });\n }\n if (generalEmpAppSettings.requestvaccationClosedNumberOfDays != storedSettings.requestvaccationClosedNumberOfDays) {\n storedSettings.requestvaccationClosedNumberOfDays = generalEmpAppSettings.requestvaccationClosedNumberOfDays\n data.push({ key: GENERAL_EMPAPP_SETTINGS.requestvaccationClosedNumberOfDays, value: generalEmpAppSettings.requestvaccationClosedNumberOfDays });\n }\n if (generalEmpAppSettings.sickRequestDisabled != storedSettings.sickRequestDisabled) {\n storedSettings.sickRequestDisabled = generalEmpAppSettings.sickRequestDisabled;\n const x = generalEmpAppSettings.sickRequestDisabled ? 1 : 0;\n data.push({ key: GENERAL_EMPAPP_SETTINGS.sickRequestDisabled, value: x });\n }\n if (generalEmpAppSettings.tradeDisabled != storedSettings.tradeDisabled) {\n storedSettings.tradeDisabled = generalEmpAppSettings.tradeDisabled;\n const x = generalEmpAppSettings.tradeDisabled ? 1 : 0;\n data.push({ key: GENERAL_EMPAPP_SETTINGS.tradeDisabled, value: x });\n }\n if (generalEmpAppSettings.hideTeamSchedule != storedSettings.hideTeamSchedule) {\n storedSettings.hideTeamSchedule = generalEmpAppSettings.hideTeamSchedule;\n const x = generalEmpAppSettings.hideTeamSchedule ? 1 : 0;\n data.push({ key: GENERAL_EMPAPP_SETTINGS.hideTeamSchedule, value: x });\n } \n if (generalEmpAppSettings.showOnlyOwnTeam != storedSettings.showOnlyOwnTeam) {\n storedSettings.showOnlyOwnTeam = generalEmpAppSettings.showOnlyOwnTeam;\n const x = generalEmpAppSettings.showOnlyOwnTeam ? 1 : 0;\n data.push({ key: GENERAL_EMPAPP_SETTINGS.showOnlyOwnTeam, value: x });\n } \n if (generalEmpAppSettings.weekStartDay != storedSettings.weekStartDay) {\n storedSettings.weekStartDay = generalEmpAppSettings.weekStartDay\n data.push({ key: GENERAL_EMPAPP_SETTINGS.weekStartDay, value: generalEmpAppSettings.weekStartDay });\n }\n\n if (generalEmpAppSettings.statsPayrollCodes != storedSettings.statsPayrollCodes) {\n storedSettings.statsPayrollCodes = generalEmpAppSettings.statsPayrollCodes;\n const x = generalEmpAppSettings.statsPayrollCodes ? 1 : 0;\n data.push({ key: GENERAL_EMPAPP_SETTINGS.statsPayrollCodes, value: x });\n }\n if (generalEmpAppSettings.statsAdherence != storedSettings.statsAdherence) {\n storedSettings.statsAdherence = generalEmpAppSettings.statsAdherence;\n const x = generalEmpAppSettings.statsAdherence ? 1 : 0;\n data.push({ key: GENERAL_EMPAPP_SETTINGS.statsAdherence, value: x });\n }\n if (generalEmpAppSettings.statsDetailedAdherence != storedSettings.statsDetailedAdherence) {\n storedSettings.statsDetailedAdherence = generalEmpAppSettings.statsDetailedAdherence;\n const x = generalEmpAppSettings.statsDetailedAdherence ? 1 : 0;\n data.push({ key: GENERAL_EMPAPP_SETTINGS.statsDetailedAdherence, value: x });\n }\n if (generalEmpAppSettings.statsPayrollCodesPublishingNumberOfDays != storedSettings.statsPayrollCodesPublishingNumberOfDays) {\n storedSettings.statsPayrollCodesPublishingNumberOfDays = generalEmpAppSettings.statsPayrollCodesPublishingNumberOfDays\n data.push({ key: GENERAL_EMPAPP_SETTINGS.statsPayrollCodesPublishingNumberOfDays, value: generalEmpAppSettings.statsPayrollCodesPublishingNumberOfDays });\n }\n\n generalEmpAppSettings.confirmChanges();\n }\n await postSettings(data);\n },\n async saveGeneralSettings(generalOptions) {\n const forecastStore = useForecastStore();\n const storedForecastSettings = forecastStore.forecastOptions;\n const storedAdherenceSettings = this.adherenceOptions;\n /** @type {import(\"@/model/dn-setting.js\").SettingDto[]} */\n const data = [];\n let needsReloadOfForecast = generalOptions.hasChangesForecast\n\n if (generalOptions.hasChanges) {\n if (generalOptions.historicWeeks != storedForecastSettings.historicWeeks) {\n storedForecastSettings.historicWeeks = generalOptions.historicWeeks\n data.push({ key: GENERAL_SETTINGS.historicWeeks, value: generalOptions.historicWeeks });\n }\n if (generalOptions.forecastWeeks != storedForecastSettings.forecastWeeks) {\n storedForecastSettings.forecastWeeks = generalOptions.forecastWeeks\n data.push({ key: GENERAL_SETTINGS.forecastWeeks, value: generalOptions.forecastWeeks });\n }\n if (generalOptions.numberOfHistoricSpecialDays != storedForecastSettings.numberOfHistoricSpecialDays) {\n storedForecastSettings.numberOfHistoricSpecialDays = generalOptions.numberOfHistoricSpecialDays\n data.push({ key: GENERAL_SETTINGS.numberOfHistoricSpecialDays, value: generalOptions.numberOfHistoricSpecialDays });\n }\n if (generalOptions.occupacyFte != storedForecastSettings.occupacyFte) {\n storedForecastSettings.occupacyFte = generalOptions.occupacyFte\n data.push({ key: GENERAL_SETTINGS.occupacyFte, value: generalOptions.occupacyFte });\n }\n if (generalOptions.adherancePercent != storedForecastSettings.adherancePercent) {\n storedForecastSettings.adherancePercent = generalOptions.adherancePercent\n data.push({ key: GENERAL_SETTINGS.adherancePercent, value: generalOptions.adherancePercent });\n }\n if (generalOptions.percentOfAbandonsToInclude != storedForecastSettings.percentOfAbandonsToInclude) {\n storedForecastSettings.percentOfAbandonsToInclude = generalOptions.percentOfAbandonsToInclude\n data.push({ key: GENERAL_SETTINGS.percentOfAbandonsToInclude, value: generalOptions.percentOfAbandonsToInclude });\n }\n if (generalOptions.adherenceLimit != storedAdherenceSettings.adherenceLimit) {\n storedAdherenceSettings.adherenceLimit = generalOptions.adherenceLimit\n data.push({ key: GENERAL_SETTINGS.adherenceLimit, value: generalOptions.adherenceLimit });\n }\n if (generalOptions.graceMinutes != storedAdherenceSettings.graceMinutes) {\n storedAdherenceSettings.graceMinutes = generalOptions.graceMinutes\n data.push({ key: GENERAL_SETTINGS.graceMinutes, value: generalOptions.graceMinutes });\n }\n if (generalOptions.unScheduledBreakMinutes != storedAdherenceSettings.unScheduledBreakMinutes) {\n storedAdherenceSettings.unScheduledBreakMinutes = generalOptions.unScheduledBreakMinutes\n data.push({ key: GENERAL_SETTINGS.unScheduledBreakMinutes, value: generalOptions.unScheduledBreakMinutes });\n }\n if (generalOptions.closeGaps != storedAdherenceSettings.closeGaps) {\n storedAdherenceSettings.closeGaps = generalOptions.closeGaps\n data.push({ key: GENERAL_SETTINGS.closeGaps, value: generalOptions.closeGaps });\n }\n if (generalOptions.adherenceBase != storedAdherenceSettings.adherenceBase) {\n storedAdherenceSettings.adherenceBase = generalOptions.adherenceBase\n data.push({ key: GENERAL_SETTINGS.adherenceBase, value: generalOptions.adherenceBase });\n }\n generalOptions.confirmChanges();\n }\n\n await postSettings(data);\n if (needsReloadOfForecast) {\n forecastStore.reloadForecastAndHistoricData();\n }\n return;\n\n },\n /**\n * @param {import(\"@/js/dn-optimize\").PlanningSettings} settings\n */\n async savePlanningSettings(settings) {\n /** @type {import(\"@/model/dn-setting.js\").SettingDto[]} */\n const data = [];\n if (settings.noShiftsOutsideTarget !== this.planningSettings.noShiftsOutsideTarget) {\n this.planningSettings.noShiftsOutsideTarget = settings.noShiftsOutsideTarget;\n data.push({ key: GENERAL_SETTINGS.noShiftsOutsideTarget, value: settings.noShiftsOutsideTarget ? 1 : 0 });\n }\n if (settings.overTargetFactor !== this.planningSettings.overTargetFactor) {\n this.planningSettings.overTargetFactor = settings.overTargetFactor;\n data.push({ key: GENERAL_SETTINGS.overTargetFactor, value: settings.overTargetFactor });\n }\n if (data.length > 0) {\n await postSettings(data);\n }\n },\n /**\n * @param {import(\"@/shared/dn-tasktype.js\").TaskType[]} tasktypes\n */\n async saveTaskTypes(tasktypes) {\n let itemsToDelete = []\n let changeTaskTypes = []\n let promises = []\n for (let i = 0; i < tasktypes.length; i++) {\n if (tasktypes[i].isToDelete) {\n promises.push(deleteTaskType(tasktypes[i]))\n changeTaskTypes.push(tasktypes[i])\n itemsToDelete.push(tasktypes[i])\n } else if (tasktypes[i].hasChanges) {\n if (tasktypes[i].id == -1) {\n promises.push(postTaskType(tasktypes[i]))\n changeTaskTypes.push(tasktypes[i])\n }\n else {\n promises.push(patchTaskType(tasktypes[i]))\n changeTaskTypes.push(tasktypes[i])\n }\n }\n }\n for (let i = 0; i < itemsToDelete.length; i++) {\n var index = tasktypes.indexOf(itemsToDelete[i]);\n tasktypes.splice(index, 1);\n }\n\n const values = await Promise.all(promises);\n for (let i = 0; i < changeTaskTypes.length; i++) {\n if (changeTaskTypes[i].id == -1) {\n changeTaskTypes[i].id = values[i].id\n }\n changeTaskTypes[i].confirmChanges();\n }\n\n await this.loadTaskTypes();\n },\n }\n});\n","import { useDataStore } from './dataStore';\nimport { fetchAndCheckJson } from '@/js/dn-fetch.js';\nimport { addDays, getShortDate, getStartOfDay, getQuarterHour } from '@/shared/dn-shared-helper.js';\n\n/** @typedef {{callGroupId:number;dt:string|Date;calls:number[];callTime:number[];dstQ:number|null;dstShift:number|null}} ForecastPredictionDto*/\n\n/** @typedef {Map<string, { dt: Date; acgr: number; ahtData: number[]; nocData: number[]}>} ForecastDataMap */\n\nclass ForecastAiData {\n constructor() {\n /** @private @type {ForecastDataMap} */\n this._forecastDataMap = new Map();\n }\n\n get forecastDataMap() {\n return this._forecastDataMap;\n }\n\n /**\n * @param {{ forecastWeeks: number }} forecastOptions\n */\n async loadAiForecastData(forecastOptions) {\n const msPerQ = 1000 * 60 * 15;\n const dataStore = useDataStore();\n const st = dataStore.dateNow;\n /** @type {ForecastDataMap} */\n const forecastDataMap = new Map();\n const fi = addDays(st, (forecastOptions.forecastWeeks + 1) * 7)\n const forecastPredictions = await getForecastPrediction(st, fi);\n\n for (const p of forecastPredictions) {\n let dt = new Date(p.dt);\n const startOfDay = getStartOfDay(dt);\n let forecast = getOrCreateForcast(p.callGroupId, startOfDay, forecastDataMap);\n let q = getQuarterHour(dt);\n let i = 0;\n let hasShifted = false;\n while (i < 96) {\n forecast.nocData[q] = p.calls[i];\n forecast.ahtData[q] = p.callTime[i];\n if (p.dstQ && p.dstQ === i && !hasShifted) {\n i += p.dstShift;\n hasShifted = true;\n }\n i += 1;\n dt = new Date(dt.getTime() + msPerQ);\n q = getQuarterHour(dt);\n if (q === 0) {\n forecast = getOrCreateForcast(p.callGroupId, dt, forecastDataMap);\n }\n }\n }\n\n this._forecastDataMap = forecastDataMap;\n return true;\n }\n\n reset() {\n this._forecastDataMap = new Map();\n }\n\n}\n\nexport const forecastAiData = new ForecastAiData();\n\n/**\n * @param {number} callGroupId\n * @param {Date} dt\n * @param {ForecastDataMap} forecastDataMap\n */\nfunction getOrCreateForcast(callGroupId, dt, forecastDataMap) {\n const key = callGroupId + '_' + getShortDate(dt);\n let forecast = forecastDataMap.get(key);\n if (!forecast) {\n /** @type {number[]} */\n const nocData = new Array(96).fill(0);\n /** @type {number[]} */\n const ahtData = new Array(96).fill(0);\n forecast = { dt, acgr: callGroupId, nocData, ahtData };\n forecastDataMap.set(key, forecast);\n }\n return forecast;\n}\n\n/**\n * @param {Date} st\n * @param {Date} fi\n */\nasync function getForecastPrediction(st, fi) {\n /** @type {ForecastPredictionDto[]} */\n const rows = await fetchAndCheckJson(`forecast-prediction?st=${st.getTime()}&fi=${fi.getTime()}`, 'GET');\n return rows;\n}","import { getStartOfWeek } from '@/js/dn-helper.js';\nimport { addDays, getShortDate } from '@/shared/dn-shared-helper.js';\nimport { getCallStatistics } from '@/js/dn-call-statistics.js';\nimport { getDaytype } from '@/js/dn-forecast.js';\n\nclass ForecastData {\n constructor() {\n /** @private @type {Map<string, { dt: Date; acgr: number; ahtData: number[]; nocData: number[]; dayType:number}>} */\n this._historicDataMap = new Map();\n }\n\n get historicDataMap() {\n return this._historicDataMap;\n }\n\n /**\n * @param {Date} focusDt\n * @param {{ historicWeeks: number; historicFocusDate: Date; percentOfAbandonsToInclude: number; }} forecastOptions\n * @param {{id:number}[]} dayTypes\n * @param {Map<string, number>} specialDaysMap\n */\n async loadHistoricData(focusDt, forecastOptions, dayTypes, specialDaysMap) {\n if (forecastOptions.historicFocusDate !== null) {\n focusDt = forecastOptions.historicFocusDate;\n }\n /** @type {Map<string, { dt: Date; acgr: number; ahtData: number[]; nocData: number[]; dayType:number}>} */\n const historicDataMap = new Map();\n const startDate = getStartOfWeek(addDays(focusDt, -forecastOptions.historicWeeks * 7)); /* mon or sun of the youngset week */\n const ipoa = forecastOptions.percentOfAbandonsToInclude;\n const result = await getCallStatistics({startTimeUTC:startDate, quarters: (forecastOptions.historicWeeks + 1) * 7 * 96, ipoa});\n if (result.isCalculating)\n return false;\n\n const msPerQuarterHour = 1000 * 60 * 15;\n for (const histData of result.data) {\n for (let d = 0; d < (forecastOptions.historicWeeks + 1) * 7; d++) {\n const dt = addDays(startDate, d)\n //supporting daylight saving transition\n const nextDt = addDays(startDate, d + 1);\n const quarterAtDayEnd = Math.round((nextDt.getTime() - startDate.getTime()) / msPerQuarterHour);\n const quarterAtDaystart = Math.round((dt.getTime() - startDate.getTime()) / msPerQuarterHour);\n const key = histData.cgId + '_' + getShortDate(dt);\n const noc = histData.noc.slice(quarterAtDaystart, quarterAtDayEnd)\n const aht = histData.ht.slice(quarterAtDaystart, quarterAtDayEnd)\n\n let xVal = {\n dt: dt,\n acgr: histData.cgId,\n dayType: getDaytype(dt, specialDaysMap),\n nocData: noc,\n ahtData: aht\n };\n\n historicDataMap.set(key, daysavingTransitionCorrection(xVal))\n }\n }\n\n const ok = await this.loadHistoricDataSpecialDays(dayTypes, startDate, forecastOptions, historicDataMap, specialDaysMap);\n if (!ok) {\n return false;\n }\n\n this._historicDataMap = historicDataMap;\n return true;\n }\n\n /**\n * @private\n * @param {{id:number}[]} dayTypes\n * @param {Date} startDate\n * @param {{ historicWeeks: number; historicFocusDate: Date; percentOfAbandonsToInclude: number; }} forecastOptions\n * @param {Map<string, { dt: Date; acgr: number; ahtData: number[]; nocData: number[]; dayType:number}>} historicDataMap\n * @param {Map<string, number>} specialDaysMap\n */\n async loadHistoricDataSpecialDays(dayTypes, startDate, forecastOptions, historicDataMap, specialDaysMap) {\n const ipoa = forecastOptions.percentOfAbandonsToInclude;\n let counterMap = new Map();\n for (let i = 0; i < dayTypes.length; i++) { counterMap.set(dayTypes[i].id, 0) }\n\n /** @type {{st:Date;quarters:number}[]} */\n const intervals = [];\n for (let d2 = 0; d2 < 365 * 6; d2++) { //earlier then the normal x weeks of data\n let dt2 = addDays(startDate, -d2)\n let dayTypeId = getDaytype(dt2, specialDaysMap)\n if (dayTypeId > 0 && counterMap.get(dayTypeId) < 10) { //dates with specialDay and only the 10 latest\n intervals.push({st:dt2, quarters:96});\n let count = counterMap.get(dayTypeId)\n counterMap.set(dayTypeId, count + 1)\n }\n }\n\n const csResult = await getCallStatistics({intervals, ipoa});\n if (csResult.isCalculating)\n return false;\n for (const dr of csResult.list) {\n const dt2 = new Date(dr.st);\n const dayTypeId = getDaytype(dt2, specialDaysMap)\n const dt = getShortDate(dt2);\n for (const histData of dr.data) {\n let key2 = histData.cgId + '_' + dt;\n let xVal = {\n dt: dt2,\n acgr: histData.cgId,\n dayType: dayTypeId,\n nocData: histData.noc,\n ahtData: histData.ht\n };\n\n historicDataMap.set(key2, daysavingTransitionCorrection(xVal))\n }\n }\n\n return true;\n }\n\n reset() {\n this._historicDataMap = new Map();\n }\n}\n\nexport const forecastData = new ForecastData();\n\n/**\n * @param {{ dt: Date; acgr: number; dayType: number; nocData: number[]; ahtData: number[]; }} xVal\n */\nfunction daysavingTransitionCorrection(xVal) {\n if (xVal.nocData.length > 96) {\n xVal.nocData = xVal.nocData.slice(0, 96)\n xVal.ahtData = xVal.ahtData.slice(0, 96)\n }\n if (xVal.nocData.length == 92) {\n for (let i = 0; i < 4; i++) {\n xVal.nocData.push(0)\n xVal.ahtData.push(0)\n }\n }\n return xVal\n}","class SimulationData {\n constructor() {\n /** @private @type {Map<string, import(\"@/js/dn-simulation-model.js\").SimData>} */\n this._simulationDataMap = new Map();\n /** @private @type {Map<string, Map<number, number[]>>} */\n this._targetDataMap = new Map();\n /** @private @type {Map<number, import(\"@/shared/dn-employee.js\").Employee[]>} */\n this._emplyeesByAffinity = null\n /** @private @type {Map<number, number>} */\n this._callGroupPrioInfoMap = null\n /** @type {number} */\n this.callGroupPrioMax = 0\n }\n\n get simulationDataMap() {\n return this._simulationDataMap;\n }\n\n get targetDataMap() {\n return this._targetDataMap;\n }\n\n get emplyeesByAffinity(){\n return this._emplyeesByAffinity\n }\n set emplyeesByAffinity(value){\n this._emplyeesByAffinity=value\n }\n\n get callGroupPrioInfoMap(){\n return this._callGroupPrioInfoMap\n }\n set callGroupPrioInfoMap(value){\n this._callGroupPrioInfoMap=value\n }\n\n\n\n reset() {\n this._simulationDataMap = new Map();\n this._targetDataMap = new Map();\n this._emplyeesByAffinity = null\n this._callGroupPrioInfoMap=null\n this.callGroupPrioMax=0\n }\n}\n\nexport const simulationData = new SimulationData();","import { fetchAndCheckJson } from '@/js/dn-fetch.js';\nimport { getShortDate } from '@/shared/dn-shared-helper.js';\n\nclass SpecialDayData {\n constructor() {\n /** @private @type {Map<string, number>} */\n this._specialDaysMap = new Map();\n }\n\n get specialDaysMap() {\n return this._specialDaysMap;\n }\n\n async loadSpecialDays() {\n /** @type {{dt:string;dtid:number}[]} */\n const rows = await fetchAndCheckJson(`specialday`, 'GET');\n /** @type {Map<string, number>} */\n const daytypeMap = new Map();\n for (const r of rows) {\n daytypeMap.set(r.dt, r.dtid);\n }\n this._specialDaysMap = daytypeMap;\n }\n\n /**\n * @param {Date} dt\n * @param {number} dtid\n * @param {boolean} system\n */\n async saveSpecialDay(dt, dtid, system) {\n const dtString = getShortDate(dt);\n if (system && this._specialDaysMap.has(dtString)) {\n this._specialDaysMap.delete(dtString);\n } else {\n this._specialDaysMap.set(dtString, dtid);\n }\n const id = dt.getFullYear() + '-' + (dt.getMonth() + 1) + '-' + dt.getDate();\n if (!system) {\n await fetchAndCheckJson(`specialday/${id}`, 'PUT', { dtid });\n }\n else {\n await fetchAndCheckJson(`specialday/${id}`, 'DELETE');\n }\n }\n\n reset() {\n this._specialDaysMap = new Map();\n }\n}\n\nexport const specialDayData = new SpecialDayData();\n","/** @readonly @enum {number} */\nconst CALL_STATE = createCallStates();\n/** @readonly @enum {number} */\nconst CALL_TRACKER_REPORT_TYPE = createCallTrackerReportTypes();\n/** @readonly @enum {number} */\nconst CALL_TYPE = createCallTypes();\n\n/**\n * A call segment.\n * @typedef {Object} CallTrackerEvent\n * @property {string} stamp\n * @property {number} callType - A {@link CALL_TYPE} value.\n * @property {number} callState - A {@link CALL_STATE} value.\n * @property {string} initials\n * @property {number} stationNumber\n * @property {number} type - A {@link CALL_TRACKER_TYPE} value. Can vary during call\n * @property {string} value\n */\n\n/**\n * @typedef {Object} GenesisCallDto\n * @property {number} callId\n * @property {CallTrackerEvent[]} events\n * @property {number} clientNumber\n */\n\n/**\n * @typedef {Object} GenesisCallTrackerReport\n * @property {string} start\n * @property {number} [switchId]\n * @property {GenesisCallDto[]} calls\n */\n\n/**\n * @param {string[]} lines\n * @returns {GenesisCallTrackerReport}\n */\nexport function parseGenesisCallTrackerTsv(lines) {\n /** @type {GenesisCallDto[]} */\n const calls = [];\n let index = 0;\n let start = '';\n\n while (index < lines.length) {\n const r = splitTabLine(lines[index]);\n index += 1;\n if (r[0] === 'Start Date:') {\n start = r[1];\n } else if (r[0] === 'Stamp') {\n break;\n }\n }\n\n while (true) {\n const r = parseCall(lines, index);\n if (r) {\n calls.push(r.call)\n index = r.endIndex + 1;\n } else {\n break;\n }\n }\n\n return { start, calls };\n}\n\n/**\n * @param {string[]} lines\n * @param {number} startIndex\n * @returns {{call:GenesisCallDto; endIndex:number}}\n */\nfunction parseCall(lines, startIndex) {\n const client = splitTabLine(lines[startIndex]);\n if (client.length !== 3) { return undefined; }\n let clientNumber = Number(client[0]);\n if (Number.isNaN(clientNumber)) {\n clientNumber = null;\n }\n const callId = Number(splitTabLine(lines[startIndex + 1])[1]);\n /** @type {CallTrackerEvent[]} */\n const events = [];\n let i = startIndex + 4;\n\n while (lines[i].length > 0) {\n const segment = splitTabLine(lines[i]);\n const stamp = segment[0];\n const type = parseEnum(CALL_TRACKER_REPORT_TYPE, segment[1]);\n const value = segment[2];\n const callType = parseEnum(CALL_TYPE, segment[3]);\n const initials = segment[5];\n const callState = parseEnum(CALL_STATE, segment[6]);\n const stationNumber = Number(segment[8]);\n\n events.push({ stamp, type, callType, initials, callState, stationNumber, value });\n i += 1;\n }\n\n return { call: { callId, clientNumber, events }, endIndex: i };\n}\n\nfunction createCallTypes() {\n const enumObject = {\n Undefined: 0,\n Secretarial: 1, // regular inbound\n Checkin: 2,\n Fetch: 3,\n Scheduled: 4,\n IVR: 5,\n WebScript: 6,\n VoiceMail: 7,\n AutoCall: 8,\n Announcement: 9,\n MergeComm: 10,\n PageConfirmation: 11,\n SmartPaging: 12,\n ChangeClient: 13,\n AgentAudio: 14,\n Rauland: 15,\n AutoAttendant: 16,\n ListingLookup: 17,\n Dispatch: 18, //include\n ParkOrbit: 19,\n VMCallBack: 20,\n Cue: 21, //include\n Repeat: 22, //include\n ConfBridge: 23,\n Orbit: 24,\n Elevator: 25,\n Pers: 26,\n };\n\n return Object.freeze(enumObject);\n}\n\nfunction createCallStates() {\n const enumObject = {\n Unknown: 0,\n Disposed: 1,\n Disc: 2,\n Ring: 3,\n Talk: 4,\n Talk1: 5,\n Talk2: 6,\n Conference: 7,\n Hold: 8,\n InProgress: 9,\n VoiceMail: 10,\n OutboundQueue: 11,\n Auto: 12,\n AutoHold: 13,\n Patch: 14,\n Bridge: 15,\n MaxStates: 16,\n };\n\n return Object.freeze(enumObject);\n}\n\nfunction createCallTrackerReportTypes() {\n const enumObject = {\n None: 0,\n 'New Call': 1, // *\n 'End Call': 2, // *\n Distribute: 3, // *\n Answered: 4, // *\n Hold: 5, // *\n 'Auto Answer': 6, // *\n 'Dial Start': 7, // *\n 'Dial End': 8, // *\n Overdial: 9, //\n 'Agent Hang Up': 10, // *\n 'System Hang Up': 10, // * kanske\n 'Hung Up': 11, // *\n Change: 12, // *\n Reassign: 13,\n Park: 14, // *\n Conference: 15, // *\n Patch: 16, // *\n Transfer: 17,\n 'Digit Menu Entry': 18, // *\n 'Speech Rec': 19,\n 'Send To Op': 20,\n 'Screen Start & Stop': 21, // kanske 'var SmartPage'\n 'Send To vm': 22, // *\n 'Script Action': 23,\n Abandon: 24, // *\n 'Switch Error': 25,\n Orbit: 26,\n 'Bridge Add': 27,\n 'Bridge Del': 28,\n Voci: 29,\n 'AI Insight': 30,\n Limited: 31,\n 'Disc Alert & override': 32, // *\n 'Logger Start & Stop': 33, // *\n 'Video Recording': 34,\n 'Invalid Source': 35,\n 'Hold Alert': 36,\n };\n\n return Object.freeze(enumObject);\n}\n\n/**\n * @param {Readonly<any>} enumObj\n * @param {string} name\n */\nfunction parseEnum(enumObj, name) {\n /** @type {number} */\n let value = enumObj[name];\n if (value === undefined) {\n let indexOfLeft = name.indexOf('[');\n let indexOfRight = name.indexOf(']');\n if (indexOfLeft >= 0 && indexOfRight > indexOfLeft) {\n value = Number(name.substring(indexOfLeft + 1, indexOfRight));\n if (Number.isNaN(value)) {\n value = null;\n }\n } else {\n value = null;\n }\n }\n return value;\n}\n\n/**\n * @param {string} line\n */\nfunction splitTabLine(line) {\n const r = line.split('\\t');\n for (let i = 0; i < r.length; i++) {\n if (r[i].length > 1 && r[i][0] === '\"') {\n r[i] = r[i].substring(1, r[i].length - 1);\n }\n\n }\n return r;\n}","import { fetchAndCheckJson } from '@/js/dn-fetch.js';\nimport { parseGenesisCallTrackerTsv } from './dn-genesis.js';\nvar moment = require(\"moment-timezone\");\n\n/**\n * @typedef {{callid:number|string;timestamp:string;wrap:string|number,talk:string|number;tag1:string|number;tag2:string|number;tag3:string|number;abandon:string|number;switchId?:number}} ImportCallDto\n */\n\n/**\n * @param {string[]} lines\n * @param {number} callImportFileType\n * @param {number} switchId\n * @param {{ (progress: any): void; (arg0: number): void; }} updateProgress\n */\nexport async function importCallsFile(lines, callImportFileType, switchId, updateProgress) {\n let startIndex = 0;\n let data = [];\n /** @type {string} */\n let start;\n let batchSize = 10000;\n let resultData = lines;\n\n if (callImportFileType == CALL_FILETYPE.infinity || callImportFileType == CALL_FILETYPE.isoDate) {\n // if (lines[0].toLowerCase() == 'callid;timestamp;wrap;talk;tag1;tag2;tag3;abandons')\n // startIndex = 1;\n\n /**is this optimized? */\n const requiredHeaders = ['callid', 'timestamp', 'wrap', 'talk', 'tag1', 'tag2', 'tag3', 'abandons'];\n if (lines.length > 0) {\n let headers = lines[0].toLowerCase().split(';');\n headers = headers.map(header => header.replace(/\\s+/g, ''));\n const hasAllHeaders = requiredHeaders.every(header => headers.includes(header)); /**handle import file with header doesnt follow the format indexes */\n if (hasAllHeaders) {\n startIndex = 1;\n const headerIndexMap = headers.reduce((acc, header, index) => {\n acc[header] = index;\n return acc;\n }, {});\n resultData = lines.slice(0)\n .map(line => line.replace(/ /g, ''))\n .filter(rec => rec !== '') \n .map(rec => {\n const values = rec.split(/[;,]/);\n const cleanedValues = requiredHeaders.map(header => values[headerIndexMap[header]] || '');\n return cleanedValues.join(';');\n }); \n }\n }\n\n for (let i = startIndex; i < resultData.length; i++) {\n const line = resultData[i].replace(/\\s+/g, '');\n const callData = line.split(';');\n if (callData.length === 1)\n continue;\n\n if (callData.length !== 8)\n throw new Error(`Number of fields error on line ${i}`);\n\n const callid = parseInt(callData[0]);\n if (!isNonNegative32Bit(callid)) {\n throw new Error(`Invalid callid on line ${i}`);\n }\n\n let timestamp = \"\"\n if (callImportFileType == CALL_FILETYPE.infinity) {\n const minutes = parseInt(callData[1]);\n\n if (!(minutes >= 6000000 && minutes < 68000000)) {\n throw new Error(`Bad formatting of timestamp on line ${i}`);\n }\n\n //the timestamp from text file should be minutes from 1899-12-31 in customer time zone\n //36819360 - 60 * 24 is number of minutes from 1899-12-31 to 1970-01-01\n const dt = new Date((minutes - 36819360 + 60 * 24) * 1000 * 60);\n timestamp = dt.toISOString()\n timestamp = timestamp.substring(0, timestamp.length - 1);\n } else if (callImportFileType == CALL_FILETYPE.isoDate) {\n if (isNaN(Date.parse(callData[1]))) {\n throw new Error(`Bad formatting of timestamp on line ${i}`);\n }\n timestamp = callData[1]\n }\n\n const wrap = parseInt(callData[2]);\n if (!is32Bit(wrap)) {\n throw new Error(`wrap error on line ${i}`);\n }\n\n const talk = parseInt(callData[3]);\n if (!isNonNegative32Bit(talk)) {\n throw new Error(`talk error on line ${i}`);\n }\n\n const tag1 = Number(emptyToNull(callData[4]));\n if (!Number.isInteger(tag1)) {\n throw new Error(`tag1 not number error on line ${i}`);\n }\n if (tag1 != null && !isNonNegative64Bit(tag1)) {\n throw new Error(`tag1 error on line ${i}`);\n }\n\n const tag2 = Number(emptyToNull(callData[5]));\n if (!Number.isInteger(tag2)) {\n throw new Error(`tag2 not number error on line ${i}`);\n }\n if (tag2 != null && !isNonNegative64Bit(tag2)) {\n throw new Error(`tag2 error on line ${i}`);\n }\n\n /** @type {null|string|number} */\n let tag3 = emptyToNull(callData[6]);\n\n if (!Number.isInteger(Number(tag3))) {\n throw new Error(`tag3 not number error on line ${i}`);\n }\n\n if (tag3 !== null) {\n tag3 = parseInt(tag3);\n if (!isNonNegative32Bit(tag3)) {\n throw new Error(`tag3 error on line ${i}`);\n }\n }\n\n const abandon = parseInt(callData[7]);\n if (!(abandon === 0 || abandon === 1)) {\n throw new Error(`abandon expects 0 or 1 error on line ${i}`);\n }\n\n data.push({\n callid: callid,\n timestamp: timestamp,\n wrap: wrap,\n talk: talk,\n tag1: tag1,\n tag2: tag2,\n tag3: tag3,\n abandon: abandon,\n switchId: switchId\n })\n }\n } else if (callImportFileType == CALL_FILETYPE.genesisLS) {\n\n const columnMap = new Map //genesis\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]//.replace(/ /g, '');\n const callData = line.split(';');\n\n if (callData.length === 1)\n continue;\n\n //Read columns\n if (i == 0) {\n for (let c = 0; c < callData.length; c++) {\n let col = callData[c]\n if (col == \"startTime\") { columnMap.set(c, col) }\n if (col == \"externalId\") { columnMap.set(c, col) }\n if (col == \"talk\") { columnMap.set(c, col) }\n if (col == \"wrapup\") { columnMap.set(c, col) }\n if (col == \"mark1\") { columnMap.set(c, col) }\n if (col == \"callType\") { columnMap.set(c, col) }\n }\n } else {\n let callid = 0\n let wrap\n let talk\n let tag1\n let timestamp = \"\"\n let abandon = 0\n\n for (let c = 0; c < callData.length; c++) {\n if (columnMap.has(c)) {\n let col = columnMap.get(c)\n if (col == \"startTime\") {\n if (isNaN(Date.parse(callData[c]))) {\n throw new Error(`Bad formatting of timestamp on line ${i}`);\n }\n timestamp = moment(new Date(callData[c])).format(\"YYYY-MM-DD HH:mm:ss\");\n timestamp = timestamp.substring(0, 10) + 'T' + timestamp.substring(11, 19) + '.000'\n }\n if (col == \"externalId\") {\n callid = parseInt(callData[c]);\n if (!isNonNegative32Bit(callid)) {\n throw new Error(`Invalid callid on line ${i}`);\n }\n }\n if (col == \"talk\") {\n talk = 1000 * parseInt(callData[c]);\n if (!isNonNegative32Bit(talk)) {\n throw new Error(`talk error on line ${i}`);\n }\n }\n if (col == \"wrapup\") {\n wrap = 1000 * parseInt(callData[c]);\n if (!is32Bit(wrap)) {\n throw new Error(`wrap error on line ${i}`);\n }\n }\n if (col == \"mark1\") {\n tag1 = Number(emptyToNull(callData[c]));\n if (!Number.isInteger(tag1)) {\n throw new Error(`tag1 not number error on line ${i}`);\n }\n if (tag1 != null && !isNonNegative64Bit(tag1)) {\n throw new Error(`tag1 error on line ${i}`);\n }\n }\n if (col == \"callType\") {\n if (parseInt(callData[c]) == 3) { abandon = 1 } else { abandon = 0 }\n if (!(abandon === 0 || abandon === 1)) {\n throw new Error(`abandon expects 0 or 1 error on line ${i}`);\n }\n }\n }\n\n }\n\n data.push({\n callid: callid,\n timestamp: timestamp,\n wrap: wrap,\n talk: talk,\n tag1: tag1,\n tag2: 0,\n tag3: 0,\n abandon: abandon,\n switchId: switchId\n })\n }\n }\n } else if (callImportFileType === CALL_FILETYPE.genesisCallTracker) {\n batchSize = 1000;\n const report = parseGenesisCallTrackerTsv(lines);\n start = report.start;\n data = report.calls;\n }\n\n if (data.length === 0)\n throw new Error('No calls to import found');\n\n let result;\n const total = data.length;\n let left = data.length;\n do {\n let batch;\n if (left <= batchSize) {\n batch = data;\n left = 0;\n } else {\n batch = data.splice(0, batchSize);\n left = data.length;\n }\n if (callImportFileType === CALL_FILETYPE.genesisCallTracker) {\n /** @type {import(\"@/js/dn-genesis.js\").GenesisCallTrackerReport} */\n const batchedReport = { start, switchId, calls: batch };\n result = await fetchAndCheckJson(`import-calls?kind=${CALL_FILETYPE.genesisCallTracker}&file=1`, 'POST', batchedReport);\n } else {\n result = await fetchAndCheckJson('import-calls?file=1', 'POST', batch);\n }\n\n updateProgress(1 - left / total);\n } while (left > 0);\n\n return result;\n}\n\n/**\n * @param {number} number\n */\nfunction isNonNegative32Bit(number) {\n return number >= 0 && number <= 2147483647;\n}\n\n/**\n * @param {number} number\n */\nfunction is32Bit(number) {\n return number >= -2147483648 && number <= 2147483647;\n}\n\nfunction isNonNegative64Bit(numberAsString) {\n const number = parseInt(numberAsString);\n return number >= 0 || number <= 9007199254740990\n}\n\n/**\n * @param {string} value\n */\nfunction emptyToNull(value) {\n if (value.length === 0) {\n return null;\n }\n return value;\n}\nexport const CALL_FILETYPE = createCallFileTypeEnum();\n\nfunction createCallFileTypeEnum() {\n const enumObject = {\n isoDate: 0,\n infinity: 1,\n genesisLS: 2,\n genesisCallTracker: 3,\n\n };\n\n return Object.freeze(enumObject)\n}\n\n","import { defineStore } from 'pinia';\nimport { importAgentEventsCsv } from '@/js/dn-agent-event.js';\nimport { importCallsFile } from \"@/js/dn-import-calls.js\";\n\nexport const useFileImportStore = defineStore('fileImport', {\n state: () => ({\n callImportFileType: 0,\n dropFiles: [],\n fileImportInfo: {\n context: [],\n nofImported: 0,\n error: false,\n fileName: \"\"\n },\n importCallsLoadingStatus: 0,\n lastImportFileSetting:{\n lastCallImportFile:0,\n lastAgentImportFile:0 //not in use\n },\n }),\n getters: {\n },\n actions: {\n /**\n * Import calls or agent events csv files.\n * @param {{ blob:Blob; fileCount:number; agentEvents:boolean; callImportFileType:number; switchId:number}} fileInfo\n */\n async executeCsvImport(fileInfo) {\n const blob = fileInfo.blob;\n const dropFileLengh = fileInfo.fileCount;\n const startProgress = this.importCallsLoadingStatus;\n try {\n const updateProgress = progress => {\n if (startProgress + 100 * progress / dropFileLengh < 100) {\n this.importCallsLoadingStatus = startProgress + 100 * progress / dropFileLengh;\n } else { this.importCallsLoadingStatus = 100 }\n };\n\n let content = await blob.text();\n content = content.replace(/(\\r)/gm, '')\n if (fileInfo.agentEvents || fileInfo.callImportFileType !== 3) {\n content = content.replace(/,/g, ';').replace(/\"/g, '');\n }\n \n const lines = content.split('\\n');\n if (fileInfo.agentEvents) {\n await importAgentEventsCsv(lines, fileInfo.switchId, updateProgress);\n } else {\n await importCallsFile(lines, fileInfo.callImportFileType, fileInfo.switchId, updateProgress);\n }\n\n const fileImportInfo = this.fileImportInfo;\n fileImportInfo.nofImported += 1;\n fileImportInfo.fileName = blob.name\n fileImportInfo.context.push({msg:'File ' + blob.name + ': ' + (lines.length - 1) + ' rows',severity:\"success\"});\n } catch (error) {\n const fileImportInfo = this.fileImportInfo;\n fileImportInfo.error = true;\n fileImportInfo.fileName = blob.name\n fileImportInfo.context.push({msg:'File ' + blob.name + ': ' + error,severity:\"error\"});\n }\n },\n }\n}\n);\n","import { defineStore } from 'pinia';\nimport { fetchAndCheckJson } from '@/js/dn-fetch.js';\nimport { forecastData } from '@/stores/dn-forecast-data.js';\nimport { forecastAiData } from '@/stores/dn-forecast-ai-data.js';\nimport { specialDayData } from '@/stores/dn-special-day-data.js';\nimport { useDataStore } from './dataStore';\nimport { getAllWeekData, getCallStatsWeek, getChartData, updateForecastInAllWeekData } from '@/js/dn-forecast.js';\nimport { getLastForcastOptions,setLastForcastOptions } from '@/js/dn-localStorage';\n\nlet _isLoadingHistoricData = false;\nlet _isLoadingAiForecast = false;\n\nexport const useForecastStore = defineStore('forecast', {\n state: () => ({\n callStatsWeek: [],\n callStatsWeekMap: new Map(),\n chartData: [],\n /** @type {Map<string, Map<number, any>>} */\n forecastAdjustmentmap: new Map(),\n forecastOptions: {\n selectedParameters: ['noc'],\n compareWithForecast: true,\n /**@type {{id: number; system: boolean; }}; */\n focusedDaytyp: { id: undefined, system: undefined },\n /** @type {{id:number;forecastMethod:number}[]} */\n selectedCallGroups: [],\n selectedCallCenters: [],\n selectedDates: [],\n adjustmentDate: null,\n adjustmentDialogShow:false,\n historicWeeks: 6,\n forecastWeeks: 3,\n numberOfHistoricSpecialDays: 10,\n occupacyFte: 90,\n adherancePercent: 89,\n forecastIsLoaded: false,\n /** @type {Date} */\n historicFocusDate: null,\n compareSencitivity: 0,\n percentOfAbandonsToInclude: 50,\n useAiForecast:true,\n aiForecastIsLoaded: false,\n copiedData:null,\n },\n }),\n actions: {\n /* initial fetch of callstatsWeek */\n fetchForecast() {\n const dataStore = useDataStore();\n const dayTypes = dataStore.dayTypes;\n this.callStatsWeekMap = getAllWeekData(\n dataStore.dateNow, this.forecastOptions, specialDayData.specialDaysMap, forecastData.historicDataMap, dataStore.callGroupsAllowed, dayTypes);\n },\n async initForecast() {\n const dataStore = useDataStore();\n const forecastStore = useForecastStore();\n const promises = []\n promises.push(dataStore.loadDayTypes())\n promises.push(dataStore.loadCallGroups())\n promises.push(specialDayData.loadSpecialDays());\n promises.push(dataStore.loadSwitches());\n promises.push(dataStore.backOfficeSkills.load());\n await Promise.all(promises)\n forecastStore.loadLocalForcastOptions(); //dependent on callGroups\n await forecastStore.loadForecastAdjustment();\n await forecastStore.reloadForecastAndHistoricData();\n },\n\n async reloadAiForecast() {\n if (_isLoadingAiForecast)\n return;\n const dataStore = useDataStore();\n if (dataStore.dateNow === null) { return; }\n _isLoadingAiForecast = true;\n try {\n \n this.forecastOptions.aiForecastIsLoaded = false;\n let ok = false;\n do {\n ok = await forecastAiData.loadAiForecastData(this.forecastOptions);\n if (ok) {\n this.forecastOptions.aiForecastIsLoaded = true;\n this.fetchForecast();\n this.updateForecast();\n } else {\n await new Promise((resolve) => { setTimeout(() => resolve(null), 30000); });\n }\n } while (!ok);\n } catch (error) {\n console.log(error);\n } finally {\n _isLoadingAiForecast = false;\n }\n },\n\n async reloadForecastAndHistoricData() {\n if (_isLoadingHistoricData)\n return;\n const dataStore = useDataStore();\n if (dataStore.dateNow === null) { return; }\n _isLoadingHistoricData = true;\n try {\n const dayTypes = dataStore.dayTypes;\n this.forecastOptions.forecastIsLoaded = false;\n let ok1 = false;\n let ok2= false;\n do {\n ok1 = await forecastData.loadHistoricData(dataStore.dateNow, this.forecastOptions, dayTypes, specialDayData.specialDaysMap);\n if(this.forecastOptions.useAiForecast){\n ok2 = await forecastAiData.loadAiForecastData(this.forecastOptions);\n }else{ok2=true}\n if (ok1&&ok2) {\n this.forecastOptions.forecastIsLoaded = true;\n this.fetchForecast();\n this.updateForecast();\n } else {\n await new Promise((resolve) => { setTimeout(() => resolve(null), 30000); });\n }\n } while (!(ok1&&ok2));\n } catch (error) {\n console.log(error);\n } finally {\n _isLoadingHistoricData = false;\n }\n },\n /* recalculate callstatsWeek with updated forecast */\n updateForecast() { \n const dataStore = useDataStore();\n this.callStatsWeekMap = updateForecastInAllWeekData(this.callStatsWeekMap, dataStore.dateNow, this.forecastOptions, specialDayData.specialDaysMap,\n this.forecastAdjustmentmap, forecastData.historicDataMap,forecastAiData.forecastDataMap, dataStore.callGroupsAllowed, dataStore.latestImportDate);\n this.callStatsWeek = getCallStatsWeek(this.callStatsWeekMap, this.forecastOptions, specialDayData.specialDaysMap)\n },\n /* Recalcualte CallStatweek with new selection of callgroups and focused daytype */\n updateCallStatsWeek() {\n this.callStatsWeek = getCallStatsWeek(this.callStatsWeekMap, this.forecastOptions, specialDayData.specialDaysMap)\n },\n async loadForecastAdjustment() {\n const dataStore = useDataStore();\n /** @type {{dt:string; adj:number;cgid:number;quarterRange:null|[number,number];static_noc:null|number[];static_ht:null|number[]}[]} */\n const rows = await fetchAndCheckJson(`forecastadjustment`, 'GET');\n const callGroups = dataStore.callGroupsAllowed;\n /** @type {Map<string, Map<number, any>>} */\n const adjustmentMap = new Map();\n for (let i = 0; i < rows.length; i++) {\n const key = rows[i].dt.substring(0, 10);\n /** @type {Map<number, any>} */\n let dayMap;\n if (adjustmentMap.has(key)) {\n dayMap = adjustmentMap.get(key)\n } else {\n dayMap = new Map()\n adjustmentMap.set(key, dayMap);\n }\n const rec = rows[i]\n for (let a = 0; a < callGroups.length; a++) {\n if (callGroups[a].id == rec.cgid) {\n let staticData = null\n const qr = rec.quarterRange ? rec.quarterRange : [0,96];\n if (rec.static_noc&&rec.static_ht){staticData={noc:rec.static_noc,ht:rec.static_ht}}\n dayMap.set(rec.cgid, {nocAdj:rec.adj,quarterRange:qr,copiedNocAht:staticData});\n }\n }\n }\n this.forecastAdjustmentmap = adjustmentMap;\n },\n loadLocalForcastOptions() {\n const dataStore = useDataStore();\n const forecastOptions = this.forecastOptions\n let localForecastOptions = getLastForcastOptions()\n if (localForecastOptions && localForecastOptions.selectedAcGrIds) {\n let selectedCallGroups = []\n const callGroups = dataStore.callGroupsAllowed;\n for (let i = 0; i < localForecastOptions.selectedAcGrIds.length; i++) {\n for (let a = 0; a < callGroups.length; a++) {\n if (localForecastOptions.selectedAcGrIds[i] == callGroups[a].id) {\n selectedCallGroups.push(callGroups[a])\n }\n }\n }\n\n forecastOptions.selectedParameters = localForecastOptions.selectedParameters\n forecastOptions.compareWithForecast = localForecastOptions.compareWithForecast\n forecastOptions.selectedCallGroups = selectedCallGroups\n if(localForecastOptions.selectedCallCenters){forecastOptions.selectedCallCenters=localForecastOptions.selectedCallCenters}else{forecastOptions.selectedCallCenters=[]}\n }\n\n const dayTypes = dataStore.dayTypes;\n dayTypes.forEach((dt) => {\n if (dt.system) { forecastOptions.focusedDaytyp = dt }\n })\n },\n saveLocalForecastOptions(){\n let localForecastOptions = {\n selectedParameters: this.forecastOptions.selectedParameters,\n compareWithForecast: this.forecastOptions.compareWithForecast,\n //selectedCallGroups:this.forecastOptions.selectedCallGroups,\n selectedAcGrIds: this.forecastOptions.selectedCallGroups.map(function (x) { return x.id }),\n selectedDates: this.forecastOptions.selectedDates,\n selectedCallCenters:this.forecastOptions.selectedCallCenters\n \n }\n setLastForcastOptions(localForecastOptions)\n },\n setChartData() {\n const dataStore = useDataStore();\n this.chartData = getChartData(this.forecastOptions, specialDayData.specialDaysMap, dataStore.dateNow, this.forecastAdjustmentmap, forecastData.historicDataMap,forecastAiData.forecastDataMap, dataStore.latestImportDate);\n },\n }\n});\n","import { defineStore } from 'pinia';\nimport { addDays } from '@/shared/dn-shared-helper.js';\nimport { getSimData, SimState } from '@/js/dn-simulation.js';\nimport { getEmployees } from '@/js/dn-fetch-employee.js';\nimport { createSchedule } from '#shared/dn-employee-schedule';\nimport { getScheduleTasks } from '@/js/dn-fetch-schedule.js';\nimport { useDataStore } from '@/stores/dataStore.js';\nimport { forecastData } from '@/stores/dn-forecast-data.js';\nimport { forecastAiData } from '@/stores/dn-forecast-ai-data.js';\nimport { specialDayData } from '@/stores/dn-special-day-data.js';\nimport { useForecastStore } from '@/stores/forecastStore.js';\nimport { useScheduleStore } from \"@/stores/scheduleStore.js\";\n\nexport const usePortfolioStore = defineStore('portfolio', {\n state: () => ({\n callCenterKeyFigures: [],\n callCenterKeyFiguresLoadingStatus: 0,\n }),\n actions: {\n clearCallCenterKeyFigures() {\n this.callCenterKeyFigures = [];\n this.callCenterKeyFiguresLoadingStatus = 0;\n },\n /**\n * @param {Date} startDate\n */\n async fetchCallcenterKeyFigures(startDate) {\n const dataStore = useDataStore();\n this.callCenterKeyFiguresLoadingStatus = 0;\n let callCenterKeyFifures = []\n /** @type {{avgQueue:boolean; datesWithChanges:any[]; employeeOccupancy:boolean; forceUpdate:boolean; numberOfSimIterations:number; occ:boolean; sl:boolean; waitWithin:boolean}} */\n const outputSpec = { forceUpdate: true, datesWithChanges: [], sl: true, occ: true, avgQueue: false, waitWithin: false, employeeOccupancy: false, numberOfSimIterations: 1 }\n\n const taskTypeMap = dataStore.taskTypeMap\n\n /** @type {{id:number}[]} */\n const activeCallCenters = dataStore.callCentersAllowed;\n\n for (let c = 0; c < activeCallCenters.length; c++) {\n let cc = activeCallCenters[c]\n\n let data = { occ: [], sl: [], work: [], vacation: [], sick: [], employees: [] }\n for (let d = 0; d < 7; d++) {\n const dateInterval = { numberOfDays: 1, st: addDays(startDate, d) }\n const scheduleOptions = { dateInterval: [addDays(startDate, d), addDays(startDate, d)], }\n const x = await getCCSimData(cc, dateInterval, outputSpec, scheduleOptions);\n data.occ.push(x.simdata.occ)\n data.sl.push(x.simdata.slAvg)\n data.work.push(x.simdata.work)\n data.vacation.push(x.vacation)\n data.sick.push(x.sick)\n data.employees.push(x.employees)\n this.callCenterKeyFiguresLoadingStatus += 100 / (activeCallCenters.length * 7)\n }\n callCenterKeyFifures.push(data)\n }\n\n this.callCenterKeyFigures = callCenterKeyFifures;\n\n /**\n * @param {{ id: number; }} cc\n * @param {{ st: Date; numberOfDays: number; }} dateInterval\n * @param {{ avgQueue: boolean; datesWithChanges: any[]; employeeOccupancy: boolean; forceUpdate: boolean; numberOfSimIterations: number; occ: boolean; sl: boolean; waitWithin: boolean; }} outputSpec\n * @param {{ dateInterval: Date[]; }} scheduleOptions\n */\n async function getCCSimData(cc, dateInterval, outputSpec, scheduleOptions) {\n const dataStore = useDataStore();\n const forecastStore = useForecastStore();\n const scheduleStore = useScheduleStore();\n const taskTypes = dataStore.taskTypes;\n return await new Promise((resolve) => {\n let promises = []\n promises.push(getEmployees(cc.id))\n promises.push(getScheduleTasks([dateInterval], cc.id))\n Promise.all(promises).then((values) => {\n /** @type {import(\"@/shared/dn-employee.js\").Employee[]} */ // @ts-ignore\n let employees = values[0]\n /** @type {import(\"@/shared/dn-task.js\").Task[]} */ // @ts-ignore\n let scheduleTasks = values[1]\n //calculate sick and vacation\n const schedule = createSchedule({numberOfDays:1, st: dateInterval.st}, scheduleTasks, taskTypes, employees, false);\n let numberOfSick = 0\n let numberOfVacation = 0\n for (let e = 0; e < schedule.length; e++) {\n if (schedule[e].absences.length > 0) {\n let absTask = schedule[e].absences[0]\n let tt = taskTypeMap.get(absTask.tasktypeId)\n if (tt.subtype == 's') { ++numberOfSick }\n if (tt.subtype == 'v') { ++numberOfVacation }\n }\n }\n const callGroups = dataStore.callGroups;\n const ccCallGroups = callGroups.filter((cg) => cg.contactCenterId == cc.id);\n const affinities = new Set();\n for (const cg of ccCallGroups) {\n affinities.add(cg.affinity);\n }\n\n let occ = 0;\n let slAvg = 0;\n let work = 0;\n for (const affinity of affinities) {\n const simState = new SimState(taskTypes, dataStore.dateNow, forecastStore.forecastAdjustmentmap,\n forecastStore.forecastOptions, forecastData.historicDataMap,forecastAiData.forecastDataMap, scheduleStore.simulationSettings,\n specialDayData.specialDaysMap, ccCallGroups, dataStore.latestImportDate, dataStore.employeeCallcenters, cc.id, affinity);\n const simData = getSimData(\n outputSpec,\n simState,\n scheduleOptions,\n schedule,\n );\n occ += simData.occ;\n slAvg += simData.serviceLevelDisplayData[0].slAvg;\n work += simData.work;\n }\n\n if (affinities.size > 0) {\n occ = occ / affinities.size;\n slAvg = slAvg / affinities.size;\n }\n\n let data = { simdata: { occ, slAvg, work }, sick: numberOfSick, vacation: numberOfVacation, employees: employees.length }\n resolve(data)\n })\n })\n }\n },\n }\n});","import { defineStore } from 'pinia';\r\nimport { useDataStore } from './dataStore';\r\n\r\nexport const useReportStore = defineStore('report', {\r\n state: () => ({\r\n reportOptions: {\r\n /** @type {number} */\r\n agreementID: undefined,\r\n includePaidBreaks: false,\r\n /** @type {number} */\r\n numHoursWeeklyOvertime: null,\r\n payrollReportOneRow: false,\r\n reportCalendarDays: false,\r\n reportCsvSemicolon: false,\r\n reportDatePicker: new Date(0),\r\n /** @type {number[]} */\r\n reportFilter:[],\r\n reportKind: 0,\r\n reportTimeRangePicker: [],\r\n selectedEmp: null,\r\n selectedTasks: new Set(),\r\n selectedTasktype:null,\r\n separateColumns: false,\r\n weekendAsHoliday: false,\r\n },\r\n }),\r\n actions: {\r\n toggleSelectedTask(task){\r\n if(!task.checked) {\r\n this.reportOptions.selectedTasks.add(task.id)\r\n }\r\n else{\r\n this.reportOptions.selectedTasks.delete(task.id)\r\n }\r\n },\r\n selectedTasktoString(){\r\n if (this.reportOptions.selectedTasks.size == 0) {\r\n return \"No tasks selected\"\r\n }\r\n let thisTaskname = \"\";\r\n let stringArray = []\r\n let taskTypesMap = useDataStore().taskTypes.byId\r\n for (const taskTypeID of this.reportOptions.selectedTasks) {\r\n thisTaskname = taskTypesMap.get(taskTypeID).name\r\n stringArray.push(thisTaskname)\r\n }\r\n\r\n return stringArray.join(\", \");\r\n }\r\n }\r\n});\r\n","import { fetchAndCheckJson } from '@/js/dn-fetch.js';\nimport { getUniqueNegativeId,timeRangeInformation } from '@/js/dn-helper.js';\nimport { useDataStore } from '@/stores/dataStore';\n\n\n/**\n* @typedef {{id: number,daysOfWeek: number[], blackHours:[number,number],grade:number,taskTypeId:number}} BreakBlackoutDto\n*/\n\n/**\n* @typedef {{\n* callcenterId: number;\n* spreadFactor: number;\n* avoidSimultanousBreaksFactor: number;\n* numberOfIterations: number;\n* breakStartQuarterHours:boolean;\n* blackouts: BreakBlackoutDto[]\n* }} BreakOptimizationSettingsDto\n*/\n\nexport class BreakOptimizationSettings {\n /**\n * @param {BreakOptimizationSettingsDto} dto\n */\n constructor(dto) {\n /** @private @type {number} */\n this.callcenterId = dto.callcenterId;\n /** @private @type {number} */\n this._spreadFactor = dto.spreadFactor;\n /** @private @type {number} */\n this._avoidSimultanousBreaksFactor = dto.avoidSimultanousBreaksFactor;\n /** @private @type {number} */\n this._numberOfIterations = dto.numberOfIterations;\n /** @private @type {boolean} */\n this._breakStartQuarterHours = dto.breakStartQuarterHours;\n /** @private @type {BreakOptimizationSettingDetail[]} */\n this._blackouts = []\n for (const blackout of dto.blackouts) {\n this._blackouts.push(new BreakOptimizationSettingDetail(this, blackout));\n }\n }\n\n get spreadFactor() {\n return this._spreadFactor;\n }\n set spreadFactor(newValue) {\n this.markAsHasChanges();\n this._spreadFactor = newValue;\n }\n\n get avoidSimultanousBreaksFactor() {\n return this._avoidSimultanousBreaksFactor;\n }\n set avoidSimultanousBreaksFactor(newValue) {\n this.markAsHasChanges();\n this._avoidSimultanousBreaksFactor = newValue;\n }\n\n get numberOfIterations() {\n return this._numberOfIterations;\n }\n set numberOfIterations(newValue) {\n this.markAsHasChanges();\n this._numberOfIterations = newValue\n }\n\n get breakStartQuarterHours() {\n return this._breakStartQuarterHours;\n }\n set breakStartQuarterHours(newValue) {\n this.markAsHasChanges();\n this._breakStartQuarterHours = newValue\n }\n\n get blackouts() {\n return this._blackouts;\n }\n\n get hasChanges() {\n return this._hasChanges;\n }\n\n addBlackout() {\n const id = getUniqueNegativeId(this.blackouts);\n this.blackouts.push(new BreakOptimizationSettingDetail(this, { id, daysOfWeek: [0, 1, 2, 3, 4, 5, 6], blackHours: [17*12, 18*12], grade: 30, taskTypeId: null }));\n }\n\n /**\n * @param {{ id: number; }} row\n */\n deleteBlackout(row) {\n const index = this.blackouts.findIndex(x => x.id === row.id);\n this.blackouts.splice(index, 1);\n this.markAsHasChanges();\n }\n\n markAsHasChanges() {\n this._hasChanges = true;\n }\n\n confirmChanges() {\n this._hasChanges = false;\n }\n\n async save() {\n await fetchAndCheckJson(`break-optimization-settings`, 'POST', this.toDto());\n this.confirmChanges();\n }\n\n /** @returns {BreakOptimizationSettingsDto} */\n toDto() {\n return {\n callcenterId: this.callcenterId, spreadFactor: this._spreadFactor,\n avoidSimultanousBreaksFactor: this._avoidSimultanousBreaksFactor, numberOfIterations: this._numberOfIterations,\n breakStartQuarterHours: this._breakStartQuarterHours, blackouts: this._blackouts.map(x => x.toDto())\n };\n }\n}\n\nexport class BreakOptimizationSettingDetail {\n /**\n * @param {BreakOptimizationSettings} parent\n * @param {BreakBlackoutDto} dto\n */\n constructor(parent, dto) {\n /** @private @type {number} */\n this._id = dto.id;\n /** @private @type {number[]} */\n this._daysOfWeek = dto.daysOfWeek;\n /** @private @type {[number,number]} */\n this._blackHours = dto.blackHours;\n /** @private @type {number} */\n this._grade = dto.grade;\n /** @private @type {number} */\n this._taskTypeId = dto.taskTypeId;\n /** @private @type {BreakOptimizationSettings} */\n this.parent = parent;\n }\n\n get id() {\n return this._id;\n }\n\n get daysOfWeek() {\n return this._daysOfWeek;\n }\n set daysOfWeek(newValue) {\n this.parent.markAsHasChanges();\n this._daysOfWeek = newValue\n }\n\n get blackHours() {\n return this._blackHours;\n }\n set blackHours(newValue) {\n this.parent.markAsHasChanges();\n this._blackHours = newValue\n }\n\n get blackGrade() {\n return this._grade;\n }\n set blackGrade(newValue) {\n this.parent.markAsHasChanges();\n this._grade = newValue;\n }\n\n get taskTypeId() {\n return this._taskTypeId;\n }\n set taskTypeId(newValue) {\n this.parent.markAsHasChanges();\n this._taskTypeId = newValue;\n }\n\n /**\n * @param {Intl.LocalesArgument} lang\n */\n blackHoursInfo(lang) {\n const hourFormat = useDataStore().hourFormat;\n return timeRangeInformation(lang,this.blackHours,3, hourFormat);\n }\n\n /** @returns {BreakBlackoutDto} */\n toDto() {\n /** @type {[number, number]} */\n const blackHours = [this.blackHours[0],this.blackHours[1]];\n return { id: this.id, daysOfWeek: this.daysOfWeek.slice(), blackHours, grade: this._grade, taskTypeId: this.taskTypeId };\n }\n}\n\n/**\n * @param {number} callcenterId\n */\nexport async function getBreakOptimizationSettings(callcenterId) {\n /** @type {BreakOptimizationSettingsDto} */\n let dto = await fetchAndCheckJson(`break-optimization-settings?ccId=${callcenterId}`, 'GET');\n if (!dto) {\n dto = {\n callcenterId, breakStartQuarterHours: true,\n spreadFactor: 50, avoidSimultanousBreaksFactor: 50, numberOfIterations: 1, blackouts: []\n };\n }\n return new BreakOptimizationSettings(dto);\n}","\nexport class EmployeeContext {\n constructor() {\n /** @private @type {Set<number>} */\n this.highlightedEmpIds = new Set();\n /** @private @type {number[]} */\n this._checkedEmpIds = [];\n /** @private @type {number} */\n this._activeTab = 0;\n /** @type {number} */\n this.previousTab = 0;\n /** @type {string} */\n this.selectedSection = 'general';\n /** @private @type {boolean} */\n this._hasCheckedNotHighlighted = false;\n /** @private @type {boolean} */\n this._hasModifiedData = false;\n /** @private @type {number} */\n this._modifedDataTab = 0;\n /** @type {null|import(\"@/shared/dn-employee.js\").Employee} */\n this.selectedEmp = null;\n }\n\n get activeTab() {\n return this._activeTab;\n }\n set activeTab(value) {\n this.previousTab = this._activeTab;\n this._activeTab = value;\n }\n\n get checkedEmpIds() {\n return this._checkedEmpIds;\n }\n set checkedEmpIds(value) {\n /** @type {number[]} */\n this.oldCheckedEmpIds = this._checkedEmpIds;\n this._checkedEmpIds = value;\n this.calcHasCheckedNotHighlighted();\n }\n\n get hasCheckedNotHighlighted() {\n return this._hasCheckedNotHighlighted;\n }\n\n get hasModifiedData() {\n return this._hasModifiedData;\n }\n set hasModifiedData(value) {\n if (this._hasModifiedData !== value) {\n this._hasModifiedData = value;\n if (value) {\n this._modifedDataTab = this.activeTab;\n }\n }\n }\n\n get hasModifiedDataInOtherTab() {\n return this.hasModifiedData && this._modifedDataTab !== this.activeTab;\n }\n\n /** @private */\n calcHasCheckedNotHighlighted() {\n let newValue = false;\n for (const empid of this._checkedEmpIds) {\n if (!this.highlightedEmpIds.has(empid)) {\n newValue = true;\n break;\n }\n }\n\n if (this._hasCheckedNotHighlighted !== newValue) {\n this._hasCheckedNotHighlighted = newValue;\n }\n }\n\n /**\n * @param {number} empId\n */\n isHighlighted(empId) {\n return this.highlightedEmpIds.has(empId);\n }\n\n /**\n * @param {Iterable<number>} empIds\n */\n setHighlighedEmps(empIds) {\n /** @type {Set<number>} */\n this.oldHighlightedEmpIds = this.highlightedEmpIds;\n this.highlightedEmpIds = new Set(empIds);\n this.calcHasCheckedNotHighlighted();\n }\n\n revertModifiedData() {\n this.hasModifiedData = false;\n if (this.selectedEmp) {\n this.selectedEmp.revert();\n }\n }\n\n reset() {\n this.selectedEmp = null;\n this._checkedEmpIds = [],\n this.highlightedEmpIds = new Set([]);\n }\n}","\nexport class EmployeeList {\n constructor() {\n /** @private @type {boolean} */\n this._hasChanges = false;\n /** @private @type {import(\"@/shared/dn-employee.js\").Employee[]} */\n this._list = [];\n }\n\n get hasChanges() {\n return this._hasChanges;\n }\n\n get list() {\n return this._list\n }\n\n /**\n * @param {import(\"@/shared/dn-employee.js\").Employee} employee\n */\n add(employee) {\n employee.setContainer(this);\n const list = this.list.slice();\n const numberOfGhosts = list.filter(x => x.ghost ).length;\n\n let index =-1\n for(let i=0;i<list.length;i++){\n const emp= list[i]\n if(employee.ghost){\n if(emp.ghost&&emp.name.toLowerCase()>employee.name.toLowerCase()){\n index=i\n break\n }\n }\n else{\n if(emp.name.toLowerCase()>employee.name.toLowerCase()){\n index=i\n break\n }\n }\n }\n\n if(index>-1){\n list.splice(index,0,employee)\n }\n else{\n if(employee.ghost){\n list.push(employee);\n }else{\n list.splice(list.length-numberOfGhosts,0,employee)\n }\n \n }\n this._list = list \n }\n\n /**\n * @param {number} employeeId\n */\n deleteEmployee(employeeId) {\n const employees = this.list.slice();\n const index = employees.findIndex(x => x.id === employeeId);\n employees.splice(index, 1);\n this._list = employees;\n this.setHasChanged();\n }\n\n /**\n * @param {import(\"@/shared/dn-employee.js\").Employee[]} employees\n */\n load(employees) {\n this._list = employees;\n for (const t of this._list) {\n t.setContainer(this)\n }\n this._hasChanges = false;\n }\n\n /**\n * @param {boolean} hasChanges\n */\n itemHasChanged(hasChanges) {\n if (hasChanges !== this._hasChanges) {\n if (hasChanges) {\n this._hasChanges = true;\n } else {\n this.setHasChanged();\n }\n }\n }\n\n /**\n * @param {number} id\n */\n getById(id) {\n const employees = this.list;\n let employee = {};\n for (let i = 0; i < employees.length; i++) {\n if (employees[i].id === id) {\n employee = employees[i]\n }\n }\n return employee\n }\n\n /** @private */\n setHasChanged() {\n this._hasChanges = this._list.some(x => x.hasChanges);\n }\n}","import { addUndoTransaction } from \"@/js/dn-undo.js\";\nimport { Task } from \"@/shared/dn-task.js\";\n\nexport class ScheduleTask extends Task {\n /**\n * @param {import(\"@/shared/dn-task.js\").TaskDto} dto\n */\n constructor(dto) {\n super(dto)\n }\n\n get st() {\n return super.st;\n }\n set st(newValue) {\n addUndoTransaction(this.id, this.st, null, null);\n super.st = newValue;\n }\n\n get fi() {\n return super.fi;\n }\n set fi(newValue) {\n addUndoTransaction(this.id, null, this.fi, null);\n super.fi = newValue;\n }\n\n get tasktypeId() {\n return super.tasktypeId;\n }\n set tasktypeId(newValue) {\n addUndoTransaction(this.id, null, null, this.tasktypeId);\n super.tasktypeId = newValue;\n }\n\n get dur() {\n return super.dur;\n }\n set dur(newValue) {\n addUndoTransaction(this.id, null, this.fi, null);\n super.dur = newValue;\n }\n\n get durationDate() {\n return super.durationDate;\n }\n set durationDate(newValue) {\n addUndoTransaction(this.id, null, this.fi, null);\n super.durationDate = newValue;\n }\n\n toDelete() {\n super.toDelete();\n addUndoTransaction(this.id, null, null, null, null, true);\n }\n}\n\nexport class ScheduleTasks {\n constructor() {\n /** @private @type {boolean} */\n this._hasChanges = false;\n /** @private @type {ScheduleTask[]} */\n this._list = null;\n }\n\n get hasChanges() {\n return this._hasChanges;\n }\n\n get isLoaded() {\n return this._list !== null;\n }\n\n get list() {\n return this._list;\n }\n\n /**\n * @param {import(\"@/shared/dn-task.js\").TaskDto} taskDto\n */\n add(taskDto) {\n const task = new ScheduleTask(taskDto);\n addUndoTransaction(task.id, null, null, null, true, null)\n task.setContainer(this);\n this.list.push(task);\n this._hasChanges = true;\n return task;\n }\n\n clear() {\n this._list = [];\n this._hasChanges = false;\n }\n\n /**\n * @param {boolean} hasChanges\n */\n itemHasChanged(hasChanges) {\n if (hasChanges !== this._hasChanges) {\n if (hasChanges) {\n this._hasChanges = true;\n } else {\n this.setItemHasChanges();\n }\n }\n }\n\n /**\n * @param {ScheduleTask[]} tasks\n */\n load(tasks) {\n for (const t of tasks) {\n t.setContainer(this)\n }\n\n this._list = tasks;\n this.setItemHasChanges();\n }\n\n setItemHasChanges() {\n this._hasChanges = this._list.some(x => x.hasChanges);\n }\n\n removeUnsavedDeletedTasks() {\n const scheduleTasks = this.list;\n for (let i = scheduleTasks.length - 1; i >= 0; i--) {\n if (scheduleTasks[i].isToDelete && scheduleTasks[i].id < 0) {\n scheduleTasks.splice(i, 1);\n }\n }\n }\n}\n","import { defineStore } from 'pinia';\nimport { shallowReactive } from 'vue';\nimport { useDataStore } from \"@/stores/dataStore.js\";\nimport { forecastData } from '@/stores/dn-forecast-data.js';\nimport { forecastAiData } from '@/stores/dn-forecast-ai-data.js';\nimport { specialDayData } from '@/stores/dn-special-day-data.js';\nimport { useForecastStore } from '@/stores/forecastStore.js';\nimport { Availabilities } from '@/model/dn-availability.js'\nimport { AvailabilityRequests } from '@/model/dn-availability-request';\nimport { getBreakOptimizationSettings } from '@/model/dn-break-optimization-settings';\nimport { EmployeeContext } from '@/model/dn-employee-context.js';\nimport { getAffintyIndicators } from \"@/js/dn-employee-helper.js\";\nimport { EmployeeList } from '@/model/dn-employee-list.js';\nimport { EmployeeScheduleList } from '#shared/dn-employee-schedule';\nimport { fetchAndCheckJson } from '@/js/dn-fetch.js';\nimport { getEmployees } from '@/js/dn-fetch-employee.js';\nimport { getTasks, getScheduleTasksSync, updateScheduleTasks } from '@/js/dn-fetch-schedule.js';\nimport { getNumberOfDaysFromIntervalMinusOne } from \"@/js/dn-helper.js\";\nimport { addDays, getDayDiff, getShortDate } from '@/shared/dn-shared-helper.js';\nimport { getRotations } from '@/model/dn-rotation.js';\nimport { getShiftBags } from '@/model/dn-optimizable-shift.js';\nimport columnDefinitions from \"@/jso/dn-column-definitions.json\";\nimport columnDefinitionsDetailed from \"@/jso/dn-column-definitions-detailed.json\";\nimport { getCustomShifts } from '@/model/dn-custom-shift.js';\nimport columnDefinitionsServiceLevel from \"@/jso/dn-serviceLevelColumns.json\";\nimport { getLatestPublishedDate } from \"@/js/dn-schedule-helper.js\";\nimport { getSimData, SimState } from '@/js/dn-simulation.js';\nimport { getCurrentCCId, getLastAgentScheduleOptions, getLastScheduleOptions, getRequestFilterOptions, getScheduleColumnIds, getEmployeeDisplaySettings, getSimulationSettings, setScheduleColumnIds } from '@/js/dn-localStorage';\nimport { getScheduleRequest } from '@/model/dn-schedule-request.js';\nimport { ScheduleTask, ScheduleTasks } from '@/model/dn-schedule-task.js';\nimport { EventBus } from \"@/js/dn-event-bus.js\";\nimport { DateInterval } from '#shared/dn-date-interval';\nimport {getRevisionMap,decrementUndoRevision,incrementUndoRevision,resetUndo,addRedoTransaction} from \"@/js/dn-undo.js\";\n\n\n/** \n * dateKeys already retrieved from database and up to date until given id:s\n * @type {{loaded:number[]; last?:{id:number;histId:number}}} \n */\nconst _scheduleTaskInfo = { loaded: [] };\n\nexport const useScheduleStore = defineStore('schedule', {\n state: () => ({\n affintyIndicatorsMap: null,\n availabilityRequests: new AvailabilityRequests(),\n availabilities: shallowReactive(new Availabilities()),\n /**@type {import(\"@/model/dn-break-optimization-settings.js\").BreakOptimizationSettings} */\n breakOptimizationSettings: null,\n customShifts: [],\n employeeContext: shallowReactive(new EmployeeContext()),\n employees: shallowReactive(new EmployeeList()),\n employeeDisplaySettings: {\n workTimeWarning: true,\n skillsWarning: true,\n shiftWarning: true,\n switchIdWarning: true,\n hasMobileApp: true,\n breakWarnings: true,\n multiEditSameValue: false\n },\n inspectorPanel: {\n timespan: 2.0,\n stQ: 0,\n runningStQ: 0,\n hideTimeSpan: false,\n serviceLevel: true,\n },\n loadCCData: false,\n pinnedRequestKey: 0,\n /** @type {import(\"@/model/dn-rotation\").Rotations} */\n rotations: null,\n schedule: shallowReactive(new EmployeeScheduleList()),\n scheduleColumnDefinitions: getScheduleColumnDefinitions(),\n scheduleColumnDefinitionsDetailed: getScheduleColumnDefinitionsDetailed(),\n scheduleOptions: {\n /** @type {Date[]} */\n dateInterval: [],\n /** @type {Map<string, {dt:Date; emp:import(\"@/shared/dn-employee.js\").Employee}>} */\n selection: new Map(), //key:getSelectionKey(dt,emp.empid) value:{emp:emp,dt:dt})\n currentSortMap: new Map(),//key:row index 0,1,2... value:emp\n /** @type {{st:number;fi:number;ttid:number}[][]} */\n copiedShifts: [],\n dragSelectionStart: {}, //{emp:emp,dt:dt}\n showServiceLevel: false,\n showDetailsInServiceLevel: false,\n showOccupancyChart: false,\n showAvgQueueChart: false,\n showWaitWithinChart: false,\n showWorkChart: false,\n showEmployeeOccupancy: false,\n showReplacementDialog: false,\n dispalySimulationSettings: false,\n showInactive: false,\n showDetailEdit: false,\n showRequestTile: false,\n selectedEmpId: 0,\n numberOfSimIterations: 1,\n autoSimulate: true,\n autoKeyFigures: false,\n numberOfDaysInSchedule: 7, //\n agentScheduleViewClock: true,\n agentScheduleDarkView: false,\n agentExpandedTeamView: false,\n agentAcceptedCookies: undefined,\n selectedDate: new Date(0),\n selectedDateInTeamSchedule: new Date(0),\n findReplacementSelected: false,\n scheduleFilter: { show: false, searchText: '', affinity: null, callGroups: [], taskTypes: [], tagIds: [], filterMsg: '', applyToChart: false,includeTerminated: false },\n chartDisplay: { erlangC: false, target: true, smooth: false, chartInspector: false, fixedY: false, fixedYvalue: 10, servicelevelPercentForWarning: 60, breaks: false,deviationTooFewBars:true,deviationTooManyBars:true },\n workChartHeight: 160,\n adherence: { showLog: false, showWorkWarnings: false, showBreakWarnings: false, showAdherenceWarnings: false, showInRotation: false },\n meetingSettings:{meetingLastTasktypeId:null,lastStartMinute:60*9,lastStartMinuteMax:60*16,lastDurationMinute:60,onlyOnShift:true,flexStart:false},\n notifications:{onScheduleChange:false},\n scheduleIndicators:{highlightBeforeSave:false,unsavedIndicators:false},\n saveButtonHovered:false,\n virtualScrollerOptions:{}//itemSize: 27\n },\n scheduleRequestData: {\n /** @type {Map<number, import(\"@/model/dn-schedule-request.js\").ScheduleRequest>} */\n byId: new Map(),\n /** @type {Map<string, import(\"@/model/dn-schedule-request.js\").ScheduleRequest>} */\n bySelectionKey: new Map(),\n /** @type {import(\"@/model/dn-schedule-request.js\").ScheduleRequest[]} */\n items: [],\n loaded: new Date(0),\n /** @type {number} */\n employeeId: null,\n /** @type {number} */\n ccId: null,\n },\n scheduleRequestSettings: {\n showSick: true,\n showVacation: true,\n showFree: true,\n showWork: true,\n showAvailability: false,\n showUnavailability: true,\n showPending: true,\n showFuture: false,\n showBasedOnSelection: false,\n showApproved: false,\n showRejected: false,\n showHistoric: false,\n tagId: 0\n },\n scheduleTasks: shallowReactive(new ScheduleTasks()),\n /** @type {number[]} */\n selectedScheduleColumnIds: [1, 2, 8, 9],\n serviceLevelColumnDefinitions: getServiceLevelColumnDefinitions(),\n /** @type {{ employeeOccupancyData:import(\"@/js/dn-simulation.js\").EmployeeOccupancyData; occChartData:any; serviceLevelDisplayData:any;byAffinity:any }} */\n simData: null,\n simulationStatus: 0,\n simulationSettings: {\n displaySLSencitivity: 4,\n callsPercent: 0,\n handlingTimePercent: 0,\n handlingTimeVariationPercent: 0,\n percetageOfCallsInWaitChart: 80,\n empOccTarget: [35, 80],\n },\n /** @type {import(\"@/model/dn-optimizable-shift\").ShiftBags} */\n shiftBags: null,\n }),\n getters: {\n scheduleDateInteval() {\n const user = useDataStore().currentUser;\n const dateArray = this.scheduleOptions.dateInterval;\n if (!user || dateArray.length === 0) { return undefined; }\n const numberOfDays = 1 + getDayDiff(dateArray[1], dateArray[0]);\n return new DateInterval(dateArray[0], numberOfDays, user.timezoneUI);\n },\n getAffintyIndicatorsMap() {\n if (!this.affintyIndicatorsMap) {\n this.affintyIndicatorsMap = getAffintyIndicators(this.employees.list, 100);\n }\n return this.affintyIndicatorsMap;\n },\n getNumberOfDaysInSchedule() {\n if (this.scheduleOptions.dateInterval.length === 0) { return 0; }\n return getNumberOfDaysFromIntervalMinusOne(this.scheduleOptions.dateInterval);\n },\n scheduleNeedsToSave() {\n const currentUser = useDataStore().currentUser;\n if (currentUser === null || !currentUser.canEditScheduling)\n return false;\n return this.scheduleRequestData.items.some(x => x.isPending) ||\n (this.scheduleTasks.hasChanges && this.scheduleTasks.list.some(x => x.hasChanges && isAllowedToSave(x))) ||\n this.employees.hasChanges;\n }\n\n },\n actions: {\n undo(){\n decrementUndoRevision()\n const revisionMap = getRevisionMap()\n const undoMap = revisionMap.undo\n const redoMap = revisionMap.redo\n let changedDates=[]\n \n for (let key of undoMap.keys()) {\n let v=undoMap.get(key)\n let t=this.scheduleTasks.list.find((item) => item.id === key);\n\n\n //a task not saved and deleted is not icluded in scheduleTasks.list\n //and can not be reverted\n\n if(t){\n if(v.isNew||v.isDeleted){\n addRedoTransaction(redoMap,t.id,t.st,t.fi,t.tasktypeId,!v.isNew,!v.isDeleted)\n }else{\n addRedoTransaction(redoMap,t.id,t.st,t.fi,t.tasktypeId,false,false)\n } \n \n t.revertTo(v.st,v.fi,v.tasktypeId,v.isNew,v.isDeleted)\n let dt = getShortDate(t.st)\n if(!changedDates.includes(dt)){changedDates.push(dt)}\n }\n \n EventBus.emit(\"schedulePerDtChange\",changedDates);\n }\n \n },\n\n redo(){\n incrementUndoRevision(true)\n const revisionMap = getRevisionMap()\n let changedDates=[]\n let redoMap = revisionMap.redo\n \n for (let key of redoMap.keys()) {\n let v=redoMap.get(key)\n let t=this.scheduleTasks.list.find((item) => item.id === key);\n t.revertTo(v.st,v.fi,v.tasktypeId,v.isNew,v.isDeleted)\n let dt = getShortDate(t.st)\n if(!changedDates.includes(dt)){changedDates.push(dt)}\n }\n EventBus.emit(\"schedulePerDtChange\",changedDates);\n \n },\n\n clearScheduleFilter() {\n const scheduleFilter = this.scheduleOptions.scheduleFilter;\n scheduleFilter.affinity = null;\n scheduleFilter.applyToChart = false;\n scheduleFilter.show = true;\n scheduleFilter.searchText = '';\n scheduleFilter.callGroups = [];\n scheduleFilter.taskTypes = [];\n scheduleFilter.tagIds = [];\n //scheduleFilter.filterMsg = '';\n },\n clearScheduleTasks() {\n _scheduleTaskInfo.loaded = [];\n _scheduleTaskInfo.last = undefined;\n this.scheduleTasks.clear();\n this.scheduleOptions.selection = new Map();\n this.scheduleOptions.selectedEmpId = 0;\n },\n /**\n * @param {import(\"@/js/dn-simulation.js\").OutputSpec} outputSpec\n */\n fetchSimData(outputSpec) {\n const dataStore = useDataStore();\n const forecastStore = useForecastStore();\n\n this.resetSimulationsStatus();\n\n const affinities = dataStore.affinities;\n const ccCallGroups = dataStore.callGroupsCurrentCC;\n const taskTypes = dataStore.taskTypes;\n /** @type {Set<number|null>} */\n const affinintyIdSet = new Set();\n for (const cg of ccCallGroups) {\n affinintyIdSet.add(cg.affinity);\n }\n\n const schedule = this.schedule.list;\n const byAffinity = [];\n for (const affinityId of affinintyIdSet) {\n const simState = new SimState(taskTypes, dataStore.dateNow, forecastStore.forecastAdjustmentmap,\n forecastStore.forecastOptions, forecastData.historicDataMap,forecastAiData.forecastDataMap, this.simulationSettings,\n specialDayData.specialDaysMap, ccCallGroups, dataStore.latestImportDate, dataStore.employeeCallcenters, dataStore.currentCC.id, affinityId);\n const simData = getSimData(\n outputSpec,\n simState,\n this.scheduleOptions,\n schedule,\n (p) => { this.simulationStatus = p; },\n );\n byAffinity.push({ affinityId: affinityId, simData });\n }\n\n\n /** @type {import(\"@/js/dn-simulation.js\").ServicelevelDisplayData[]} */\n let serviceLevelDisplayData = undefined;\n if (outputSpec.sl) {\n if (byAffinity.length === 1) {\n serviceLevelDisplayData = byAffinity[0].simData.serviceLevelDisplayData;\n } else if (byAffinity.length > 1) {\n serviceLevelDisplayData = [];\n for (const r of byAffinity) {\n for (const sldd of r.simData.serviceLevelDisplayData) {\n if (sldd.acgrid === null) {\n const affinity = affinities.find(x => x.id === sldd.affinity)\n if (affinity) {\n sldd.name = 'SL ' + affinity.name;\n }\n }\n serviceLevelDisplayData.push(sldd);\n }\n }\n }\n }\n\n /** @type {import(\"@/js/dn-simulation.js\").EmployeeOccupancyData} */\n let employeeOccupancyData;\n if (outputSpec.employeeOccupancy) {\n if (byAffinity.length === 1) {\n employeeOccupancyData = byAffinity[0].simData.employeeOccupancyData;\n } else if (byAffinity.length > 1) {\n employeeOccupancyData = new Map();\n for (const r of byAffinity) {\n for (const [employeeId, occ] of r.simData.employeeOccupancyData) {\n let totOcc = employeeOccupancyData.get(employeeId);\n if (totOcc === undefined) {\n totOcc = new Array(occ.length).fill(0);\n employeeOccupancyData.set(employeeId, totOcc);\n }\n for (let i = 0; i < totOcc.length; i++) {\n totOcc[i] = totOcc[i] + occ[i];\n }\n }\n }\n }\n }\n\n /** @type {import(\"@/js/dn-simulation.js\").ChartData[]} */\n let occChartData = undefined;\n if (outputSpec.occ) {\n if (byAffinity.length === 1) {\n occChartData = byAffinity[0].simData.occChartData;\n } else if (byAffinity.length > 1) {\n occChartData = [];\n for (const r of byAffinity) {\n for (const cd of r.simData.occChartData) {\n if (r.affinityId) {\n const affinity = affinities.find(x => x.id === r.affinityId)\n if (affinity) {\n cd.label = 'Occ. ' + affinity.name;\n }\n }\n occChartData.push(cd)\n }\n }\n }\n }\n\n const simData = {\n employeeOccupancyData,\n occChartData,\n serviceLevelDisplayData,\n byAffinity\n };\n\n this.simData = simData;\n },\n async loadAvailabilities() {\n this.availabilities.load(useDataStore().currentCC.id);\n },\n /**\n * @param {number} ccId\n */\n async loadBreakOptimizationSettings(ccId) {\n this.breakOptimizationSettings = await getBreakOptimizationSettings(ccId);\n },\n async loadCurrentCCData() {\n const dataStore = useDataStore();\n if (!dataStore.employeeCallcenters.isLoaded) {\n dataStore.employeeCallcenters.load();\n }\n this.shiftBags = null;\n this.rotations = null;\n this.availabilities.clear();\n this.zeroSchedule();\n resetUndo()\n if (dataStore.currentCC) {\n const ccId = dataStore.currentCC.id;\n this.loadCCData = this.loadCCData || !dataStore.currentUser.isAgent;\n if (this.loadCCData) {\n this.availabilityRequests.init(ccId, false);\n } else {\n this.availabilityRequests.init(dataStore.currentUser.employee.id, true);\n }\n this.loadScheduleRequests();\n this.availabilities.load(ccId);\n if (!dataStore.currentUser.isAgent) {\n this.loadBreakOptimizationSettings(ccId);\n this.loadCustomShifts(ccId);\n this.loadShiftBags(ccId);\n this.loadRotations(ccId);\n }\n await this.loadEmployees(ccId);\n }\n },\n /**\n * @param {number} ccId\n */\n async loadEmployees(ccId) {\n const employees = await getEmployees(ccId);\n this.employees.load(employees);\n this.clearScheduleTasks();\n this.affintyIndicatorsMap = null;\n },\n /**\n * @param {number} ccId\n */\n async loadRotations(ccId) {\n this.rotations = await getRotations(ccId);\n },\n /**\n * @param {number} ccId\n */\n async loadShiftBags(ccId) {\n this.shiftBags = await getShiftBags(ccId);\n },\n /**\n * @param {number} ccId\n */\n async loadCustomShifts(ccId) {\n this.customShifts = await getCustomShifts(ccId);\n },\n loadLocalAgentScheduleOptions() {\n const scheduleOptions = this.scheduleOptions;\n const localAgentScheduleOptions = getLastAgentScheduleOptions()\n\n if (localAgentScheduleOptions && useDataStore().currentUser.isAgent) {\n scheduleOptions.agentScheduleViewClock = localAgentScheduleOptions.agentScheduleViewClock\n scheduleOptions.agentExpandedTeamView = localAgentScheduleOptions.agentExpandedTeamView\n scheduleOptions.agentScheduleDarkView = localAgentScheduleOptions.agentScheduleDarkView\n scheduleOptions.agentAcceptedCookies=localAgentScheduleOptions.agentAcceptedCookies\n } else {\n scheduleOptions.agentScheduleViewClock = true\n scheduleOptions.agentExpandedTeamView=false\n scheduleOptions.agentScheduleDarkView = false\n scheduleOptions.agentAcceptedCookies=undefined\n }\n },\n loadLocalScheduleOptions() {\n let scheduleOptions = this.scheduleOptions;\n let inspector = this.inspectorPanel;\n let localScheduleOptions = getLastScheduleOptions();\n if (localScheduleOptions) {\n scheduleOptions.showServiceLevel = localScheduleOptions.showServiceLevel\n scheduleOptions.showOccupancyChart = localScheduleOptions.showOccupancyChart\n scheduleOptions.showWorkChart = localScheduleOptions.showWorkChart\n if (localScheduleOptions.workChartHeight > 0) { scheduleOptions.workChartHeight = localScheduleOptions.workChartHeight }\n scheduleOptions.showRequestTile = localScheduleOptions.showRequestTile\n scheduleOptions.showEmployeeOccupancy = localScheduleOptions.showEmployeeOccupancy\n if (!localScheduleOptions.numberOfSimIterations || localScheduleOptions.numberOfSimIterations == 0) {\n scheduleOptions.numberOfSimIterations = 1\n } else { scheduleOptions.numberOfSimIterations = localScheduleOptions.numberOfSimIterations }\n scheduleOptions.autoSimulate = localScheduleOptions.autoSimulate\n scheduleOptions.autoKeyFigures = localScheduleOptions.autoKeyFigures\n scheduleOptions.numberOfDaysInSchedule = localScheduleOptions.numberOfDaysInSchedule\n if (scheduleOptions.numberOfDaysInSchedule > 7) { scheduleOptions.numberOfDaysInSchedule = 7 }\n scheduleOptions.chartDisplay.erlangC = localScheduleOptions.chartDisplayErlangC\n scheduleOptions.chartDisplay.smooth = localScheduleOptions.chartDisplaySmooth\n scheduleOptions.chartDisplay.target = localScheduleOptions.chartDisplayTarget\n scheduleOptions.chartDisplay.chartInspector = localScheduleOptions.chartDisplaychartInspector\n scheduleOptions.chartDisplay.fixedY = localScheduleOptions.chartDisplayFixedY\n if (localScheduleOptions.chartDisplayFixedYvalue && localScheduleOptions.chartDisplayFixedYvalue > 0) scheduleOptions.chartDisplay.fixedYvalue = localScheduleOptions.chartDisplayFixedYvalue\n if (localScheduleOptions.chartDisplayServicelevelPercentForWarning && localScheduleOptions.chartDisplayServicelevelPercentForWarning > 0) scheduleOptions.chartDisplay.servicelevelPercentForWarning = localScheduleOptions.chartDisplayServicelevelPercentForWarning\n\n if(localScheduleOptions.chartDisplayBreaks!==null){scheduleOptions.chartDisplay.breaks=localScheduleOptions.chartDisplayBreaks}\n if(localScheduleOptions.chartDisplayDeviationTooFewBars!==null){ scheduleOptions.chartDisplay.deviationTooFewBars=localScheduleOptions.chartDisplayDeviationTooFewBars}\n if(localScheduleOptions.chartDisplayDeviationTooManyBars!==null){ scheduleOptions.chartDisplay.deviationTooManyBars=localScheduleOptions.chartDisplayDeviationTooManyBars}\n\n \n \n scheduleOptions.adherence.showLog = localScheduleOptions.showLog\n scheduleOptions.adherence.showWorkWarnings = localScheduleOptions.showWorkWarnings\n scheduleOptions.adherence.showBreakWarnings = localScheduleOptions.showBreakWarnings\n scheduleOptions.adherence.showAdherenceWarnings = localScheduleOptions.showAdherenceWarnings\n scheduleOptions.adherence.showInRotation = localScheduleOptions.showInRotation\n\n scheduleOptions.meetingSettings.meetingLastTasktypeId = localScheduleOptions.meetingLastTasktypeId \n if(localScheduleOptions.meetingLastStartMinute){ scheduleOptions.meetingSettings.lastStartMinute = localScheduleOptions.meetingLastStartMinute}\n if(localScheduleOptions.meetingLastStartMinuteMax) {scheduleOptions.meetingSettings.lastStartMinuteMax = localScheduleOptions.meetingLastStartMinuteMax}\n if(localScheduleOptions.meetingLastOnlyOnShift){scheduleOptions.meetingSettings.onlyOnShift = localScheduleOptions.meetingLastOnlyOnShift}\n if(localScheduleOptions.meetingLastFlexStart){scheduleOptions.meetingSettings.flexStart = localScheduleOptions.meetingLastFlexStart}\n if(localScheduleOptions.meetingLastDurationMinute){scheduleOptions.meetingSettings.lastDurationMinute = localScheduleOptions.meetingLastDurationMinute}\n\n if(localScheduleOptions.notifyOnScheduleChange){ scheduleOptions.notifications.onScheduleChange = localScheduleOptions.notifyOnScheduleChange}\n\n if(localScheduleOptions.indicatorsHighlightBeforeSave){ scheduleOptions.scheduleIndicators.highlightBeforeSave = localScheduleOptions.indicatorsHighlightBeforeSave}\n if(localScheduleOptions.indicatorsUnsavedIndicators){ scheduleOptions.scheduleIndicators.unsavedIndicators = localScheduleOptions.indicatorsUnsavedIndicators}\n \n\n if (localScheduleOptions.inspectorPanelTimespan > 0) {\n inspector.timespan = localScheduleOptions.inspectorPanelTimespan\n inspector.hideTimeSpan = localScheduleOptions.inspectorHideTimeSpan\n \n inspector.serviceLevel = localScheduleOptions.inspectorServiceLevel\n }\n }\n this.loadLocalRequestOptions();\n this.loadScheduleColumnIds();\n this.loadEmployeeDisplaySettings();\n },\n loadLocalRequestOptions() {\n let scheduleRequestSettings = this.scheduleRequestSettings;\n let localRequestOptions = getRequestFilterOptions();\n if (localRequestOptions) {\n scheduleRequestSettings.showSick = localRequestOptions.showSick\n scheduleRequestSettings.showVacation = localRequestOptions.showVacation\n scheduleRequestSettings.showFree = localRequestOptions.showFree\n scheduleRequestSettings.showWork = localRequestOptions.showWork\n scheduleRequestSettings.showPending = localRequestOptions.showPending\n scheduleRequestSettings.showHistoric = localRequestOptions.showHistoric\n scheduleRequestSettings.showBasedOnSelection = localRequestOptions.showBasedOnSelection\n scheduleRequestSettings.showFuture = localRequestOptions.showFuture\n scheduleRequestSettings.showApproved = localRequestOptions.showApproved\n scheduleRequestSettings.showRejected = localRequestOptions.showRejected\n scheduleRequestSettings.tagId = localRequestOptions.tagId\n\n }\n },\n loadScheduleColumnIds() {\n const scheduleColumnIds = getScheduleColumnIds();\n if (scheduleColumnIds) {\n this.selectedScheduleColumnIds = scheduleColumnIds;\n }\n },\n loadEmployeeDisplaySettings() {\n const employeeDisplaySettings = getEmployeeDisplaySettings();\n if (employeeDisplaySettings) {\n this.employeeDisplaySettings = employeeDisplaySettings;\n }\n },\n async loadScheduleRequests(merge = false) {\n const currentUser = useDataStore().currentUser;\n if (currentUser === null) { return; }\n const currentData = this.scheduleRequestData;\n const scheduleRequestData = {\n byId: new Map(),\n bySelectionKey: new Map(),\n items: [],\n loaded: new Date(0),\n employeeId: null,\n ccId: null,\n };\n\n if (currentUser.isAgent) {\n if (!this.loadCCData)\n scheduleRequestData.employeeId = currentUser.employee.id;\n scheduleRequestData.ccId = currentUser.employee.ccid;\n } else {\n scheduleRequestData.ccId = getCurrentCCId();\n }\n\n if (scheduleRequestData.ccId) {\n const affectedDates = new Set();\n let items = await getScheduleRequest(scheduleRequestData.ccId, scheduleRequestData.employeeId);\n if (merge) {\n const toStore = [];\n for (const r of items) {\n const local = currentData.byId.get(r.id);\n if (local !== undefined) {\n if (local.needToBeRevertedBeforeUpdate(r)) {\n local.approveToggle(this.scheduleTasks.list, affectedDates);\n }\n local.update(r);\n toStore.push(local);\n } else {\n toStore.push(r);\n }\n }\n\n items = toStore;\n }\n\n scheduleRequestData.items = items;\n scheduleRequestData.byId = new Map(items.map(x => [x.id, x]));\n if (merge) {\n for (const r of currentData.byId.values()) {\n if (scheduleRequestData.byId.get(r.id) === undefined) {\n if (r.isPending && r.isApproved) {\n r.approveToggle(this.scheduleTasks.list, affectedDates);\n }\n }\n }\n }\n\n scheduleRequestData.bySelectionKey = calculateBySelectionKeyMap(scheduleRequestData.items, currentUser.timezoneUI);\n this.loadScheduleAfterScheduleRequest(affectedDates);\n }\n\n this.scheduleRequestData = scheduleRequestData;\n EventBus.emit(\"scheduleChange\");\n },\n loadSchedule() {\n const dataStore = useDataStore();\n /** @type {Date[]} */\n const dateInterval = this.scheduleOptions.dateInterval;\n if (dateInterval.length === 0)\n return;\n\n const numberOfDays = getNumberOfDaysFromIntervalMinusOne(dateInterval)\n const stDate = this.scheduleOptions.dateInterval[0];\n const scheduleTasks = this.scheduleTasks.list;\n const employees = this.employees.list;\n const taskTypes = dataStore.taskTypes;\n this.schedule.load(numberOfDays, stDate, scheduleTasks, taskTypes, employees, this.scheduleOptions.showInactive);\n for (const employeeSchedule of this.schedule.list) {\n employeeSchedule.calculatePaidWork({numberOfDays, st:stDate});\n }\n EventBus.emit('fetchScheduleCompleted');\n EventBus.emit(\"scheduleChange\");\n },\n /**\n * @param {Set<string>} affectedDates\n */\n loadScheduleAfterScheduleRequest(affectedDates) {\n if (affectedDates.size === 0) { return; }\n this.loadSchedule();\n EventBus.emit(\"schedulePerDtChange\", Array.from(affectedDates));\n EventBus.emit(\"scheduleChangeUpdateTaskBars\");\n },\n /**\n * @param {Date[]} timeInterval\n */\n async loadScheduleTasks(timeInterval) {\n const dataStore = useDataStore();\n const numberOfDays = 2 + getNumberOfDaysFromIntervalMinusOne(timeInterval);\n const scheduleTasksToCommit = this.scheduleTasks.list;\n const st = addDays(timeInterval[0], -1);\n const dateIntervals = getTaskDateIntervalsNotYetRetrieved(st, numberOfDays);\n if (dateIntervals.length > 0) {\n const idIsEmp = !this.loadCCData;\n const id = idIsEmp ? dataStore.currentUser.employee.id : dataStore.currentCC.id;\n /** @type {import(\"@/shared/dn-task.js\").TaskDto[]} */\n let scheduleTasks;\n if (_scheduleTaskInfo.last) {\n scheduleTasks = await getTasks(dateIntervals, id, idIsEmp);\n } else {\n const last = { id: 0, histId: 0 };\n const tasksWithLast = await getScheduleTasksSync(dateIntervals, id, idIsEmp, last);\n scheduleTasks = tasksWithLast.tasks;\n _scheduleTaskInfo.last = tasksWithLast.last;\n }\n\n for (let i = 0; i < scheduleTasks.length; i++) {\n scheduleTasksToCommit.push(new ScheduleTask(scheduleTasks[i]))\n }\n\n this.scheduleTasks.load(scheduleTasksToCommit);\n }\n\n await this.availabilityRequests.load(timeInterval[0]);\n\n /**\n * @param {Date} st\n * @param {number} numberOfDays\n */\n function getTaskDateIntervalsNotYetRetrieved(st, numberOfDays) {\n const returnArray = []\n for (let d = 0; d < numberOfDays; d++) {\n const xSt = addDays(st, d); //eg:Wed Apr 01 2020 00:00:00 GMT+0200 (centraleuropeisk sommartid)\n let xNumberOfDays = 0\n let dtKey = xSt.getTime();\n if (!_scheduleTaskInfo.loaded.includes(dtKey)) {\n do {\n d++\n dtKey = addDays(st, d).getTime();\n xNumberOfDays++\n } while (!_scheduleTaskInfo.loaded.includes(dtKey) && d < numberOfDays)\n returnArray.push({ numberOfDays: xNumberOfDays, st: xSt })\n }\n }\n\n //update cach info\n for (let i = 0; i < returnArray.length; i++) {\n for (let d = 0; d < returnArray[i].numberOfDays; d++) {\n _scheduleTaskInfo.loaded.push(addDays(returnArray[i].st, d).getTime())\n }\n }\n\n return returnArray\n }\n },\n async refreshScheduleTasks() {\n const dataStore = useDataStore();\n\n _scheduleTaskInfo.loaded.sort();\n const dateIntervals = getLoadedDateIntervals();\n\n if (dateIntervals.length === 0) { return false; }\n const idIsEmp = !this.loadCCData;\n const id = idIsEmp ? dataStore.currentUser.employee.id : dataStore.currentCC.id;\n await this.availabilityRequests.refresh();\n const wasChanged = await updateScheduleTasks(dateIntervals, id, idIsEmp, _scheduleTaskInfo.last, this.scheduleTasks);\n this.scheduleTasks.setItemHasChanges();\n if (wasChanged) {\n this.loadSchedule();\n }\n },\n loadSimulationSettings() {\n const simulationSettings = getSimulationSettings();\n if (simulationSettings) {\n this.simulationSettings = simulationSettings;\n }\n },\n resetSimulationsStatus() {\n this.simulationStatus = 0;\n },\n saveScheduleColumnIds() {\n setScheduleColumnIds(this.selectedScheduleColumnIds);\n },\n \n\n async saveScheduleTasks() {\n await this.loadScheduleRequests(true);\n const scheduleTasksInStore = this.scheduleTasks.list;\n\n const scheduleRequests = this.scheduleRequestData.items;\n const changedRequests = scheduleRequests.filter(x => x.isPending);\n const hasChangedRequests = changedRequests.length > 0;\n console.log('saving scheduled tasks');\n\n /** @type {import(\"@/shared/dn-task.js\").Task[]} */\n const taskToCreate = [];\n /** @type {import(\"@/shared/dn-task.js\").Task[]} */\n const taskToUpdate = [];\n /** @type {import(\"@/shared/dn-task.js\").Task[]} */\n const taskToDelete = [];\n for (let i = 0; i < scheduleTasksInStore.length; i++) {\n if (isAllowedToSave(scheduleTasksInStore[i])) {\n if (!scheduleTasksInStore[i].isToDelete) {\n if (scheduleTasksInStore[i].hasChanges) {\n if (scheduleTasksInStore[i].id <0) {\n taskToCreate.push(scheduleTasksInStore[i])\n }\n else {\n taskToUpdate.push(scheduleTasksInStore[i])\n }\n }\n } else {\n taskToDelete.push(scheduleTasksInStore[i])\n }\n }\n }\n if (taskToCreate.length > 0 || taskToDelete.length > 0 || taskToUpdate.length > 0 || changedRequests.length > 0) {\n try {\n do {\n const createWeight = 6;\n const updateWeight = 7;\n const requestWeight = 50;\n let left = 50000;\n\n const deleteItems = taskToDelete.splice(0, Math.min(taskToDelete.length, left));\n const deleteBatch = deleteItems.map(x => x.id);\n left -= deleteBatch.length;\n\n const updateItems = taskToUpdate.splice(0, Math.min(taskToUpdate.length, Math.floor(left / updateWeight)));\n const updateBatch = updateItems.map(t => t.toDto());\n left -= updateBatch.length * updateWeight;\n\n const createItems = taskToCreate.splice(0, Math.min(taskToCreate.length, Math.floor(left / createWeight)));\n const createBatch = createItems.map(t => t.toDto());\n left -= createBatch.length * createWeight;\n\n const requestItems = changedRequests.splice(0, Math.min(changedRequests.length, Math.floor(left / requestWeight)));\n const requestBatch = requestItems.map(x => x.getApiReply());\n left -= requestBatch.length * requestWeight;\n\n const values = await fetchAndCheckJson(`scheduletasks`, 'POST',\n { create: createBatch, delete: deleteBatch, update: updateBatch, requestReplies: requestBatch });\n\n for (let i = 0; i < deleteItems.length; i++) {\n var index = scheduleTasksInStore.indexOf(deleteItems[i]);\n scheduleTasksInStore.splice(index, 1);\n }\n\n for (let i = 0; i < createItems.length; i++) {\n if (values[i].id === null) {\n createItems[i].toDelete();\n } else {\n createItems[i].id = values[i].id;\n createItems[i].confirmChanges();\n }\n }\n\n for (const t of updateItems) {\n t.confirmChanges();\n }\n\n for (const sr of requestItems) {\n sr.setAsNonPending();\n }\n\n } while (taskToCreate.length > 0 || taskToDelete.length > 0 || taskToUpdate.length > 0 || changedRequests.length > 0);\n\n if (hasChangedRequests) {\n await this.loadScheduleRequests(true);\n }\n await this.refreshScheduleTasks();\n } catch (error) {\n console.error(error.message)\n }\n }\n },\n setLoadCCData() {\n if (!this.loadCCData) {\n this.loadCCData = true;\n this.clearScheduleTasks();\n const cc = useDataStore().currentCC;\n if (cc) {\n this.availabilityRequests.init(cc.id, false);\n }\n }\n },\n /**\n * @param {number} id\n */\n toggleScheduleColumn(id) {\n const tmp = this.selectedScheduleColumnIds;\n const selectedColumns = [];\n let found = false;\n tmp.forEach(item => {\n if (item === id) {\n found = true;\n } else {\n selectedColumns.push(item);\n }\n });\n if (!found) {\n const column = this.scheduleColumnDefinitions.find((item) => item.id === id);\n selectedColumns.push(column.id);\n }\n selectedColumns.sort((a, b) => a - b);\n this.selectedScheduleColumnIds = selectedColumns;\n },\n zeroSchedule() {\n this.schedule.clear(); //force tableSchedule to reloag when filtering, needed for scheduleOptions.currentSortMap\n }\n }\n});\n\n/** @returns {{st:Date; numberOfDays:number}[]} */\nfunction getLoadedDateIntervals() {\n const dateIntervals = [];\n\n const msPerDay = 1000 * 60 * 60 * 24;\n /** @type {Date|null} */\n let st = null;\n let numberOfDays = 0;\n let last = 0;\n for (const msSinceEpoch of _scheduleTaskInfo.loaded) {\n if (st === null) {\n st = new Date(msSinceEpoch);\n numberOfDays = 1;\n } else if (Math.round((msSinceEpoch - last) / msPerDay) > 1) {\n dateIntervals.push({ st, numberOfDays });\n st = new Date(msSinceEpoch);\n numberOfDays = 1;\n } else {\n numberOfDays += 1;\n }\n last = msSinceEpoch;\n }\n if (st !== null) {\n dateIntervals.push({ st, numberOfDays });\n }\n return dateIntervals;\n}\n\nfunction getScheduleColumnDefinitions() {\n return columnDefinitions;\n}\n\nfunction getScheduleColumnDefinitionsDetailed() {\n return columnDefinitionsDetailed;\n}\n\nfunction getServiceLevelColumnDefinitions() {\n return columnDefinitionsServiceLevel;\n}\n\n/**\n * @param {import(\"@/model/dn-schedule-request.js\").ScheduleRequest[]} requests\n * @param {string} timezone\n */\nfunction calculateBySelectionKeyMap(requests, timezone) {\n //set a request map for easy access during schedule rendering\n\n /** @type {Map<string, import(\"@/model/dn-schedule-request.js\").ScheduleRequest>} */\n let requestMap = new Map()\n for (let i = 0; i < requests.length; i++) {\n let keys = requests[i].getSelectionKeys(timezone);\n\n for (let k = 0; k < keys.length; k++) {\n if (!requestMap.has(keys[k])) { requestMap.set(keys[k], requests[i]) }\n //one day may include several requests but the map only includes one item per key.\n //therefor the Map is giving prio to not handled requests\n else if (!requests[i].isApproved || !requests[i].isRejected) {\n requestMap.delete(keys[k])\n requestMap.set(keys[k], requests[i])\n }\n }\n }\n return requestMap;\n}\n\n/**\n * @param {{st:Date}} t\n */\nfunction isAllowedToSave(t) {\n const currentUser = useDataStore().currentUser;\n return !currentUser.isSupervisor || (currentUser.isSupervisor) && t.st <= addDays(getLatestPublishedDate(), 1)\n}","<template>\r\n <div v-if=\"currentUser && !currentUser.isAgent\" style=\"max-width:360px;\">\r\n <template v-if=\"!section || section === 'noti'\">\r\n <p> {{ $t('user.request-notifications') }}</p>\r\n <div style=\"margin-top: 12px;\">\r\n <RadioButton v-model=\"reqNotify\" inputId=\"requestNotifyNo\" :value=\"0\" />\r\n <label for=\"requestNotifyNo\" style=\"margin-left: 0.5rem; cursor: pointer\">{{ $t('user.requests-notify-none')\r\n }}</label>\r\n </div>\r\n <div style=\"margin: 12px 0px;\">\r\n <RadioButton v-model=\"reqNotify\" inputId=\"requestNotifyYes\" :value=\"1\" />\r\n <label for=\"requestNotifyYes\" style=\"margin-left: 0.5rem; cursor: pointer\">{{ $t('user.requests-notify-all')\r\n }}</label>\r\n </div>\r\n <Button v-if=\"canSaveNotify\" type=\"black-button\" @click=\"saveNotifyMethod\" :disabled=\"saveDisabled\">{{ $t('global.save')\r\n }}</Button>\r\n </template>\r\n </div> \r\n <div style=\"margin-top: 10px;\">\r\n <template v-if=\"!section || section === 'security'\">\r\n <p> {{ $t('account.login-authentication-method') }}</p>\r\n <section v-if=\"currentUser\" style=\"margin-top: 10px;\">\r\n <div class=\"radio-field\" >\r\n <RadioButton v-model=\"authMethod\" inputId=\"no-verification\" name=\"no-verification\" :value=0 />\r\n <label for=\"no-verification\">{{ $t('account.no-verification') }}</label>\r\n </div>\r\n <div class=\"radio-field\">\r\n <RadioButton v-model=\"authMethod\" inputId=\"email-verification\" name=\"email-verification\" :value=1 :disabled=\"isEmailDisabled\"/>\r\n <label for=\"email-verification\"> {{ $t('account.email-verification') }}</label>\r\n </div>\r\n <InputText v-if=\"loginId\" autocomplete=\"new-password\" id=\"email\" v-model=\"password2Formatted\" :placeholder=\"$t('account.verification-code')\" maxlength=\"9\" class=\"input-code\"/>\r\n <Button v-if=\"verificationNeeded\" type=\"black-button\" @click=\"sendVerification\">{{\r\n $t('account.send-verification-code') }}</Button>\r\n <Button v-if=\"canSave\" type=\"black-button\" @click=\"saveAuthMethod\" :disabled=\"saveDisabled\">{{ $t('global.save')\r\n }}</Button>\r\n </section>\r\n </template>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport { getSecretFormatting, patchUser } from '@/model/dn-user.js';\r\nimport { sendEmailVerification } from \"@/js/dn-email-helper\";\r\nimport Button from \"@/components/Base/Button.vue\";\r\nimport { useDataStore } from \"@/stores/dataStore.js\";\r\n\r\nexport default {\r\n props: {\r\n section: {type:String}\r\n },\r\n components: { Button },\r\n data: () => {\r\n return {\r\n authMethod: null,\r\n reqNotify: null,\r\n loginId: null,\r\n loginFailed: 0,\r\n password2: '',\r\n password2WithMask: '',\r\n };\r\n },\r\n computed: {\r\n\r\n currentUser() { return useDataStore().currentUser; },\r\n isEmailDisabled() {\r\n const currentUser = this.currentUser;\r\n if (currentUser) {\r\n return !currentUser.isEmail;\r\n }\r\n return true;\r\n },\r\n canSave() {\r\n return this.hasChanges && !this.verificationNeeded;\r\n },\r\n canSaveNotify(){\r\n const currentUser = this.currentUser;\r\n if (currentUser !== undefined) {\r\n return (this.reqNotify !== currentUser.reqNotify);\r\n }\r\n return false;\r\n },\r\n saveDisabled() {\r\n return this.loginId && this.password2.length !== 6;\r\n },\r\n hasChanges() {\r\n const currentUser = this.currentUser;\r\n if (currentUser !== undefined) {\r\n return (this.authMethod !== currentUser.authMethod);\r\n }\r\n return false;\r\n },\r\n verificationNeeded() {\r\n return !this.loginId && this.authMethod === 1 && this.hasChanges;\r\n },\r\n password2Formatted: {\r\n get() {\r\n return this.password2WithMask;\r\n },\r\n /**\r\n * @param {string} val\r\n */\r\n set(val) {\r\n const s = getSecretFormatting(this.password2WithMask, val);\r\n this.password2 = s.password2;\r\n this.password2WithMask = s.password2WithMask;\r\n },\r\n },\r\n },\r\n methods: {\r\n init() {\r\n const currentUser = this.currentUser;\r\n if (currentUser) {\r\n this.authMethod = currentUser.authMethod;\r\n this.reqNotify = currentUser.reqNotify;\r\n }\r\n },\r\n async saveAuthMethod() {\r\n const authMethod = Number(this.authMethod);\r\n\r\n const currentUser = this.currentUser;\r\n if (currentUser && (currentUser.authMethod !== authMethod)) {\r\n const password2 = this.password2;\r\n this.password2 = '';\r\n this.password2WithMask = '';\r\n const ok = await patchUser(currentUser.id, authMethod, this.loginId, password2);\r\n if (ok) {\r\n currentUser.authMethod = this.authMethod;\r\n this.loginFailed = 0;\r\n this.loginId = null;\r\n } else {\r\n this.loginFailed += 1;\r\n if (this.loginFailed >= 3) {\r\n this.loginId = null;\r\n this.loginFailed = 0;\r\n this.$toast.add({severity: 'error',detail: this.$t('account.too-many-verification-attempts'), life: 5000});\r\n } else {\r\n this.$toast.add({severity: 'error',detail: this.$t('account.invalid-verification-code'), life: 5000});\r\n }\r\n }\r\n }\r\n },\r\n async saveNotifyMethod(){\r\n const reqNotify = Number(this.reqNotify);\r\n const currentUser = this.currentUser;\r\n if (currentUser && (currentUser.reqNotify !== reqNotify)){\r\n const ok = await patchUser(currentUser.id, undefined, this.loginId, undefined, reqNotify);\r\n if (ok) {\r\n currentUser.reqNotify = this.reqNotify;\r\n }\r\n }\r\n },\r\n async sendVerification() {\r\n const currentUser = this.currentUser;\r\n const result = await sendEmailVerification(currentUser.email);\r\n this.$toast.add({severity: 'success',detail: this.$t('account.email-with-verification-code-sent-to') + currentUser.email});\r\n this.loginId = result.loginId;\r\n }\r\n },\r\n created() {\r\n this.init();\r\n },\r\n watch: {\r\n currentUser() {\r\n this.init();\r\n }\r\n }\r\n}\r\n\r\n</script>\r\n<style lang=\"scss\" scoped>\r\n@import \"../../assets/css/variables.module.scss\";\r\n.radio-field{\r\n label{\r\n margin-left: 1rem;\r\n cursor: pointer;\r\n }\r\n margin-bottom: 0.5rem;\r\n}\r\n.input-code{\r\n margin-bottom: 10px;\r\n border-radius: 2rem;\r\n width: 100%;\r\n &::placeholder {\r\n color: $grey;\r\n }\r\n}\r\n</style>","import { render } from \"./UserAuthConfig.vue?vue&type=template&id=9b005832&scoped=true\"\nimport script from \"./UserAuthConfig.vue?vue&type=script&lang=js\"\nexport * from \"./UserAuthConfig.vue?vue&type=script&lang=js\"\n\nimport \"./UserAuthConfig.vue?vue&type=style&index=0&id=9b005832&lang=scss&scoped=true\"\n\nimport exportComponent from \"C:\\\\DeepNumbers\\\\GitLab\\\\answerccs\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-9b005832\"]])\n\nexport default __exports__","<template>\n <span>\n <div :class=\"[{ 'has-history':hasHistory },'avatar']\" v-bind:style=\"{backgroundColor:getColor(colorId)}\"> \n \n <div class=\"avatar-text\" >{{ initials}} </div>\n </div>\n </span>\n </template>\n\n \n <script>\n import { COLORS } from '@/js/dn-colors.js';\n import { getColorFromName } from \"@/js/dn-variables\";\n export default {\n props: {\n colorId: { type: Number, required: true },\n initials: { type: String, required: true },\n hasHistory: { type: Boolean, required: false },\n },\n\n data() {\n return {\n\n };\n },\n methods: {\n \n getColor(id){\n let col=getColorFromName(COLORS.byId(this.colorId))\n return col\n },\n \n },\n computed: {\n \n },\n };\n </script>\n \n <style lang=\"scss\" scoped>\n @import \"@/assets/css/variables.module.scss\";\n .avatar {\n display: inline-block;\n border-radius: 25%;\n text-align:center;\n border: 2px solid $dark;\n min-height:10px;\n min-width:10px;\n\n }\n .avatar-text{\n font-size: 14px;\n font-weight: 600; // Semibold\n padding-left: 3px;\n padding-bottom: -1px;\n padding-top: 1px;\n padding-right: 3px;\n color:white;\n min-width: 24px;\n \n }\n .has-history{\n border: 3px solid rgb(2, 2, 2);\n\n }\n\n \n </style>","import { render } from \"./Avatar.vue?vue&type=template&id=8fe8d498&scoped=true\"\nimport script from \"./Avatar.vue?vue&type=script&lang=js\"\nexport * from \"./Avatar.vue?vue&type=script&lang=js\"\n\nimport \"./Avatar.vue?vue&type=style&index=0&id=8fe8d498&lang=scss&scoped=true\"\n\nimport exportComponent from \"C:\\\\DeepNumbers\\\\GitLab\\\\answerccs\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-8fe8d498\"]])\n\nexport default __exports__","<template>\n <PvButton class=\"button simtree-button\" rounded height=\"20px\"\n :class=\"[roundClass,buttonClass,size,buttonPaddingClass,{fitdark: type == 'fitdark' }]\">\n <div class=\"icon-wrapper left\" v-if=\"iconLeft\">\n <Icon :name=\"iconLeft\" :size=\"iconSize\"/>\n </div>\n <span><slot/></span>\n <div class=\"icon-wrapper right\" v-if=\"iconRight\">\n <Icon :name=\"iconRight\" :size=\"iconSize\"/>\n </div>\n </PvButton>\n</template>\n\n<script>\nimport Icon from \"./Icon\";\nexport default {\n components: { Icon },\n props: {\n type: { type: String, default: \"black-button\" },\n iconLeft: { type: String, default: null },\n iconRight: { type: String, default: null },\n expanded: { type: Boolean, default: false },\n size: { type: String },\n round: { type: String },\n loading: { type: Boolean, default: false },\n },\n data() {\n return {};\n },\n computed: {\n buttonClass(){\n if(this.type == 'black-button')return 'black-button'\n if(this.type == 'primary')return 'primary'\n if(this.type == 'blackSpecial')return 'black-special'\n if(this.type == 'blueSpecial')return 'blue-special'\n if(this.type == 'dangerSpecial')return 'danger-special'\n if(this.type == 'testSpecial')return 'test-special'\n if(this.type == 'is-warning')return 'warning'\n if(this.type == 'is-success')return 'success'\n if(this.type == 'is-free')return 'free'\n },\n buttonPaddingClass(){\n if(this.type == 'testSpecial'||this.type == 'blueSpecial'||this.type == 'dangerSpecial')return 'is-special'\n if(this.size == 'is-medium')return 'is-medium-padding'\n if(this.size == 'is-small')return 'is-small-padding'\n if(this.size == 'is-x-small')return 'is-x-small-padding'\n },\n iconSize(){\n if(this.size == 'is-medium')return '24px'\n else if(this.size == 'is-small')return '20px'\n else if(this.size == 'is-x-small')return '16px'\n else return '32px'\n },\n roundClass(){\n if(this.round=='sightly') return 'sightly-round'\n else if(this.round=='none') return 'none-round'\n return '';\n }\n },\n methods: {},\n created() {},\n};\n</script>\n<style lang=\"scss\" scoped>\n@import \"@/assets/css/variables.module.scss\";\n.simtree-button {\n span {\n display: flex;\n justify-content: space-between;\n width: 100%;\n }\n :deep(span) {\n display: flex;\n justify-content: space-between;\n width: 100%;\n }\n &:focus {\n border-color: lighten($black, 5%);\n box-shadow: 0 0 5px 2px rgba($black, 0.1);\n }\n &:active {\n border-color: lighten($black, 5%);\n }\n &.sightly-round{\n border-radius: 4px;\n }\n &.none-round{\n border-radius: 0!important;\n }\n &.is-special {\n padding-left:12px ;\n padding-right:12px ;\n padding-top: -4px;\n padding-bottom: -4px;\n height:36px\n }\n\n\n &.is-medium-padding {\n padding-left:12px ;\n padding-right:12px ;\n min-width: 50px;\n }\n\n &.is-small-padding {\n padding-left:8px ;\n padding-right:6px ;\n min-width: 40px;\n height:40px;\n border-radius: 4px;\n }\n &.is-x-small-padding {\n padding-left:8px ;\n padding-right:6px ;\n min-width: 30px;\n height:30px;\n border-radius: 4px;\n }\n\n &.primary {\n color: $white;\n background-color: $primary;\n width: auto;\n border-color:$stroke7;\n &:hover {\n background-color: lighten( $primary, 4%);\n border-color: $primary-dark;\n }\n\n :deep(.svg) {\n path {\n fill: $white;\n }\n g {\n stroke: $white;\n }\n }\n }\n\n &.black-button {\n color: $white;\n background-color: $black;\n width: auto;\n //border-color:$dark;\n &:hover {\n background-color: lighten($black, 25%);\n }\n\n :deep(.svg) {\n path {\n fill: $white;\n }\n g {\n stroke: $white;\n }\n }\n }\n\n &.success {\n color: $white;\n background-color: $success;\n width: auto;\n //border-color:$dark;\n &:hover {\n background-color: lighten($success, 15%);\n }\n\n :deep(.svg) {\n path {\n fill: $white;\n }\n g {\n stroke: $white;\n }\n }\n }\n\n &.free {\n color: $white;\n background-color: $free;\n width: auto;\n //border-color:$dark;\n &:hover {\n background-color: lighten($free, 15%);\n }\n\n :deep(.svg) {\n path {\n fill: $white;\n }\n g {\n stroke: $white;\n }\n }\n }\n\n\n &.warning {\n color: $black;\n background-color: $warning;\n width: auto;\n //border-color:$dark;\n &:hover {\n background-color: lighten($warning, 15%);\n }\n\n :deep(.svg) {\n path {\n fill: $black;\n }\n g {\n stroke: $black;\n }\n }\n }\n &.blue-special {\n color: $white;\n background-color: $stroke1;\n width: 400px;\n min-width: 400px;\n &:hover {\n background-color: lighten( $stroke1, 15%);\n }\n\n :deep(.svg) {\n path {\n fill: $white;\n }\n g {\n stroke: $white;\n }\n }\n }\n &.danger-special {\n color: $white;\n background-color: $danger;\n width: 400px;\n min-width: 400px;\n &:hover {\n background-color: lighten( $danger, 15%);\n }\n\n :deep(.svg) {\n path {\n fill: $white;\n }\n g {\n stroke: $white;\n }\n }\n }\n &.test-special {\n color: $white;\n background-color: grey;\n width: 400px;\n min-width: 400px;\n &:hover {\n background-color: lighten( grey, 15%);\n color: $black;\n }\n\n :deep(.svg) {\n path {\n fill: $white;\n }\n g {\n stroke: $white;\n }\n }\n }\n &.black-special {\n color: $white;\n background-color: black;\n width: 400px;\n min-width: 400px;\n &:hover {\n background-color: lighten( black, 30%);\n color: $white;\n }\n\n :deep(.svg) {\n path {\n fill: $white;\n }\n g {\n stroke: $white;\n }\n }\n }\n\n \n &.fitdark {\n color: $white;\n background-color: $primary;\n //border-color:$black;\n width: auto;\n &:hover {\n background-color: lighten($dark, 15%);\n }\n\n :deep(.svg) {\n path {\n fill: $white;\n }\n g {\n stroke: $white;\n }\n }\n }\n .icon-wrapper {\n display: inline-block;\n margin-top:1px;\n &.left {\n // float: left;\n margin-right: -5px;\n }\n &.right {\n // float: right;\n margin-left: 0px;\n }\n display: flex;\n\n height: 24px;\n align-items: center;\n }\n .anser-icon:first-child:last-child {\n margin-left: calc(-0.5em - 1px);\n margin-right: calc(-0.5em - 1px);\n }\n}\n\n</style>\n","import { render } from \"./Button.vue?vue&type=template&id=5c5efb27&scoped=true\"\nimport script from \"./Button.vue?vue&type=script&lang=js\"\nexport * from \"./Button.vue?vue&type=script&lang=js\"\n\nimport \"./Button.vue?vue&type=style&index=0&id=5c5efb27&lang=scss&scoped=true\"\n\nimport exportComponent from \"C:\\\\DeepNumbers\\\\GitLab\\\\answerccs\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5c5efb27\"]])\n\nexport default __exports__","<template>\n <span\n class=\"\"\n :class=\"{ buttonRole: role === 'button' }\"\n style=\"{ width: sizePx, height: sizePx }\"\n >\n <!-- <img v-if=\"iconSrc\" :src=\"iconSrc\" svg-inline /> -->\n <InlineSvg\n :src=\"iconSrc\"\n :width=\"size\"\n :height=\"size\"\n class=\"svg\"\n ></InlineSvg>\n </span>\n</template>\n<script>\nimport InlineSvg from \"vue-inline-svg\";\n\nexport default {\n name: \"Icon\",\n components: { InlineSvg },\n data() {\n return {\n icons: {\n add: require(\"@/assets/images/icons/add.svg\"),\n arrow_back: require(\"@/assets/images/icons/arrow_back.svg\"),\n arrows_collapse_vertical: require(\"@/assets/images/icons/arrows-collapse-vertical.svg\"),\n arrows_expand_vertical: require(\"@/assets/images/icons/arrows-expand-vertical.svg\"),\n arrow_down: require(\"@/assets/images/icons/arrow_down.svg\"),\n arrow_forward: require(\"@/assets/images/icons/arrow_forward.svg\"),\n arrow_up: require(\"@/assets/images/icons/arrow_up.svg\"),\n arrow_left_right: require(\"@/assets/images/icons/arrow-left-right.svg\"),\n arrow_right_short: require(\"@/assets/images/icons/arrow-right-short.svg\"),\n arrow_right: require(\"@/assets/images/icons/arrow-right.svg\"),\n arrow_left: require(\"@/assets/images/icons/arrow-left.svg\"),\n box_arrow_in_down: require(\"@/assets/images/icons/box-arrow-in-down.svg\"),\n box_arrow_up: require(\"@/assets/images/icons/box-arrow-up.svg\"),\n building: require(\"@/assets/images/icons/building.svg\"),\n calendar4_range: require(\"@/assets/images/icons/calendar4-range.svg\"),\n chat_left: require(\"@/assets/images/icons/chat_left.svg\"),\n chat_check2_square: require(\"@/assets/images/icons/check2-square.svg\"),\n chevron_up: require(\"@/assets/images/icons/chevron_up.svg\"),\n chevron_down: require(\"@/assets/images/icons/chevron_down.svg\"),\n chevron_left: require(\"@/assets/images/icons/chevron-left.svg\"),\n chevron_right: require(\"@/assets/images/icons/chevron-right.svg\"),\n clock:require(\"@/assets/images/icons/clock.svg\"),\n clock30:require(\"@/assets/images/icons/clock_grey30.svg\"),\n close: require(\"@/assets/images/icons/close.svg\"),\n cup: require(\"@/assets/images/icons/cup.svg\"),\n delete: require(\"@/assets/images/icons/delete.svg\"),\n deletex: require(\"@/assets/images/icons/x-circle.svg\"),\n columns: require(\"@/assets/images/icons/columns.svg\"),\n select: require(\"@/assets/images/icons/select.svg\"),\n gear:require(\"@/assets/images/icons/gear.svg\"),\n grid:require(\"@/assets/images/icons/grid-3x3-gap.svg\"), \n checkmark: require(\"@/assets/images/icons/checkmark.svg\"),\n filter: require(\"@/assets/images/icons/filter.svg\"),\n free: require(\"@/assets/images/icons/calendar-x.svg\"),\n friendlyGhost:require(\"@/assets/images/icons/friendly-ghost.svg\"),\n list:require(\"@/assets/images/icons/list.svg\"),\n list30:require(\"@/assets/images/icons/list_grey30.svg\"),\n meter: require(\"@/assets/images/icons/meter.svg\"),\n meter_temp: require(\"@/assets/images/icons/meter_temp.svg\"),\n more: require(\"@/assets/images/icons/more.svg\"),\n edit: require(\"@/assets/images/icons/edit.svg\"),\n pin: require(\"@/assets/images/icons/pin.svg\"),\n pin_angel: require(\"@/assets/images/icons/pin-angle.svg\"),\n phone: require(\"@/assets/images/icons/phone.svg\"),\n plus: require(\"@/assets/images/icons/plus.svg\"),\n search: require(\"@/assets/images/icons/search.svg\"),\n sick: require(\"@/assets/images/icons/emoji-dizzy-color.svg\"),\n sick_white: require(\"@/assets/images/icons/emoji-dizzy.svg\"),\n sick_thin: require(\"@/assets/images/icons/emoji_dizzy_color_thin.svg\"),\n star: require(\"@/assets/images/icons/star_color.svg\"),\n //swap: require(\"@/assets/images/icons/emoji-laughing-swap.svg\"),\n swap: require(\"@/assets/images/icons/arrow-left-right.svg\"),\n compare_filled: require(\"@/assets/images/icons/bottom_menu_bar/compare_filled.svg\"),\n compare_outline: require(\"@/assets/images/icons/bottom_menu_bar/compare_outline.svg\"),\n trade: require(\"@/assets/images/icons/bottom_menu_bar/arrow-repeat.svg\"),\n clock: require(\"@/assets/images/icons/bottom_menu_bar/clock.svg\"),\n portfolio_filled: require(\"@/assets/images/icons/bottom_menu_bar/portfolio_filled.svg\"),\n portfolio_outline: require(\"@/assets/images/icons/bottom_menu_bar/portfolio_outline.svg\"),\n user: require(\"@/assets/images/icons/bottom_menu_bar/person.svg\"),\n user_outline: require(\"@/assets/images/icons/bottom_menu_bar/user_outline.svg\"),\n upload: require(\"@/assets/images/icons/upload.svg\"),\n update: require(\"@/assets/images/icons/update.svg\"),\n vacation_thin: require(\"@/assets/images/icons/emoji_sunglasses_color2_thin.svg\"),\n vacation: require(\"@/assets/images/icons/emoji-sunglasses-color2.svg\"),\n vacation_white: require(\"@/assets/images/icons/emoji-sunglasses.svg\"),\n work: require(\"@/assets/images/icons/emoji-laughing.svg\"),\n work_sad: require(\"@/assets/images/icons/emoji-frown.svg\"),\n work_glad: require(\"@/assets/images/icons/emoji-wink.svg\"),\n hand_thumbs_down: require(\"@/assets/images/icons/hand-thumbs-down.svg\"),\n hand_thumbs_up: require(\"@/assets/images/icons/hand-thumbs-up.svg\"),\n patch_question: require(\"@/assets/images/icons/patch-question.svg\"),\n schedule_edit: require(\"@/assets/images/icons/bar-chart-steps.svg\"),\n log_edit: require(\"@/assets/images/icons/stopwatch.svg\"),\n stats:require(\"@/assets/images/icons/graph-up.svg\"),\n \n },\n };\n },\n props: {\n name: { type: String, required: true },\n size: { type: String, required: false, default: \"30\" },\n role: { type: String, required: false, default: \"icon\" },\n },\n computed: {\n iconSrc() {\n return this.icons[this.name];\n },\n sizePx() {\n return `${this.size}px`;\n },\n },\n methods: {},\n created() {},\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import \"@/assets/css/variables.module.scss\";\n\n.anser-icon {\n width: 32px;\n height: 32px;\n\n &.buttonRole {\n cursor: pointer;\n &:hover {\n :deep(.svg) {\n path {\n fill: $primary;\n }\n }\n }\n }\n img {\n width: 100%;\n height: 100%;\n object-fit: contain;\n }\n :deep(.svg) {\n path {\n fill: $dark;\n }\n g {\n stroke: none !important;\n }\n }\n}\n</style>\n","import { render } from \"./Icon.vue?vue&type=template&id=ad2637cc&scoped=true\"\nimport script from \"./Icon.vue?vue&type=script&lang=js\"\nexport * from \"./Icon.vue?vue&type=script&lang=js\"\n\nimport \"./Icon.vue?vue&type=style&index=0&id=ad2637cc&scoped=true&lang=scss\"\n\nimport exportComponent from \"C:\\\\DeepNumbers\\\\GitLab\\\\answerccs\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-ad2637cc\"]])\n\nexport default __exports__","<template>\n <PvDialog v-bind:visible=\"active\" aria-role=\"dialog\" modal\n v-on:close=\"$emit('close')\"\n :header=\"title\"\n @update:visible=\"$emit('close')\">\n <div class=\"modal-card\" style=\"width: auto\">\n <section class=\"modal-card-body\">\n <slot name=\"body\"></slot>\n </section>\n <footer class=\"modal-card-foot\" v-if=\"$slots.footer\">\n <slot name=\"footer\"></slot>\n </footer>\n </div>\n </PvDialog>\n</template>\n\n<script>\nimport Icon from \"./Icon.vue\";\nexport default {\n components: { Icon },\n props: {\n title: { type: String, required: false },\n active: { type: Boolean, required: true },\n },\n data() {\n return {};\n },\n computed: {\n },\n methods: {},\n created() {},\n};\n</script>\n<style lang=\"scss\" scoped>\n@import \"@/assets/css/variables.module.scss\";\n.modal-card-head {\n border-bottom: none;\n background: #fff;\n justify-content: space-between;\n font-size: $fontMid;\n}\n.modal-card-body {\n min-width: 630px;\n min-height: 250px;\n}\n.modal-card-foot {\n border-top: none;\n background: #fff;\n display: flex;\n justify-content: flex-end;\n}\n@media screen and (max-width: $mobileBreakPoint) {\n .modal-card-body {\n min-width: auto;\n }\n}\n</style>\n","import { render } from \"./Modal.vue?vue&type=template&id=302dd778&scoped=true\"\nimport script from \"./Modal.vue?vue&type=script&lang=js\"\nexport * from \"./Modal.vue?vue&type=script&lang=js\"\n\nimport \"./Modal.vue?vue&type=style&index=0&id=302dd778&lang=scss&scoped=true\"\n\nimport exportComponent from \"C:\\\\DeepNumbers\\\\GitLab\\\\answerccs\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-302dd778\"]])\n\nexport default __exports__","<template>\n <section>\n <PvAccordion v-if=\"show\" aria-id=\"rawData\"\n :selectOnFocus=\"false\"\n headerClass=\"card\"\n expandIcon=\"pi pi-arrow-up\"\n collapseIcon=\"pi pi-arrow-down\">\n <PvAccordionTab>\n <template #header>\n <p class=\"card-header-title is-size-7\" v-if=\"title\">Data: {{ title }}</p>\n <p class=\"card-header-title is-size-7\" v-else>Data: {{ data.name }}</p>\n </template>\n <pre class=\"is-size-7\">{{ data }}</pre>\n </PvAccordionTab>\n </PvAccordion>\n </section>\n</template>\n\n<script>\nimport Icon from \"./Icon\";\nexport default {\n components: { Icon },\n props: {\n data: {},\n title: { type: String },\n show: { type: Boolean, default: true },\n },\n data() {\n return {};\n },\n methods: {},\n created() {},\n};\n</script>\n<style lang=\"scss\" scoped>\n@import \"@/assets/css/variables.module.scss\";\n:deep(.p-accordion){\n .p-accordion-content{\n padding: 0;\n }\n .p-accordion-header-action{\n padding: 0.5rem;\n background: $white;\n display: flex;\n flex-direction: row-reverse;\n }\n\n}\n</style>\n","import { render } from \"./RawData.vue?vue&type=template&id=ac3a0708&scoped=true\"\nimport script from \"./RawData.vue?vue&type=script&lang=js\"\nexport * from \"./RawData.vue?vue&type=script&lang=js\"\n\nimport \"./RawData.vue?vue&type=style&index=0&id=ac3a0708&lang=scss&scoped=true\"\n\nimport exportComponent from \"C:\\\\DeepNumbers\\\\GitLab\\\\answerccs\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-ac3a0708\"]])\n\nexport default __exports__","<template>\n <span :title=\"isShowTitle?$t('settings.selected-color'):''\">\n <div v-bind:style=\"{ backgroundColor: setColor, height: getSize, width: getSize}\" class=\"dot\"></div>\n </span>\n</template>\n\n<script>\nimport { getColorFromName } from '@/js/dn-variables.js';\n\nexport default {\n props: {\n schemecolor: { type: String },\n isShowTitle: {type: Boolean, default: false},\n size:{ type: Number },\n },\n data() {\n return {};\n },\n computed: {\n setColor: function() {\n return getColorFromName(this.schemecolor);\n },\n getSize:function() {\n if(this.size>0){return this.size+'px';}else{return '16px'}\n \n }\n}\n}\n\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"@/assets/css/variables.module.scss\";\n.dot {\n display: inline-block;\n border-radius: 50%;\n margin-top: 4px;\n\n}\n</style>","import { render } from \"./ColorIndicator.vue?vue&type=template&id=0fed999d&scoped=true\"\nimport script from \"./ColorIndicator.vue?vue&type=script&lang=js\"\nexport * from \"./ColorIndicator.vue?vue&type=script&lang=js\"\n\nimport \"./ColorIndicator.vue?vue&type=style&index=0&id=0fed999d&lang=scss&scoped=true\"\n\nimport exportComponent from \"C:\\\\DeepNumbers\\\\GitLab\\\\answerccs\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-0fed999d\"]])\n\nexport default __exports__","var map = {\n\t\"./de.json\": [\n\t\t95894,\n\t\t894\n\t],\n\t\"./en.json\": [\n\t\t44174\n\t],\n\t\"./sv.json\": [\n\t\t28252,\n\t\t252\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn Promise.all(ids.slice(1).map(__webpack_require__.e)).then(function() {\n\t\treturn __webpack_require__.t(id, 3 | 16);\n\t});\n}\nwebpackAsyncContext.keys = function() { return Object.keys(map); };\nwebpackAsyncContext.id = 72096;\nmodule.exports = webpackAsyncContext;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","var getProto = Object.getPrototypeOf ? function(obj) { return Object.getPrototypeOf(obj); } : function(obj) { return obj.__proto__; };\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach(function(key) { def[key] = function() { return value[key]; }; });\n\t}\n\tdef['default'] = function() { return value; };\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"js/\" + chunkId + \".\" + {\"42\":\"35459a6d\",\"43\":\"53617567\",\"137\":\"51d66f2a\",\"246\":\"05f58d75\",\"250\":\"c18f30c5\",\"252\":\"488d0469\",\"310\":\"61746156\",\"320\":\"9be6943e\",\"323\":\"0f7cacb7\",\"332\":\"92eb16e2\",\"354\":\"cad2d09f\",\"406\":\"1dc996e9\",\"427\":\"301e4ed4\",\"436\":\"6ed597b5\",\"461\":\"b4e62d44\",\"476\":\"3a940256\",\"481\":\"4dfd5686\",\"501\":\"6af35121\",\"516\":\"370a8627\",\"526\":\"29720e74\",\"550\":\"4a1430e5\",\"600\":\"a172dbb8\",\"668\":\"c6a7f7dc\",\"696\":\"f8a67584\",\"768\":\"2511a81f\",\"772\":\"b671c3e7\",\"838\":\"453c6b9b\",\"864\":\"63793634\",\"880\":\"08807b62\",\"884\":\"0ac315e1\",\"894\":\"5d94a980\",\"917\":\"f0340ac2\",\"939\":\"2529b916\",\"961\":\"43c074b7\"}[chunkId] + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"css/\" + chunkId + \".\" + {\"42\":\"ef8a4d21\",\"43\":\"ee5cb5d3\",\"137\":\"64fcf30f\",\"320\":\"13c62312\",\"332\":\"7222771b\",\"406\":\"199801c6\",\"427\":\"3f638877\",\"436\":\"f8b39790\",\"516\":\"1c0e066e\",\"600\":\"71787203\",\"768\":\"fb102d37\",\"864\":\"0c5599a3\",\"884\":\"2740c82f\",\"917\":\"ff646181\",\"939\":\"6be03fd7\",\"961\":\"a2743db4\"}[chunkId] + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var inProgress = {};\nvar dataWebpackPrefix = \"anser:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.p = \"\";","if (typeof document === \"undefined\") return;\nvar createStylesheet = function(chunkId, fullhref, oldTag, resolve, reject) {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tvar onLinkComplete = function(event) {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + realHref + \")\");\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tlinkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\tif (oldTag) {\n\t\toldTag.parentNode.insertBefore(linkTag, oldTag.nextSibling);\n\t} else {\n\t\tdocument.head.appendChild(linkTag);\n\t}\n\treturn linkTag;\n};\nvar findStylesheet = function(href, fullhref) {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = function(chunkId) {\n\treturn new Promise(function(resolve, reject) {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, null, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t524: 0\n};\n\n__webpack_require__.f.miniCss = function(chunkId, promises) {\n\tvar cssChunks = {\"42\":1,\"43\":1,\"137\":1,\"320\":1,\"332\":1,\"406\":1,\"427\":1,\"436\":1,\"516\":1,\"600\":1,\"768\":1,\"864\":1,\"884\":1,\"917\":1,\"939\":1,\"961\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(function() {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, function(e) {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t524: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\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\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkanser\"] = self[\"webpackChunkanser\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [504], function() { return __webpack_require__(68966); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["map","webpackContext","req","id","webpackContextResolve","__webpack_require__","o","e","Error","code","keys","Object","resolve","module","exports","SUPORTED_LANGUAGES","freeze","loadedLanguages","i18n","createI18n","locale","fallbackLocale","messages","getBrowserDefaultLanguage","languages","navigator","lang","shortCode","getISO639Code","includes","splitted","split","getLanguageCode","getLanguage","browserLang","getSupportedCultures","loadSelectedLang","languageCode","loadLanguageAsync","async","languague","global","Promise","setI18nLanguage","then","setLocaleMessage","default","push","deleteAgentEvents","st","fi","switchId","agentEvents","fetchAndCheckJson","toISOString","getAgentEvents","limit","postAgentEvents","data","importAgentEventsCsv","lines","updateProgress","startIndex","toLowerCase","startsWith","i","length","rowData","dto","timestamp","trim","kind","parseInt","employeeSwitchId","reasonCode","isNaN","Date","parse","batchSize","result","total","left","batch","splice","getCallStatistics","recalculateCallGroups","COLORS","createColorEnum","colorArray","colors","stroke1","stroke2","stroke3","stroke4","stroke5","stroke6","stroke7","stroke8","stroke9","primary","lightdanger","lightinfo","dark","byId","idBySchemecolor","name","findIndex","x","getSelectableColors","EMAIL_KIND","createEmailKind","NOTIFY_KIND","createNotifyKind","enumObject","message","invoiceReminder","customerInfo","resetPassword","invoiceReport","emailVerification","scheduleNotification","invoicePDF","email","sms","sendEmail","eMailObject","sendSMS","smsObject","to","correctedPhone","c","charCodeAt","sendEmailVerification","getSortedSkills","dataStore","useDataStore","skillsCurrentCC","sort","a","b","numericSort","getSkillsMatrix","scheduleStore","useScheduleStore","employees","list","skills","skillsMatrix","empid","ghost","Array","fill","emp","s","getSkillsMatrixColumns","sMinMax","setting","scheduleOptions","scheduleFilter","aId","affinity","paginatedSkillIds","filteredskills","filter","columnDefs","slice","description","numberOfSkillsColumns","saveSkillsMatrix","postEmployeeSkillDto","changedEmps","skillList","hasChanges","skillListOrg","toEmployeeSkillDto","postEmployeeSkill","confirmChanges","simulationData","reset","getEmpIdsSameTags","empids","arraysAreEqual","tagIds","a1","a2","isEqual","getAffinityInfoMap","affinities","hasAffinities","affinityInfoMap","Map","taskTypes","set","color","getColor","getColorFromName","getAffintyIndicators","emps","svgWidth","svgns","returnMap","callGroups","skillsInfoMap","get","empAffinitiyInfos","Set","add","size","indicators","counter","aInfo","ellipse","document","createElementNS","tagObject","type","INFOTYPE","skillsInfo","tag","setAttributeNS","variables","grey","getSkillsText","affintyInfo","callGroupsCurrentCC","skillInfoText","skill","t","getEmployeeWarning","fromOptDialog","warnings","currentUser","rotations","shiftBags","availabilities","employeeDisplaySettings","taskTypeMap","skillsWarning","byEmp","has","shiftWarning","hasAdherence","switchIdWarning","switchid","workTimeWarning","workTimeOk","breakSettingsIsLoaded","breakSettings","getBreakSettingsByTag","currentCC","bs","calculateUnpaidDuration","wwt","rotation","getWeeklyWorkTime","empMinMax","getMinMaxWeeklyWork","remainingWorkTime","minWork","min","maxWork","max","remainingWorkTimeAfterCyclicExist","sBag","weeks","shiftCombosOK","w","possibleShifts","d","shifts","sh","dayIsIncludedInShiftDaylist","dayList","getShiftWorkTime","empvaluatePossibleShiftCombosToMeetWorkTime","warningCountArray","shiftCount","errorShifts","avail","stOK","fiOK","durOK","shiftOKweek","ava","getDayAvailability","isFix","fixShift","getFixShift","tasks","doFit","shPart","aSpan","stMax","fiMin","durMin","weekDayFormat","Intl","DateTimeFormat","language","weekday","tempWarnings","dt","addDays","format","shiftFits","dayHasRotationShift","day","stFi","retuenValue","agreedWorkWeek","minWorkWeek","maxWorkWeek","shiftCombos","combine","intersect","res","duplicat","some","value","empSkillsRowIsIncluded","r","empRowIsIncluded","getById","isIncludedByName","isIncludedBySkill","isIncludedByTag","includeByTermination","searchText","includeTerminated","terminationDate","active","EventBus","mitt","deleteEmployee","employeeId","getEmployeeCount","ccId","getEmployees","contactCenterId","rows","employeeFromDto","patchEmployee","employee","toDto","emailAlreadyInUse","removeDuplicatedSwitchid","employeeSwitchConflicts","password","userId","postEmployee","extra","undefined","availabilityId","shiftBagId","rotationId","switchIdList","switchIdConflict","saveEmployees","promises","all","catch","error","console","getScheduleTasks","dateIntervals","idIsEmp","getTasks","Task","idParam","join","numberOfDays","getScheduleTasksSync","last","histId","getUniqueTaskDtoKey","tasktypeId","getTime","getUniqueTaskKey","updateScheduleTasks","scheduleTasks","removeUnsavedDeletedTasks","wasChanged","deleted","toDelete","updated","currentById","unsavedByUniqueKey","updateOrInsert","update","key","apiPath","getApiPath","login","userCredentials","credentials2","url","body","strategy","loginId","password2","options","method","headers","JSON","stringify","response","fetch","json","ok","msg","cause","status","log","statusText","_lastUpdateAccessToken","updateAccessToken","loginInfo","now","setTimeout","needRefresh","refreshToken","returnJson","setAuthRefreshResult","setLoginInfo","passwordReset","accCredentials","username","newPassword","success","externalLogin","afterExternalLogin","checkIfOk","LoginInfo","accessToken","customerSchema","user","schema","isAgent","getSchemas","getCustomerData","path","saveForecastAdjustment","adjustmentsToSave","importEmployeeData","formData","getLoginInfo","Authorization","text","fetchAndCheck","resource","emit","reject","getOptions","getAllWeekData","nowDt","forecastOptions","specialDays","historicDataMap","dayTypes","returnData","startDate","historicFocusDate","getStartOfWeek","forecastWeeks","weekMap","historicWeeks","dtweekStart","wArray","dtx","getDayData","occupacyFte","getShortDate","dx","itr","next","histData","acgr","dtkey","weekdayindex","fte","ffte","noc","fnoc","aht","faht","nocRms","dayType","isChecked","getDay","itr2","weekList","val","weeknumber","getWeekNumber","getFullYear","week","weekdata","updateForecastInAllWeekData","callStatsWeekMap","specialDaysMap","forecastAdjustmentmap","aiForecastMap","latestImportDate","focusDt","dayData","forc","getForcastXX","reduce","ht","getRMS","keyx","yyyymmdd","seriesData","sq","nocData","index","Math","pow","sqRef","refRMS","sqrt","RMS","getChartData","dateNow","selectedCallGroups","dates","selectedDates","params","selectedParameters","returnValue","isForecast","getChartSerie","compareWithForecast","getForcastOnInterval","numberOfWeeks","indexesPerDay","startOfDay","getStartOfDay","msPerIndex","floor","lengthNextDay","lengthStartDay","forecast","nextDay","forecastNextDay","concat","ignoreCopiedData","adjInfo","getAdj","daytype","getDaytype","nocSum","htSum","forecastMethod","ahtData","weekOffset","numberOfDysCounter","wx","daytypex","copiedNocAht","nocAdj","adjustSeries","quarterRange","adj","qr","getForecastSetValue","parameter","setValue","minimum","maximum","adjMap","param","shortDate","nocArray","htArray","returnArray","htData","diff","q","scaleindex","label","parameterData","scaleIndex","occupancyFte","getCallStatsWeek","numberOfRows","isValidWeekRow","j","getEmptyDayData","callStatWeekData","addWeeks","item","focusedDaytyp","system","item1","item2","weekdayInedx","exportToFile","callsData","selectedAdjustmentRow","callsDataToExport","formattedDate","csvContent","filename","rowId","entry","maxLength","emptyColumns","csvHeader","csvRows","callGroup","warn","blob","Blob","URL","createObjectURL","downloadAnchor","createElement","href","download","appendChild","click","removeChild","revokeObjectURL","importFromCsv","fileInput","accept","style","display","addEventListener","file","event","target","files","fileContent","line","importedCallsData","cols","callgroup","values","Number","row","baseNoc","sum","remove","condence","array","factor","round","nullCounter","getDisplayResolutionFactor","displayResolutionFactor","getNumberOfDaysFromIntervalMinusOne","intervalMinusOneDay","getDayDiff","getElapsedTimeString","elapsed","unit","getSelectionKey","weekStartDay","getMonth","getDate","dayIndex","setDate","getUniqueNegativeId","idObjList","idObj","isSubset","sortedArray","sortedArray2","shuffleArray","random","temp","timeRangeInformation","dtRange","incrementPerQuarter","hourFormat","hour","minute","hour12","dtFormat","zero","ticksPerInterval","stDate","fiDate","rememberCredentialsKey","credentialsKey","simulationSettingsKey","lastForcastOptionsKey","lastScheduleOptionsKey","lastAgentScheduleOptionsKey","lastSettingsOptionsKey","scheduleColumnIdsKey","languageKey","timeKey","loginInfoKey","currentCCKey","lastSortOptionKey","requestFilterKey","employeeDisplaySettingsKey","virtualScrollerOptions","TABLE_COLUMN_SCHEDULE_KEY","_loginInfo","_rememberCredentials","_currentCCId","clearLocalStorage","localStorage","clear","getCurrentCCId","getItem","setCurrentCCId","getRememberCredentials","setItem","toString","removeCurrentCCId","removeItem","getJSONFromLocalStorage","removeLoginInfo","window","toStore","getSimulationSettings","setSimulationSettings","simulationSettings","removeSimulationSettings","setRememberCredentials","rememberCredentials","getCredentials","removeCredentials","getLastForcastOptions","setLastForcastOptions","lastForcastOptions","getLastScheduleOptions","setLastScheduleOptions","lastScheduleOptions","getLastAgentScheduleOptions","setLastAgentScheduleOptions","lastAgentScheduleOptions","getLastSettingsOptions","setLastSettingsOptions","lastSettingsOptions","getRequestFilterOptions","setRequestFilterOptions","RequestFilterOptions","getEmployeeDisplaySettings","setEmployeeDisplaySettings","getScheduleColumnIds","setScheduleColumnIds","scheduleColumnIds","setLanguage","getTimeDisplaySetting","setTimeDisplaySetting","timeDisplay","getLastSortOption","setLastSortOption","lastSortOption","removeScheduleColumnsWidths","getVirtualScrollSetting","setVirtualScrollSetting","option","removeVirtualScrollSetting","moment","require","getTimeNow","dnLocalStorage","toDate","substring","startOf","getInitialDateInterval","numberOfDaysInSchedule","getSpecialTaskType","subtype","forEach","element","getShift","possibleTasks","schedule","shift","getShiftBounds","getEmpWorkSum","employeeCallcenters","taskTypeIds","empWorkMap","getEmpWorkMap","dtKey","dn_uiHelper","empSumArray","pair","empWork","getEmpBreakSum","empBreakMap","getEmpBreakMap","empSumBreakArray","empBreak","getTask","ttid","get24hourShift","dur","moveEntireShift","workShiftFiltered","change","duration","lastSt","asHours","getTaskList","empTasks","focusedShift","taskList","isInShift","breaks","payments","absences","isToDelete","validateAndCorrectWorkShift","activeTask","tt","lastFi","tti","sti","fii","isSameOrBefore","isSameOrAfter","removeTask","isBefore","isAfter","_id","isSame","stj","fij","getShiftText","refDate","shiftText","timeInterval","abs","cmd","getRequestForSchedule","selectionKey","keyParts","ts","scheduleRequestSettings","future","dateInterval","selectedEmpId","scheduleRequest","scheduleRequestData","bySelectionKey","isPoster","countOrOrder","dnModel","post","approved","isAgentLogin","isFilterOk","availEmpRequests","availabilityRequests","getByEmp","requestItem","requestOnDay","byDate","best","isOpen","created","availability","getSchedule","includeInactive","createSchedule","getScheduleFromStore","empId","schedules","getScheduleRowIndex","currentSortMap","keySortMap","workShiftDetails","timeZone","timezoneUI","di","nextDt","shiftBounds","details","getTaskText","arrangeReportWeekDayStart","date","weekDayNum","completeWeek","steadyCols","weekDaysCols","width","getAgentAppRowHeight","innerHeight","scheduleIsPublished","getLatestPublishedDate","erliestRequestDate","generalEmpAppSettings","requestClosedNumberOfDays","weekDay","publishingWeekDay","publishingNumberOfDays","latestDate","publishingFixedDate","daysToAdd","scheduleisAllowedToOptimize","isSupervisor","scheduleRowIsIncluded","isIncludedByTask","singleSelectionIsVisible","show","filterdSched","filterdSched2","getSelectionKeysVisible","visibleKeys","selection","v","getCCByDate","selectionIsOk","supervisorCheck","postedShiftCheck","scheduleRequests","sr","isPending","getSelection","filteredSchedule","byEmpId","empSchedule","find","empSelection","addToChangedDatedInclNext","changedDates","saveLocalScheduleSettings","opt","insp","inspectorPanel","localScheduleOptions","showServiceLevel","showOccupancyChart","showWorkChart","showRequestTile","showEmployeeOccupancy","autoSimulate","autoKeyFigures","numberOfSimIterations","workChartHeight","chartDisplayTarget","chartDisplay","chartDisplayErlangC","erlangC","chartDisplaySmooth","smooth","chartDisplaychartInspector","chartInspector","chartDisplayFixedY","fixedY","chartDisplayFixedYvalue","fixedYvalue","chartDisplayServicelevelPercentForWarning","servicelevelPercentForWarning","chartDisplayBreaks","chartDisplayDeviationTooFewBars","deviationTooFewBars","chartDisplayDeviationTooManyBars","deviationTooManyBars","showLog","adherence","showWorkWarnings","showBreakWarnings","showAdherenceWarnings","meetingLastTasktypeId","meetingSettings","meetingLastStartMinute","lastStartMinute","meetingLastStartMinuteMax","lastStartMinuteMax","meetingLastOnlyOnShift","onlyOnShift","meetingLastFlexStart","flexStart","meetingLastDurationMinute","lastDurationMinute","notifyOnScheduleChange","notifications","onScheduleChange","indicatorsHighlightBeforeSave","scheduleIndicators","highlightBeforeSave","indicatorsUnsavedIndicators","unsavedIndicators","showInRotation","inspectorPanelTimespan","timespan","inspectorHideTimeSpan","hideTimeSpan","inspectorServiceLevel","serviceLevel","saveLocalRequestFilterOptions","saveLocalEmployeeDisplaySettings","localEmployeeDisplaySettings","hasMobileApp","breakWarnings","localRequestFilterOptions","showSick","showVacation","showFree","showWork","showPending","showHistoric","showFuture","showBasedOnSelection","showApproved","showRejected","tagId","createInfoTypeEnum","DRAWKIND","createDrawTaskKindEnum","TEAMSCHEDULEKIND","createTeamScheduleKindEnum","warningFromTaskBar","warningFromRow","publishedDayIndicator","erliestRequestIndicator","shiftFromTaskBar","unAvailabilityOtherCC","chartInfo","unavailable","otherCC","none","barSchedule","textSchedule","taskChangeInfo","userInitials","userName","colorId","timeText","users","getWorkShiftWithDeleted","focusedDate","workShiftWithDeleted","isInShiftWithDeleted","st_day","fi_day","st_shift","fi_shift","changeInfo","changeInfoFromTaskList","maxDt","latestTask","task","getPublishedScheduleTasksWithChanges","scheduleTasksInStore","returnList","ttKind","excludeTask","TASK_KIND","inRotation","selectionHasGhost","openPostShifts","items","requests","postGhostShifts","selectedRequests","selectedEmpDays","saveReqired","selectGostShiftWarning","action","starts","getIndicatorPoints","p","getUnsavedIndicator","indicatorPolyline","warning","selectionHasChanges","sheduleOptions","selectionList","shiftHasChanges","shift24","allTasks","shiftRevert","resurrect","revert","Call","constructor","msSinceEpoch","callGroupId","this","processed","wait","_wait","newValue","timeStampEnd","adherancePercent","workFactor","tostring","str","SimData","_callGroups","slMap","_slTotalMap","_waitTotalMap","_waitMap","_waitWithinMap","_queueAvgMap","_occupancyEmpMap","getInitiatedOccupancyMap","initiateValueMap","initateTotalsValueMap","initiateArrayMap","initateTotalsArrayMap","slTotalMap","waitTotalMap","waitMap","waitWithinMap","queueAvgMap","occupancyEmpMap","getCallGroup","xMap","intervalItems","_maxWaitBeforeAbandonn","_numberOfSecondsPerDay","SimState","affinityTaskTypeById","taskTypeId","work","taskTypeById","SimParameters","simState","simSt","dayForcast","daySchedule","occupiedUntil","scheduleInfoArray","getEmpWorkArray","getSimResult","numberOfIterations","simData","dnSimModel","simStTime","ds","calls","simulate","addSimData","getSimulationResult","getEmptySimDay","getSimulationDataKey","affinityId","getSimData","outputSpec","callbackSiminfo","simulationDataMap","forceUpdate","datesWithChanges","simDay","simParameters","sl","serviceLevelDisplayData","getServicelevelDisplayData","occ","getOccupancyAndWorkChartData","occChartData","occData","workChartData","workData","totWork","totOcc","avgQueue","avgQueueData","getQueueChartData","waitWithin","waitWithinData","getWaitWithinData","employeeOccupancy","employeeOccupancyData","getEmployeeOccupancyData","getDataByAffinity","emplyeesByAffinity","callGroupsByAffinity","cg","cgData","byAffinity","cgs","slTarget","getAvgSlSetting","fantomDefaultSkills","filteredEmpsByAffinity","getEmployeesByAffinity","cgMap","hasCallgroupWithNoAffinity","empArray","getTarget","adheranceFactor","targetDataMap","targetSum","targetByAffinity","affinityData","timeRangeInQuarters","getTimeRangeInQuartersForTargetSim","generateQuarterCallsTarget","minTarget","getErlangCTargetWeighted","maxTarget","getErlangCTargetSum","targetRange","ceil","slLow","slHigh","hasCalculated","testNumberOfAgent","getFantom","waitData","getWaitData","slQuarter","getTargetServiceLevel","slPercent","weight","weighted","dayTargetByAffinity","dayTarget","slWithin","daySt","empsBySkillMap","filteredEmps","ex","excludeStartup","empWithLongestWait","getEmpWithLongestWait","call","maxDiff","indexFound","randomEmpId","fantom","handlingTimePercent","handlingTimeVariationPercent","secondsToAdd","df","getErlangCTarget","getErlangCTargetArray","callGroupsToInclude","minArray","maxArray","cgByAffinity","adherenceFactor","totForc","slSetting","forcSum","generateQuarterCalls","callGroupPrioInfoMap","loadCallGroupPrioInfo","maxPrioSecondInQueue","callGroupPrioMax","lastQuarter","daySchedulesQuarterBySkillMap","filteredDaySchedules","callX","qx","processCall","skilledAndWorkingDayScheduls","empDayScheduleWithMaxWait","getDayScheduleWithLowestWait","MAX_VALUE","msTot","iCallStart","ixTalkStart","iTalkStart","xPart","occupArray","workArray","numberOfDayIntervals","numberOfSecondsPerInterval","callGroupIds","callGroupIdsWith0","waitsData","waitsData2","y","slArray","occEmpData","stDt","acgrid","slMin","slAvg","slMax","slPeneltyScore","slData","resolution","returnArrayOcc","returnArrayWork","occArray","occWorkArray","totOccWork","empOccArray","returnArrayAvg","queueAvgArray","waitWithinArray","occEmp","obj","sumP","sumS","callsPercent","getErlangB","m","invB","getErlangC","erlB","getServiceLevel","erlC","exp","slLast","prioSecondsInQueue","days","getDurationInMinutes","formatMMDDYYY","getShortDate2","getStartOfWeekUI","getWeekdayNarrow","toLocaleDateString","getWeekdayLong","getWeekDays","getWeekDaysWithInfo","startDay","isWeekend","getShortTime","optionsTime","toLocaleTimeString","ShortTime","getShortTimeMinutes","minutes","getShortTimeQuarterHour","quarter","formatTimeAsDuration","getDateFormat","getMonthLong","month","isMobile","test","userAgent","suggestUserInitials","initials","prototype","mmdd","mm","dd","week1","getWeekYear","UNDO_STATE","createUndoState","revCounter","revisionMap","lastIncrementUndoOrRedo","undo","newSelectionPending","incrementUndoRevision","direct","redo","decrementUndoRevision","resetUndo","addUndoTransaction","isNew","isDeleted","delete","currentMap","addRedoTransaction","getRevisionMap","canUndoRedo","canUndo","canRedo","redoDataExist","undoDataExist","schemecolor","returnColor","light","danger","free","class","_createElementBlock","onKeydown","_cache","_withKeys","_withModifiers","args","$options","reSimulate","_normalizeClass","currentRoute","isDark","_createBlock","_component_Header","_createElementVNode","_hoisted_1","userGuide","_hoisted_2","_createVNode","_component_router_view","_component_Guide","$data","isLowHeight","_component_Footer","src","_imports_0","alt","ref","disabled","for","onClick","layOutChange","showExpireWarning","_component_PvMessage","severity","icon","expireMessage","refreshedDueToError","_ctx","$t","showSettings","relevantInvoiceStatus","_hoisted_3","_hoisted_4","_hoisted_5","_component_router_link","_hoisted_6","isNormalLogin","isPage","$event","goToView","forecastIsAvailable","_hoisted_7","_toDisplayString","showForecast","showSchedule","showReport","_hoisted_8","toggleMenubar","_normalizeStyle","isShowSidebar","checkInvoiceStatus","_hoisted_9","_hoisted_10","_hoisted_11","supervisorInfo","_hoisted_12","_hoisted_13","showCurrentTimezone","_hoisted_14","_hoisted_15","currentTimezone","showEmpFilter","_hoisted_16","_hoisted_17","_hoisted_18","filterMsg","showReadOnlyInfo","_hoisted_19","_hoisted_20","showAffintyDropDown","_hoisted_21","_component_PvDropdown","affinitySelection","optionValue","optionLabel","onChange","filterChange","pt","_withCtx","slotProps","getAffinityText","isCurrentCCSelected","_hoisted_22","_hoisted_23","_hoisted_24","toggleUserMenubar","_hoisted_25","isSuperAdmin","hasAccessSettings","settingsDialogVisible","logOut","_component_PvDialog","visible","modal","header","_hoisted_26","_Fragment","_renderList","tabMenu","tab","_hoisted_27","activeTab","tabKey","_hoisted_29","_hoisted_30","_component_TabView","activeIndex","navContainer","_component_TabPanel","_hoisted_31","_hoisted_32","_hoisted_33","_component_AvatarSelector","_hoisted_34","_component_InputSwitch","useVirtualScroll","_hoisted_35","_component_UserAuthConfig","section","_hoisted_36","_hoisted_37","_hoisted_38","selectedLanguage","placeholder","_hoisted_39","_hoisted_40","_hoisted_41","hourFormats","_hoisted_42","_component_PvButton","_component_Avatar","colorName","scrollHeight","panelClass","_component_ColorIndicator","_component_InputText","components","RawData","Avatar","ColorIndicator","props","computed","methods","getInitials","getColorId","mounted","watch","init","$emit","__exports__","Icon","Modal","Button","AvatarSelector","UserAuthConfig","activeSelectAvatar","screenWidth","innerWidth","xLargeBreakPoint","userData","useMode","getMode","hasAffinity","resolvedOptions","routeName","$route","employeeContext","useForecastStore","forecastIsLoaded","hasAccessForecasting","hasAccessReports","hasAccessScheduling","canEditScheduling","canEditSettings","canEditForecasting","fileImportInfo","useFileImportStore","scheduleNeedsSave","scheduleNeedsToSave","endTime","checkVirtualScrollSetting","hasChangeUser","saveUserSettings","saveUsers","itemSize","lazy","numToleratedItems","showLoader","loadRelevantInvoiceStatus","sel","usedAffinities","dn_schedulehelper","$confirm","rejectLabel","acceptLabel","$router","page","hasModifiedData","revertModifiedData","handleClickOutsideMenu","$refs","rightMenu","contains","updateScreenWidth","handler","$toast","detail","fileName","life","nofImported","forecastStore","reloadForecastAndHistoricData","deep","newTab","oldTab","immediate","newUser","setHourFormat","beforeUnmount","removeEventListener","beforeDestroy","_component_MobileNavbarFooter","agentScheduleDarkView","_component_MobileNavbarItem","goto","canSeeTeam","canTrade","canSeeStats","$props","_component_Icon","String","Boolean","MobileNavbarItem","tradeDisabled","hideTeamSchedule","gs","statsAdherence","statsPayrollCodes","statsDetailedAdherence","MobileNavbarFooter","xmlns","height","viewBox","_component_IconField","iconPosition","_component_InputIcon","_component_ScrollPanel","_component_Accordion","expandIcon","collapseIcon","onTabClick","setTab","filteredGuideItems","_component_AccordionTab","parent","hideAccordionTab","title","activeSubIndex","subchapters","subitem","subindex","openDialog","intro","steps","step","refMenu","link","_component_InlineSvg","videoSrc","followLink","_hoisted_28","dialogVisible","popupData","_hoisted_43","_hoisted_44","_hoisted_45","activePopupTab","currentTab","currentSubTab","InlineSvg","dnUserguides","foundSubchaps","chapter","foundSubChapter","guideFilter","subchap","searchOK","open","setSubTab","state","d_activeIndex","Header","Footer","Guide","admin","isLoggedIn","selectedAptId","sizeChange","setFirstDayOfWeek","$primevue","config","firstDayOfWeek","loadLanguage","loadHourFormat","loadLocalScheduleOptions","render","resetStores","forecastData","specialDayData","forecastAiData","$reset","usePortfolioStore","useReportStore","routes","component","createAppRouter","router","createRouter","history","createWebHashHistory","beforeEach","from","externalPath","initUser","afterEach","hasRefreshed","sessionStorage","hasNotCheckedInvoiceStatus","onError","err","location","reload","lastRelevantInvoiceStatuscheck","loadCurrentUser","loadDateNow","loadLocalAgentScheduleOptions","loadSimulationSettings","loadGeneralSettings","loadAffinities","loadCallCenters","loadCurrentCCData","loadHolidays","loadAgreements","initForecast","loadTagUsage","app","createApp","App","pinia","createPinia","use","PrimeVue","ToastService","Accordion","AccordionTab","AutoComplete","Calendar","Card","Checkbox","Column","ConfirmDialog","ContextMenu","DataTable","FileUpload","IconField","InlineMessage","InputGroup","InputGroupAddon","InputIcon","InputNumber","InputSwitch","InputText","Listbox","MultiSelect","Panel","Password","ProgressBar","Dialog","Dropdown","FloatLabel","Message","SelectButton","RadioButton","ScrollPanel","Slider","SplitButton","Splitter","SplitterPanel","PanelMenu","TabPanel","TabView","Tag","Textarea","Toast","TreeTable","OverlayPanel","Rating","TieredMenu","Menubar","Sidebar","directive","Tooltip","ConfirmationService","mount","deleteAffinity","getAffinities","Affinity","patchAffinity","postAffinity","saveAffinityChanges","_name","_hasChanges","_isToDelete","copy","getAvailabilityRequests","idIsEmployee","postAvailabilityRequest","patchAvailabilityRequest","deleteAvailabilityRequest","AvailabilityRequest","RequestItem","super","isApprovedOrAutoApproved","available","replyMsg","employeesToDisplay","iconName","getSelectionKeys","timezone","stLocal","getDateOfInstant","affectedScheduleInterval","canDelete","canReply","deleteRequest","getEmployeeIdByIndex","getMsgToDisplay","getReplyMsg","getReplyObj","AvailabilityRequestReply","getTasksInfo","srEmp","hasSelectionKey","empList","okByOthers","okByDate","okByTag","showAvailability","showUnavailability","tagList","hasAnyTag","syncWithSchedule","timeOffId","bySystemKind","TASK_SYSTEM_KIND","timeOffTasks","hasOverlappingShift","overlaps","modifed","affectedDates","toggleApproval","approve","reply","ar","isEmp","AvailabilityRequests","dtoList","setData","isLoaded","getByFilter","getByEmpDate","empRequests","dtRequests","getOkOnSelection","l","isApproved","loadedStTime","load","stTime","getData","refresh","updateUpdated","availEmp","AvailabilityRequestEmployee","adjustQuarterHoursByDateUnavailability","unavail","startTime","request2","getQuarterHour2","addToIntervals","adjustQuarterHoursByDateAvailability","availabilityByDay","dayStart","dayEnd","getQuarterHourRelative","dtTime","avails","intervals","inverted","interval","getQuarterHour","ms","Availabilities","_dto","_byEmp","employeeIdList","_items","Availability","fromISODate","clearAvailability","availabilityUI","getUnavailability","startDt","localOffsetQ","getLocalOffset","unavailability","endQ","lastQ","firstQ","getDayIndex","dayDiff","getByDayIndex","_byDayIndex","dayCount","dayFi","deleteAvailability","checkedEmps","saveAvailability","toISODate","BackOfficeSkill","Skill","taskType","minLength","BackOfficeSkillDetail","_stDate","_fiDate","markAsHasChanges","addDetail","interactions","daysOfWeek","openHours","_aht","_interactions","_daysOfWeek","_openHours","openHoursInfo","ticksPerQ","BackOfficeSkills","hasBO","createList","ccList","ccid","getTargetByTaskType","byTaskTypeId","skillBO","boSt","boFi","targetByDay","boTargetDay","targetDetail","boTarget","optimizationPriority","createBackOfficeSkill","saveBackOfficeSkills","changed","secondsPer5Min","deleteBreakSettings","getBreakSettings","breakSettingsFromDto","saveBreakSettings","BreakSettings","minShiftDuration","maxShiftDuration","minWorkDuration","_minShiftDuration","_maxShiftDuration","_minWorkDuration","_tasks","_tagId","_unpaidDurationMinutes","minShiftDurationMinutes","minShiftDurationDate","unitToDate","dateToUnit","maxShiftDurationMinutes","maxShiftDurationDate","minWorkDurationQ","minWorkDurationDate","tagIdSingle","avgWorkDuration","shiftLength","workIntervalCount","totalBreakDuration","bsTask","unpaidDuration","ttId","paidBreak","unpaidDurationMinutes","isMinMaxDurationOk","isValid","minPossibleDuration","BreakSettingsTask","_ttId","_duration","durationDate","bsTasks","settings","ccTagIdList","filtered","filterByTag","getBreakSettingsMinWork","durMinutes","workMinutes","getBreakSettingsMaxWork","hours","time","getHours","getMinutes","deleteCallCenter","getCallCenters","CallCenter","saveCallCenter","toApi","saveCallCenterList","callCenters","_description","_imgUrl","imgUrl","createForecastMethodEnum","average","ai","FORCAST_METHOD_KIND","createCallGroup","defaultSwitchId","CallGroup","slpercent","slseconds","addWrap","conditions","setDefaultSwitchId","mergeCallGroups","callgroups","itemsToDelete","indexOf","getCallGroups","includeConditions","cond","_slPercent","_slWithin","_prioSecondsInQueue","_addWrap","_forecastMethod","CallGroupCondition","_conditions","tag1min","addWrapS","_defaultSwitchId","addCondition","tag1max","tag2min","tag2max","tag3min","tag3max","newConditionIds","deleteCondition","condition","every","conditionsToDelete","conditionsToInsert","conditionsToUpdate","toSave","_switchId","_tag1min","_tag1max","_tag2min","_tag2max","_tag3min","_tag3max","prop","getTagMax","hasValidValue","getCustomShifts","CustomShift","createNewCustomShift","newCustomShift","deleteCustomShift2","customShift","usershift","contactcenterIds","_contactcenterIds","_cmd","addCustomer","copyCustomer","connectUsers","deleteCustomer","getCustomers","Customer","patchCustomer","version","_email","_areaId","areaId","_initialLicenses","initialLicenses","_extraStorage","extraStorage","_paymentMethod","paymentMethod","_vat","vat","_address","address","_person","person","tzOk","_countDays","countDays","_initialOverride","initialOverride","_authExternal","authExternal","_refreshTokenDays","refreshTokenDays","_useMode","_useDepartments","useDepartments","_stripeId","stripeId","_invoiceEmail","invoiceEmail","_note","note","_setUsers","setUsers","features","CUSTOMER_FEATURE_KEYS","CustomerFeature","apiRow","featureId","hasSms","hasFeat","isInvoicesCreated","fee","save","_fee","_st","_fi","_isInDB","canStartBeSetToNull","CUSTOMER_FEATURE","main","storage","getDayTypes","DayType","postDayTypes","daytypes","promesis","_schemecolor","_system","MONTH_NAMES","getMonthNames","getInvoicesByYear","invoices","byYear","invoice","year","info","getInvoiceStatusInfo","getRelevantWorstInvoiceStatus","relevantInvoiceStatuses","worstStatus","INVOICE_STATUS","paid","removed","getInvoices","invoiceList","inv","invoiceInfo","getInvoice","Invoice","getPaymentLink","currency","unit_amount","itemName","memo","updateInvoice","paymentLink","scheduled","payDt","paymentLinkId","paymentlink","getTitleDate","getInvoiceStatus","dueDate","paymentTerms","daysDue","due","overdue30","initiated","released","downloaded","invoiceDate","daysInMonth","invoiceNumber","customerNumber","customerId","customer","customerName","customerAdress","_status","licences","_features","dayFactors","feature","licenceFee","storageFee","smsFee","adherenceFee","storageAmount","iban","bic","totalCustomWork","customWork","round2","workHours","workRate","licenseTotal","smsTotal","adherenceTotal","storageTotal","creditCardFee","amount","getDayInfo","monthFormat","monthNames","createInvoiceStatus","checkInvoicesStatus","_accessToken","_refreshToken","_loginKind","loginKind","LOGIN_KIND","normal","agent","superAdmin","setLoginKind","authResult","createLoginKindEnum","getShiftBags","ShiftBags","createShiftBagByEmp","optimizableShiftGroup","OptimizableShiftGroup","OptimizableShift","clone","hasAllowedShifts","dayBounds","isAllowed","getBounds","bounds","stMin","fiMax","setMaxBounds","Shift","_dayList","isAllowedDate","isDayBoundsOk","createNewOptimizableShift","fixTasks","flexTasks","stSpan","fiSpan","durSpan","deleteShiftBag","_pending","employeeCount","isRejected","isPost","isTrade","canEdit","canEvaluate","canReopen","canReplyWithAnswer","canReplyWithAnswerEmp","getNumberOfStarsByIndex","reopen","setAsNonPending","setPendingState","createNewRotation","Rotation","getRotations","Rotations","createRotationByEmp","create","byShiftId","shiftId","shiftByDay","shiftDtos","isEmpty","found","s2","idList","includeFlexShift","deleteRotation","ScheduleRequest","callCenterId","_days","_evaluate","REQUEST_KIND","scheduleTask","dtFrom","getStartFrom","dtTo","getStartTo","sick","vacation","trade","empIds","srTask","requestTask","canBePicked","possibleWithSchedule","evaluate","maxCount","count","okBySelectedEmps","getDateRange","okByApproval","byIndex","dtLocal","start","returnRange","dtEnd","clearPick","replyEmp","numberOfStars","approveToggle","performChange","addToAffectedDates","selectPickEmployee","picked","rejectToggle","reopenScheduleRequest","refreshScheduleTasks","loadScheduleRequests","createTask","revertChange","changedTasks","performChangeOnTasks","newTask","getAffectedAffinities","getAffectedDates","getAffectedIntervals","interval1","modified","interval2","deleteScheduleRequest","needsReply","getEmployee","ScheduleRequestEmployee","pickEmployees","taskInfoList","srEmp2","getTaskString","break","operation","opText","getApiReply","pickEmp","pick","needToBeRevertedBeforeUpdate","other","otherSREmp","sendReply","isPick","toastMsg","stars","updateScheduleRequestEmployee","ScheduleRequestTask","ScheduleRequestScheduleTask","deleteScheduleRequests","getScheduleRequest","onlyOpenRequests","employeeQuery","openQuery","stQuery","fiQuery","convertScheduleRequestFromApi","patchScheduleRequestEdit","convertScheduleRequestToApi","postScheduleRequest","request","postScheduleRequests","re","rt","createRequestKindEnum","isAvailabilityRequest","createPostRequest","requestConfig","original","getScheduleRequestBounds","tasksToReduce","publishedTasks","isContainedIn","createScheduleRequestTask","usedExistingTask","createRequestCommon","requestKind","employeeSchedule","sortDateIntervals","hasShift","setMinutes","absenceStart","absenceDuration","createSettingsColumnsEnum","number","department","cc","payrollRuleKind","payrollRuleWeekLimit","timeOfDay","checkbox","SETTINGS_COLUMN_KIND","createSettingsDetailEnum","breakSetting","bo","payrollRule","SETTINGS_DETAIL_KIND","getSettings","postSettings","saveReportCalendarDays","GENERAL_SETTINGS","reportCalendarDays","saveReportCsvSemicolon","reportCsvSemicolon","savenumHoursWeeklyOvertime","numHoursWeeklyOvertime","saveWeekendAsHoliday","weekendAsHoliday","createGeneralSettingsEnum","numberOfHistoricSpecialDays","percentOfAbandonsToInclude","adherenceBase","graceMinutes","adherenceLimit","overTargetFactor","closeGaps","noShiftsOutsideTarget","unScheduledBreakMinutes","GENERAL_EMPAPP_SETTINGS","createGeneralEmpSettingsEnum","publishingFixedDateMs","allRequestsDisabled","requestvaccationClosedNumberOfDays","sickRequestDisabled","showOnlyOwnTeam","statsPayrollCodesPublishingNumberOfDays","GeneralOptions","forecastSetting","adherenceSetting","_historicWeeks","_forecastWeeks","_numberOfHistoricSpecialDays","_occupacyFte","_adherancePercent","_percentOfAbandonsToInclude","_adherenceBase","_graceMinutes","_unScheduledBreakMinutes","_closeGaps","_adherenceLimit","_numHoursWeeklyOvertime","_weekendAsHoliday","_hasChangesForecast","_hasChangesAdherence","hasChangesForecast","hasChangesAdherence","GeneralEmpAppSettings","_publishingWeekDay","_publishingNumberOfDays","_publishingFixedDate","_usePublishFixedDate","_allRequestsDisabled","_requestClosedNumberOfDays","_requestvaccationClosedNumberOfDays","_sickRequestDisabled","_tradeDisabled","_showOnlyOwnTeam","_weekStartDay","publishingFixedDateNoChange","usePublishFixedDate","_hideTeamSchedule","_statsPayrollCodes","_statsAdherence","_statsDetailedAdherence","_statsPayrollCodesPublishingNumberOfDays","HolidaySettings","_date","getHolidays","holidays","saveHolidays","holiday","_automaticBreaks","automaticBreaks","_openForBO","openForBO","_fixTasks","_stMin","_stMax","_fiMin","_fiMax","_durMin","_durMax","_step","taskType2Id","dur2Min","dur2Max","flexTask","hasTask2","flexSt","flexFi","flexDur","durMax","hasChanged","t2","_fixShift","paidWorkMinutes","shiftBoundMinutes","stMinute","fiMinute","taskFiMinute","durMinute","tasksWithoutBreaks","nextSt","isAllowedEnd","maxDurQ","maxWorkMinutes","minStMinute","maxFiMinute","unavailabilites","fiQ","stQ","minStQ","maxFiQ","getDurationText","createShift","_optimizationPriority","_contactCenterId","_affinity","clearAffinity","IMPORT_CONFIG_KIND","createImportConfigEnum","addNewSwitchConfig","switchConfigs","minId","sc","SwitchConfig","importConfigs","apiCalls","startel","peoplePraise","apiAgentEvents","fileImportCalls","fileImportAgentEvents","getImportConfigKinds","switchKinds","isImportOfCallData","importConfigKind","getSwitches","switches","postSwitch","patchSwitch","_timezone","_active","_deletedImportConfigKinds","_changedImportConfigs","lastTime","ic","addmportConfig","deleteImportConfig","updateImportConfig","filteredImportConfigs","possibleImportConfigsToAdd","orderById","deletedImportConfigKinds","abbr","_colorId","_abbr","colorType","getTags","getTagUsage","postTags","tags","getFilteredTags","tagById","disallowedTagIds","textToSeach","toLocaleLowerCase","convertTagsFromAPI","convertTagFromAPI","TAG_USAGE_DESCRIPTION","createTagUsageDescription","tagUsageDescription","getTagUsageWarnings","tagUsage","used","ids","getTagsUsageTooltip","tagUsageWarnings","ACCESS_RIGHT","createAccessRightEnum","createNewUser","api","User","forecasting","reports","scheduling","getUsers","getCurrentUser","LoggedInUser","patchUser","authMethod","secret","reqNotify","toCreate","toPatch","u","pwd","contactCenterIds","tagIdList","notify","notifyEmail","createdResult","errors","_forecasting","_scheduling","_reports","_settings","_initials","_tagIdList","_pwd","getNumAccessRight","readonly","write","getStringAccessRight","getNumAccessRightScheduling","supervisor","getStringAccessRightScheduling","schedulingNum","forecastingNum","settingsNum","reportsNum","_employee","_adherence","isEmail","customerTimezone","tzMode","getSecretFormatting","current","password2WithMask","AGREEMENT_KIND","createAgreementKind","payroll","report","accumulation","PAYROLL_RULE_KIND","createPayrollRuleKind","PAYROLL_RULE_WORK_TYPE","createPayrollRuleWorkType","paidWork","attendance","flex","PAYROLL_RULE_DAY_KIND","createPayrollRuleDayKind","sunday","monday","tuesday","wednesday","thursday","friday","saturday","dayBeforeHoliday","dayAfterHoliday","getWeekLimitAboveOptions","Agreements","_byTagId","loadCounter","byTagId","hasPayrollRules","agreement","payrollRules","asList","getByTagId","defaultAgreement","getPayrollPeriod","payrollPeriod","getPayrollReportData","timeRange","reportOptions","agreementToUse","getPayrollReportDataImpl","getPayrollReportDataOneRow","oneRowReport","adherenceOptions","weeklyLimit","sortedHolidays","getSortedHolidays","timeRangeWeeks","splitIntoWeeks","employeesWithAgreement","payrollRuleGroupsById","payrollRuleGroupsEmpId","groups","group","PayrollRuleCalcGroup","weekLimitAbove","PayrollRuleCalc","payrollPeriodShiftBounds","tr","calcName","reportColumnDefinitions","rules","rows2","row2ByEmp","empName","payrollRuleGroup","getAmount","payrollName","row2","agreementId","weeklyLimitAbove","unitDays","useShiftBounds","PayrollRuleShiftBound","PayrollRuleTime","PayrollRuleDetail","calcAttendance","workType","calcFlex","subtract","taskTypesByKind","ttSet","getInternalAmount","timeToRemove","addTimeToRemove","stDay","fiDay","dayInfo","isPayrollHolidaySettingsOk","getHolidayTime","overMidnight","nextDayInfo","nextDaySt","getPayrollTime","timeRangeFi","timeIntervals","addtimeIntervals","newSt","fiNextDay","getPayrollShiftBound","newlength","dayBeforeInterval","dayAfterInterval","uniqueDays","holidayInfo","createHolidayInfo","dayBefore","dayAfter","dayKind","payrollRuleDetail","holidayDiff","DateInterval","getDateTimezoneInfo","dayLightSavingCorrs","getDateTimeInTimezone","EmployeeSchedule","calcInfo","tasksByKind","_paidwork","boByTaskType","byDay","_paidWorkWeek","boData","hasAny","filteredBySkills","plannedAndTarget","_boWorkWeek","initialTasks","addTask","getDayByIndex","absence","payment","correction","copyForReplacement","addTasks","minutesPerUnit","affectsnextday","tzDayInfo","endOfDay","clearDayComputations","calcMode","calculateWork","calcPayment","calendarDays","getShiftBoundsByDate","calculateShiftPaidTime","tasks2","cutToBounds","getWorkImpl","calculateBOWork","dayCalcInfo","boTasks","workIntervals","subtractTasks","workInMinutes","msPerMinute","wi","boSkillData","addPlanned","calculateWorkIntervals","taskIntervals","breaksOnDay","optimizationInterval","paidWorkInterval","paidwork","calculatePaidWork","paidWorkWeek","weekIndex","weekWork","removeBreaks","deleteTasksOnInterval","endsAtNextDay","removeShift","boWork","hasWork","getAgreedWorkMinutesDiff","agreedWorkMinutes","maxTotalWorkMinutes","getDayBounds","areedWorkMinutesLeft","getMaxWorkWeekLeft","getMaxDurForWork","afterNightRest","nightRest","beforeNightRest","availabilites","isAvailable","getMinWorkLeft","possibleWork","workLeft","workLeftWeek","getMinWorkWeekLeft","maxWorkMinutesByWeekIndex","POSITIVE_INFINITY","getShiftBounds2","getPayrollTasks","sumDays","allAttendanceTasks","getAttendanceTasks","attendanceTasks","requiresLog","toCount","calculateAttendance","paidAbsence","toRemove","sumTasks","stCorrect","fiCorrect","msPerHour","payrollTasks","shiftOk","ti","isOkToWork","isOkDaysInRow","isOkWeekendsInRow","maxDaysInRow","maxWeekendsInRow","saturdayIndex","isOkMinNightRest","minNightRest","checkRuleCompliance","agreedWorkDiff","weekIndexSt","weekIndexFi","minWorkWeekLeft","maxWorkWeekViolation","weekStart","dayIndexSt","dayIndexFi","getBOWork","getBOWorkLeft","maxBOWeek","getBOScore","getScore","getBOTaskScore","numberOfAgents","boWorkLeft","scores","taskScore","getTaskScore","getMinTargetScore","arrayQ","setScores","getAttendance","getLogTime","calculateTimeInInterval","getRotationTime","getPaidWork","getOvertime","getAddedOrDeletedTasks","initialByKey","getKey","added","compareWithInital","EmployeeScheduleList","_list","attendanceBreaksTolerance","paidBreaksOnLog","unpaidBreaks","br","hasBefore","hasAfter","noLogTasks","sumDateIntervals","tasksByEmpId","getTasksByEmpId","availByEmp","availByDay","arEmp","createAvailabilityByDay","ec","ccIntervals","getOnInterval","callcenterId","ccInterval","qSt","nextNextDt","qFi","shiftTasks","taskCopy","getConnectedEnd","endDt","ignoreToDelete","dayEmpSchedule","empCC","getEmpBreakArray","breakArray","breakArrayDetailed","dtStart","isAtDt","getMinShiftStart","minTaskStart","getPossibleShiftStart","minAbsenceStart","connectEnd","addExtraTime","hasTask","setShiftBounds","prevDate","isInDB","getWork","getWorkFromTasks","filteredTasks","filteredToRemove","getWorkImplFromTasks","usePaid","remains","newFi","Employee","ModelObject","_empid","_ccid","_agreedWorkWeek","_minWorkWeek","_maxWorkWeek","_optimizationOrder","optimizationOrder","_maxDaysInRow","_maxWeekendsInRow","_nightRest","_maxBOWeek","_absenceDuration","_username","_switchid","_skills","_password","_tagIds","_address1","address1","_address2","address2","_address3","address3","_agreedSms","agreedSms","_phoneNum","phoneNum","userid","_birthDate","birthDate","_hireDate","hireDate","_terminationDate","changeVersion","_separateUsername","_warnings","_checked","setEmpDateValue","separateUsername","setEmpValue","agworkhours","setHours","isExtra","minWorkWeekHours","maxWorkWeekHours","maxBOWeekHours","absenceDurationHours","nightRestHours","setEmpNumberArrayValue","checked","hasChangesWorkTime","hasChangesPart","hasChangesTags","hasChangesWorkDays","hasChangesGeneral","hasSameSkills","hasSameWorkTimes","hasSameWorkDaySettings","copyWorkWorkDaySettings","copyWorkHours","isUsernameOk","originalMap","originalSkills","skillId","patchSave","setDateValue","setNumberArrayValue","numberValue","parseFloat","setValueImpl","eqProjection","originalValue","projOriginalValue","projValue","setHasChanges","dateProj","numberArrayProj","setOriginalValueImpl","setOriginalValue","setOriginalDateValue","setContainer","container","_container","hasContainer","itemChanged","itemHasChanged","fields","field","undoToDelete","dt1","dt2","diffTime","diffDays","isoDate","stMs","fiMs","msPerHours","msPerNormalDay","negativeId","getNegativeId","convertToDate","_comment","convertToString","comment","_tasktypeId","_corrSt","convertToNumber","corrSt","_corrFi","corrFi","_reasonCode","_updated","_userId","_lastSt","_lastFi","_logStToggleIndex","_logFiToggleIndex","oldValue","stCorrectTime","fiCorrectTime","durHours","logStToggleIndex","logFiToggleIndex","revertTo","redoRevertTo","adjustLogCorrection","msDay","msPerMin","createTaskSystemKind","operator","shortBreak","longBreak","overtime","createTaskKind","getKindAsType","getSystemKindAsSubtype","systemKind","TaskTypes","TaskType","_byId","_bySystemKind","_work","getSchemeColor","_type","_subtype","_paid","_requiresLog","_color","localUTCOffset","utcOffset","tzUTCOffset","h","getTimeOfDay","EmployeeCallcenters","empCCToList","_byEmployeeId","EmployeeCallcenter","midday","records","getEmployeeCallcenter","byEmployeeId","n","postEmployeeCallcenter","empCCList","getListCopy","defaultId","excludeId","fiInterval","getInitialData","deleteAgreement","deleteTaskType","getAgreements","getTaskTypes","patchTaskType","postAgreements","agreementsToSave","postTaskType","defineStore","agreements","shallowReactive","backOfficeSkills","generalSettingsLoaded","planningSettings","getters","empTabs","general","callCentersRelevant","callGroupsAllowed","ccIds","callCentersAllowed","dayTypeDefault","taskTypeList","actions","initialData","tasktypes","loadBreakSettings","currentCCId","setCurrentCC","loadCallGroups","loadDayTypes","reportStore","loadSwitches","loadTags","loadTaskTypes","initUsers","saveAgreements","saveGeneralEmpAppSettings","storedSettings","saveGeneralSettings","generalOptions","storedForecastSettings","storedAdherenceSettings","needsReloadOfForecast","savePlanningSettings","saveTaskTypes","changeTaskTypes","ForecastAiData","_forecastDataMap","forecastDataMap","loadAiForecastData","msPerQ","forecastPredictions","getForecastPrediction","getOrCreateForcast","hasShifted","callTime","dstQ","dstShift","ForecastData","_historicDataMap","loadHistoricData","ipoa","startTimeUTC","quarters","isCalculating","msPerQuarterHour","quarterAtDayEnd","quarterAtDaystart","cgId","xVal","daysavingTransitionCorrection","loadHistoricDataSpecialDays","counterMap","d2","dayTypeId","csResult","dr","key2","SimulationData","_simulationDataMap","_targetDataMap","_emplyeesByAffinity","_callGroupPrioInfoMap","SpecialDayData","_specialDaysMap","loadSpecialDays","daytypeMap","dtid","saveSpecialDay","dtString","CALL_STATE","createCallStates","CALL_TRACKER_REPORT_TYPE","createCallTrackerReportTypes","CALL_TYPE","createCallTypes","parseGenesisCallTrackerTsv","splitTabLine","parseCall","endIndex","client","clientNumber","callId","events","segment","stamp","parseEnum","callType","callState","stationNumber","Undefined","Secretarial","Checkin","Fetch","Scheduled","IVR","WebScript","VoiceMail","AutoCall","Announcement","MergeComm","PageConfirmation","SmartPaging","ChangeClient","AgentAudio","Rauland","AutoAttendant","ListingLookup","Dispatch","ParkOrbit","VMCallBack","Cue","Repeat","ConfBridge","Orbit","Elevator","Pers","Unknown","Disposed","Disc","Ring","Talk","Talk1","Talk2","Conference","Hold","InProgress","OutboundQueue","Auto","AutoHold","Patch","Bridge","MaxStates","None","Distribute","Answered","Overdial","Change","Reassign","Park","Transfer","Abandon","Voci","Limited","enumObj","indexOfLeft","indexOfRight","importCallsFile","callImportFileType","resultData","CALL_FILETYPE","infinity","requiredHeaders","replace","hasAllHeaders","headerIndexMap","acc","rec","cleanedValues","callData","callid","isNonNegative32Bit","wrap","is32Bit","talk","tag1","emptyToNull","isInteger","isNonNegative64Bit","tag2","tag3","abandon","genesisLS","columnMap","col","genesisCallTracker","batchedReport","numberAsString","createCallFileTypeEnum","dropFiles","context","importCallsLoadingStatus","lastImportFileSetting","lastCallImportFile","lastAgentImportFile","executeCsvImport","fileInfo","dropFileLengh","fileCount","startProgress","progress","content","_isLoadingHistoricData","_isLoadingAiForecast","callStatsWeek","chartData","selectedCallCenters","adjustmentDate","adjustmentDialogShow","compareSencitivity","useAiForecast","aiForecastIsLoaded","copiedData","fetchForecast","loadLocalForcastOptions","loadForecastAdjustment","reloadAiForecast","updateForecast","ok1","ok2","updateCallStatsWeek","adjustmentMap","dayMap","cgid","staticData","static_noc","static_ht","localForecastOptions","selectedAcGrIds","saveLocalForecastOptions","setChartData","callCenterKeyFigures","callCenterKeyFiguresLoadingStatus","clearCallCenterKeyFigures","fetchCallcenterKeyFigures","callCenterKeyFifures","activeCallCenters","getCCSimData","simdata","numberOfSick","numberOfVacation","absTask","ccCallGroups","agreementID","includePaidBreaks","payrollReportOneRow","reportDatePicker","reportFilter","reportKind","reportTimeRangePicker","selectedEmp","selectedTasks","selectedTasktype","separateColumns","toggleSelectedTask","selectedTasktoString","thisTaskname","stringArray","taskTypesMap","taskTypeID","BreakOptimizationSettings","_spreadFactor","spreadFactor","_avoidSimultanousBreaksFactor","avoidSimultanousBreaksFactor","_numberOfIterations","_breakStartQuarterHours","breakStartQuarterHours","_blackouts","blackout","blackouts","BreakOptimizationSettingDetail","addBlackout","blackHours","grade","deleteBlackout","_blackHours","_grade","_taskTypeId","blackGrade","blackHoursInfo","getBreakOptimizationSettings","EmployeeContext","highlightedEmpIds","_checkedEmpIds","_activeTab","previousTab","selectedSection","_hasCheckedNotHighlighted","_hasModifiedData","_modifedDataTab","checkedEmpIds","oldCheckedEmpIds","calcHasCheckedNotHighlighted","hasCheckedNotHighlighted","hasModifiedDataInOtherTab","isHighlighted","setHighlighedEmps","oldHighlightedEmpIds","EmployeeList","numberOfGhosts","setHasChanged","ScheduleTask","ScheduleTasks","taskDto","setItemHasChanges","_scheduleTaskInfo","loaded","affintyIndicatorsMap","breakOptimizationSettings","customShifts","multiEditSameValue","runningStQ","loadCCData","pinnedRequestKey","scheduleColumnDefinitions","getScheduleColumnDefinitions","scheduleColumnDefinitionsDetailed","getScheduleColumnDefinitionsDetailed","copiedShifts","dragSelectionStart","showDetailsInServiceLevel","showAvgQueueChart","showWaitWithinChart","showReplacementDialog","dispalySimulationSettings","showInactive","showDetailEdit","agentScheduleViewClock","agentExpandedTeamView","agentAcceptedCookies","selectedDate","selectedDateInTeamSchedule","findReplacementSelected","applyToChart","saveButtonHovered","selectedScheduleColumnIds","serviceLevelColumnDefinitions","getServiceLevelColumnDefinitions","simulationStatus","displaySLSencitivity","percetageOfCallsInWaitChart","empOccTarget","scheduleDateInteval","dateArray","getAffintyIndicatorsMap","getNumberOfDaysInSchedule","isAllowedToSave","undoMap","redoMap","clearScheduleFilter","clearScheduleTasks","fetchSimData","resetSimulationsStatus","affinintyIdSet","sldd","cd","loadAvailabilities","loadBreakOptimizationSettings","zeroSchedule","loadCustomShifts","loadShiftBags","loadRotations","loadEmployees","localAgentScheduleOptions","inspector","loadLocalRequestOptions","loadScheduleColumnIds","loadEmployeeDisplaySettings","localRequestOptions","merge","currentData","local","calculateBySelectionKeyMap","loadScheduleAfterScheduleRequest","loadSchedule","loadScheduleTasks","scheduleTasksToCommit","getTaskDateIntervalsNotYetRetrieved","tasksWithLast","xSt","xNumberOfDays","getLoadedDateIntervals","saveScheduleColumnIds","saveScheduleTasks","changedRequests","hasChangedRequests","taskToCreate","taskToUpdate","taskToDelete","createWeight","updateWeight","requestWeight","deleteItems","deleteBatch","updateItems","updateBatch","createItems","createBatch","requestItems","requestBatch","requestReplies","setLoadCCData","toggleScheduleColumn","tmp","selectedColumns","column","msPerDay","columnDefinitions","columnDefinitionsDetailed","columnDefinitionsServiceLevel","requestMap","k","_component_RadioButton","inputId","canSaveNotify","_component_Button","saveNotifyMethod","saveDisabled","isEmailDisabled","autocomplete","password2Formatted","maxlength","verificationNeeded","sendVerification","canSave","saveAuthMethod","loginFailed","hasHistory","backgroundColor","required","roundClass","buttonClass","buttonPaddingClass","fitdark","rounded","iconLeft","iconSize","_renderSlot","$slots","iconRight","expanded","loading","buttonRole","role","iconSrc","icons","arrow_back","arrows_collapse_vertical","arrows_expand_vertical","arrow_down","arrow_forward","arrow_up","arrow_left_right","arrow_right_short","arrow_right","arrow_left","box_arrow_in_down","box_arrow_up","building","calendar4_range","chat_left","chat_check2_square","chevron_up","chevron_down","chevron_left","chevron_right","clock","clock30","close","cup","deletex","columns","select","gear","grid","checkmark","friendlyGhost","list30","meter","meter_temp","more","edit","pin","pin_angel","phone","plus","search","sick_white","sick_thin","star","swap","compare_filled","compare_outline","portfolio_filled","portfolio_outline","user_outline","upload","vacation_thin","vacation_white","work_sad","work_glad","hand_thumbs_down","hand_thumbs_up","patch_question","schedule_edit","log_edit","stats","sizePx","onClose","footer","_component_PvAccordion","selectOnFocus","headerClass","_component_PvAccordionTab","isShowTitle","setColor","getSize","webpackAsyncContext","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","deferred","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","getter","__esModule","leafPrototypes","getProto","getPrototypeOf","__proto__","mode","ns","def","getOwnPropertyNames","definition","defineProperty","enumerable","f","chunkId","miniCssF","g","globalThis","Function","hasOwnProperty","inProgress","dataWebpackPrefix","done","script","needAttach","scripts","getElementsByTagName","getAttribute","charset","timeout","nc","setAttribute","onScriptComplete","prev","onerror","onload","clearTimeout","doneFns","parentNode","bind","head","Symbol","toStringTag","nmd","paths","children","createStylesheet","fullhref","oldTag","linkTag","rel","onLinkComplete","errorType","realHref","insertBefore","nextSibling","findStylesheet","existingLinkTags","dataHref","existingStyleTags","loadStylesheet","installedCssChunks","miniCss","cssChunks","baseURI","self","installedChunks","installedChunkData","promise","loadingEnded","realSrc","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""}