{"version":3,"file":"index.4fa1eab0.js","mappings":"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,oEACD,CAXD,CAAYA,IAAAA,EAAwB,KAapC,SAAYC,GACV,yCACA,yCACA,yCACA,gCACA,8BACA,0BACA,0BACA,yBACA,yBACA,0BACA,wBACA,wBACA,uBACA,sBACA,wBACA,sBACA,qBACA,iBACA,eACA,gBACD,CArBD,CAAYA,IAAAA,EAAoB,KAuBhC,SAAYC,GACV,6BACA,uBACA,sBACD,CAJD,CAAYA,IAAAA,EAAa,KAMzB,SAAYC,GACV,iDACA,iCACD,CAHD,CAAYA,IAAAA,EAAgB,KAK5B,SAAYC,GACV,yBACA,sBACD,CAHD,CAAYA,IAAAA,EAAY,KAKjB,MAAMC,EAAoB,CAC/B,CAACD,EAAaE,UAAW,iBACzB,CAACF,EAAaG,SAAU,sBAG1B,IAAYC,EAMAC,EAcAC,EAQAC,EAmBAC,EAMAC,EAaAC,EAyBAC,EAsBAzI,EAUA0I,EASAC,GApIZ,SAAYT,GACV,yBACA,iBACA,YACD,EAJD,CAAYA,IAAAA,EAAS,KAMrB,SAAYC,GACV,0BACA,0BACA,yBACA,qBACA,qBACA,iBACA,iBACA,iBACA,yBACA,2BACA,gBACD,CAZD,CAAYA,IAAAA,EAAU,KActB,SAAYC,GACV,yCACA,6BACA,2BACA,uBACA,cACD,CAND,CAAYA,IAAAA,EAAS,KAQrB,SAAYC,GACV,+BACA,iBACA,iBACA,yBACA,mBACA,oBACA,eACA,eACA,iBACA,0BACA,oCACA,uBACA,uBACA,2BACA,6BACA,uBACD,CAjBD,CAAYA,IAAAA,EAAmB,KAmB/B,SAAYC,GACV,2BACA,qCACA,sCACD,CAJD,CAAYA,IAAAA,EAAuB,KAMnC,SAAYC,GACV,sBACA,+BACA,iBACA,iBACA,yBACA,mBACA,wBACA,kBACA,eACA,kBACD,CAXD,CAAYA,IAAAA,EAAY,KAaxB,SAAYC,GACV,wCACA,wCACA,wCACA,4BACA,iCACA,qCACA,uCACA,4CACA,4CACA,gCACA,yCACA,qCACA,uDACA,qCACA,oCACA,kCACA,gCACA,qCACA,mCACA,yDACA,wDACA,6BACD,CAvBD,CAAYA,IAAAA,EAAc,KAyB1B,SAAYC,GACV,6BACA,6BACA,2BACA,2BACA,6BACA,mBACA,iBACA,2BACA,2BACA,6BACA,yBACA,2CACA,uBACA,yBACA,uBACA,+BACA,+BACA,+CACA,4CACD,CApBD,CAAYA,IAAAA,EAAuB,KAsBnC,SAAYzI,GACV,sBACA,sBACA,qBACA,oBACA,mBACA,oBACA,oBACD,CARD,CAAYA,IAAAA,EAAa,KAUzB,SAAY0I,GACV,sBACA,sBACA,qBACA,oBACA,mBACA,mBACD,CAPD,CAAYA,IAAAA,EAAwB,KASpC,SAAYC,GACV,uBACA,yBACA,6BACA,6BACA,qCACA,iCACA,+BACA,kCACA,kCACA,gCACA,gCACA,kCACA,8BACA,gDACA,sBACA,iCACD,CAjBD,CAAYA,IAAAA,EAAe,KC/OpB,MAEMC,EAAyB,mBACzBC,EAA+B,yBAC/BC,EAAgB,UAChBC,EAAmB,aACnBC,EAAwB,kB,ICNzBC,EAIAC,EAKAC,EAOAC,E,uBAhBZ,SAAYH,GACV,4CACD,EAFD,CAAYA,IAAAA,EAAsB,KAIlC,SAAYC,GACV,uDACA,4CACD,CAHD,CAAYA,IAAAA,EAAwB,KAKpC,SAAYC,GACV,qDACA,wDACA,yDACA,wDACD,CALD,CAAYA,IAAAA,EAAwB,KAOpC,SAAYC,GACV,qDACA,mDACA,wDACD,CAJD,CAAYA,IAAAA,EAA0B,K,IChB1BC,EAOAC,EAaAC,EAyBAC,EAOAC,EAQAC,EAcAC,EAKA5J,EAgBAE,EAgBA2J,E,YA/GZ,SAAYP,GACV,yBACA,iCACA,iCACA,gDACD,EALD,CAAYA,IAAAA,EAAiB,KAO7B,SAAYC,GACV,iCACA,6CACA,qCACA,qDACA,+DACA,qEACA,yCACA,+CACA,iEACA,wDACD,CAXD,CAAYA,IAAAA,EAAqB,KAajC,SAAYC,GACV,iCACA,mDACA,uEACA,mDACA,qCACA,qCACA,+BACA,+BACA,qCACA,qCACA,yCACA,2CACA,+CACA,+CACA,yCACA,+CACA,yDACA,qCACA,yCACA,yCACA,yDACA,8CACD,CAvBD,CAAYA,IAAAA,EAAmB,KAyB/B,SAAYC,GACV,yBACA,iCACA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oDACA,kDACA,8DACA,wDACA,oEACA,kDACA,oDACA,wDACA,mDACD,CAfD,CAAYA,KAAAA,GAA+B,KAiB3C,SAAYC,GACV,sEACA,oEACA,oEACA,8DACA,gEACA,8DACA,kEACA,wDACA,mDACD,CAVD,CAAYA,KAAAA,GAAiC,KAY7C,SAAYC,GACV,mBACA,yBACA,sBACD,CAJD,CAAYA,KAAAA,GAAc,KAM1B,SAAYC,GACV,2CACA,iDACA,6CACA,mDACA,mDACA,qDACA,uEACA,yDACA,2DACA,+BACA,yCACA,6BACA,6CACA,6CACA,2CACA,qCACA,6DACA,iEACA,2DACA,sDACD,CArBD,CAAYA,KAAAA,GAAM,KAuBlB,SAAYC,GACV,6CACA,+CACA,2CACA,kDACA,kDACA,mDACA,uDACA,sDACA,wDACA,8BACA,wCACA,4BACA,2CACA,2CACA,4CACA,oCACA,uDACA,2DACA,qDACA,4CACD,CArBD,CAAYA,KAAAA,GAAY,KAuBxB,SAAYC,GACV,gDACA,0CAEA,uDACA,8DACA,yDACA,sDACA,mCACA,6CACA,iCACA,yCACA,yCACA,iDACA,yCACA,qDACA,uDACA,oDACA,iDACD,CAnBD,CAAYA,KAAAA,GAAkB,KAqB9B,SAAYC,GACV,mBACA,cACA,aACD,CAJD,CAAYA,KAAAA,GAAgB,KAM5B,SAAYC,GACV,+BACA,sBACD,CAHD,CAAYA,KAAAA,GAAgB,KAK5B,SAAYC,GACV,uDACA,2DACA,oDACD,CAJD,CAAYA,KAAAA,GAAc,KAM1B,SAAYC,GACV,6CACA,4CACD,CAHD,CAAYA,KAAAA,GAAU,KAKtB,SAAYC,GACV,qBACA,sBACD,CAHD,CAAYA,KAAAA,GAAgB,KAK5B,SAAYC,GACV,qBACA,sBACD,CAHD,CAAYA,KAAAA,GAA+B,KAK3C,SAAYC,GACV,sCACA,qCACD,CAHD,CAAYA,KAAAA,GAAc,KAK1B,SAAYC,GACV,yBACA,4BACA,wBACA,0BACA,8BACA,sBACA,qCACA,mCACA,qCACA,2CACD,CAXD,CAAYA,KAAAA,GAAW,KAavB,SAAYC,GACV,wBACA,wBACA,yBACA,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CV,8CACA,uDACD,CAHD,CAAYA,KAAAA,GAA0B,KAKtC,SAAYC,GACV,sDACA,0DACA,yDACA,6DACA,gFACA,+DACD,CAPD,CAAYA,KAAAA,GAA0B,KAStC,SAAYC,GACV,sDACA,0DACA,0DACA,+DACD,CALD,CAAYA,KAAAA,GAA4B,KAOxC,SAAYC,GACV,+CACA,2EACA,yDACA,oEACD,CALD,CAAYA,KAAAA,GAA4B,KAOjC,MAAMC,GAAuB,CAClC,CAACD,GAA6BE,qBAAsB,qBACpD,CAACF,GAA6BG,mCAAoC,wBAClE,CAACH,GAA6BI,0BAA2B,iBACzD,CAACJ,GAA6BK,gCAAiC,wBAIjE,IAAYC,GCzCAC,GAUAC,GAUAC,GAqBAC,GAeAC,GAWAC,GAUAC,GAUAC,GAKAC,GAMAC,GAKAC,ID9DZ,SAAYX,GACV,qBACA,6BACA,6CACA,yBACA,yBACA,uBACA,mBACA,2DACA,wBACD,EAVD,CAAYA,KAAAA,GAAmB,KCzC/B,SAAYC,GACV,wDACA,4DACA,wEACA,kEACA,kEACA,4DACA,2CACD,CARD,CAAYA,KAAAA,GAAsB,KAUlC,SAAYC,GACV,wDACA,4DACA,wEACA,kEACA,kEACA,4DACA,2CACD,CARD,CAAYA,KAAAA,GAAwB,KAUpC,SAAYC,GACV,gEACA,gFACA,0EACA,0EACA,oEACA,oDACA,4DACA,kEACA,8DACA,8EACA,wEACA,oEACA,oEACA,oEACA,8DACA,kEACA,oEACA,6DACD,CAnBD,CAAYA,KAAAA,GAAwB,KAqBpC,SAAYC,GACV,gEACA,8DACA,oEACA,oEACA,gFACA,0EACA,0EACA,oEACA,oDACA,sFACA,8EACA,uEACD,CAbD,CAAYA,KAAAA,GAA0B,KAetC,SAAYC,GACV,2BACA,qCACA,uBACA,uBACA,yBACA,iBACA,iCACA,oCACD,CATD,CAAYA,KAAAA,GAAqB,KAWjC,SAAYC,GACV,0BACA,6BACA,wBACA,yBACA,sBACA,4BACA,oCACD,CARD,CAAYA,KAAAA,GAA0B,KAUtC,SAAYC,GACV,0BACA,oCACA,uBACA,uBACA,2BACA,6BACA,uBACD,CA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","sources":["webpack://cp/./packages/ui/components/UiNotification.vue?adbb","webpack://cp/./packages/common/plugins/notification.ts","webpack://cp/./packages/cloud/src/router/cloud.routes.ts","webpack://cp/./packages/cloud/src/router/cloud.router.ts","webpack://cp/./packages/cloud/src/components/general/CloudUpdateWarning.vue","webpack://cp/./packages/cloud/src/components/general/CloudUpdateWarning.vue?78dc","webpack://cp/./packages/cloud/src/Cloud.vue?a25b","webpack://cp/./packages/cloud/src/Cloud.vue","webpack://cp/./packages/ui/components/UiSnackbar.vue?c610","webpack://cp/./packages/common/plugins/snackbar.ts","webpack://cp/./packages/cloud/src/cloud.main.ts","webpack://cp/./packages/common/app-composables/useReceiptCRUD.ts","webpack://cp/./packages/common/composables/useTravelReportFields.ts","webpack://cp/./packages/common/composables/useActivityOverview.ts","webpack://cp/./packages/common/composables/useDailyAllowance.ts","webpack://cp/./packages/common/composables/usePaymentMethods.ts","webpack://cp/./packages/common/composables/useAccountingRefs.ts","webpack://cp/./packages/common/composables/useOCRCoordinates.ts","webpack://cp/./packages/common/composables/useBankConnection.ts","webpack://cp/./packages/common/composables/useItemRowFields.ts","webpack://cp/./packages/common/composables/useReceiptSelect.ts","webpack://cp/./packages/common/composables/useReportButtons.ts","webpack://cp/./packages/common/composables/useReceiptFields.ts","webpack://cp/./packages/common/composables/useMileageFields.ts","webpack://cp/./packages/common/composables/useUpdateChecker.ts","webpack://cp/./packages/common/composables/useTransactions.ts","webpack://cp/./packages/common/composables/useLoadingState.ts","webpack://cp/./packages/common/composables/useIntegrations.ts","webpack://cp/./packages/common/composables/useActiveDates.ts","webpack://cp/./packages/common/composables/useDuplicates.ts","webpack://cp/./packages/common/composables/useFileUpload.ts","webpack://cp/./packages/common/composables/useCostTypes.ts","webpack://cp/./packages/common/composables/useApprovals.ts","webpack://cp/./packages/common/composables/useTableSort.ts","webpack://cp/./packages/common/composables/useCompanies.ts","webpack://cp/./packages/common/lib/statuses/tripCurrencyConversionStatus.js","webpack://cp/./packages/common/composables/useFilters.ts","webpack://cp/./packages/common/composables/useContext.ts","webpack://cp/./packages/common/composables/useExport.ts","webpack://cp/./packages/common/composables/useEvents.ts","webpack://cp/./packages/common/composables/useUser.ts","webpack://cp/./packages/common/enums/companies.ts","webpack://cp/./packages/common/enums/receipts.ts","webpack://cp/./packages/common/enums/events.ts","webpack://cp/./packages/common/enums/cost-types.ts","webpack://cp/./packages/common/enums/trips.ts","webpack://cp/./packages/common/enums/approvals.ts","webpack://cp/./packages/common/enums/approval-settings.ts","webpack://cp/./packages/common/enums/mileage.ts","webpack://cp/./packages/common/enums/currencies.ts","webpack://cp/./packages/common/enums/general.ts","webpack://cp/./packages/common/enums/overview.ts","webpack://cp/./packages/common/enums/einvoicing.ts","webpack://cp/./packages/common/enums/transactions.ts","webpack://cp/./packages/common/enums/accounting.ts","webpack://cp/./packages/common/lib/statuses/receiptStatuses.ts","webpack://cp/./packages/common/lib/useLocalStorage.ts","webpack://cp/./packages/common/lib/helpers/index.js","webpack://cp/./packages/common/lib/integrationTitle.js","webpack://cp/./packages/common/lib/log/index.js","webpack://cp/./packages/common/lib/receipts/index.js","webpack://cp/./packages/common/lib/trips/index.js","webpack://cp/webpack/bootstrap","webpack://cp/webpack/runtime/chunk loaded","webpack://cp/webpack/runtime/compat get default export","webpack://cp/webpack/runtime/define property getters","webpack://cp/webpack/runtime/ensure chunk","webpack://cp/webpack/runtime/get javascript chunk filename","webpack://cp/webpack/runtime/get mini-css chunk filename","webpack://cp/webpack/runtime/global","webpack://cp/webpack/runtime/harmony module decorator","webpack://cp/webpack/runtime/hasOwnProperty shorthand","webpack://cp/webpack/runtime/load script","webpack://cp/webpack/runtime/make namespace object","webpack://cp/webpack/runtime/node module decorator","webpack://cp/webpack/runtime/runtimeId","webpack://cp/webpack/runtime/publicPath","webpack://cp/webpack/runtime/css loading","webpack://cp/webpack/runtime/jsonp chunk loading","webpack://cp/webpack/startup"],"sourcesContent":["import { render } from \"./UiNotification.vue?vue&type=template&id=383a7a38&scoped=true\"\nimport script from \"./UiNotification.vue?vue&type=script&lang=js\"\nexport * from \"./UiNotification.vue?vue&type=script&lang=js\"\n\nimport \"./UiNotification.vue?vue&type=style&index=0&id=383a7a38&lang=scss&scoped=true\"\n\nimport exportComponent from \"/usr/src/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-383a7a38\"]])\n\nexport default __exports__","import UiNotification from '@ui/components/UiNotification'\r\nimport type { Plugin as PluginType } from 'vue'\r\nimport emitter from 'tiny-emitter/instance'\r\n\r\ndeclare module '@vue/runtime-core' {\r\n interface ComponentCustomProperties {\r\n $notification: typeof notification\r\n }\r\n}\r\n\r\nexport const notification = (\r\n message: string,\r\n type?: string,\r\n timeToDisappear?: number,\r\n bottomOffset?: number,\r\n options?: any\r\n) => {\r\n emitter.emit('appear', message, type, timeToDisappear, bottomOffset, options)\r\n\r\n if (type === 'error') {\r\n console.log(message)\r\n }\r\n}\r\n\r\nconst Plugin: PluginType = (app) => {\r\n app.config.globalProperties.$notification = notification\r\n\r\n app.component('ui-notification', UiNotification)\r\n}\r\n\r\nexport default Plugin","import { RouteRecordRaw } from 'vue-router'\n\nconst routes: Array = [\n {\n path: '/',\n component: () => import('@cloud/views/Main.view.vue')\n },\n {\n path: '/login/callback',\n component: () => import('@cloud/views/AuthCallback.view.vue'),\n meta: { isPublic: true }\n },\n {\n path: '/overview/:summaryTab',\n component: () => import('@cloud/views/Dashboard.view.vue')\n },\n {\n path: '/:companyId',\n component: () => import('@cloud/views/Main.view.vue')\n },\n {\n path: '/:companyId/:tab/:layout',\n component: () => import('@cloud/views/Main.view.vue')\n },\n {\n path: '/:companyId/:tab/:layout/create',\n component: () => import('@cloud/views/Main.view.vue')\n },\n {\n path: '/:companyId/:tab/:layout/receipt/:receiptId',\n component: () => import('@cloud/views/Main.view.vue')\n },\n {\n path: '/:companyId/:tab/:layout/receipt/:receiptId/create',\n component: () => import('@cloud/views/Main.view.vue')\n },\n {\n path: '/:companyId/:tab/:layout/trip/:tripId',\n component: () => import('@cloud/views/Main.view.vue')\n },\n {\n path: '/:companyId/:tab/:layout/trip/:tripId/receipt/:receiptId',\n component: () => import('@cloud/views/Main.view.vue')\n },\n {\n path: '/:companyId/:tab/:layout/trip/:tripId/mileage/:mileageId',\n component: () => import('@cloud/views/Main.view.vue')\n },\n {\n path: '/:companyId/:tab/:layout/new-trip/:tripType',\n component: () => import('@cloud/views/Main.view.vue')\n },\n {\n path: '/:companyId/:tab/:layout/approval/:approvalId/trip/:tripId',\n component: () => import('@cloud/views/Main.view.vue')\n },\n {\n path: '/:companyId/:tab/:layout/approval/:approvalId/receipt/:receiptId',\n component: () => import('@cloud/views/Main.view.vue')\n },\n {\n path: '/:companyId/:tab/:layout/approval/:approvalId/trip/:tripId/receipt/:receiptId',\n component: () => import('@cloud/views/Main.view.vue')\n }\n]\n\nexport default routes","import {\n Router,\n RouteLocationNormalized,\n NavigationGuardNext,\n createWebHistory,\n createRouter,\n} from 'vue-router'\n\nimport routes from './cloud.routes'\nimport {Config} from '@/types'\n\nexport default (config: Config): Router => {\n console.log('creating router @ ' + config?.appRoot)\n\n const router = createRouter({\n history: createWebHistory(config?.appRoot),\n routes\n })\n \n router.beforeEach((\n to: RouteLocationNormalized,\n from: RouteLocationNormalized, \n next: NavigationGuardNext\n ) => {\n let redirect\n \n if (to.path.startsWith('/@')) {\n redirect = to.path\n .replace(/^\\/@/, '/cloud')\n }\n \n if (redirect) {\n next(redirect)\n } else {\n next()\n }\n })\n\n return router\n}","\r\n\r\n\r\n\r\n\r\n","import { render } from \"./CloudUpdateWarning.vue?vue&type=template&id=3a7a008c&scoped=true\"\nimport script from \"./CloudUpdateWarning.vue?vue&type=script&lang=js\"\nexport * from \"./CloudUpdateWarning.vue?vue&type=script&lang=js\"\n\nimport \"./CloudUpdateWarning.vue?vue&type=style&index=0&id=3a7a008c&lang=scss&scoped=true\"\n\nimport exportComponent from \"/usr/src/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-3a7a008c\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, createElementVNode as _createElementVNode, createElementBlock as _createElementBlock, Fragment as _Fragment } from \"vue\"\nimport _imports_0 from '@/img/pocket-loader-small.gif'\n\n\nconst _hoisted_1 = {\n key: 2,\n class: \"loader\"\n}\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"img\", { src: _imports_0 }, null, -1)\nconst _hoisted_3 = [\n _hoisted_2\n]\n\nimport { onBeforeMount, computed, ref } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport {\n APPROVAL_STATE,\n COMPANIES_STORE_ACTIONS,\n CONFIG_STORE_ACTIONS,\n CONFIG_STORE_GETTERS,\n USERS_STORE_ACTIONS\n} from '@/enums'\n\nimport {\n useCompanies,\n useContext,\n useCostTypes,\n useEvents,\n usePaymentMethods,\n useActiveDates,\n useIntegrations,\n useBankConnection,\n useApprovals,\n useUpdateChecker,\n useUser\n} from '@/composables'\n\nimport CloudUpdateWarning from './components/general/CloudUpdateWarning'\n\n\nexport default /*#__PURE__*/_defineComponent({\n setup(__props) {\n\nconst { activeCompany, activeUserIsAdmin, openDefaultView, onCompanyChange, getCompany } = useCompanies()\nconst { loadExpenseTypes } = useCostTypes()\nconst { loadPaymentMethods } = usePaymentMethods()\nconst { setActiveDates, selectPresetDates, setDateSelectCriteria } = useActiveDates()\nconst { checkServiceActivationState } = useIntegrations()\nconst { loadApprovals } = useApprovals()\nconst { loadBankAccounts } = useBankConnection()\nconst { initEventStream } = useEvents()\nconst { updateRequired, initUpdateChecker } = useUpdateChecker()\nconst { convertTo3LetterLanguage } = useUser()\n\nconst router = useRouter()\nconst { store, root } = useContext()\n\nconst isConfigLoaded = computed(() => store.getters[CONFIG_STORE_GETTERS.IS_CONFIG_LOADED])\nconst companyIdInRoute = computed(() => root?.$route?.params?.companyId)\nconst isDataLoaded = ref(false)\nconst isOverviewRoute = computed(() => location.pathname.includes('/overview'))\n\nonBeforeMount(async () => {\n if (!isConfigLoaded.value) {\n await store.dispatch(CONFIG_STORE_ACTIONS.LOAD_CONFIG)\n }\n\n if (localStorage.language && localStorage.language.length === 2) {\n const converted = convertTo3LetterLanguage(localStorage.language)\n localStorage.setItem('language', converted)\n }\n\n if (location.pathname == '/login/callback') {\n isDataLoaded.value = true\n return\n }\n\n initEventStream()\n\n const config = store.getters[CONFIG_STORE_GETTERS.CONFIG]\n\n initUpdateChecker()\n\n const user = await store.dispatch(USERS_STORE_ACTIONS.GET_USER)\n\n if (!user) {\n // route to login\n // let email = _storage.getItem('email') ? `&email=${encodeURIComponent(_storage.getItem('email'))}` : ''\n const lang = localStorage.getItem('language') ? `&lang=${localStorage.getItem('language')}` : ''\n const originalUrl = root?.$route.path === '/' ? '' : `?originalUrl=${root?.$route.path}`\n const redirectUri = config.auth.redirectUri ? `${config.auth.redirectUri}${originalUrl}` : ''\n\n const authUrl =\n config.auth.url +\n '/login?client_id=' +\n config.auth.clientId +\n '&redirect_uri=' +\n encodeURIComponent(redirectUri) +\n '&email=' +\n lang\n\n isDataLoaded.value = true\n return (location.href = authUrl)\n }\n\n await store.dispatch(COMPANIES_STORE_ACTIONS.GET_COMPANIES)\n\n await getCompany(companyIdInRoute.value)\n\n if (!activeCompany.value && !isOverviewRoute.value) {\n setTimeout(() => {\n openDefaultView()\n isDataLoaded.value = true\n }, 100)\n } else {\n let lastSelectedTab = localStorage.getItem('last-selected-tab')\n if (!activeCompany.value?.settings?.usesCreditCardReports && lastSelectedTab === 'transactions') {\n lastSelectedTab = 'receipts'\n }\n if (!activeCompany.value?.settings?.enableApprovals && lastSelectedTab === 'approvals') {\n lastSelectedTab = 'receipts'\n }\n localStorage.removeItem('last-selected-tab')\n const lastSelectedLayout = localStorage.getItem('last-selected-layout')\n localStorage.removeItem('last-selected-layout')\n if (\n lastSelectedTab &&\n lastSelectedLayout &&\n companyIdInRoute.value &&\n !location.pathname?.includes(lastSelectedTab)\n ) {\n router.replace(`/${companyIdInRoute.value}/${lastSelectedTab}/${lastSelectedLayout}`)\n }\n }\n\n const { startDate, endDate } = selectPresetDates()\n setActiveDates({ startDate, endDate })\n\n const selectReceiptsBy = localStorage.getItem('selectReceiptsBy')\n if (selectReceiptsBy) {\n setDateSelectCriteria(selectReceiptsBy, 'receipts')\n }\n\n const selectTripsBy = localStorage.getItem('selectTripsBy')\n if (selectTripsBy) {\n setDateSelectCriteria(selectTripsBy, 'reports')\n }\n\n isDataLoaded.value = true\n})\n\nonCompanyChange(async (id) => {\n if (id) {\n const companyResult = await getCompany(id)\n const isAdmin = Boolean(companyResult?.companyRoles)\n\n if (isAdmin) {\n checkServiceActivationState(id)\n }\n\n if (companyResult?.settings?.usesCustomCostTypes) {\n loadExpenseTypes(id)\n }\n\n if (companyResult?.settings?.usesCustomPaymentMethods) {\n loadPaymentMethods()\n }\n\n if (companyResult?.settings?.usesCreditCardReports && isAdmin) {\n loadBankAccounts()\n }\n\n if (companyResult?.settings?.enableApprovals) {\n loadApprovals(activeUserIsAdmin.value, [APPROVAL_STATE.PENDING])\n }\n }\n})\n\nreturn (_ctx: any,_cache: any) => {\n const _component_ui_notification = _resolveComponent(\"ui-notification\")!\n const _component_router_view = _resolveComponent(\"router-view\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n (_unref(updateRequired))\n ? (_openBlock(), _createBlock(_unref(CloudUpdateWarning), { key: 0 }))\n : _createCommentVNode(\"\", true),\n _createVNode(_component_ui_notification),\n (_unref(isConfigLoaded) && isDataLoaded.value)\n ? (_openBlock(), _createBlock(_component_router_view, { key: 1 }))\n : (_openBlock(), _createElementBlock(\"div\", _hoisted_1, _hoisted_3))\n ], 64))\n}\n}\n\n})","import script from \"./Cloud.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./Cloud.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./Cloud.vue?vue&type=style&index=0&id=a4df32de&lang=scss\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { render } from \"./UiSnackbar.vue?vue&type=template&id=17fe5ac3&scoped=true\"\nimport script from \"./UiSnackbar.vue?vue&type=script&lang=js\"\nexport * from \"./UiSnackbar.vue?vue&type=script&lang=js\"\n\nimport \"./UiSnackbar.vue?vue&type=style&index=0&id=17fe5ac3&lang=scss&scoped=true\"\n\nimport exportComponent from \"/usr/src/app/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-17fe5ac3\"]])\n\nexport default __exports__","import UiSnackbar from '@ui/components/UiSnackbar'\nimport type { Plugin as PluginType } from 'vue'\nimport emitter from 'tiny-emitter/instance'\n\ndeclare module '@vue/runtime-core' {\n interface ComponentCustomProperties {\n $snackbar: typeof snackbar\n }\n}\n\nexport const snackbar = (\n message: string,\n type?: string,\n timeToDisappear?: number | boolean,\n bottomOffset?: number | boolean,\n options?: any\n) => {\n emitter.emit('appear', message, type, timeToDisappear, bottomOffset, options)\n\n if (type === 'error') {\n console.log(message)\n }\n}\n\nconst Plugin: PluginType = (app) => {\n app.config.globalProperties.$snackbar = snackbar\n\n app.component('ui-snackbar', UiSnackbar)\n}\n\nexport default Plugin\n","import {\n createApp,\n VNode\n} from 'vue'\n\nimport VueLazyLoad from 'vue3-lazyload'\n\nimport '@/lib/globalInterceptors/axios.interceptor'\nimport UiNotification from '@/plugins/notification'\nimport createRouter from '@cloud/router/cloud.router'\nimport Cloud from '@cloud/Cloud.vue'\nimport store from '@/store'\n\nimport {\n helpers,\n l10n,\n} from '@/plugins'\n\nimport {\n registerDynamicComponents,\n registerStaticComponents\n} from '@/components'\n\nimport {\n routerLocationKey\n} from '@/providers'\n\nimport icons from '@ui/icons'\n\nimport Axios from 'axios'\n\nAxios.defaults.headers.common['x-app-id'] = 'cloud-v2'\nAxios.defaults.withCredentials = true\n\nconst render = (config: any | undefined) => {\n const app = createApp(Cloud)\n\n app.use(registerDynamicComponents)\n app.use(registerStaticComponents)\n \n app.use(VueLazyLoad)\n\n const router = createRouter(config)\n \n app.use(router)\n app.use(store)\n app.use(helpers, config)\n app.use(l10n)\n app.use(icons)\n\n app.use(UiNotification)\n\n app.provide(routerLocationKey, router)\n\n app.mount('#__COSTPOCKET__')\n}\n\ntry {\n Axios\n .get('/config.json', {})\n .then(({ data: config }) => {\n render(config)\n })\n .catch(() => {\n render(undefined)\n })\n} catch (error) {\n render(undefined)\n}\n\n","import Axios from 'axios'\r\n\r\nexport default function useReceiptCRUD() {\r\n const createReceipt = async (companyId: any, tripId: any, extras: any) => {\r\n const initialPayload: any = {}\r\n\r\n // TEMPORARY TALTECH SOLUTION, SHOULD BE REMOVABLE AFTER 21.05.2024\r\n if (isNaN(tripId)) {\r\n initialPayload.extraData = {}\r\n initialPayload.extraData.uid = tripId\r\n } else if (tripId) {\r\n initialPayload.tripId = tripId\r\n }\r\n\r\n if (extras) {\r\n Object.assign(initialPayload, extras)\r\n }\r\n\r\n return Axios.post(`@coreapi/companies/${companyId}/receipts`, initialPayload).then(\r\n ({ data: receipt = {} }) => receipt\r\n )\r\n }\r\n\r\n const loadReceipt = async (companyId: any, receiptId: any) => {\r\n return Axios.get(`@coreapi/companies/${companyId}/receipts/${receiptId}`).then(({ data: receipt = {} }) => receipt)\r\n }\r\n\r\n const updateReceipt = async (companyId: any, receiptId: any, key: string, value: any) => {\r\n return Axios.put(`@coreapi/companies/${companyId}/receipts/${receiptId}`, {\r\n [key]: value\r\n }).then(({ data: receipt = {} }) => receipt)\r\n }\r\n\r\n const updateReceiptValues = async (companyId: any, receiptId: any, values: any) => {\r\n return Axios.put(`@coreapi/companies/${companyId}/receipts/${receiptId}`, values).then(\r\n ({ data: receipt = {} }) => receipt\r\n )\r\n }\r\n\r\n const deleteReceipt = async (companyId: any, receiptId: string | number) => {\r\n return Axios.delete(`@coreapi/companies/${companyId}/receipts/${receiptId}`)\r\n }\r\n\r\n return {\r\n createReceipt,\r\n loadReceipt,\r\n updateReceipt,\r\n updateReceiptValues,\r\n deleteReceipt\r\n }\r\n}\r\n","import moment from 'moment'\r\nimport { each, uniq, uniqBy, cloneDeep } from 'lodash-es'\r\nimport { TRAVEL_REPORT_FIELDS } from '@/enums'\r\nimport { COUNTRY_CODE, Trip, CountryNames, TripDestination } from '@/models'\r\nimport countrynametranslations from '@/lib/countrynametranslations/countrynames'\r\nimport specialTerritories from '@/lib/allowance/data/specialTerritories'\r\nimport allowance from '@/lib/allowance/allowance'\r\nimport { allowanceCalculator } from '@/lib/allowance'\r\nimport world from '@/lib/world'\r\nimport useTrips from './useTrips'\r\n\r\nexport default function useTravelReportFields() {\r\n const countries: CountryNames = countrynametranslations\r\n\r\n const featuredCountries = () => {\r\n const { companyTrips } = useTrips()\r\n let featuredCountries: Array<{ title: string; value: string }> = []\r\n let trips = Object.values(companyTrips.value).slice(0, 100)\r\n // FIND ALL TRAVEL REPORTS THAT HAVE DESTINATION SET TODO: should find in daily allowance entries\r\n each(trips, (trip: Trip) => {\r\n if (trip.type === 'travel') {\r\n if (trip.dailyAllowanceInfo && trip.dailyAllowanceInfo.destination) {\r\n let destination = trip.dailyAllowanceInfo.destination\r\n featuredCountries.push(destination)\r\n }\r\n }\r\n })\r\n // MAKE SURE FEATURED COUNTRIES ARE UNIQUE\r\n featuredCountries = uniq(featuredCountries)\r\n // ONLY SHOW LAST FIVE\r\n if (featuredCountries.length > 5) {\r\n let length = featuredCountries.length\r\n featuredCountries = featuredCountries.slice(length - 5, length)\r\n }\r\n return featuredCountries.map((country: any) => {\r\n return { title: countries[localStorage.language || 'eng'][country], value: country }\r\n })\r\n }\r\n\r\n const mapDestinationOptions = (countryCode: COUNTRY_CODE) => {\r\n let destinationCountries: Array<{ title: string; value: string }> = []\r\n let surroundingCountries: Array<{ title: string; value: string }> = []\r\n let lang = localStorage.language || 'eng'\r\n if (lang === 'null') {\r\n // FOR PRELIVE GLITCH\r\n lang = 'eng'\r\n }\r\n world.forEach((country) => {\r\n let countryName = countries[lang][country.code]\r\n if (countryName && ['EE', 'FI', 'LV', 'PL', 'LT', 'RU', 'DE', 'SE'].includes(country.code)) {\r\n surroundingCountries.push({ title: countryName, value: country.code })\r\n } else if (countryName) {\r\n destinationCountries.push({ title: countryName, value: country.code })\r\n }\r\n })\r\n // sort country names in alphabetical order in user language\r\n destinationCountries.sort((a: { title: string }, b: { title: string }) => a.title.localeCompare(b.title))\r\n // at the top of the list add surrounding countries\r\n destinationCountries = surroundingCountries.concat(destinationCountries)\r\n // at the top of the list add featured countries and make sure they don't repeat\r\n const featured = featuredCountries()\r\n destinationCountries = featured.concat(destinationCountries)\r\n destinationCountries = uniqBy(destinationCountries, 'value')\r\n // add special territories\r\n // @ts-ignore\r\n const hasSpecialTerritories: CountryNames = specialTerritories[countryCode]\r\n if (hasSpecialTerritories) {\r\n Object.keys(hasSpecialTerritories).forEach((cc) => {\r\n let countryIndex = destinationCountries.findIndex((option) => option.value === cc)\r\n let territories = Object.keys(hasSpecialTerritories[cc]).map((territory) => {\r\n let territoryTranslation = hasSpecialTerritories[cc][territory][lang]\r\n return { value: territory, title: '- ' + territoryTranslation }\r\n })\r\n territories.forEach((ter) => destinationCountries.splice(countryIndex + 1, 0, ter))\r\n })\r\n }\r\n return destinationCountries\r\n }\r\n\r\n const canHaveDailyAllowance = (countryCode: COUNTRY_CODE, destinations: any[]): Boolean => {\r\n if (countryCode === 'EE') {\r\n return destinations?.[0]?.destination !== 'EE'\r\n }\r\n return ['FI', 'LV', 'SE', 'PL', 'LT'].includes(countryCode)\r\n }\r\n\r\n const tripFieldsByCountry = (countryCode: COUNTRY_CODE) => {\r\n switch (countryCode) {\r\n case 'EE':\r\n return {\r\n canAddDestination: false,\r\n destinationOptions: mapDestinationOptions(countryCode),\r\n fields: [\r\n TRAVEL_REPORT_FIELDS.DESTINATION,\r\n TRAVEL_REPORT_FIELDS.START_DATE,\r\n TRAVEL_REPORT_FIELDS.END_DATE,\r\n TRAVEL_REPORT_FIELDS.MAX_ALLOWANCE\r\n ],\r\n additionalFields: [TRAVEL_REPORT_FIELDS.DEPART_BEFORE_3, TRAVEL_REPORT_FIELDS.DEPART_AFTER_22],\r\n oneDestinationFields: {\r\n id: '',\r\n index: '',\r\n days: 0,\r\n sum: 0,\r\n currency: 'EUR',\r\n searchInput: '',\r\n isDestinationValid: true,\r\n isStartDateValid: true,\r\n isEndDateValid: true\r\n },\r\n calculateAllowance: (\r\n tripDestinations: Array,\r\n extraInfo: any,\r\n tripId: string | number,\r\n companyMaxAllowance: any = '',\r\n oldTrips: Trip[]\r\n ) => {\r\n let updatedDestinations = [...tripDestinations]\r\n let updatedExtraInfo = { ...extraInfo }\r\n\r\n let maxAllowance = 0\r\n\r\n if (companyMaxAllowance !== '' && !isNaN(companyMaxAllowance)) {\r\n maxAllowance = companyMaxAllowance\r\n }\r\n\r\n if (extraInfo.maxAllowance !== '' && !isNaN(extraInfo.maxAllowance)) {\r\n maxAllowance = extraInfo.maxAllowance\r\n }\r\n\r\n const tripInput = {\r\n id: tripId,\r\n destinations: tripDestinations,\r\n startDate: tripDestinations[0].startDate,\r\n endDate: tripDestinations[tripDestinations.length - 1].endDate,\r\n extraData: {\r\n departBefore03: extraInfo.departBefore03,\r\n departAfter22: extraInfo.departAfter22,\r\n maxAllowance\r\n }\r\n }\r\n\r\n let dailyAllowance: any = allowanceCalculator('EE', tripInput, oldTrips)\r\n updatedDestinations[0].sum = dailyAllowance.sum || 0\r\n updatedDestinations[0].days = dailyAllowance.days || 0\r\n\r\n // TODO: overlapping dates\r\n\r\n if (dailyAllowance.maxAllowance && companyMaxAllowance === '') {\r\n updatedExtraInfo.maxAllowance = dailyAllowance.maxAllowance\r\n }\r\n\r\n return { updatedDestinations, updatedExtraInfo }\r\n }\r\n }\r\n case 'LV':\r\n return {\r\n canAddDestination: true,\r\n destinationOptions: mapDestinationOptions(countryCode),\r\n fields: [\r\n TRAVEL_REPORT_FIELDS.DESTINATION,\r\n TRAVEL_REPORT_FIELDS.START_DATE,\r\n TRAVEL_REPORT_FIELDS.END_DATE,\r\n TRAVEL_REPORT_FIELDS.MAX_ALLOWANCE\r\n ],\r\n additionalFields: [\r\n TRAVEL_REPORT_FIELDS.MEAL_AND_ACCOMODATION,\r\n TRAVEL_REPORT_FIELDS.RETURN_OVERNIGHT,\r\n TRAVEL_REPORT_FIELDS.CALCULATE_WEEKENDS\r\n ],\r\n oneDestinationFields: {\r\n id: '',\r\n index: '',\r\n days: 0,\r\n sum: 0,\r\n currency: 'EUR',\r\n searchInput: '',\r\n isDestinationValid: true,\r\n isStartDateValid: true,\r\n isEndDateValid: true\r\n // mealAndAccomodation: [],\r\n // returnOvernight: [],\r\n },\r\n calculateAllowance: (\r\n tripDestinations: Array,\r\n extraInfo: any,\r\n tripId: string | number,\r\n companyMaxAllowance: any = '',\r\n _: Trip[]\r\n ) => {\r\n let updatedDestinations = [...tripDestinations]\r\n\r\n const newTrip: any = {\r\n id: tripId || '',\r\n includesDailyAllowance: true,\r\n startDate: tripDestinations[0].startDate,\r\n endDate: tripDestinations[tripDestinations.length - 1].endDate,\r\n dailyAllowanceInfo: {\r\n destinations: [],\r\n mealAndAccomodation: extraInfo.mealAndAccomodation,\r\n returnOvernight: extraInfo.returnOvernight,\r\n excludeWeekends: !extraInfo.calculateWeekends\r\n }\r\n }\r\n\r\n for (let [index, dest] of tripDestinations.entries()) {\r\n newTrip.dailyAllowanceInfo.destinations.push({\r\n index: index,\r\n destination: dest.destination,\r\n startDate: moment(dest.startDate).format('YYYY-MM-DD'),\r\n endDate: moment(dest.endDate).format('YYYY-MM-DD')\r\n })\r\n }\r\n\r\n if (companyMaxAllowance && newTrip) {\r\n newTrip.dailyAllowanceInfo.maxAllowance = Number(companyMaxAllowance)\r\n }\r\n\r\n if (extraInfo.maxAllowance !== '' && !isNaN(extraInfo.maxAllowance) && newTrip) {\r\n newTrip.dailyAllowanceInfo.maxAllowance = extraInfo.maxAllowance\r\n }\r\n\r\n let dailyAllowance: any = allowance.calculate(newTrip, {}, 'LV')\r\n\r\n if (dailyAllowance.dataPerDestination) {\r\n dailyAllowance.dataPerDestination.forEach((dataItem: { sum: number; days: number; index: number }) => {\r\n updatedDestinations[dataItem.index].sum = dataItem.sum || 0\r\n updatedDestinations[dataItem.index].days = dataItem.days || 0\r\n })\r\n }\r\n return { updatedDestinations, updatedExtraInfo: extraInfo }\r\n }\r\n }\r\n case 'FI':\r\n return {\r\n canAddDestination: true,\r\n destinationOptions: mapDestinationOptions(countryCode),\r\n fields: [\r\n TRAVEL_REPORT_FIELDS.DESTINATION,\r\n TRAVEL_REPORT_FIELDS.START_DATE,\r\n TRAVEL_REPORT_FIELDS.START_TIME,\r\n TRAVEL_REPORT_FIELDS.END_DATE,\r\n TRAVEL_REPORT_FIELDS.END_TIME,\r\n TRAVEL_REPORT_FIELDS.MAX_ALLOWANCE\r\n ],\r\n additionalFields: [TRAVEL_REPORT_FIELDS.ONE_FREE_MEAL, TRAVEL_REPORT_FIELDS.TWO_FREE_MEALS],\r\n freeMealsButton: true,\r\n oneDestinationFields: {\r\n id: '',\r\n index: '',\r\n days: 0,\r\n sum: 0,\r\n currency: 'EUR',\r\n searchInput: '',\r\n isDestinationValid: true,\r\n isStartDateValid: true,\r\n isEndDateValid: true,\r\n isStartTimeValid: true,\r\n isEndTimeValid: true,\r\n oneFreeMeal: [],\r\n twoFreeMeals: []\r\n },\r\n calculateAllowance: (\r\n tripDestinations: Array,\r\n extraInfo: any,\r\n tripId: string | number,\r\n companyMaxAllowance: any = '',\r\n _: Trip[]\r\n ) => {\r\n const updatedDestinations = cloneDeep(tripDestinations)\r\n\r\n let maxAllowance = 0\r\n if (companyMaxAllowance) {\r\n maxAllowance = Number(companyMaxAllowance)\r\n }\r\n if (extraInfo.maxAllowance) {\r\n maxAllowance = Number(extraInfo.maxAllowance)\r\n }\r\n\r\n for (let i = 0; i < updatedDestinations.length; i++) {\r\n updatedDestinations[i].index = i\r\n }\r\n\r\n const tripInput = {\r\n id: tripId,\r\n destinations: tripDestinations,\r\n maxAllowance\r\n }\r\n\r\n const allowanceInfo: any = allowanceCalculator('FI', tripInput, [])\r\n\r\n if (allowanceInfo.dataPerDestination) {\r\n allowanceInfo.dataPerDestination?.forEach((dataItem: any) => {\r\n if (dataItem.index !== undefined) {\r\n updatedDestinations[dataItem.index].sum = dataItem.sum || 0\r\n updatedDestinations[dataItem.index].days = dataItem.days || 0\r\n }\r\n })\r\n }\r\n return { updatedDestinations, updatedExtraInfo: extraInfo }\r\n }\r\n }\r\n case 'SE':\r\n return {\r\n canAddDestination: true,\r\n destinationOptions: mapDestinationOptions(countryCode),\r\n fields: [\r\n TRAVEL_REPORT_FIELDS.DESTINATION,\r\n TRAVEL_REPORT_FIELDS.START_DATE,\r\n TRAVEL_REPORT_FIELDS.START_TIME,\r\n TRAVEL_REPORT_FIELDS.END_DATE,\r\n TRAVEL_REPORT_FIELDS.END_TIME\r\n ],\r\n additionalFields: [\r\n TRAVEL_REPORT_FIELDS.BREAKFAST_INCLUDED,\r\n TRAVEL_REPORT_FIELDS.LUNCH_INCLUDED,\r\n TRAVEL_REPORT_FIELDS.DINNER_INCLUDED\r\n ],\r\n oneDestinationFields: {\r\n id: '',\r\n index: '',\r\n days: 0,\r\n sum: 0,\r\n currency: 'SEK',\r\n searchInput: '',\r\n isDestinationValid: true,\r\n isStartDateValid: true,\r\n isEndDateValid: true,\r\n isStartTimeValid: true,\r\n isEndTimeValid: true\r\n // breakfastIncluded: [],\r\n // lunchIncluded: [],\r\n // dinnerIncluded: []\r\n },\r\n calculateAllowance: (\r\n tripDestinations: Array,\r\n extraInfo: any,\r\n tripId: string | number,\r\n companyMaxAllowance: any = '',\r\n _: Trip[]\r\n ) => {\r\n let updatedDestinations = [...tripDestinations]\r\n\r\n const newTrip: any = {\r\n includesDailyAllowance: true,\r\n destinations: [],\r\n breakfastIncluded: extraInfo.breakfastIncluded,\r\n lunchIncluded: extraInfo.lunchIncluded,\r\n dinnerIncluded: extraInfo.dinnerIncluded\r\n }\r\n\r\n for (let [index, dest] of tripDestinations.entries()) {\r\n newTrip.destinations.push({\r\n index: index,\r\n destination: dest.destination,\r\n startDate: moment(dest.startDate).format('YYYY-MM-DD'),\r\n endDate: moment(dest.endDate).format('YYYY-MM-DD'),\r\n startTime: dest.startTime,\r\n endTime: dest.endTime\r\n })\r\n }\r\n\r\n newTrip.startDate = tripDestinations[0].startDate\r\n newTrip.endDate = tripDestinations[tripDestinations.length - 1].endDate\r\n\r\n if (companyMaxAllowance && newTrip) {\r\n newTrip.maxAllowance = Number(companyMaxAllowance)\r\n }\r\n\r\n newTrip.id = tripId\r\n\r\n let dailyAllowance: any = allowance.calculate(newTrip, {}, 'SE')\r\n if (dailyAllowance.dataPerDestination) {\r\n dailyAllowance.dataPerDestination.forEach((dataItem: { sum: number; days: number; index: number }) => {\r\n updatedDestinations[dataItem.index].sum = dataItem.sum || 0\r\n updatedDestinations[dataItem.index].days = dataItem.days || 0\r\n })\r\n }\r\n return { updatedDestinations, updatedExtraInfo: extraInfo }\r\n }\r\n }\r\n case 'LT':\r\n return {\r\n canAddDestination: true,\r\n destinationOptions: mapDestinationOptions(countryCode),\r\n fields: [TRAVEL_REPORT_FIELDS.DESTINATION, TRAVEL_REPORT_FIELDS.START_DATE, TRAVEL_REPORT_FIELDS.END_DATE],\r\n additionalFields: [TRAVEL_REPORT_FIELDS.NEXT_TRIP_ON_LAST_DAY],\r\n calculateAllowance: (\r\n tripDestinations: Array,\r\n extraInfo: any,\r\n tripId: string | number,\r\n companyMaxAllowance: any = '',\r\n _: Trip[]\r\n ) => {\r\n let updatedDestinations = [...tripDestinations]\r\n\r\n const newTrip: any = {\r\n id: tripId || '',\r\n includesDailyAllowance: true,\r\n startDate: tripDestinations[0].startDate,\r\n endDate: tripDestinations[tripDestinations.length - 1].endDate,\r\n dailyAllowanceInfo: {\r\n destinations: [],\r\n nextTripOnLastDay: extraInfo.nextTripOnLastDay\r\n }\r\n }\r\n\r\n for (let [index, dest] of tripDestinations.entries()) {\r\n newTrip.dailyAllowanceInfo.destinations.push({\r\n index: index,\r\n destination: dest.destination,\r\n startDate: moment(dest.startDate).format('YYYY-MM-DD'),\r\n endDate: moment(dest.endDate).format('YYYY-MM-DD')\r\n })\r\n }\r\n\r\n if (companyMaxAllowance) {\r\n newTrip.dailyAllowanceInfo.maxAllowance = Number(companyMaxAllowance)\r\n }\r\n\r\n let dailyAllowance: any = allowance.calculate(newTrip, {}, 'LT')\r\n if (dailyAllowance.dataPerDestination) {\r\n dailyAllowance.dataPerDestination.forEach((dataItem: { sum: number; days: number; index: number }) => {\r\n updatedDestinations[dataItem.index].sum = dataItem.sum || 0\r\n updatedDestinations[dataItem.index].days = dataItem.days || 0\r\n })\r\n }\r\n return { updatedDestinations, updatedExtraInfo: extraInfo }\r\n },\r\n oneDestinationFields: {\r\n id: '',\r\n index: '',\r\n days: 0,\r\n sum: 0,\r\n currency: 'EUR',\r\n searchInput: '',\r\n isDestinationValid: true,\r\n isStartDateValid: true,\r\n isEndDateValid: true\r\n }\r\n }\r\n case 'PL':\r\n return {\r\n canAddDestination: true,\r\n destinationOptions: mapDestinationOptions(countryCode),\r\n fields: [\r\n TRAVEL_REPORT_FIELDS.DESTINATION,\r\n TRAVEL_REPORT_FIELDS.START_DATE,\r\n TRAVEL_REPORT_FIELDS.START_TIME,\r\n TRAVEL_REPORT_FIELDS.END_DATE,\r\n TRAVEL_REPORT_FIELDS.END_TIME\r\n ],\r\n additionalFields: [\r\n TRAVEL_REPORT_FIELDS.BREAKFAST_INCLUDED,\r\n TRAVEL_REPORT_FIELDS.LUNCH_INCLUDED,\r\n TRAVEL_REPORT_FIELDS.DINNER_INCLUDED\r\n ],\r\n freeMealsButton: true,\r\n oneDestinationFields: {\r\n id: '',\r\n index: '',\r\n days: 0,\r\n sum: 0,\r\n currency: 'PLN',\r\n searchInput: '',\r\n isDestinationValid: true,\r\n isStartDateValid: true,\r\n isEndDateValid: true,\r\n isStartTimeValid: true,\r\n isEndTimeValid: true,\r\n breakfastIncluded: [],\r\n lunchIncluded: [],\r\n dinnerIncluded: []\r\n },\r\n calculateAllowance: (\r\n tripDestinations: Array,\r\n extraInfo: any,\r\n tripId: string | number,\r\n __: any = '',\r\n _: Trip[]\r\n ) => {\r\n const updatedDestinations = cloneDeep(tripDestinations)\r\n\r\n const newTrip: any = {\r\n id: tripId,\r\n includesDailyAllowance: true,\r\n destinations: [...tripDestinations],\r\n startDate: tripDestinations[0].startDate,\r\n endDate: tripDestinations[tripDestinations.length - 1].endDate\r\n }\r\n\r\n const dailyAllowance: any = allowance.calculate(newTrip, {}, 'PL')\r\n\r\n if (dailyAllowance.dataPerDestination) {\r\n dailyAllowance.dataPerDestination.forEach((dataItem: TripDestination) => {\r\n if (dataItem?.index !== undefined) {\r\n updatedDestinations[dataItem.index] = { ...dataItem }\r\n }\r\n })\r\n }\r\n\r\n return { updatedDestinations, updatedExtraInfo: extraInfo }\r\n }\r\n }\r\n default:\r\n return {\r\n canAddDestination: true,\r\n destinationOptions: mapDestinationOptions(countryCode),\r\n fields: [TRAVEL_REPORT_FIELDS.DESTINATION, TRAVEL_REPORT_FIELDS.START_DATE, TRAVEL_REPORT_FIELDS.END_DATE],\r\n additionalFields: [],\r\n oneDestinationFields: {}\r\n }\r\n }\r\n }\r\n\r\n const filterDestinationSuggestions = (searchInput: string, allOptions: Array) => {\r\n if (!searchInput) {\r\n return [...allOptions]\r\n }\r\n return allOptions.filter((option) => {\r\n return option.title && option.title.toLowerCase().includes(searchInput.toLowerCase())\r\n })\r\n }\r\n\r\n return {\r\n canHaveDailyAllowance,\r\n tripFieldsByCountry,\r\n filterDestinationSuggestions\r\n }\r\n}\r\n","import { computed } from 'vue'\r\nimport xstore from '@/store'\r\nimport { OVERVIEW_STORE_ACTIONS, OVERVIEW_STORE_GETTERS, OVERVIEW_STATUS_KEYS, OVERVIEW_STATUS_COLORS, STATUS_COLORS, STATUS_BACKGROUND_COLORS } from '@/enums'\r\nimport { useContext, useActiveDates } from '@/composables'\r\n\r\nexport default function useActivityOverview() {\r\n const { root } = useContext()\r\n const { activeDates } = useActiveDates()\r\n\r\n const tripsCount = computed(() => {\r\n return xstore.getters[OVERVIEW_STORE_GETTERS.TRIPS_COUNT] || {}\r\n })\r\n\r\n const receiptsCount = computed(() => {\r\n return xstore.getters[OVERVIEW_STORE_GETTERS.RECEIPTS_COUNT] || {}\r\n })\r\n\r\n const tripsCountByCompany = (companyId: any) => {\r\n return tripsCount.value?.[companyId] || {}\r\n }\r\n\r\n const receiptsCountByCompany = (companyId: any) => {\r\n return receiptsCount.value?.[companyId] || {}\r\n }\r\n\r\n const tripsCountTotals = computed(() => {\r\n const statusTotals: any = {}\r\n Object.values(tripsCount.value).forEach((company: any) => {\r\n for (const status in company) {\r\n // @ts-ignore\r\n if (OVERVIEW_STATUS_KEYS[status] && company[status] > 0) {\r\n if (!statusTotals[status]) statusTotals[status] = 0\r\n statusTotals[status] += company[status]\r\n }\r\n }\r\n })\r\n return statusTotals\r\n })\r\n\r\n const receiptsCountTotals = computed(() => {\r\n const statusTotals: any = {}\r\n Object.values(receiptsCount.value).forEach((company: any) => {\r\n for (const status in company) {\r\n // @ts-ignore\r\n if (OVERVIEW_STATUS_KEYS[status] && company[status] > 0) {\r\n if (!statusTotals[status]) statusTotals[status] = 0\r\n statusTotals[status] += company[status]\r\n }\r\n }\r\n })\r\n return statusTotals\r\n })\r\n\r\n const loadTripsCount = async () => {\r\n try {\r\n const payload = {\r\n startDate: activeDates.value?.startDate,\r\n endDate: activeDates.value?.endDate\r\n }\r\n await xstore.dispatch(OVERVIEW_STORE_ACTIONS.GET_TRIPS_COUNT, payload)\r\n return true\r\n } catch (error) {\r\n root?.$snackbar('Failed to load report stats', 'error', 5000)\r\n }\r\n }\r\n\r\n const loadReceiptsCount = async () => {\r\n try {\r\n const payload = {\r\n startDate: activeDates.value?.startDate,\r\n endDate: activeDates.value?.endDate\r\n }\r\n await xstore.dispatch(OVERVIEW_STORE_ACTIONS.GET_RECEIPTS_COUNT, payload)\r\n return true\r\n } catch (error) {\r\n root?.$snackbar('Failed to load receipt stats', 'error', 5000)\r\n }\r\n }\r\n\r\n function setTagColor(status: keyof typeof OVERVIEW_STATUS_KEYS) {\r\n // @ts-ignore\r\n const colorKey = OVERVIEW_STATUS_COLORS[OVERVIEW_STATUS_KEYS[status]]\r\n // @ts-ignore\r\n return { color: STATUS_COLORS[colorKey], background: STATUS_BACKGROUND_COLORS[colorKey] }\r\n }\r\n\r\n return {\r\n tripsCount,\r\n tripsCountTotals,\r\n receiptsCount,\r\n receiptsCountTotals,\r\n tripsCountByCompany,\r\n receiptsCountByCompany,\r\n loadTripsCount,\r\n loadReceiptsCount,\r\n setTagColor\r\n }\r\n}\r\n","import moment from 'moment'\r\nimport { xstore } from '@/store'\r\nimport { cloneDeep } from 'lodash-es'\r\nimport { COUNTRY_CODE, DailyAllowanceItem, DailyAllowanceTotals, TripDestination } from '@/models'\r\nimport useFormatters from './useFormatters'\r\nimport { TRIPS_STORE_ACTIONS } from '@/enums'\r\n\r\nexport default function useDailyAllowance() {\r\n const { formatDate } = useFormatters()\r\n\r\n const minStartDate = (index: number, tripDestinations: Array) => {\r\n return tripDestinations[index - 1] ? tripDestinations[index - 1].endDate || '' : ''\r\n }\r\n\r\n const minEndDate = (index: number, tripDestinations: Array) => {\r\n return tripDestinations[index].startDate || ''\r\n }\r\n\r\n const mapDailyAllowanceData = (dailyAllowanceData: Array, destinationOptions: Array) => {\r\n const entries = cloneDeep(dailyAllowanceData).sort((a: DailyAllowanceItem, b: DailyAllowanceItem) => {\r\n return +new Date(a.start) - +new Date(b.start)\r\n })\r\n let destinations: Array = []\r\n let extraInfo: any = {}\r\n entries.forEach((entry: DailyAllowanceItem, index: number) => {\r\n const oneDestination: TripDestination = {\r\n id: entry.id,\r\n index,\r\n sum: entry.sum,\r\n currency: entry.currency || '',\r\n days: entry.days,\r\n destination: entry.destination,\r\n searchInput: destinationOptions.find((option) => option.value === entry.destination)?.title,\r\n startDate: formatDate(entry.start?.slice(0, 10)),\r\n endDate: formatDate(entry.end?.slice(0, 10)),\r\n startTime: entry.info?.startTime,\r\n endTime: entry.info?.endTime,\r\n isDestinationValid: true,\r\n isStartDateValid: true,\r\n isEndDateValid: true,\r\n isStartTimeValid: true,\r\n isEndTimeValid: true\r\n }\r\n\r\n if (entry.info?.maxAllowance) {\r\n extraInfo.maxAllowance = entry.info.maxAllowance\r\n }\r\n\r\n // EE\r\n if (entry.info?.departBefore03) {\r\n extraInfo.departBefore03 = true\r\n }\r\n if (entry.info?.departAfter22) {\r\n extraInfo.departAfter22 = true\r\n }\r\n\r\n // LV\r\n if (entry.info?.mealAndAccomodation) {\r\n extraInfo.mealAndAccomodation = true\r\n }\r\n if (entry.info?.returnOvernight) {\r\n extraInfo.returnOvernight = true\r\n }\r\n if (entry.info?.excludeWeekends) {\r\n extraInfo.calculateWeekends = false\r\n } else {\r\n extraInfo.calculateWeekends = true\r\n }\r\n\r\n // FI\r\n if (entry.info?.freeMeal) {\r\n extraInfo.freeMeal = true\r\n }\r\n\r\n // SE // PL\r\n if (entry.info?.breakfastIncluded) {\r\n oneDestination.breakfastIncluded = entry.info?.breakfastIncluded\r\n extraInfo.breakfastIncluded = true\r\n }\r\n if (entry.info?.lunchIncluded) {\r\n oneDestination.lunchIncluded = entry.info?.lunchIncluded\r\n extraInfo.lunchIncluded = true\r\n }\r\n if (entry.info?.dinnerIncluded) {\r\n oneDestination.dinnerIncluded = entry.info?.dinnerIncluded\r\n extraInfo.dinnerIncluded = true\r\n }\r\n\r\n // LT\r\n if (entry.info?.nextTripOnLastDay) {\r\n extraInfo.nextTripOnLastDay = true\r\n }\r\n\r\n destinations.push(oneDestination)\r\n })\r\n\r\n return { destinations, extraInfo }\r\n }\r\n\r\n const calculateTripDuration = (allDestinations: Array = [], hasTimeFields: Boolean) => {\r\n let duration = {\r\n d: 0,\r\n h: 0,\r\n m: 0\r\n }\r\n let tripTotalTime = 0\r\n if (hasTimeFields) {\r\n allDestinations.forEach((dest) => {\r\n if (dest.startDate && dest.endDate && dest.startTime && dest.endTime) {\r\n let start = moment(dest.startDate + ' ' + dest.startTime, 'YYYY-MM-DDLT')\r\n let end = moment(dest.endDate + ' ' + dest.endTime, 'YYYY-MM-DDLT')\r\n tripTotalTime += end.diff(start, 'minutes')\r\n }\r\n })\r\n\r\n duration.d = Math.floor(tripTotalTime / 1440)\r\n let remainingTime = tripTotalTime - duration.d * 1440\r\n duration.h = Math.floor(remainingTime / 60)\r\n duration.m = remainingTime - duration.h * 60\r\n } else {\r\n allDestinations.forEach((destination) => {\r\n duration.d += destination.days\r\n })\r\n }\r\n return duration\r\n }\r\n\r\n const calculateDailyAllowanceTotals = (tripAllowanceEntries: Array) => {\r\n const allowance: DailyAllowanceTotals = {}\r\n if (tripAllowanceEntries?.length) {\r\n tripAllowanceEntries.forEach((entry) => {\r\n if (allowance[entry.currency] && entry.sum) {\r\n allowance[entry.currency] = Number((allowance[entry.currency] + Number(entry.sum)).toFixed(2))\r\n } else if (entry.sum) {\r\n allowance[entry.currency] = Number(entry.sum)\r\n }\r\n })\r\n }\r\n return allowance\r\n }\r\n\r\n const validateDateInput = (dateField: string, dateIndex: number, tripDestinations: Array) => {\r\n let updatedDestinations = updateValidity(dateField, dateIndex, true, tripDestinations)\r\n\r\n if (\r\n tripDestinations[dateIndex].startDate &&\r\n tripDestinations[dateIndex].endDate &&\r\n new Date(tripDestinations[dateIndex].startDate) > new Date(tripDestinations[dateIndex].endDate)\r\n ) {\r\n \r\n tripDestinations[dateIndex][dateField] = ''\r\n updatedDestinations = updateValidity(dateField, dateIndex, false, tripDestinations)\r\n }\r\n\r\n tripDestinations.forEach((entry, index) => {\r\n if (tripDestinations[index - 1] && tripDestinations[index - 1].endDate && entry.startDate) {\r\n let prevDestEnd = new Date(tripDestinations[index - 1].endDate)\r\n let nextDestStart = new Date(entry.startDate)\r\n\r\n if (prevDestEnd > nextDestStart) {\r\n updatedDestinations[index].startDate = ''\r\n updatedDestinations[index].endDate = ''\r\n updatedDestinations[index].isStartDateValid = false\r\n }\r\n }\r\n })\r\n\r\n if (dateField === 'startDate') {\r\n return validateTimeInput('startTime', dateIndex, tripDestinations)\r\n } else {\r\n return validateTimeInput('endTime', dateIndex, tripDestinations)\r\n }\r\n }\r\n\r\n const validateTimeInput = (timeField: string, timeIndex: number, tripDestinations: Array) => {\r\n let updatedDestinations = updateValidity(timeField, timeIndex, true, tripDestinations)\r\n\r\n let prevDate =\r\n timeField === 'startTime'\r\n ? tripDestinations[timeIndex - 1] && tripDestinations[timeIndex - 1].endDate\r\n : tripDestinations[timeIndex].startDate\r\n let prevTime =\r\n timeField === 'startTime'\r\n ? tripDestinations[timeIndex - 1] && tripDestinations[timeIndex - 1].endTime\r\n : tripDestinations[timeIndex].startTime\r\n let currentDate =\r\n timeField === 'startTime' ? tripDestinations[timeIndex].startDate : tripDestinations[timeIndex].endDate\r\n\r\n if (updatedDestinations[timeIndex][timeField] || !prevDate || !prevTime || !currentDate) {\r\n return updatedDestinations\r\n }\r\n\r\n let prevFullDate = convertToDate(prevDate, prevTime)\r\n let currentFullDate = convertToDate(currentDate, tripDestinations[timeIndex][timeField])\r\n\r\n if (!currentFullDate.isSameOrAfter(prevFullDate)) {\r\n updatedDestinations[timeIndex][timeField] = ''\r\n updatedDestinations = updateValidity(timeField, timeIndex, false, tripDestinations)\r\n }\r\n\r\n return updatedDestinations\r\n }\r\n\r\n const updateValidity = (input: string, index: number, isValid: Boolean, tripDestinations: Array) => {\r\n let updatedDestinations = [...tripDestinations]\r\n switch (input) {\r\n case 'startDate':\r\n updatedDestinations[index].isStartDateValid = isValid\r\n case 'endDate':\r\n updatedDestinations[index].isEndDateValid = isValid\r\n case 'startTime':\r\n updatedDestinations[index].isStartTimeValid = isValid\r\n case 'endTime':\r\n updatedDestinations[index].isEndTimeValid = isValid\r\n case 'destination':\r\n updatedDestinations[index].isDestinationValid = isValid\r\n default:\r\n break\r\n }\r\n return updatedDestinations\r\n }\r\n\r\n const validateReport = (tripDestinations: Array, hasTimeFields: Boolean) => {\r\n const updatedDestinations = cloneDeep(tripDestinations)\r\n updatedDestinations.forEach((item: any) => {\r\n if (!item.destination) {\r\n item.isDestinationValid = false\r\n }\r\n if (!item.startDate) {\r\n item.isStartDateValid = false\r\n }\r\n if (!item.endDate) {\r\n item.isEndDateValid = false\r\n }\r\n if (hasTimeFields && !item.startTime) {\r\n item.isStartTimeValid = false\r\n }\r\n if (hasTimeFields && !item.endTime) {\r\n item.isEndTimeValid = false\r\n }\r\n })\r\n return updatedDestinations\r\n }\r\n\r\n const isReportValid = (tripDestinations: Array) => {\r\n return tripDestinations.every((item) => {\r\n return (\r\n item.isDestinationValid &&\r\n item.isStartDateValid &&\r\n item.isEndDateValid &&\r\n item.isStartTimeValid &&\r\n item.isEndTimeValid\r\n )\r\n })\r\n }\r\n\r\n const convertToDate = (date: string, time: string) => {\r\n return moment(date + ' ' + time, 'YYYY-MM-DDLT')\r\n }\r\n\r\n const setDailyAllowancePayload = (\r\n tripDestinations: Array,\r\n extraInfo: any,\r\n includesDailyAllowance: Boolean,\r\n companyCountryCode: COUNTRY_CODE\r\n ) => {\r\n let dailyAllowanceItems: Array = []\r\n tripDestinations.forEach((item) => {\r\n const dailyAllowanceItem: DailyAllowanceItem = {\r\n destination: item.destination,\r\n start: item.startDate,\r\n end: item.endDate,\r\n days: Math.ceil(item.days),\r\n sum: includesDailyAllowance ? item.sum : 0,\r\n id: item.id,\r\n currency: item.currency,\r\n info: {}\r\n }\r\n\r\n if (['SE', 'FI', 'PL'].includes(companyCountryCode)) {\r\n dailyAllowanceItem.info.startTime = item.startTime\r\n dailyAllowanceItem.info.endTime = item.endTime\r\n dailyAllowanceItem.start = `${item.startDate} ${item.startTime}`\r\n dailyAllowanceItem.end = `${item.endDate} ${item.endTime}`\r\n }\r\n\r\n if (companyCountryCode === 'SE') {\r\n dailyAllowanceItem.info.breakfastIncluded = extraInfo.breakfastIncluded\r\n dailyAllowanceItem.info.lunchIncluded = extraInfo.lunchIncluded\r\n dailyAllowanceItem.info.dinnerIncluded = extraInfo.dinnerIncluded\r\n }\r\n\r\n if (companyCountryCode === 'PL') {\r\n dailyAllowanceItem.info.breakfastIncluded = item.breakfastIncluded\r\n dailyAllowanceItem.info.lunchIncluded = item.lunchIncluded\r\n dailyAllowanceItem.info.dinnerIncluded = item.dinnerIncluded\r\n }\r\n\r\n if (companyCountryCode === 'LT') {\r\n dailyAllowanceItem.info.nextTripOnLastDay = extraInfo.nextTripOnLastDay\r\n }\r\n\r\n if (companyCountryCode === 'EE') {\r\n dailyAllowanceItem.info.departBefore03 = extraInfo.departBefore03\r\n dailyAllowanceItem.info.departAfter22 = extraInfo.departAfter22\r\n }\r\n\r\n if (companyCountryCode === 'FI') {\r\n dailyAllowanceItem.info.freeMeal = extraInfo.freeMeal\r\n }\r\n\r\n if (companyCountryCode === 'LV') {\r\n dailyAllowanceItem.info.mealAndAccomodation = extraInfo.mealAndAccomodation\r\n dailyAllowanceItem.info.returnOvernight = extraInfo.returnOvernight\r\n dailyAllowanceItem.info.excludeWeekends = !extraInfo.calculateWeekends\r\n }\r\n\r\n if (extraInfo.maxAllowance !== '' && !isNaN(extraInfo.maxAllowance)) {\r\n dailyAllowanceItem.info.maxAllowance = extraInfo.maxAllowance\r\n }\r\n\r\n dailyAllowanceItems.push(dailyAllowanceItem)\r\n })\r\n return dailyAllowanceItems\r\n }\r\n\r\n const postNewEntry = (companyId: string | number, tripId: string | number, newAllowanceEntry: DailyAllowanceItem) => {\r\n delete newAllowanceEntry.id\r\n return xstore.dispatch(TRIPS_STORE_ACTIONS.SAVE_ALLOWANCE, {\r\n companyId,\r\n tripId,\r\n newAllowanceEntry\r\n })\r\n }\r\n\r\n const putUpdatedEntry = (companyId: string | number, tripId: string | number, allowanceEntry: DailyAllowanceItem) => {\r\n return xstore.dispatch(TRIPS_STORE_ACTIONS.UPDATE_ALLOWANCE, {\r\n companyId,\r\n tripId,\r\n allowanceEntry\r\n })\r\n }\r\n\r\n const deleteEntry = (companyId: string | number, tripId: string | number, allowanceEntryId: string | number) => {\r\n return xstore.dispatch(TRIPS_STORE_ACTIONS.DELETE_ALLOWANCE, {\r\n companyId,\r\n tripId,\r\n allowanceEntryId\r\n })\r\n }\r\n\r\n const saveDailyAllowance = (\r\n companyId: string | number,\r\n tripId: string | number,\r\n allowanceEntries: Array\r\n ) => {\r\n let entriesToSave: Array> = []\r\n allowanceEntries.forEach((entry) => {\r\n entriesToSave.push(postNewEntry(companyId, tripId, entry))\r\n })\r\n return Promise.all(entriesToSave)\r\n }\r\n\r\n const updateDailyAllowance = (\r\n companyId: string | number,\r\n tripId: string | number,\r\n allowanceEntries: Array,\r\n initialDailyAllowanceEntries: Array\r\n ) => {\r\n let entriesToUpdate: Array> = []\r\n\r\n allowanceEntries.forEach((entry) => {\r\n if (!entry.id) {\r\n entriesToUpdate.push(postNewEntry(companyId, tripId, entry))\r\n }\r\n const entryDidExist: DailyAllowanceItem | undefined = initialDailyAllowanceEntries.find((e) => e.id === entry.id)\r\n if (entry.id && entryDidExist) {\r\n entriesToUpdate.push(putUpdatedEntry(companyId, tripId, entry))\r\n }\r\n })\r\n\r\n let removableEntries: Array = initialDailyAllowanceEntries.filter(\r\n (e) => !allowanceEntries.find((entry) => entry.id === e.id)\r\n )\r\n removableEntries.forEach((entry) => {\r\n if (entry.id) {\r\n entriesToUpdate.push(deleteEntry(companyId, tripId, entry.id))\r\n }\r\n })\r\n return Promise.all(entriesToUpdate)\r\n }\r\n\r\n return {\r\n minStartDate,\r\n minEndDate,\r\n calculateTripDuration,\r\n validateDateInput,\r\n validateTimeInput,\r\n validateReport,\r\n isReportValid,\r\n calculateDailyAllowanceTotals,\r\n mapDailyAllowanceData,\r\n setDailyAllowancePayload,\r\n saveDailyAllowance,\r\n updateDailyAllowance\r\n }\r\n}\r\n","import { computed } from 'vue'\r\nimport { sortBy } from 'lodash-es'\r\nimport xstore from '@/store'\r\nimport { useContext } from '@/composables'\r\nimport { PaymentMethod, PaymentMethods } from '@/models'\r\nimport { PAYMENT_TYPE, PAYMENTS_STORE_ACTIONS, PAYMENTS_STORE_GETTERS } from '@/enums'\r\n\r\nexport default function usePaymentMethods() {\r\n const { root } = useContext()\r\n\r\n const companyId = computed(() => Number(root?.$route.params.companyId) || '')\r\n\r\n const paymentMethods = computed(() => {\r\n return xstore.getters[PAYMENTS_STORE_GETTERS.PAYMENT_METHODS][companyId.value] || {}\r\n })\r\n\r\n const paymentMethodsForUser = (userId: number | null | undefined): PaymentMethod[] => {\r\n if (!userId) return []\r\n return sortBy(Object.values(paymentMethods.value || {}).filter((method: PaymentMethod) => {\r\n // CUSTOM CASH IS GETTING DEPRECATED\r\n return (!method.userId || method.userId == userId) && method.type !== PAYMENT_TYPE.CASH\r\n }), [(paymentMethod: PaymentMethod) => paymentMethod.type])\r\n }\r\n\r\n // RETURNS METHODS THAT ARE AVAILABLE FOR USER TO SELECT AVOIDING DOUBLING OPTIONS WITH CUSTOM ONES\r\n const defaultPaymentMethods = (userCustomPaymentMethods: PaymentMethod[]) => {\r\n const availableDefaultMethods = ['cash', 'cc']\r\n // const hasCard = userCustomPaymentMethods.find((method) => {\r\n // return method.type === PAYMENT_TYPE.CREDIT_CARD || method.type === PAYMENT_TYPE.DEBIT_CARD\r\n // })\r\n // if (!hasCard) {\r\n // availableDefaultMethods.push('cc')\r\n // }\r\n const hasAccount = userCustomPaymentMethods.find(method => {\r\n return method.type === PAYMENT_TYPE.BANK_ACCOUNT\r\n })\r\n if (!hasAccount) {\r\n availableDefaultMethods.push('transfer')\r\n }\r\n return availableDefaultMethods\r\n }\r\n\r\n const paymentMethodById = (id: string | number): PaymentMethod => {\r\n return paymentMethods.value?.[id] || {}\r\n }\r\n\r\n const loadPaymentMethods = () => {\r\n if (!companyId.value) return\r\n return xstore.dispatch(PAYMENTS_STORE_ACTIONS.GET_PAYMENT_METHODS, {\r\n companyId: companyId.value\r\n })\r\n }\r\n\r\n const createPaymentMethod = (newPaymentMethod: PaymentMethod): Promise | undefined => {\r\n if (!companyId.value) return\r\n return xstore.dispatch(PAYMENTS_STORE_ACTIONS.CREATE_PAYMENT_METHOD, {\r\n companyId: companyId.value,\r\n newPaymentMethod\r\n })\r\n }\r\n\r\n const updatePaymentMethod = (paymentMethodId: string | number, updatedPaymentMethod: PaymentMethod) => {\r\n if (!companyId.value) return\r\n return xstore.dispatch(PAYMENTS_STORE_ACTIONS.UPDATE_PAYMENT_METHOD, {\r\n companyId: companyId.value,\r\n paymentMethodId,\r\n updatedPaymentMethod\r\n })\r\n }\r\n\r\n const deletePaymentMethod = (paymentMethodId: string | number) => {\r\n if (!companyId.value) return\r\n return xstore.dispatch(PAYMENTS_STORE_ACTIONS.DELETE_PAYMENT_METHOD, {\r\n companyId: companyId.value,\r\n paymentMethodId\r\n })\r\n }\r\n\r\n return {\r\n paymentMethods,\r\n defaultPaymentMethods,\r\n paymentMethodById,\r\n paymentMethodsForUser,\r\n loadPaymentMethods,\r\n createPaymentMethod,\r\n updatePaymentMethod,\r\n deletePaymentMethod\r\n }\r\n}\r\n","import { computed, ComputedRef } from 'vue'\r\nimport xstore from '@/store'\r\nimport {\r\n AccountingEntries,\r\n AccountingObject,\r\n AccountingRef,\r\n DisplayedAccountingEntry,\r\n ExpenseAccountingRefs\r\n} from '@/models'\r\nimport { useContext } from '@/composables'\r\nimport { ACCOUNTING_OBJECT_TYPE, ACCOUNTING_STORE_ACTIONS, ACCOUNTING_STORE_GETTERS } from '@/enums'\r\n\r\nexport default function useAccountingRefs() {\r\n const { root } = useContext()\r\n\r\n const companyId = computed(() => Number(root?.$route.params.companyId))\r\n\r\n const allReceiptAccountingEntries: ComputedRef = computed(() => {\r\n return xstore.getters[ACCOUNTING_STORE_GETTERS.RECEIPT_ACCOUNTING_ENTRIES]\r\n })\r\n\r\n const allTripAccountingEntries: ComputedRef = computed(() => {\r\n return xstore.getters[ACCOUNTING_STORE_GETTERS.TRIP_ACCOUNTING_ENTRIES]\r\n })\r\n\r\n const allReceiptAccountingRefs: ComputedRef = computed(() => {\r\n return xstore.getters[ACCOUNTING_STORE_GETTERS.RECEIPT_ACCOUNTING_REFS]\r\n })\r\n\r\n const allTripAccountingRefs: ComputedRef = computed(() => {\r\n return xstore.getters[ACCOUNTING_STORE_GETTERS.TRIP_ACCOUNTING_REFS]\r\n })\r\n\r\n const receiptAccountingEntries = (receiptId: string | number) => {\r\n if (!receiptId) return {}\r\n return allReceiptAccountingEntries.value?.[Number(receiptId)]\r\n }\r\n\r\n const tripAccountingEntries = (tripId: string | number): DisplayedAccountingEntry[] => {\r\n if (!tripId) return []\r\n const entries = allTripAccountingEntries.value?.[Number(tripId)]\r\n if (!entries) return []\r\n const preparedEntries: any = {}\r\n entries.forEach((entry) => {\r\n const value = entry?.accounting?.value || 'unspecified'\r\n if (!preparedEntries[value]) {\r\n preparedEntries[value] = {\r\n type: entry.accounting?.type,\r\n name: entry.accounting?.name,\r\n value: value,\r\n totals: []\r\n }\r\n }\r\n preparedEntries[value].totals.push({\r\n currency: entry.transaction.currency,\r\n sum: entry.transaction.sum\r\n })\r\n })\r\n const preparedArray: DisplayedAccountingEntry[] = Object.values(preparedEntries)\r\n const unspecifiedIndex = preparedArray.findIndex((item) => item?.value === 'unspecified')\r\n if (unspecifiedIndex > -1) {\r\n preparedArray.unshift(preparedArray.splice(unspecifiedIndex, 1)[0])\r\n }\r\n return preparedArray\r\n }\r\n\r\n const receiptAccountingRefs = (receiptId: string | number) => {\r\n if (!receiptId) return {}\r\n return allReceiptAccountingRefs.value?.[Number(receiptId)]\r\n }\r\n\r\n const tripAccountingRefs = (tripId: string | number) => {\r\n if (!tripId) return {}\r\n return allTripAccountingRefs.value?.[Number(tripId)]\r\n }\r\n\r\n const loadReceiptAccountingEntries = async (receiptId: string | number) => {\r\n if (!companyId.value || !receiptId) return\r\n return xstore.dispatch(ACCOUNTING_STORE_ACTIONS.GET_RECEIPT_ACCOUNTING_ENTRIES, {\r\n companyId: companyId.value,\r\n receiptId: Number(receiptId)\r\n })\r\n }\r\n\r\n const loadTripAccountingEntries = async (tripId: string | number) => {\r\n if (!companyId.value || !tripId) return\r\n return xstore.dispatch(ACCOUNTING_STORE_ACTIONS.GET_TRIP_ACCOUNTING_ENTRIES, {\r\n companyId: companyId.value,\r\n tripId: Number(tripId)\r\n })\r\n }\r\n\r\n const loadReceiptAccountingRefs = async (receiptId: string | number) => {\r\n if (!companyId.value || !receiptId) return\r\n return xstore.dispatch(ACCOUNTING_STORE_ACTIONS.GET_RECEIPT_ACCOUNTING_REFS, {\r\n companyId: companyId.value,\r\n receiptId\r\n })\r\n }\r\n\r\n const loadTripAccountingRefs = async (tripId: string | number) => {\r\n if (!companyId.value || !tripId) return\r\n return xstore.dispatch(ACCOUNTING_STORE_ACTIONS.GET_TRIP_ACCOUNTING_REFS, {\r\n companyId: companyId.value,\r\n tripId\r\n })\r\n }\r\n\r\n const deleteAccountingRef = async (baseRefKey: string, baseRefId: string | number, accountingRef: AccountingRef) => {\r\n if (baseRefKey === 'tripId') {\r\n return xstore.dispatch(ACCOUNTING_STORE_ACTIONS.DELETE_TRIP_ACCOUNTING_REF, {\r\n companyId: companyId.value,\r\n tripId: baseRefId,\r\n accountingRef\r\n })\r\n }\r\n if (baseRefKey === 'receiptId') {\r\n return xstore.dispatch(ACCOUNTING_STORE_ACTIONS.DELETE_RECEIPT_ACCOUNTING_REF, {\r\n companyId: companyId.value,\r\n receiptId: baseRefId,\r\n accountingRef\r\n })\r\n }\r\n }\r\n\r\n const updateAccountingRef = async (\r\n accountingObjectId: AccountingObject['id'],\r\n accountingObjectType: ACCOUNTING_OBJECT_TYPE,\r\n baseRefKey: string,\r\n baseRefId: string | number,\r\n options?: AccountingRef\r\n ) => {\r\n const isTrip = baseRefKey === 'tripId'\r\n const allRefs = isTrip\r\n ? tripAccountingRefs(Number(baseRefId)) || {}\r\n : receiptAccountingRefs(Number(baseRefId)) || {}\r\n const refsToArray: AccountingRef[] = Object.values(allRefs)\r\n const refWithSameTypeExists = refsToArray.find(\r\n (refObject) =>\r\n refObject.refId === Number(options?.refId) &&\r\n refObject.refType === options?.refType &&\r\n refObject.accounting?.type === accountingObjectType\r\n )\r\n if (refWithSameTypeExists && options) {\r\n await deleteAccountingRef(baseRefKey, baseRefId, refWithSameTypeExists)\r\n }\r\n if (!accountingObjectId) return\r\n return xstore.dispatch(ACCOUNTING_STORE_ACTIONS.UPDATE_ACCOUNTING_REF, {\r\n companyId: companyId.value,\r\n accountingObjectId,\r\n baseRefKey,\r\n baseRefId,\r\n options\r\n })\r\n }\r\n\r\n return {\r\n loadReceiptAccountingEntries,\r\n loadTripAccountingEntries,\r\n loadReceiptAccountingRefs,\r\n loadTripAccountingRefs,\r\n receiptAccountingEntries,\r\n receiptAccountingRefs,\r\n tripAccountingEntries,\r\n tripAccountingRefs,\r\n updateAccountingRef\r\n }\r\n}\r\n","import { EDITABLE_RECEIPT_KEY } from '@/enums'\n\nexport default function useOCRCoordinates() {\n\n const getOcrCoordinates = (receipt: any) => {\n // Initialize OCRCoordinates object\n const OCRCoordinates: { [key: string]: any } = {}\n const ocrData = Object.entries(receipt?.ocr || {})\n\n // Process OCR data\n ocrData.forEach(([key, value]) => {\n if (key === 'bankAccounts' || key === 'supplier') {\n const data = Object.entries(value || {})\n data.forEach(([subKey, subValue]) => {\n if (subValue.source) {\n if (!OCRCoordinates[key.toLowerCase()]) {\n OCRCoordinates[key.toLowerCase()] = []\n }\n OCRCoordinates[key.toLowerCase()].push(subValue.source)\n }\n })\n } else if (key === 'totals') {\n const data = Object.entries(value || {})\n data.forEach(([subKey, subValue]) => {\n const data = Object.entries(subValue || {})\n data.forEach(([subberKey, subberValue]) => {\n if ((subberValue as { source: any })?.source) {\n OCRCoordinates[subberKey.toLowerCase()] = (subberValue as { source: any }).source\n }\n })\n })\n } else if (key === 'documentInfo') {\n if ((value as { documentId?: { source: any } })?.documentId?.source) {\n OCRCoordinates[key.toLowerCase()] = (value as { documentId?: { source: any } })?.documentId?.source\n }\n } else {\n if ((value as { source: any })?.source) {\n OCRCoordinates[key.toLowerCase()] = (value as { source: any }).source\n }\n }\n })\n\n const totalHeight = receipt?.ocr?.metadata?.totalHeight || false\n const imageHeight = receipt?.ocr?.metadata?.imageHeight\n // account for multiple page PDF-s\n const finalHeight = totalHeight ? totalHeight * (totalHeight / imageHeight) : imageHeight\n\n return {\n coordinates: OCRCoordinates,\n imageWidth: receipt?.ocr?.metadata?.imageWidth,\n imageHeight: finalHeight,\n oldPDF: !totalHeight && receipt?.originalName?.endsWith('.pdf') // for old PDF-s when the totalHeight wasnt attached to them\n }\n }\n\n const getDrawableOcrCoordinates = (field: string, OCRCoordinates: Array) => {\n // convert to input field labels to the labels that come from OCR data\n if (\n field === EDITABLE_RECEIPT_KEY.SUPPLIER ||\n field === EDITABLE_RECEIPT_KEY.SUPPLIER_REG_NR ||\n field === EDITABLE_RECEIPT_KEY.SUPPLIER_VAT_NR\n ) {\n field = 'supplier'\n } else if (field === EDITABLE_RECEIPT_KEY.DOCUMENT_ID) {\n field = 'documentInfo'\n } else if (field === EDITABLE_RECEIPT_KEY.IBAN) {\n field = 'bankAccounts'\n }\n\n // Convert field to lowercase\n field = field.toLowerCase()\n\n let matchingField = findFromObject(OCRCoordinates, field)\n\n // Check if field exists in OCRCoordinates, if not the return all fields\n if (matchingField?.length) {\n return matchingField\n } else {\n // if not found, dont return anything\n return []\n }\n }\n\n const findFromObject = (object: Array, field: string) => {\n const matches = []\n\n for (const [key, value] of Object.entries(object)) {\n if (key === field) {\n if (Array.isArray(value)) {\n for (const i of value) {\n matches.push(i)\n }\n } else {\n matches.push(value)\n }\n }\n }\n return matches\n }\n\n return {\n getOcrCoordinates,\n getDrawableOcrCoordinates\n }\n}\n","import { ComputedRef, computed } from 'vue'\r\nimport { xstore } from '@/store'\r\nimport { useInstanceHelpers, useConfig, useContext } from '@/composables'\r\nimport { CARD_REPORTING_INTERVAL, TRANSACTIONS_STORE_ACTIONS, TRANSACTIONS_STORE_GETTERS } from '@/enums'\r\nimport { BankAccountInfo, Company, User } from '@/models'\r\n\r\nexport default function useBankConnection() {\r\n const { t } = useInstanceHelpers()\r\n const { config } = useConfig()\r\n const { root } = useContext()\r\n\r\n const companyId = computed(() => Number(root?.$route.params.companyId))\r\n\r\n const bankAccountList: ComputedRef = computed(() => {\r\n return Object.values(xstore.getters[TRANSACTIONS_STORE_GETTERS.BANK_ACCOUNT_LIST][companyId.value] || []) \r\n })\r\n\r\n const reportingIntervalOptions = [\r\n { title: t('weekly'), value: CARD_REPORTING_INTERVAL.WEEKLY },\r\n { title: t('monthly'), value: CARD_REPORTING_INTERVAL.MONTHLY },\r\n { title: t('yearly'), value: CARD_REPORTING_INTERVAL.YEARLY }\r\n ]\r\n\r\n const getInitialHub = (countryCode: string) => {\r\n return ['EE', 'LV', 'LT'].includes(countryCode) ? 'swedbank' : 'enablebanking'\r\n }\r\n\r\n const connectToBank = (company: Company, user: User, account: BankAccountInfo = {}) => {\r\n if (!company.id) return\r\n const lang = `&lang=${user?.lang || 'eng'}`\r\n const cid = `&cid=${company.id}`\r\n const redirect = `&redirect_path=${encodeURIComponent(location.pathname)}`\r\n let connectUrl = `${config.value.services.api.url}/integrations/v2/connect?i=psd2${cid}${lang}${redirect}`\r\n if (account.bic && account.iban && account.hub && account.psuType) {\r\n connectUrl = `${connectUrl}&a=sync&bic=${account.bic}&iban=${account.iban}&hub=${account.hub}&psuType=${account.psuType}`\r\n }\r\n window.location.href = connectUrl\r\n }\r\n\r\n const loadBankAccounts = (): Promise | undefined => {\r\n if (!companyId.value) return\r\n return xstore.dispatch(TRANSACTIONS_STORE_ACTIONS.GET_BANK_ACCOUNT_LIST, {\r\n companyId: companyId.value\r\n })\r\n }\r\n\r\n return {\r\n bankAccountList,\r\n reportingIntervalOptions,\r\n loadBankAccounts,\r\n connectToBank\r\n }\r\n}\r\n","import { computed } from 'vue'\r\nimport { ITEM_ROW_COLUMN_KEY, FIELD_TYPE, ITEM_ROW_KEY, ACCOUNTING_OBJECT_TYPE, REFERENCE_OBJECT_TYPE } from '@/enums'\r\nimport { ItemRow, Receipt, AccountingObject, Company, ItemRowColumn } from '@/models'\r\nimport transformSumInput from '@/lib/helpers/transformSumInput'\r\nimport {\r\n useItemRows,\r\n useContext,\r\n useAccountingRefs,\r\n useAccountingSettings,\r\n useAccountingFields\r\n} from '@/composables'\r\n\r\nexport default function useItemRowFields() {\r\n const { root } = useContext()\r\n const { updateItemRow } = useItemRows()\r\n const { activeAccountingFields, accountingEntriesEnabled } = useAccountingSettings()\r\n const { loadTripAccountingEntries, receiptAccountingRefs, updateAccountingRef } = useAccountingRefs()\r\n const { accountingFieldOptions } = useAccountingFields()\r\n\r\n const defaultColumns: ItemRowColumn[] = [\r\n ITEM_ROW_COLUMN_KEY.ITEM_CODE,\r\n ITEM_ROW_COLUMN_KEY.DESCRIPTION,\r\n ITEM_ROW_COLUMN_KEY.UNIT,\r\n ITEM_ROW_COLUMN_KEY.QUANTITY,\r\n ITEM_ROW_COLUMN_KEY.PRICE,\r\n ITEM_ROW_COLUMN_KEY.VAT_RATE,\r\n ITEM_ROW_COLUMN_KEY.VAT,\r\n ITEM_ROW_COLUMN_KEY.VAT_CODE,\r\n ITEM_ROW_COLUMN_KEY.SUM,\r\n ITEM_ROW_COLUMN_KEY.TOTAL,\r\n ITEM_ROW_COLUMN_KEY.ACCOUNT,\r\n ITEM_ROW_COLUMN_KEY.PROJECT,\r\n ITEM_ROW_COLUMN_KEY.DIMENSION,\r\n ITEM_ROW_COLUMN_KEY.COST_OBJECTIVE,\r\n ITEM_ROW_COLUMN_KEY.DEPARTMENT,\r\n ITEM_ROW_COLUMN_KEY.CODE\r\n ]\r\n const VATcolumns: ItemRowColumn[] = [ITEM_ROW_COLUMN_KEY.SUM, ITEM_ROW_COLUMN_KEY.VAT, ITEM_ROW_COLUMN_KEY.VAT_RATE]\r\n\r\n const accountingColumns: ItemRowColumn[] = [\r\n ITEM_ROW_COLUMN_KEY.ACCOUNT,\r\n ITEM_ROW_COLUMN_KEY.COST_OBJECTIVE,\r\n ITEM_ROW_COLUMN_KEY.DEPARTMENT,\r\n ITEM_ROW_COLUMN_KEY.DIMENSION,\r\n ITEM_ROW_COLUMN_KEY.ITEM_CODE,\r\n ITEM_ROW_COLUMN_KEY.PROJECT,\r\n ITEM_ROW_COLUMN_KEY.VAT_CODE\r\n ]\r\n\r\n const companyId = computed(() => root.$route.params.companyId?.toString())\r\n const receiptId = computed(() => Number(root?.$route.params.receiptId))\r\n const tripId = computed(() => Number(root?.$route.params.tripId))\r\n const activeRefs = computed(() => receiptAccountingRefs(receiptId.value || '') || {})\r\n\r\n const itemRowAccountingFields = computed(() => {\r\n return activeAccountingFields.value?.find(({ target }) => target === REFERENCE_OBJECT_TYPE.ITEM_ROW)?.types || []\r\n })\r\n\r\n const isSameAsExisting = (key: ITEM_ROW_KEY, value: any, rowNum: number, receipt: Receipt) => {\r\n if (!rowNum || !receipt.itemRows) return false\r\n const existingRow = receipt.itemRows.find((row: ItemRow) => row.rowNum === rowNum)\r\n if (!existingRow) return false\r\n return existingRow[key] == value\r\n }\r\n\r\n const updateValue = async (\r\n rowKey: ITEM_ROW_KEY,\r\n updatedValue: any,\r\n rowNum: ItemRow[ITEM_ROW_KEY.ROW_NUM],\r\n receipt: Receipt\r\n ) => {\r\n try {\r\n if (updatedValue === undefined || isSameAsExisting(rowKey, updatedValue, rowNum, receipt)) return\r\n return await updateItemRow(companyId.value, receipt, rowKey, updatedValue, rowNum)\r\n } catch (error) {\r\n root?.$notification(root.eh(error), 'error', 9000)\r\n }\r\n }\r\n\r\n const columnConfig = {\r\n [ITEM_ROW_COLUMN_KEY.DESCRIPTION]: {\r\n title: ITEM_ROW_COLUMN_KEY.DESCRIPTION,\r\n cellWidth: 'minmax(220px, 3fr)'\r\n },\r\n [ITEM_ROW_COLUMN_KEY.CODE]: {\r\n title: ITEM_ROW_COLUMN_KEY.CODE,\r\n cellWidth: 'minmax(100px, 1fr)'\r\n },\r\n [ITEM_ROW_COLUMN_KEY.UNIT]: {\r\n title: ITEM_ROW_COLUMN_KEY.UNIT,\r\n cellWidth: 'minmax(60px, 1fr)'\r\n },\r\n [ITEM_ROW_COLUMN_KEY.QUANTITY]: {\r\n title: ITEM_ROW_COLUMN_KEY.QUANTITY,\r\n cellWidth: 'minmax(60px, 1fr)'\r\n },\r\n [ITEM_ROW_COLUMN_KEY.PRICE]: {\r\n title: ITEM_ROW_COLUMN_KEY.PRICE,\r\n cellWidth: 'minmax(100px, 1fr)'\r\n },\r\n [ITEM_ROW_COLUMN_KEY.VAT_RATE]: {\r\n title: ITEM_ROW_COLUMN_KEY.VAT_RATE,\r\n cellWidth: 'minmax(60px, 1fr)'\r\n },\r\n [ITEM_ROW_COLUMN_KEY.VAT]: {\r\n title: ITEM_ROW_COLUMN_KEY.VAT,\r\n cellWidth: 'minmax(100px, 1fr)'\r\n },\r\n [ITEM_ROW_COLUMN_KEY.SUM]: {\r\n title: ITEM_ROW_COLUMN_KEY.SUM,\r\n cellWidth: 'minmax(100px, 1fr)'\r\n },\r\n [ITEM_ROW_COLUMN_KEY.TOTAL]: {\r\n title: ITEM_ROW_COLUMN_KEY.TOTAL,\r\n cellWidth: 'minmax(100px, 1fr)'\r\n },\r\n [ITEM_ROW_COLUMN_KEY.ITEM_CODE]: {\r\n title: ITEM_ROW_COLUMN_KEY.ITEM_CODE,\r\n cellWidth: 'minmax(160px, 2fr)'\r\n },\r\n [ITEM_ROW_COLUMN_KEY.COST_OBJECTIVE]: {\r\n title: ITEM_ROW_COLUMN_KEY.COST_OBJECTIVE,\r\n cellWidth: 'minmax(160px, 2fr)'\r\n },\r\n [ITEM_ROW_COLUMN_KEY.PROJECT]: {\r\n title: ITEM_ROW_COLUMN_KEY.PROJECT,\r\n cellWidth: 'minmax(160px, 2fr)'\r\n },\r\n [ITEM_ROW_COLUMN_KEY.ACCOUNT]: {\r\n title: ITEM_ROW_COLUMN_KEY.ACCOUNT,\r\n cellWidth: 'minmax(160px, 2fr)'\r\n },\r\n [ITEM_ROW_COLUMN_KEY.DIMENSION]: {\r\n title: ITEM_ROW_COLUMN_KEY.DIMENSION,\r\n cellWidth: 'minmax(160px, 2fr)'\r\n },\r\n [ITEM_ROW_COLUMN_KEY.DEPARTMENT]: {\r\n title: ITEM_ROW_COLUMN_KEY.DEPARTMENT,\r\n cellWidth: 'minmax(160px, 2fr)'\r\n },\r\n [ITEM_ROW_COLUMN_KEY.VAT_CODE]: {\r\n title: ITEM_ROW_COLUMN_KEY.VAT_CODE,\r\n cellWidth: 'minmax(160px, 2fr)'\r\n }\r\n }\r\n\r\n const fieldConfig = {\r\n [ITEM_ROW_COLUMN_KEY.ITEM_CODE]: {\r\n ...accountingFieldOptions.value[ACCOUNTING_OBJECT_TYPE.ITEM_CODE],\r\n label: ACCOUNTING_OBJECT_TYPE.ITEM_CODE,\r\n inputType: FIELD_TYPE.SELECT,\r\n getValue: ({ id }: ItemRow) => {\r\n return accountingFieldOptions.value[ACCOUNTING_OBJECT_TYPE.ITEM_CODE].getValue(\r\n activeRefs.value,\r\n REFERENCE_OBJECT_TYPE.ITEM_ROW,\r\n id\r\n )\r\n },\r\n handleOnChange: (value: AccountingObject['id'], itemRow: ItemRow, _: Receipt) => {\r\n return updateAccountingRef(value, ACCOUNTING_OBJECT_TYPE.ITEM_CODE, 'receiptId', receiptId.value, {\r\n refType: REFERENCE_OBJECT_TYPE.ITEM_ROW,\r\n refId: itemRow.id\r\n })\r\n }\r\n },\r\n [ITEM_ROW_COLUMN_KEY.DESCRIPTION]: {\r\n label: ITEM_ROW_COLUMN_KEY.DESCRIPTION,\r\n inputType: FIELD_TYPE.TEXT,\r\n getValue: ({ description }: ItemRow) => description,\r\n handleOnChange: (value: ItemRow[ITEM_ROW_KEY.DESCRIPTION], itemRow: ItemRow, receipt: Receipt) => {\r\n return updateValue(ITEM_ROW_KEY.DESCRIPTION, value, itemRow.rowNum, receipt)\r\n }\r\n },\r\n [ITEM_ROW_COLUMN_KEY.UNIT]: {\r\n label: ITEM_ROW_COLUMN_KEY.UNIT,\r\n inputType: FIELD_TYPE.TEXT,\r\n getValue: ({ unit }: ItemRow) => unit,\r\n handleOnChange: (value: ItemRow[ITEM_ROW_KEY.UNIT], itemRow: ItemRow, receipt: Receipt) => {\r\n return updateValue(ITEM_ROW_KEY.UNIT, value, itemRow.rowNum, receipt)\r\n }\r\n },\r\n [ITEM_ROW_COLUMN_KEY.QUANTITY]: {\r\n label: ITEM_ROW_COLUMN_KEY.QUANTITY,\r\n inputType: FIELD_TYPE.NUMBER,\r\n minValue: 0,\r\n getValue: ({ quantity }: ItemRow) => Number(quantity),\r\n handleOnChange: (value: ItemRow[ITEM_ROW_KEY.QUANTITY], itemRow: ItemRow, receipt: Receipt) => {\r\n value = Number(value)\r\n if (value < 0) {\r\n value = value * -1\r\n }\r\n return updateValue(ITEM_ROW_KEY.QUANTITY, value, itemRow.rowNum, receipt)\r\n }\r\n },\r\n [ITEM_ROW_COLUMN_KEY.PRICE]: {\r\n label: ITEM_ROW_COLUMN_KEY.PRICE,\r\n inputType: FIELD_TYPE.TEXT,\r\n getValue: ({ price }: ItemRow) => Number(price).toFixed(2),\r\n handleOnChange: (value: ItemRow[ITEM_ROW_KEY.PRICE], itemRow: ItemRow, receipt: Receipt) => {\r\n value = Number(transformSumInput(value?.toString()))\r\n return updateValue(ITEM_ROW_KEY.PRICE, value, itemRow.rowNum, receipt)\r\n }\r\n },\r\n [ITEM_ROW_COLUMN_KEY.VAT_RATE]: {\r\n label: ITEM_ROW_COLUMN_KEY.VAT_RATE,\r\n inputType: FIELD_TYPE.TEXT,\r\n getValue: ({ VATrate }: ItemRow) => Number(VATrate),\r\n handleOnChange: (value: ItemRow[ITEM_ROW_KEY.VAT_RATE], itemRow: ItemRow, receipt: Receipt) => {\r\n value = Number(transformSumInput(value?.toString()))\r\n if (value > 100) {\r\n value = 100\r\n }\r\n return updateValue(ITEM_ROW_KEY.VAT_RATE, value, itemRow.rowNum, receipt)\r\n }\r\n },\r\n [ITEM_ROW_COLUMN_KEY.VAT]: {\r\n label: ITEM_ROW_COLUMN_KEY.VAT,\r\n inputType: FIELD_TYPE.TEXT,\r\n getValue: ({ VATsum }: ItemRow) => Number(VATsum).toFixed(2),\r\n handleOnChange: (value: ItemRow[ITEM_ROW_KEY.VAT], itemRow: ItemRow, receipt: Receipt) => {\r\n value = Number(transformSumInput(value?.toString()))\r\n return updateValue(ITEM_ROW_KEY.VAT, value, itemRow.rowNum, receipt)\r\n }\r\n },\r\n [ITEM_ROW_COLUMN_KEY.VAT_CODE]: {\r\n ...accountingFieldOptions.value[ACCOUNTING_OBJECT_TYPE.VAT_CODE],\r\n label: ACCOUNTING_OBJECT_TYPE.VAT_CODE,\r\n inputType: FIELD_TYPE.SELECT,\r\n getValue: ({ id }: ItemRow) => {\r\n return accountingFieldOptions.value[ACCOUNTING_OBJECT_TYPE.VAT_CODE].getValue(\r\n activeRefs.value,\r\n REFERENCE_OBJECT_TYPE.ITEM_ROW,\r\n id\r\n )\r\n },\r\n handleOnChange: (value: AccountingObject['id'], itemRow: ItemRow, _: Receipt) => {\r\n return updateAccountingRef(value, ACCOUNTING_OBJECT_TYPE.VAT_CODE, 'receiptId', receiptId.value, {\r\n refType: REFERENCE_OBJECT_TYPE.ITEM_ROW,\r\n refId: itemRow.id\r\n })\r\n }\r\n },\r\n [ITEM_ROW_COLUMN_KEY.SUM]: {\r\n label: ITEM_ROW_COLUMN_KEY.SUM,\r\n inputType: FIELD_TYPE.TEXT,\r\n getValue: ({ sum }: ItemRow) => Number(sum).toFixed(2),\r\n handleOnChange: (value: ItemRow[ITEM_ROW_KEY.SUM], itemRow: ItemRow, receipt: Receipt) => {\r\n value = Number(transformSumInput(value?.toString()))\r\n return updateValue(ITEM_ROW_KEY.SUM, value, itemRow.rowNum, receipt)\r\n }\r\n },\r\n [ITEM_ROW_COLUMN_KEY.TOTAL]: {\r\n label: ITEM_ROW_COLUMN_KEY.TOTAL,\r\n inputType: FIELD_TYPE.TEXT,\r\n getValue: ({ total }: ItemRow) => Number(total).toFixed(2),\r\n handleOnChange: (value: ItemRow[ITEM_ROW_KEY.TOTAL], itemRow: ItemRow, receipt: Receipt) => {\r\n value = Number(transformSumInput(value?.toString()))\r\n return updateValue(ITEM_ROW_KEY.TOTAL, value, itemRow.rowNum, receipt)\r\n }\r\n },\r\n [ITEM_ROW_COLUMN_KEY.ACCOUNT]: {\r\n ...accountingFieldOptions.value[ACCOUNTING_OBJECT_TYPE.ACCOUNT],\r\n label: ACCOUNTING_OBJECT_TYPE.ACCOUNT,\r\n inputType: FIELD_TYPE.SELECT,\r\n getValue: ({ id }: ItemRow) => {\r\n return accountingFieldOptions.value[ACCOUNTING_OBJECT_TYPE.ACCOUNT].getValue(\r\n activeRefs.value,\r\n REFERENCE_OBJECT_TYPE.ITEM_ROW,\r\n id\r\n )\r\n },\r\n handleOnChange: async (value: AccountingObject['id'], itemRow: ItemRow, _: Receipt) => {\r\n const updated = await updateAccountingRef(value, ACCOUNTING_OBJECT_TYPE.ACCOUNT, 'receiptId', receiptId.value, {\r\n refType: REFERENCE_OBJECT_TYPE.ITEM_ROW,\r\n refId: itemRow.id\r\n })\r\n if (tripId.value) {\r\n await loadTripAccountingEntries(tripId.value)\r\n }\r\n return updated\r\n }\r\n },\r\n [ITEM_ROW_COLUMN_KEY.PROJECT]: {\r\n ...accountingFieldOptions.value[ACCOUNTING_OBJECT_TYPE.PROJECT],\r\n label: ACCOUNTING_OBJECT_TYPE.PROJECT,\r\n inputType: FIELD_TYPE.SELECT,\r\n getValue: ({ id }: ItemRow) => {\r\n return accountingFieldOptions.value[ACCOUNTING_OBJECT_TYPE.PROJECT].getValue(\r\n activeRefs.value,\r\n REFERENCE_OBJECT_TYPE.ITEM_ROW,\r\n id\r\n )\r\n },\r\n handleOnChange: (value: AccountingObject['id'], itemRow: ItemRow, _: Receipt) => {\r\n return updateAccountingRef(value, ACCOUNTING_OBJECT_TYPE.PROJECT, 'receiptId', receiptId.value, {\r\n refType: REFERENCE_OBJECT_TYPE.ITEM_ROW,\r\n refId: itemRow.id\r\n })\r\n }\r\n },\r\n [ITEM_ROW_COLUMN_KEY.DIMENSION]: {\r\n ...accountingFieldOptions.value[ACCOUNTING_OBJECT_TYPE.DIMENSION],\r\n label: ACCOUNTING_OBJECT_TYPE.DIMENSION,\r\n inputType: FIELD_TYPE.SELECT,\r\n getValue: ({ id }: ItemRow) => {\r\n return accountingFieldOptions.value[ACCOUNTING_OBJECT_TYPE.DIMENSION].getValue(\r\n activeRefs.value,\r\n REFERENCE_OBJECT_TYPE.ITEM_ROW,\r\n id\r\n )\r\n },\r\n handleOnChange: (value: AccountingObject['id'], itemRow: ItemRow, _: Receipt) => {\r\n return updateAccountingRef(value, ACCOUNTING_OBJECT_TYPE.DIMENSION, 'receiptId', receiptId.value, {\r\n refType: REFERENCE_OBJECT_TYPE.ITEM_ROW,\r\n refId: itemRow.id\r\n })\r\n }\r\n },\r\n [ITEM_ROW_COLUMN_KEY.COST_OBJECTIVE]: {\r\n ...accountingFieldOptions.value[ACCOUNTING_OBJECT_TYPE.COST_OBJECTIVE],\r\n label: ACCOUNTING_OBJECT_TYPE.COST_OBJECTIVE,\r\n inputType: FIELD_TYPE.SELECT,\r\n getValue: ({ id }: ItemRow) => {\r\n return accountingFieldOptions.value[ACCOUNTING_OBJECT_TYPE.COST_OBJECTIVE].getValue(\r\n activeRefs.value,\r\n REFERENCE_OBJECT_TYPE.ITEM_ROW,\r\n id\r\n )\r\n },\r\n handleOnChange: (value: AccountingObject['id'], itemRow: ItemRow, _: Receipt) => {\r\n return updateAccountingRef(value, ACCOUNTING_OBJECT_TYPE.COST_OBJECTIVE, 'receiptId', receiptId.value, {\r\n refType: REFERENCE_OBJECT_TYPE.ITEM_ROW,\r\n refId: itemRow.id\r\n })\r\n }\r\n },\r\n [ITEM_ROW_COLUMN_KEY.DEPARTMENT]: {\r\n ...accountingFieldOptions.value[ACCOUNTING_OBJECT_TYPE.DEPARTMENT],\r\n label: ACCOUNTING_OBJECT_TYPE.DEPARTMENT,\r\n inputType: FIELD_TYPE.SELECT,\r\n getValue: ({ id }: ItemRow) => {\r\n return accountingFieldOptions.value[ACCOUNTING_OBJECT_TYPE.DEPARTMENT].getValue(\r\n activeRefs.value,\r\n REFERENCE_OBJECT_TYPE.ITEM_ROW,\r\n id\r\n )\r\n },\r\n handleOnChange: (value: AccountingObject['id'], itemRow: ItemRow, _: Receipt) => {\r\n return updateAccountingRef(value, ACCOUNTING_OBJECT_TYPE.DEPARTMENT, 'receiptId', receiptId.value, {\r\n refType: REFERENCE_OBJECT_TYPE.ITEM_ROW,\r\n refId: itemRow.id\r\n })\r\n }\r\n },\r\n [ITEM_ROW_COLUMN_KEY.CODE]: {\r\n label: ITEM_ROW_COLUMN_KEY.CODE,\r\n inputType: FIELD_TYPE.TEXT,\r\n getValue: ({ code }: ItemRow) => code,\r\n handleOnChange: (value: ItemRow[ITEM_ROW_KEY.CODE], itemRow: ItemRow, receipt: Receipt) => {\r\n return updateValue(ITEM_ROW_KEY.CODE, value, itemRow.rowNum, receipt)\r\n }\r\n }\r\n }\r\n\r\n const filterAvailableItemColumns = (company: Company, columns: ItemRowColumn[]) => {\r\n const isVATAccountable = company.VATAccountable !== false\r\n return columns.filter((column) => {\r\n const isDefault = !VATcolumns.includes(column) && !accountingColumns.includes(column)\r\n const VATColumnSupported = isVATAccountable && VATcolumns.includes(column)\r\n const accountingColumnSupported =\r\n accountingEntriesEnabled.value &&\r\n accountingColumns.includes(column) &&\r\n // @ts-ignore // TODO:\r\n itemRowAccountingFields.value.includes(column)\r\n return isDefault || VATColumnSupported || accountingColumnSupported\r\n })\r\n }\r\n\r\n const mapItemColumnConfig = (company: Company) => {\r\n let columns: ItemRowColumn[] =\r\n company.settings?.cloudViewCustomization?.itemColumnOrder || filterAvailableItemColumns(company, defaultColumns)\r\n columns = columns.filter(column => column.length > 0)\r\n return columns.map((column) => columnConfig[column])\r\n }\r\n\r\n return {\r\n defaultColumns,\r\n columnConfig,\r\n fieldConfig,\r\n filterAvailableItemColumns,\r\n mapItemColumnConfig\r\n }\r\n}\r\n","import { computed, watch } from 'vue'\r\nimport xstore from '@/store'\r\nimport { RECEIPTS_STORE_ACTIONS, RECEIPTS_STORE_MUTATIONS, RECEIPTS_STORE_GETTERS } from '@/enums'\r\nimport { useContext } from '@/composables'\r\nimport { Receipt } from '@/models'\r\n\r\nexport default function useReceiptSelect() {\r\n const { root, store } = useContext()\r\n\r\n const companyId = computed(() => root.$route.params.companyId?.toString())\r\n\r\n const selectedReceipts = computed(() => {\r\n return xstore.getters[RECEIPTS_STORE_GETTERS.SELECTED_RECEIPTS]\r\n })\r\n\r\n const receiptBrowsingList = computed<(string | number)[]>(() => {\r\n return xstore.getters[RECEIPTS_STORE_GETTERS.RECEIPT_BROWSING_LIST]\r\n })\r\n\r\n const setSelectedReceipt = (receiptId: number, selected: Boolean) => {\r\n // TODO: Fix types\r\n // @ts-ignore\r\n return xstore.commit(RECEIPTS_STORE_MUTATIONS.SET_SELECTED_RECEIPTS, { receiptIds: [receiptId], selected })\r\n }\r\n\r\n const isReceiptSelected = (receiptId: number): Boolean => {\r\n return selectedReceipts.value && selectedReceipts.value.includes(receiptId)\r\n }\r\n\r\n const setMultipleSelectedReceipts = (receipts: Array, selected: Boolean) => {\r\n clearSelectedReceipts()\r\n const receiptIds = receipts.map((receipt) => receipt.id)\r\n // TODO: Fix types\r\n // @ts-ignore\r\n return xstore.commit(RECEIPTS_STORE_MUTATIONS.SET_SELECTED_RECEIPTS, { receiptIds, selected })\r\n }\r\n\r\n const clearSelectedReceipts = () => {\r\n // @ts-ignore\r\n return xstore.commit(RECEIPTS_STORE_MUTATIONS.CLEAR_SELECTED_RECEIPTS)\r\n }\r\n\r\n const setReceiptBrowsingList = (receiptIds: Array) => {\r\n return xstore.dispatch(RECEIPTS_STORE_ACTIONS.UPDATE_RECEIPT_BROWSING_LIST, { receiptIds })\r\n }\r\n\r\n watch(\r\n () => companyId.value,\r\n () => {\r\n if (selectedReceipts.value?.length) {\r\n clearSelectedReceipts()\r\n }\r\n\r\n if (receiptBrowsingList.value.length) {\r\n setReceiptBrowsingList([])\r\n }\r\n }\r\n )\r\n\r\n return {\r\n receiptBrowsingList,\r\n selectedReceipts,\r\n clearSelectedReceipts,\r\n isReceiptSelected,\r\n setMultipleSelectedReceipts,\r\n setReceiptBrowsingList,\r\n setSelectedReceipt\r\n }\r\n}\r\n","import { validateStatus } from '@/lib/status'\r\nimport { TRIP_STATUS_VALIDATOR, TRIP_STATUS, TRIP_ACTION } from '@/enums'\r\nimport { useUser, useCompanies, useTrips, useExport, useReceipts } from '@/composables'\r\n\r\nexport default function useReportButtons() {\r\n const { activeUser } = useUser()\r\n const { activeCompany, activeUserIsAdmin } = useCompanies()\r\n const { activeTrip } = useTrips()\r\n const { canExport, canExportAndCopy } = useExport()\r\n const { activeTripReceipts } = useReceipts()\r\n\r\n const isButtonAccessible = (buttonAction: string) => {\r\n const tripStatus = activeTrip.value?.status\r\n switch (buttonAction) {\r\n case TRIP_ACTION.ADD_DOCUMENT:\r\n case TRIP_ACTION.ADD_MILEAGE:\r\n case TRIP_ACTION.COPY_EMAIL:\r\n return !validateStatus(tripStatus, [TRIP_STATUS.CONFIRMED])\r\n case TRIP_ACTION.EXPORT:\r\n return (\r\n canExport(activeCompany.value, activeUser.value!) &&\r\n validateStatus(tripStatus, [TRIP_STATUS.CONFIRMED]) &&\r\n !validateStatus(tripStatus, TRIP_STATUS_VALIDATOR.APPROVING) &&\r\n !validateStatus(tripStatus, TRIP_STATUS_VALIDATOR.PROCESSING)\r\n )\r\n case TRIP_ACTION.EXPORT_AND_COPY:\r\n return (\r\n canExportAndCopy(activeCompany.value, activeUser.value!) &&\r\n validateStatus(tripStatus, [TRIP_STATUS.CONFIRMED]) &&\r\n !validateStatus(tripStatus, TRIP_STATUS_VALIDATOR.APPROVING) &&\r\n !validateStatus(tripStatus, TRIP_STATUS_VALIDATOR.PROCESSING)\r\n )\r\n case TRIP_ACTION.UNARCHIVE:\r\n return (\r\n validateStatus(tripStatus, TRIP_STATUS_VALIDATOR.CONFIRMED) ||\r\n (validateStatus(tripStatus, TRIP_STATUS_VALIDATOR.SENT) && activeUserIsAdmin.value) ||\r\n (validateStatus(tripStatus, TRIP_STATUS_VALIDATOR.APPROVED) && activeUserIsAdmin.value) ||\r\n validateStatus(tripStatus, TRIP_STATUS_VALIDATOR.PROCESSING)\r\n )\r\n case TRIP_ACTION.EDIT:\r\n return (\r\n !validateStatus(tripStatus, TRIP_STATUS_VALIDATOR.CONFIRMED) &&\r\n !validateStatus(tripStatus, TRIP_STATUS_VALIDATOR.SENT) &&\r\n !validateStatus(tripStatus, TRIP_STATUS_VALIDATOR.APPROVING) &&\r\n !validateStatus(tripStatus, TRIP_STATUS_VALIDATOR.APPROVED) &&\r\n !validateStatus(tripStatus, TRIP_STATUS_VALIDATOR.PROCESSING)\r\n )\r\n case TRIP_ACTION.CONFIRM_AND_SEND:\r\n return (\r\n !validateStatus(tripStatus, TRIP_STATUS_VALIDATOR.SENT) &&\r\n activeCompany.value?.settings?.requireReportConfirmation &&\r\n activeUserIsAdmin.value\r\n )\r\n case TRIP_ACTION.SUBMIT:\r\n return (\r\n !validateStatus(tripStatus, TRIP_STATUS_VALIDATOR.APPROVING) &&\r\n !validateStatus(tripStatus, TRIP_STATUS_VALIDATOR.APPROVED) &&\r\n !validateStatus(tripStatus, TRIP_STATUS_VALIDATOR.PROCESSING) &&\r\n !validateStatus(tripStatus, TRIP_STATUS_VALIDATOR.SENT) &&\r\n !(\r\n activeTrip.value?.type === 'expense' &&\r\n activeTripReceipts.value?.length < 1 &&\r\n activeTrip.value?.subtype !== 'mileage'\r\n ) &&\r\n !activeCompany.value?.settings?.requireReportConfirmation\r\n )\r\n case TRIP_ACTION.SEND:\r\n return (\r\n (validateStatus(tripStatus, [TRIP_STATUS.CONFIRMED, TRIP_STATUS.APPROVED]) ||\r\n validateStatus(tripStatus, [TRIP_STATUS.CONFIRMED, TRIP_STATUS.SENT])) &&\r\n activeUserIsAdmin.value\r\n )\r\n case TRIP_ACTION.DELETE:\r\n return (\r\n (!validateStatus(tripStatus, [TRIP_STATUS.CONFIRMED, TRIP_STATUS.APPROVED]) &&\r\n !validateStatus(tripStatus, [TRIP_STATUS.CONFIRMED, TRIP_STATUS.SENT])) ||\r\n activeUserIsAdmin.value\r\n )\r\n }\r\n }\r\n return {\r\n isButtonAccessible\r\n }\r\n}\r\n","import { ComputedRef, computed, ref } from 'vue'\nimport iban from 'iban'\nimport { xstore } from '@/store'\nimport {\n RECEIPTS_STORE_ACTIONS,\n EDITABLE_RECEIPT_KEY,\n DOCUMENT_TYPE,\n BILLING_TYPE,\n COST_TYPES_STORE_GETTERS,\n FIELD_TYPE,\n COST_TYPE,\n PAID_WITH,\n PAYMENT_TYPE,\n DOCUMENT_SUBTYPE,\n RECEIPT_STATUS,\n TRIP_STATUS_VALIDATOR\n} from '@/enums'\nimport { validateStatus } from '@/lib/status'\nimport { PaymentMethod, Receipt, EditableField, CompanySettings } from '@/models'\nimport { compareObjAgainstTarget } from '@/lib/helpers'\nimport {\n useInstanceHelpers,\n useContext,\n useCompanies,\n useReceipts,\n useTrips,\n useExpenseFlow,\n useItemRows,\n usePaymentMethods,\n useLoadingState,\n useDuplicates,\n useHelpers\n} from '@/composables'\n\nexport default function useReceiptFields() {\n const loadingFields = ref([])\n\n const { t } = useInstanceHelpers()\n const { root } = useContext()\n const { activeTrip } = useTrips()\n const { activeCompany, activeUserIsAdmin, updateCompanySettings } = useCompanies()\n const { activeReceipt, loadReceipt } = useReceipts()\n const { digitizeReceipt } = useExpenseFlow()\n const { setLoadingState } = useLoadingState()\n const { deleteAllItemRows, addItemRow } = useItemRows()\n const { paymentMethodsForUser, defaultPaymentMethods } = usePaymentMethods()\n const { duplicatesByReceiptId } = useDuplicates()\n const { findMostUsedCurrencies, ocrWordList } = useHelpers()\n\n const isAttachment = computed(() => activeReceipt.value?.docType === DOCUMENT_TYPE.ATTACHMENT)\n const isCostWithoutDocument = computed(() => activeReceipt.value?.extraData?.emptyReceipt)\n const isPaymentCardStatement = computed(() => activeReceipt.value?.docSubType === DOCUMENT_SUBTYPE.CARD_STATEMENT)\n\n const isEditBlocked = computed(() => {\n if (!activeReceipt.value?.status) return true\n if (activeUserIsAdmin.value) return false\n const tripStatus = activeTrip.value?.status\n const tripBlocked = validateStatus(tripStatus, TRIP_STATUS_VALIDATOR.APPROVED)\n const receiptBlocked = validateStatus(activeReceipt.value?.status, [RECEIPT_STATUS.APPROVED])\n return tripBlocked || receiptBlocked\n })\n\n async function updateReceiptField(target: EDITABLE_RECEIPT_KEY, receipt: Receipt, values: any, config: any = {}) {\n if (!receipt?.id) return\n\n try {\n // using exmpl: config.getParentObj: (payload) => ({paymentDetails: payload})\n if (values && typeof config.getParentObj === 'function') {\n values = config.getParentObj(values)\n }\n\n if (compareObjAgainstTarget(values, receipt)) {\n return\n }\n\n if (!config.disableLoading) {\n loadingFields.value.push(target)\n }\n\n setLoadingState(true)\n\n await xstore.dispatch(RECEIPTS_STORE_ACTIONS.UPDATE_RECEIPT_DATA, {\n companyId: activeCompany?.value?.id,\n receiptId: receipt?.id,\n disablePopUp: config.disablePopUp ?? false,\n values\n })\n\n const receiptDuplicates = duplicatesByReceiptId(Number(receipt?.id))\n for (const duplicate of receiptDuplicates) {\n await loadReceipt(duplicate.id)\n }\n\n root?.$notification('saved', 'success', 4000)\n } catch (error) {\n root?.$notification(root?.eh(error), 'error', 9000)\n } finally {\n if (!config.disableLoading) {\n loadingFields.value = loadingFields.value.filter((field) => field !== target)\n }\n setLoadingState(false)\n }\n }\n\n const receiptFields: ComputedRef = computed(() => {\n const fields: EditableField[] = [\n {\n name: EDITABLE_RECEIPT_KEY.SUPPLIER,\n type: FIELD_TYPE.TEXT,\n isHighlighted: ({ supplier }: Receipt) => !supplier,\n isVisible: !isAttachment.value && !isCostWithoutDocument.value,\n label: t('supplier'),\n isLoading: loadingFields.value.includes(EDITABLE_RECEIPT_KEY.SUPPLIER),\n getValue: ({ supplier }: Receipt) => supplier,\n handleOnChange: (value: Receipt[EDITABLE_RECEIPT_KEY.SUPPLIER], receipt: Receipt) => {\n updateReceiptField(EDITABLE_RECEIPT_KEY.SUPPLIER, receipt, { supplier: value })\n },\n supportsSuggestions: true,\n filterSuggestions: true,\n getValueSuggestions: ocrWordList()\n },\n {\n name: EDITABLE_RECEIPT_KEY.SUPPLIER_REG_NR,\n type: FIELD_TYPE.TEXT,\n isHighlighted: ({ supplierRegNumber }: Receipt) => !supplierRegNumber,\n isVisible: !isAttachment.value && !isCostWithoutDocument.value,\n label: t('supplierRegNumber'),\n isLoading: loadingFields.value.includes(EDITABLE_RECEIPT_KEY.SUPPLIER_REG_NR),\n getValue: ({ supplierRegNumber }: Receipt) => supplierRegNumber,\n handleOnChange: (value: Receipt[EDITABLE_RECEIPT_KEY.SUPPLIER_REG_NR], receipt: Receipt) => {\n updateReceiptField(EDITABLE_RECEIPT_KEY.SUPPLIER_REG_NR, receipt, { supplierRegNumber: value || null })\n },\n supportsSuggestions: true,\n filterSuggestions: true,\n getValueSuggestions: ocrWordList()\n },\n {\n name: EDITABLE_RECEIPT_KEY.SUPPLIER_VAT_NR,\n type: FIELD_TYPE.TEXT,\n isHighlighted: ({ supplierVATNumber }: Receipt) => !supplierVATNumber,\n isVisible: !isAttachment.value && !isCostWithoutDocument.value,\n label: t('VATNumber'),\n isLoading: loadingFields.value.includes(EDITABLE_RECEIPT_KEY.SUPPLIER_VAT_NR),\n getValue: ({ supplierVATNumber }: Receipt) => supplierVATNumber,\n handleOnChange: (value: Receipt[EDITABLE_RECEIPT_KEY.SUPPLIER_VAT_NR], receipt: Receipt) => {\n updateReceiptField(EDITABLE_RECEIPT_KEY.SUPPLIER_VAT_NR, receipt, { supplierVATNumber: value || null })\n },\n supportsSuggestions: true,\n filterSuggestions: true,\n getValueSuggestions: ocrWordList()\n },\n {\n name: EDITABLE_RECEIPT_KEY.DOCUMENT_ID,\n type: FIELD_TYPE.TEXT,\n isHighlighted: ({ documentId }: Receipt) => !documentId,\n isVisible: !isAttachment.value && !isCostWithoutDocument.value,\n label: t('documentId'),\n isLoading: loadingFields.value.includes(EDITABLE_RECEIPT_KEY.DOCUMENT_ID),\n getValue: ({ documentId }: Receipt) => documentId,\n handleOnChange: (value: Receipt[EDITABLE_RECEIPT_KEY.DOCUMENT_ID], receipt: Receipt) => {\n updateReceiptField(EDITABLE_RECEIPT_KEY.DOCUMENT_ID, receipt, { documentId: value || null })\n },\n supportsSuggestions: true,\n filterSuggestions: true,\n getValueSuggestions: ocrWordList()\n },\n {\n name: EDITABLE_RECEIPT_KEY.ISSUED,\n type: FIELD_TYPE.DATE,\n isHighlighted: ({ issued }: Receipt) => !issued,\n isVisible: !isAttachment.value,\n label: t('issued'),\n isLoading: loadingFields.value.includes(EDITABLE_RECEIPT_KEY.ISSUED),\n getValue: ({ issued }: Receipt) => issued,\n handleOnChange: (value: Receipt[EDITABLE_RECEIPT_KEY.ISSUED], receipt: Receipt) => {\n updateReceiptField(EDITABLE_RECEIPT_KEY.ISSUED, receipt, { issued: value })\n }\n },\n {\n name: EDITABLE_RECEIPT_KEY.CURRENCY,\n type: FIELD_TYPE.TEXT,\n isHighlighted: ({ currency }: Receipt) => !currency,\n isVisible: !isAttachment.value,\n label: t('currency'),\n maxLength: 3,\n isLoading: loadingFields.value.includes(EDITABLE_RECEIPT_KEY.CURRENCY),\n getValue: ({ currency }: Receipt) => currency,\n handleOnChange: (value: Receipt[EDITABLE_RECEIPT_KEY.CURRENCY], receipt: Receipt) => {\n value = value?.toUpperCase() || null\n updateReceiptField(EDITABLE_RECEIPT_KEY.CURRENCY, receipt, { currency: value })\n },\n supportsSuggestions: true,\n filterSuggestions: false,\n getValueSuggestions: (value?: string) => {\n if (!value) return []\n return findMostUsedCurrencies(value).filter((currency) => currency !== null)\n }\n },\n {\n name: EDITABLE_RECEIPT_KEY.ITEM_ROWS,\n type: FIELD_TYPE.ITEM_ROWS,\n isVisible: !isAttachment.value,\n label: '',\n isLoading: loadingFields.value.includes(EDITABLE_RECEIPT_KEY.ITEM_ROWS),\n getValue: ({ itemRows }: Receipt) => itemRows\n },\n {\n name: EDITABLE_RECEIPT_KEY.COMMENT,\n type: FIELD_TYPE.TEXTAREA,\n isVisible: !isPaymentCardStatement.value,\n label: t('comment'),\n isLoading: loadingFields.value.includes(EDITABLE_RECEIPT_KEY.COMMENT),\n getValue: ({ comment }: Receipt) => comment,\n handleOnChange: (value: Receipt[EDITABLE_RECEIPT_KEY.COMMENT], receipt: Receipt) => {\n updateReceiptField(EDITABLE_RECEIPT_KEY.COMMENT, receipt, { comment: value })\n }\n },\n {\n name: EDITABLE_RECEIPT_KEY.BILLING_TYPE,\n type: FIELD_TYPE.SELECT,\n canUnselect: true,\n isVisible: !isAttachment.value,\n label: t('billingType'),\n isLoading: loadingFields.value.includes(EDITABLE_RECEIPT_KEY.BILLING_TYPE),\n isMissing: ({ billingType } = {}) => !billingType,\n getValue: ({ billingType }: Receipt) => (billingType ? billingType : `${t('select')} ${t('billingType')}`),\n handleOnChange: (value: Receipt[EDITABLE_RECEIPT_KEY.BILLING_TYPE], receipt: Receipt) => {\n if (!value) value = null\n updateReceiptField(EDITABLE_RECEIPT_KEY.BILLING_TYPE, receipt, { billingType: value })\n },\n options: [\n { title: t('paidByCompanyFunds'), value: 'company' },\n { title: t('paidPersonally'), value: 'personal' }\n ]\n },\n {\n name: EDITABLE_RECEIPT_KEY.PAID_WITH,\n type: FIELD_TYPE.SELECT,\n isVisible: activeReceipt?.value?.billingType === BILLING_TYPE.COMPANY && !isAttachment.value,\n label: t('paidBy'),\n isLoading: loadingFields.value.includes(EDITABLE_RECEIPT_KEY.PAID_WITH),\n isMissing: ({ paidWith, paymentMethodId } = {}) => !paymentMethodId && !paidWith,\n getValue: ({ paidWith, paymentMethodId }: Receipt) => paymentMethodId || paidWith,\n handleOnChange: (value: Receipt[EDITABLE_RECEIPT_KEY.PAID_WITH], receipt: Receipt) => {\n const payload: any = {}\n if (value && Object.values(PAID_WITH).includes(value)) {\n payload.paidWith = value || null\n payload.paymentMethodId = null\n } else {\n payload.paymentMethodId = value || null\n payload.paidWith = null\n }\n updateReceiptField(EDITABLE_RECEIPT_KEY.PAID_WITH, receipt, payload)\n },\n options: (() => {\n const methodsForUser = paymentMethodsForUser(activeReceipt.value?.userId)\n const defaultMethods = defaultPaymentMethods(methodsForUser).map((method) => {\n return { value: method, title: t(method) }\n })\n const customMethods = methodsForUser.map((method: PaymentMethod) => {\n let methodTitle = t(method.type)\n if (method.type === PAYMENT_TYPE.BANK_ACCOUNT) {\n methodTitle = `${methodTitle} ${method.bankAccountNr || ''}`\n }\n if (method.type === PAYMENT_TYPE.CREDIT_CARD || method.type === PAYMENT_TYPE.DEBIT_CARD) {\n methodTitle = `${methodTitle} ${method.cardLfd || ''}`\n }\n return { title: methodTitle, value: method.id, extraInfo: method.name }\n })\n\n return [...defaultMethods, ...customMethods]\n })()\n },\n {\n name: EDITABLE_RECEIPT_KEY.COST_TYPE,\n type: FIELD_TYPE.COST_TYPE,\n isVisible: !isAttachment.value,\n label: t('costType'),\n isLoading: loadingFields.value.includes(EDITABLE_RECEIPT_KEY.COST_TYPE),\n isMissing: ({ costType } = {}) => !costType,\n getValue: ({ costType, costTypeId }: Receipt) => costTypeId || costType,\n handleOnChange: (value: Receipt[EDITABLE_RECEIPT_KEY.PAID_WITH], receipt: Receipt) => {\n updateReceiptField(EDITABLE_RECEIPT_KEY.PAID_WITH, receipt, {\n ...(!activeCompany?.value?.settings?.usesCustomCostTypes && { costTypeId: null }),\n [activeCompany?.value?.settings?.usesCustomCostTypes ? 'costTypeId' : 'costType']: value\n })\n },\n options: (() => {\n return activeCompany?.value?.settings?.usesCustomCostTypes\n ? xstore.getters[COST_TYPES_STORE_GETTERS.EXPENSE_TYPES]\n : Object.values(COST_TYPE) // used with CostTypeSelect\n })()\n },\n {\n name: EDITABLE_RECEIPT_KEY.DOC_TYPE,\n type: FIELD_TYPE.SELECT,\n isVisible:\n !isCostWithoutDocument.value &&\n !isPaymentCardStatement.value &&\n (!isInExtraFields(EDITABLE_RECEIPT_KEY.DOC_TYPE) ||\n companyExtraFieldsIncludes(EDITABLE_RECEIPT_KEY.DOC_TYPE)),\n isExtraField: isInExtraFields(EDITABLE_RECEIPT_KEY.DOC_TYPE),\n extraFieldLabel: t('addDocType'),\n label: t('docType'),\n isLoading: loadingFields.value.includes(EDITABLE_RECEIPT_KEY.DOC_TYPE),\n getValue: ({ docType }: Receipt) => docType || DOCUMENT_TYPE.RECEIPT,\n handleOnChange: async (value: Receipt[EDITABLE_RECEIPT_KEY.DOC_TYPE], receipt: Receipt) => {\n if (value === DOCUMENT_TYPE.ATTACHMENT) {\n await deleteAllItemRows(activeReceipt.value, activeCompany.value?.id)\n await digitizeReceipt(activeCompany.value, activeReceipt.value)\n } else if (\n activeReceipt.value?.itemRows &&\n activeReceipt.value?.itemRows?.length < 1 &&\n activeCompany.value\n ) {\n await addItemRow(activeCompany.value, activeReceipt.value)\n }\n updateReceiptField(EDITABLE_RECEIPT_KEY.DOC_TYPE, receipt, {\n docType: value\n })\n },\n options: [\n isAttachment.value && activeReceipt.value?.currency === null\n ? {}\n : { title: t('invoice'), value: DOCUMENT_TYPE.INVOICE },\n isAttachment.value && activeReceipt.value?.currency === null\n ? {}\n : { title: t('receipt'), value: DOCUMENT_TYPE.RECEIPT },\n activeReceipt.value?.tripId ? { title: t('nonCostDocument'), value: DOCUMENT_TYPE.ATTACHMENT } : {}\n ],\n enableExtraField: () => {\n addToExtraFields(EDITABLE_RECEIPT_KEY.DOC_TYPE)\n }\n },\n {\n name: EDITABLE_RECEIPT_KEY.IBAN,\n type: FIELD_TYPE.TEXT,\n isHighlighted: (receipt: Receipt) => false,\n isVisible: activeReceipt?.value?.docType === DOCUMENT_TYPE.INVOICE,\n label: t('IBAN'),\n isLoading: loadingFields.value.includes(EDITABLE_RECEIPT_KEY.IBAN),\n getValue: ({ paymentDetails }: Receipt) => paymentDetails?.accounts?.[0]?.number,\n handleOnChange: (value: any, receipt: Receipt) => {\n if (iban.isValid(value)) {\n updateReceiptField(EDITABLE_RECEIPT_KEY.IBAN, receipt, {\n paymentDetails: {\n accounts: [{ number: value }]\n }\n })\n } else {\n root?.$notification('notValidIban', 'error', 6000)\n }\n }\n },\n {\n name: EDITABLE_RECEIPT_KEY.REF_NUM,\n type: FIELD_TYPE.TEXT,\n isHighlighted: (receipt: Receipt) => false,\n isVisible: activeReceipt?.value?.docType === DOCUMENT_TYPE.INVOICE,\n label: t('refNum'),\n isLoading: loadingFields.value.includes(EDITABLE_RECEIPT_KEY.REF_NUM),\n getValue: ({ paymentDetails }: Receipt) => paymentDetails?.refNum,\n handleOnChange: (value: any, receipt: Receipt) => {\n updateReceiptField(EDITABLE_RECEIPT_KEY.REF_NUM, receipt, {\n paymentDetails: {\n refNum: value\n }\n })\n }\n },\n {\n name: EDITABLE_RECEIPT_KEY.ORDER_ID,\n type: FIELD_TYPE.TEXT,\n isHighlighted: (receipt: Receipt) => false,\n isVisible:\n companyExtraFieldsIncludes(EDITABLE_RECEIPT_KEY.ORDER_ID) &&\n activeReceipt.value?.docType === DOCUMENT_TYPE.INVOICE,\n isExtraField: isInExtraFields(EDITABLE_RECEIPT_KEY.ORDER_ID),\n extraFieldLabel: t('showOrderId'),\n label: t('orderId'),\n isLoading: loadingFields.value.includes(EDITABLE_RECEIPT_KEY.ORDER_ID),\n getValue: ({ orderId }: Receipt) => orderId,\n handleOnChange: (value: Receipt[EDITABLE_RECEIPT_KEY.ORDER_ID], receipt: Receipt) => {\n updateReceiptField(EDITABLE_RECEIPT_KEY.ORDER_ID, receipt, { orderId: value || null })\n },\n supportsSuggestions: true,\n filterSuggestions: true,\n getValueSuggestions: ocrWordList(),\n enableExtraField: () => {\n addToExtraFields(EDITABLE_RECEIPT_KEY.ORDER_ID)\n }\n },\n {\n name: EDITABLE_RECEIPT_KEY.DUE_DATE,\n type: FIELD_TYPE.DATE,\n isHighlighted: (receipt: Receipt) => false,\n isVisible: activeReceipt?.value?.docType === DOCUMENT_TYPE.INVOICE,\n label: t('dueDate'),\n isLoading: loadingFields.value.includes(EDITABLE_RECEIPT_KEY.DUE_DATE),\n getValue: ({ paymentDetails }: Receipt) => paymentDetails?.dueDate,\n handleOnChange: (value: any, receipt: Receipt) => {\n updateReceiptField(EDITABLE_RECEIPT_KEY.DUE_DATE, receipt, {\n paymentDetails: {\n dueDate: value\n }\n })\n }\n },\n {\n name: EDITABLE_RECEIPT_KEY.PAID,\n type: FIELD_TYPE.CHECKBOX,\n isHighlighted: (receipt: Receipt) => false,\n isVisible: !isAttachment.value && activeCompany.value?.countryCode === 'LV',\n label: t('paid'),\n isLoading: loadingFields.value.includes(EDITABLE_RECEIPT_KEY.PAID),\n getValue: ({ paymentDetails }: Receipt) => paymentDetails?.paid,\n handleOnChange: (value: any, receipt: Receipt) => {\n updateReceiptField(EDITABLE_RECEIPT_KEY.PAID, receipt, {\n paymentDetails: {\n paid: value\n }\n })\n }\n }\n ]\n return fields\n })\n\n // Extra field definition: field that is not visible by default\n // Here you can add condition, when true, the field is considered as extra field\n // How to add a new extra field:\n // 1) add \"isExtraField\", \"extraFieldLabel\", \"enableExtraField\" props to receiptFields. Check existing usage for examples\n // 2) add a condition (eg. isInExtraFields or companyExtraFieldsIncludes) to \"isVisible\" prop\n const extraReceiptFields: ComputedRef<{ [key in EDITABLE_RECEIPT_KEY]?: boolean }> = computed(() => {\n return {\n [EDITABLE_RECEIPT_KEY.DOC_TYPE]: activeCompany.value?.countryCode == 'PL',\n [EDITABLE_RECEIPT_KEY.ORDER_ID]: true\n }\n })\n\n // Checks if the field is an extra field\n function isInExtraFields(field: EDITABLE_RECEIPT_KEY) {\n return extraReceiptFields.value[field] ?? false\n }\n\n // Checks if the extra field is activated in the company settings\n function companyExtraFieldsIncludes(field: EDITABLE_RECEIPT_KEY) {\n return activeCompany.value?.settings?.cloudViewCustomization?.extraDocumentFields?.includes(field) ?? false\n }\n\n async function addToExtraFields(field: EDITABLE_RECEIPT_KEY) {\n // Make copies in order to not mutate the original arrays\n const extraDocumentFieldsCloud = [\n ...(activeCompany.value?.settings?.cloudViewCustomization?.extraDocumentFields || [])\n ]\n const extraDocumentFieldsApp = [...(activeCompany.value?.settings?.appViewCustomization?.extraDocumentFields || [])]\n\n if (extraDocumentFieldsCloud.includes(field)) {\n // Cloud\n extraDocumentFieldsCloud.splice(extraDocumentFieldsCloud.indexOf(field), 1)\n // App\n if (extraDocumentFieldsApp.includes(field)) {\n extraDocumentFieldsApp.splice(extraDocumentFieldsApp.indexOf(field), 1)\n }\n } else {\n // Cloud\n extraDocumentFieldsCloud.push(field)\n // App\n if (!extraDocumentFieldsApp.includes(field)) {\n extraDocumentFieldsApp.push(field)\n }\n }\n\n const payload: CompanySettings = {\n cloudViewCustomization: { extraDocumentFields: extraDocumentFieldsCloud }\n }\n\n // Dont add doctype to app\n if (field !== EDITABLE_RECEIPT_KEY.DOC_TYPE)\n payload.appViewCustomization = { extraDocumentFields: extraDocumentFieldsApp }\n\n try {\n await updateCompanySettings(payload)\n } catch (error) {\n root?.$notification(root?.eh(error), 'error', 9000)\n }\n }\n\n return {\n isEditBlocked,\n receiptFields\n }\n}\n","import { computed, ComputedRef } from 'vue'\r\nimport { MILEAGE_FIELDS, FIELD_TYPE, ACCOUNTING_OBJECT_TYPE, REFERENCE_OBJECT_TYPE } from '@/enums'\r\nimport { AccountingObject, AccountingRef, MileageItem } from '@/models'\r\nimport {\r\n useContext,\r\n useCompanies,\r\n useAccountingRefs,\r\n useAccountingSettings,\r\n useAccountingFields,\r\n useInstanceHelpers,\r\n useFormatters\r\n} from '@/composables'\r\n\r\nexport default function useMileageFields() {\r\n const { t } = useInstanceHelpers()\r\n const { root } = useContext()\r\n const { activeCompany } = useCompanies()\r\n const { activeAccountingFields, accountingEntriesEnabled } = useAccountingSettings()\r\n const { tripAccountingRefs, updateAccountingRef } = useAccountingRefs()\r\n const { accountingFieldOptions } = useAccountingFields()\r\n const { formatSum, formatInteger, formatDateSlashes } = useFormatters()\r\n\r\n const tripId = computed(() => Number(root?.$route.params.tripId))\r\n const countryCode = computed(() => activeCompany.value?.countryCode || '')\r\n const activeRefs = computed(() => tripAccountingRefs(tripId.value || '') || {})\r\n\r\n const activeMileageRefs: ComputedRef = computed(() => {\r\n return Object.values(activeRefs.value || {}).filter(({ refType }) => {\r\n return refType === REFERENCE_OBJECT_TYPE.TRIP_MILEAGE\r\n })\r\n })\r\n\r\n const mileageAccountingFields = computed(() => {\r\n if (!accountingEntriesEnabled.value) return []\r\n const mileageFields = activeAccountingFields.value?.find(({ target }) => {\r\n return target === REFERENCE_OBJECT_TYPE.TRIP_MILEAGE\r\n })\r\n return mileageFields?.types || []\r\n })\r\n\r\n const accountingFieldVisible = (fieldType: ACCOUNTING_OBJECT_TYPE) => {\r\n if (!accountingEntriesEnabled) return false\r\n const hasActiveRef = Boolean(\r\n activeMileageRefs.value.find(({ accounting }) => {\r\n return accounting?.type === fieldType\r\n })\r\n )\r\n return mileageAccountingFields.value.includes(fieldType) || hasActiveRef\r\n }\r\n\r\n const displayVehicleName = (vehicle: string) => {\r\n if (countryCode.value === 'FI' || countryCode.value === 'EE') {\r\n return t(vehicle)\r\n }\r\n const ownerTranslation = {\r\n private: 'ownedByPerson',\r\n company: 'ownedByCompany'\r\n }\r\n const [owner, type] = vehicle.split(' ')\r\n //@ts-ignore\r\n return `${t(type)} - ${t(ownerTranslation[owner])}`\r\n }\r\n\r\n const mileageFields = computed(() => {\r\n const allFields = [\r\n {\r\n ...accountingFieldOptions.value[ACCOUNTING_OBJECT_TYPE.ITEM_CODE],\r\n type: ACCOUNTING_OBJECT_TYPE.ITEM_CODE,\r\n label: t(ACCOUNTING_OBJECT_TYPE.ITEM_CODE),\r\n inputType: FIELD_TYPE.SELECT,\r\n isVisible: accountingFieldVisible(ACCOUNTING_OBJECT_TYPE.ITEM_CODE),\r\n getValue: ({ id }: MileageItem) => {\r\n return accountingFieldOptions.value[ACCOUNTING_OBJECT_TYPE.ITEM_CODE].getValue(\r\n activeRefs.value,\r\n REFERENCE_OBJECT_TYPE.TRIP_MILEAGE,\r\n id\r\n )\r\n },\r\n handleOnChange: (value: AccountingObject['id'], mileageItem: MileageItem) => {\r\n return updateAccountingRef(value, ACCOUNTING_OBJECT_TYPE.ITEM_CODE, 'tripId', tripId.value, {\r\n refType: REFERENCE_OBJECT_TYPE.TRIP_MILEAGE,\r\n refId: mileageItem?.id\r\n })\r\n }\r\n },\r\n {\r\n type: MILEAGE_FIELDS.VEHICLE,\r\n label: t(MILEAGE_FIELDS.VEHICLE),\r\n inputType: false,\r\n isVisible: true,\r\n getValue: (mileageItem: MileageItem) => displayVehicleName(mileageItem?.info?.vehicle || ''),\r\n handleOnChange: () => {}\r\n },\r\n {\r\n type: MILEAGE_FIELDS.PLATE_NUMBER,\r\n label: t(MILEAGE_FIELDS.PLATE_NUMBER),\r\n inputType: false,\r\n isVisible: ['EE', 'PL'].includes(countryCode.value),\r\n getValue: (mileageItem: MileageItem) => mileageItem?.info?.plateNumber,\r\n handleOnChange: () => {}\r\n },\r\n {\r\n type: MILEAGE_FIELDS.START_ADDRESS,\r\n label: t(MILEAGE_FIELDS.START_ADDRESS),\r\n inputType: false,\r\n isVisible: ['FI', 'PL'].includes(countryCode.value),\r\n getValue: (mileageItem: MileageItem) => mileageItem?.startPointAddress,\r\n handleOnChange: () => {}\r\n },\r\n {\r\n type: MILEAGE_FIELDS.DESTINATION_ADDRESS,\r\n label: t(MILEAGE_FIELDS.DESTINATION_ADDRESS),\r\n inputType: false,\r\n isVisible: ['FI', 'PL'].includes(countryCode.value),\r\n getValue: (mileageItem: MileageItem) => mileageItem?.endPointAddress,\r\n handleOnChange: () => {}\r\n },\r\n {\r\n type: MILEAGE_FIELDS.DISTANCE,\r\n label: t(MILEAGE_FIELDS.DISTANCE),\r\n inputType: false,\r\n isVisible: true,\r\n getValue: (mileageItem: MileageItem) => formatInteger(mileageItem?.distance || 0),\r\n handleOnChange: () => {}\r\n },\r\n {\r\n type: MILEAGE_FIELDS.ROUND_TRIP,\r\n label: t(MILEAGE_FIELDS.ROUND_TRIP),\r\n inputType: FIELD_TYPE.CHECKMARK,\r\n isVisible: countryCode.value === 'FI',\r\n getValue: (mileageItem: MileageItem) => mileageItem?.info?.roundTrip,\r\n handleOnChange: () => {}\r\n },\r\n {\r\n type: MILEAGE_FIELDS.ADDITIONAL_INFO,\r\n label: t(MILEAGE_FIELDS.ADDITIONAL_INFO),\r\n inputType: FIELD_TYPE.LIST,\r\n isVisible: countryCode.value === 'FI',\r\n getValue: (mileageItem: MileageItem) => {\r\n const list = []\r\n if (mileageItem.info.over50hp) {\r\n list.push(t('moreThan50hp'))\r\n }\r\n if (mileageItem.info.withCanteen) {\r\n list.push(`+ ${t('canteenOrEqual')}`)\r\n }\r\n if (mileageItem.info.withCaravan) {\r\n list.push(`+ ${t('caravan')}`)\r\n }\r\n if (mileageItem.info.withDog) {\r\n list.push(`+ ${t('serviceDog')}`)\r\n }\r\n if (mileageItem.info.withHeavyLoad) {\r\n list.push(`+ ${t('machineryOrLoad')}`)\r\n }\r\n if (mileageItem.info.withTrailer) {\r\n list.push(`+ ${t('trailer')}`)\r\n }\r\n if (mileageItem.info.roughRoadDistance) {\r\n list.push(`${t('forrestRoadDistance')}: ${mileageItem.info.roughRoadDistance} km`)\r\n }\r\n if (mileageItem.info.coworkers) {\r\n list.push(`${t('numberOfCoworkers')}: ${mileageItem.info.coworkers}`)\r\n }\r\n return list\r\n },\r\n handleOnChange: () => {}\r\n },\r\n {\r\n type: MILEAGE_FIELDS.DATE,\r\n label: t(MILEAGE_FIELDS.DATE),\r\n inputType: false,\r\n isVisible: true,\r\n getValue: (mileageItem: MileageItem) => formatDateSlashes(mileageItem?.info?.date || ''),\r\n handleOnChange: () => {}\r\n },\r\n {\r\n type: MILEAGE_FIELDS.COMMENT,\r\n label: t(MILEAGE_FIELDS.COMMENT),\r\n inputType: false,\r\n isVisible: true,\r\n getValue: (mileageItem: MileageItem) => mileageItem?.comment,\r\n handleOnChange: () => {}\r\n },\r\n {\r\n type: MILEAGE_FIELDS.SUM,\r\n label: t(MILEAGE_FIELDS.SUM),\r\n inputType: false,\r\n isVisible: true,\r\n getValue: (mileageItem: MileageItem) => formatSum(mileageItem?.sum || 0),\r\n handleOnChange: () => {}\r\n },\r\n {\r\n ...accountingFieldOptions.value[ACCOUNTING_OBJECT_TYPE.VAT_CODE],\r\n type: ACCOUNTING_OBJECT_TYPE.VAT_CODE,\r\n label: t(ACCOUNTING_OBJECT_TYPE.VAT_CODE),\r\n inputType: FIELD_TYPE.SELECT,\r\n isVisible: accountingFieldVisible(ACCOUNTING_OBJECT_TYPE.VAT_CODE),\r\n getValue: ({ id }: MileageItem) => {\r\n return accountingFieldOptions.value[ACCOUNTING_OBJECT_TYPE.VAT_CODE].getValue(\r\n activeRefs.value,\r\n REFERENCE_OBJECT_TYPE.TRIP_MILEAGE,\r\n id\r\n )\r\n },\r\n handleOnChange: (value: AccountingObject['id'], mileageItem: MileageItem) => {\r\n return updateAccountingRef(value, ACCOUNTING_OBJECT_TYPE.VAT_CODE, 'tripId', tripId.value, {\r\n refType: REFERENCE_OBJECT_TYPE.TRIP_MILEAGE,\r\n refId: mileageItem.id\r\n })\r\n }\r\n },\r\n {\r\n ...accountingFieldOptions.value[ACCOUNTING_OBJECT_TYPE.ACCOUNT],\r\n type: ACCOUNTING_OBJECT_TYPE.ACCOUNT,\r\n label: t(ACCOUNTING_OBJECT_TYPE.ACCOUNT),\r\n inputType: FIELD_TYPE.SELECT,\r\n isVisible: accountingFieldVisible(ACCOUNTING_OBJECT_TYPE.ACCOUNT),\r\n getValue: ({ id }: MileageItem) => {\r\n return accountingFieldOptions.value[ACCOUNTING_OBJECT_TYPE.ACCOUNT].getValue(\r\n activeRefs.value,\r\n REFERENCE_OBJECT_TYPE.TRIP_MILEAGE,\r\n id\r\n )\r\n },\r\n handleOnChange: (value: AccountingObject['id'], mileageItem: MileageItem) => {\r\n return updateAccountingRef(value, ACCOUNTING_OBJECT_TYPE.ACCOUNT, 'tripId', tripId.value, {\r\n refType: REFERENCE_OBJECT_TYPE.TRIP_MILEAGE,\r\n refId: mileageItem.id\r\n })\r\n }\r\n },\r\n {\r\n ...accountingFieldOptions.value[ACCOUNTING_OBJECT_TYPE.PROJECT],\r\n type: ACCOUNTING_OBJECT_TYPE.PROJECT,\r\n label: t(ACCOUNTING_OBJECT_TYPE.PROJECT),\r\n inputType: FIELD_TYPE.SELECT,\r\n isVisible: accountingFieldVisible(ACCOUNTING_OBJECT_TYPE.PROJECT),\r\n getValue: ({ id }: MileageItem) => {\r\n return accountingFieldOptions.value[ACCOUNTING_OBJECT_TYPE.PROJECT].getValue(\r\n activeRefs.value,\r\n REFERENCE_OBJECT_TYPE.TRIP_MILEAGE,\r\n id\r\n )\r\n },\r\n handleOnChange: (value: AccountingObject['id'], mileageItem: MileageItem) => {\r\n return updateAccountingRef(value, ACCOUNTING_OBJECT_TYPE.PROJECT, 'tripId', tripId.value, {\r\n refType: REFERENCE_OBJECT_TYPE.TRIP_MILEAGE,\r\n refId: mileageItem.id\r\n })\r\n }\r\n },\r\n {\r\n ...accountingFieldOptions.value[ACCOUNTING_OBJECT_TYPE.DIMENSION],\r\n type: ACCOUNTING_OBJECT_TYPE.DIMENSION,\r\n label: t(ACCOUNTING_OBJECT_TYPE.DIMENSION),\r\n inputType: FIELD_TYPE.SELECT,\r\n isVisible: accountingFieldVisible(ACCOUNTING_OBJECT_TYPE.DIMENSION),\r\n getValue: ({ id }: MileageItem) => {\r\n return accountingFieldOptions.value[ACCOUNTING_OBJECT_TYPE.DIMENSION].getValue(\r\n activeRefs.value,\r\n REFERENCE_OBJECT_TYPE.TRIP_MILEAGE,\r\n id\r\n )\r\n },\r\n handleOnChange: (value: AccountingObject['id'], mileageItem: MileageItem) => {\r\n return updateAccountingRef(value, ACCOUNTING_OBJECT_TYPE.DIMENSION, 'tripId', tripId.value, {\r\n refType: REFERENCE_OBJECT_TYPE.TRIP_MILEAGE,\r\n refId: mileageItem.id\r\n })\r\n }\r\n },\r\n {\r\n ...accountingFieldOptions.value[ACCOUNTING_OBJECT_TYPE.COST_OBJECTIVE],\r\n type: ACCOUNTING_OBJECT_TYPE.COST_OBJECTIVE,\r\n label: t(ACCOUNTING_OBJECT_TYPE.COST_OBJECTIVE),\r\n inputType: FIELD_TYPE.SELECT,\r\n isVisible: accountingFieldVisible(ACCOUNTING_OBJECT_TYPE.COST_OBJECTIVE),\r\n getValue: ({ id }: MileageItem) => {\r\n return accountingFieldOptions.value[ACCOUNTING_OBJECT_TYPE.COST_OBJECTIVE].getValue(\r\n activeRefs.value,\r\n REFERENCE_OBJECT_TYPE.TRIP_MILEAGE,\r\n id\r\n )\r\n },\r\n handleOnChange: (value: AccountingObject['id'], mileageItem: MileageItem) => {\r\n return updateAccountingRef(value, ACCOUNTING_OBJECT_TYPE.COST_OBJECTIVE, 'tripId', tripId.value, {\r\n refType: REFERENCE_OBJECT_TYPE.TRIP_MILEAGE,\r\n refId: mileageItem.id\r\n })\r\n }\r\n },\r\n {\r\n ...accountingFieldOptions.value[ACCOUNTING_OBJECT_TYPE.DEPARTMENT],\r\n type: ACCOUNTING_OBJECT_TYPE.DEPARTMENT,\r\n label: t(ACCOUNTING_OBJECT_TYPE.DEPARTMENT),\r\n inputType: FIELD_TYPE.SELECT,\r\n isVisible: accountingFieldVisible(ACCOUNTING_OBJECT_TYPE.DEPARTMENT),\r\n getValue: ({ id }: MileageItem) => {\r\n return accountingFieldOptions.value[ACCOUNTING_OBJECT_TYPE.DEPARTMENT].getValue(\r\n activeRefs.value,\r\n REFERENCE_OBJECT_TYPE.TRIP_MILEAGE,\r\n id\r\n )\r\n },\r\n handleOnChange: (value: AccountingObject['id'], mileageItem: MileageItem) => {\r\n return updateAccountingRef(value, ACCOUNTING_OBJECT_TYPE.DEPARTMENT, 'tripId', tripId.value, {\r\n refType: REFERENCE_OBJECT_TYPE.TRIP_MILEAGE,\r\n refId: mileageItem.id\r\n })\r\n }\r\n }\r\n ]\r\n return allFields.filter((field) => field.isVisible)\r\n })\r\n\r\n return {\r\n mileageFields\r\n }\r\n}\r\n","import { ref } from 'vue'\r\nimport Axios from 'axios'\r\n\r\nexport default function useUpdateChecker() {\r\n const updateRequired = ref(false)\r\n const latestVersion = ref(null)\r\n\r\n /**\r\n * \r\n * @param interval Update check interval in minutes\r\n */\r\n const initUpdateChecker = (interval: number = 2) => {\r\n setInterval(async () => {\r\n try {\r\n const { data: currentVersion } = await Axios.get(`/x-application-version.info?t=${encodeURIComponent(new Date().toISOString())}`)\r\n\r\n if (!latestVersion.value) {\r\n latestVersion.value = currentVersion\r\n }\r\n\r\n if (latestVersion.value !== currentVersion) {\r\n updateRequired.value = true\r\n }\r\n }\r\n catch(e) {\r\n // possible connection issue, which can happen during rolling update\r\n console.error('ERROR LOADING APP VERSION', e)\r\n }\r\n }, interval * 60 * 1000)\r\n }\r\n\r\n return {\r\n updateRequired,\r\n initUpdateChecker\r\n }\r\n}\r\n","import { ComputedRef, computed } from 'vue'\r\nimport { xstore } from '@/store'\r\nimport { useContext } from '@/composables'\r\nimport { TRANSACTIONS_STORE_ACTIONS, TRANSACTIONS_STORE_GETTERS } from '@/enums'\r\nimport { BankAccountInfo, PaymentTransaction } from '@/models'\r\n\r\nexport default function useTransactions() {\r\n const { root } = useContext()\r\n\r\n const companyId = computed(() => Number(root?.$route.params.companyId))\r\n\r\n const transactionList: ComputedRef = computed(() => {\r\n return Object.values(xstore.getters[TRANSACTIONS_STORE_GETTERS.TRANSACTIONS][companyId.value] || {})\r\n })\r\n\r\n const unmatchedList: ComputedRef = computed(() => {\r\n return transactionList.value.filter((transaction: PaymentTransaction) => {\r\n return !transaction.receiptId\r\n })\r\n })\r\n\r\n const unmatchedCount = computed(() => {\r\n return unmatchedList.value.length\r\n })\r\n\r\n const transactionById = (transactionId: string | number): PaymentTransaction | undefined => {\r\n if (!companyId.value || !transactionId) return\r\n return xstore.getters[TRANSACTIONS_STORE_GETTERS.TRANSACTIONS]?.[companyId.value]?.[transactionId]\r\n }\r\n\r\n const importFromFile = (e: Event) => {\r\n const formData = new FormData()\r\n const target = e.target as HTMLInputElement\r\n const files = target.files\r\n const uploadedFile = files ? files[0] : null\r\n if (uploadedFile) {\r\n formData.append('file', uploadedFile)\r\n }\r\n return xstore.dispatch(TRANSACTIONS_STORE_ACTIONS.IMPORT_TRANSACTIONS_FROM_FILE, {\r\n companyId: companyId.value,\r\n formData\r\n })\r\n }\r\n\r\n const loadTransactions = (): Promise | undefined => {\r\n if (!companyId.value) return\r\n return xstore.dispatch(TRANSACTIONS_STORE_ACTIONS.GET_TRANSACTIONS, {\r\n companyId: companyId.value\r\n })\r\n }\r\n\r\n const autogenerateReports = (): Promise | undefined => {\r\n if (!companyId.value) return\r\n return xstore.dispatch(TRANSACTIONS_STORE_ACTIONS.AUTOGENERATE_REPORTS, {\r\n companyId: companyId.value\r\n })\r\n }\r\n\r\n const updateTransaction = (transactionId: string | number, values: {}): Promise | undefined => {\r\n if (!companyId.value || !transactionId) return\r\n return xstore.dispatch(TRANSACTIONS_STORE_ACTIONS.UPDATE_TRANSACTION, {\r\n companyId: companyId.value,\r\n transactionId,\r\n values\r\n })\r\n }\r\n\r\n const deleteTransaction = (transactionId: string | number): Promise | undefined => {\r\n if (!companyId.value || !transactionId) return\r\n\r\n // TODO: Fix return type or remove explicit type from function\r\n // @ts-ignore\r\n return xstore.dispatch(TRANSACTIONS_STORE_ACTIONS.DELETE_TRANSACTION, {\r\n companyId: companyId.value,\r\n transactionId\r\n })\r\n }\r\n\r\n return {\r\n transactionList,\r\n transactionById,\r\n importFromFile,\r\n loadTransactions,\r\n autogenerateReports,\r\n updateTransaction,\r\n deleteTransaction,\r\n unmatchedCount\r\n }\r\n}\r\n","import { computed } from 'vue'\r\nimport xstore from '@/store'\r\nimport { SETTING_STORE_GETTERS, SETTING_STORE_ACTIONS } from '@/enums'\r\n\r\nexport default function useLoadingState() {\r\n const isDataLoading = computed(() => {\r\n return xstore.getters[SETTING_STORE_GETTERS.IS_LOADING]\r\n })\r\n\r\n const setLoadingState = (isLoading: Boolean) => {\r\n return xstore.dispatch(SETTING_STORE_ACTIONS.UPDATE_LOADING_STATE, isLoading)\r\n }\r\n\r\n return {\r\n isDataLoading,\r\n setLoadingState\r\n }\r\n}\r\n","import { computed, watch } from 'vue'\r\nimport { xstore } from '@/store'\r\nimport {\r\n CONFIG_STORE_GETTERS,\r\n COMPANIES_STORE_GETTERS,\r\n INTEGRATIONS_STORE_ACTIONS,\r\n INTEGRATIONS_STORE_GETTERS,\r\n INTEGRATION\r\n} from '@/enums'\r\nimport { Companies, Company, ServiceActivation, Integration } from '@/models'\r\nimport { useContext, useParamsContext, useInstanceHelpers, useAccountingSettings } from '@/composables'\r\nimport integrationTitle from '@/lib/integrationTitle'\r\n\r\nexport default function useIntegrations() {\r\n const { store } = useContext()\r\n const paramsContext = useParamsContext()\r\n\r\n const { t } = useInstanceHelpers()\r\n\r\n const { loadAccountingObjects } = useAccountingSettings()\r\n\r\n const companyId = computed(() => paramsContext.value?.companyId)\r\n\r\n const companies = computed(() => {\r\n return xstore.getters[COMPANIES_STORE_GETTERS.COMPANIES] || {}\r\n })\r\n\r\n const activeCompany = computed(() => {\r\n return companies.value?.[companyId?.value || 0]\r\n })\r\n\r\n const activeIntegration = computed(() => {\r\n return xstore.getters[INTEGRATIONS_STORE_GETTERS.ACTIVE_INTEGRATION] || {}\r\n })\r\n\r\n const serviceActivation = computed(() => {\r\n return xstore.getters[INTEGRATIONS_STORE_GETTERS.SERVICE_ACTIVATION] || {}\r\n })\r\n\r\n const isEmailAllowed = (enteredEmail: string): Boolean => {\r\n let { mailDomain } = xstore.getters[CONFIG_STORE_GETTERS.CONFIG]\r\n if (enteredEmail.includes(mailDomain)) {\r\n return false\r\n }\r\n return true\r\n }\r\n\r\n const getActiveIntegration = async (companyId: any) => {\r\n if (!companyId) return\r\n return await store.dispatch(INTEGRATIONS_STORE_ACTIONS.GET_ACTIVE_INTEGRATION, companyId)\r\n }\r\n\r\n const checkServiceActivationState = async (companyId: any) => {\r\n if (!companyId) return\r\n return await store.dispatch(INTEGRATIONS_STORE_ACTIONS.CHECK_SERVICE_ACTIVATION_STATE, companyId)\r\n }\r\n\r\n const serviceActivationWarning = computed(() => {\r\n if (!activeCompany.value?.companyRoles?.length) return ''\r\n if (serviceActivation.value?.state !== 'pending') return ''\r\n const partnerId = serviceActivation.value?.partnerId || ''\r\n let integrationName = ''\r\n if (partnerId) {\r\n integrationName = integrationTitle({ id: partnerId }, activeCompany.value?.countryCode)\r\n }\r\n return t('integrationNotActive').replace('$software', integrationName)\r\n })\r\n\r\n const confirmServiceActivation = (companyId: any, code: any, accepted: Boolean) => {\r\n if (!companyId || !code) return\r\n return store.dispatch(INTEGRATIONS_STORE_ACTIONS.CONFIRM_SERVICE_ACTIVATION, { companyId, code, accepted })\r\n }\r\n\r\n const isExtRefIntegration = computed(() => {\r\n const integrationIds: INTEGRATION[] = [\r\n INTEGRATION.STANDARDBOOKS,\r\n INTEGRATION.ONE_S,\r\n INTEGRATION.ODOO,\r\n INTEGRATION.JUMIS_PRO,\r\n INTEGRATION.JUMIS_START\r\n ]\r\n return integrationIds.includes(activeIntegration.value?.id as INTEGRATION)\r\n })\r\n\r\n const allowModifyingFwdMode = computed(() => {\r\n const integrationIds: INTEGRATION[] = [\r\n INTEGRATION.CUSTOM,\r\n INTEGRATION.ASTERI,\r\n INTEGRATION.BRIOX,\r\n INTEGRATION.DIRECTO,\r\n INTEGRATION.E_ARVELDAJA,\r\n INTEGRATION.EMAIL,\r\n INTEGRATION.ERPLYBOOKS,\r\n INTEGRATION.EMCE_XML,\r\n INTEGRATION.FITEK,\r\n INTEGRATION.FIKS,\r\n INTEGRATION.INTAXO,\r\n INTEGRATION.MERIT,\r\n INTEGRATION.MONEO,\r\n INTEGRATION.MSBC,\r\n INTEGRATION.ODOO,\r\n INTEGRATION.ONE_S,\r\n INTEGRATION.SAF,\r\n INTEGRATION.SIMPLBOOKS,\r\n INTEGRATION.SMARTACCOUNTS,\r\n INTEGRATION.STANDARDBOOKS,\r\n INTEGRATION.TELEMA,\r\n INTEGRATION.JUMIS_PRO,\r\n INTEGRATION.VALIDIUS,\r\n INTEGRATION.VISMA_FIVALDI,\r\n INTEGRATION.VISMA_HORIZON,\r\n INTEGRATION.VISMA_NETVISOR,\r\n INTEGRATION.HANSAWORLD\r\n ]\r\n return integrationIds.includes(activeIntegration.value?.id)\r\n })\r\n\r\n const allowOnlyReports = computed(() => {\r\n const integrationIds: INTEGRATION[] = [\r\n INTEGRATION.COMARCH_OPTIMA,\r\n INTEGRATION.JUMIS_START,\r\n INTEGRATION.MONEO,\r\n INTEGRATION.VISMA_FIVALDI_CSV,\r\n INTEGRATION.ZALKTIS,\r\n ]\r\n return integrationIds.includes(activeIntegration.value?.id)\r\n })\r\n \r\n const canEnableAutoaccounting = computed(() => {\r\n return (\r\n activeIntegration.value?.id &&\r\n [\r\n INTEGRATION.MERIT,\r\n //INTEGRATION.DIRECTO,\r\n INTEGRATION.FENNOA,\r\n INTEGRATION.JUMIS_PRO,\r\n INTEGRATION.VISMA_FIVALDI,\r\n INTEGRATION.VISMA_HORIZON,\r\n INTEGRATION.VISMA_NETVISOR,\r\n INTEGRATION.BRIOX,\r\n INTEGRATION.SIMPLBOOKS\r\n ].includes(activeIntegration.value.id)\r\n )\r\n })\r\n\r\n watch(\r\n () => companyId.value,\r\n async (id, oldId) => {\r\n if (id !== undefined && id !== oldId) {\r\n const integration = await getActiveIntegration(id)\r\n if (integration?.configuration?.accountingEntriesEnabled) {\r\n loadAccountingObjects()\r\n }\r\n }\r\n }\r\n )\r\n\r\n return {\r\n activeIntegration,\r\n allowModifyingFwdMode,\r\n allowOnlyReports,\r\n canEnableAutoaccounting,\r\n isExtRefIntegration,\r\n serviceActivationWarning,\r\n serviceActivation,\r\n checkServiceActivationState,\r\n confirmServiceActivation,\r\n isEmailAllowed,\r\n getActiveIntegration\r\n }\r\n}\r\n","import { computed } from 'vue'\r\nimport moment from 'moment'\r\nimport { useDateFilters } from '@/composables'\r\nimport { SETTING_STORE_GETTERS, SETTING_STORE_ACTIONS, DATE_FILTER_SELECTIONS, NAVIGATION_TAB } from '@/enums'\r\n\r\nimport { xstore } from '@/store'\r\nimport { ActiveDates } from '@/models'\r\n\r\nexport default function useActiveDates() {\r\n const { selectableDates } = useDateFilters()\r\n\r\n const activeDates = computed(() => {\r\n return xstore.getters[SETTING_STORE_GETTERS.ACTIVE_DATES]\r\n })\r\n\r\n const selectReceiptsBy = computed(() => {\r\n return xstore.getters[SETTING_STORE_GETTERS.SELECT_RECEIPTS_BY]\r\n })\r\n\r\n const selectTripsBy = computed(() => {\r\n return xstore.getters[SETTING_STORE_GETTERS.SELECT_TRIPS_BY]\r\n })\r\n\r\n const setActiveDates = (dates: ActiveDates) => {\r\n xstore.dispatch(SETTING_STORE_ACTIONS.UPDATE_ACTIVE_DATES, dates)\r\n\r\n if (dates?.target) {\r\n savePresetPereference(dates.target)\r\n }\r\n }\r\n\r\n const savePresetPereference = (preset: string) => {\r\n if (preset == DATE_FILTER_SELECTIONS.CUSTOM) {\r\n sessionStorage.setItem('startDate', activeDates.value.startDate)\r\n sessionStorage.setItem('endDate', activeDates.value.endDate)\r\n } else {\r\n localStorage.setItem('dateRangePreference', preset)\r\n sessionStorage.removeItem('startDate')\r\n sessionStorage.removeItem('endDate')\r\n }\r\n }\r\n\r\n const selectPresetDates = () => {\r\n const sessionStartDate = sessionStorage.getItem('startDate')\r\n const sessionEndDate = sessionStorage.getItem('endDate')\r\n if (sessionStartDate && sessionEndDate) {\r\n return {\r\n startDate: sessionStartDate,\r\n endDate: sessionEndDate\r\n }\r\n }\r\n\r\n const dateRangePreference = localStorage.getItem('dateRangePreference')\r\n if (dateRangePreference) {\r\n // @ts-ignore\r\n const preset = selectableDates[dateRangePreference]\r\n return {\r\n startDate: moment(preset.selectedDates.start).format('YYYY-MM-DD'),\r\n endDate: moment(preset.selectedDates.end).format('YYYY-MM-DD')\r\n }\r\n }\r\n\r\n return {\r\n startDate: moment().subtract(1, 'months').startOf('month').format('YYYY-MM-DD'),\r\n endDate: moment().format('YYYY-MM-DD')\r\n }\r\n }\r\n\r\n const setDateSelectCriteria = (criteria: string, documentType: string) => {\r\n if (documentType === NAVIGATION_TAB.RECEIPTS) {\r\n xstore.dispatch(SETTING_STORE_ACTIONS.UPDATE_SELECT_RECEIPTS_BY, criteria)\r\n localStorage.setItem('selectReceiptsBy', criteria)\r\n }\r\n if (documentType === NAVIGATION_TAB.REPORTS) {\r\n xstore.dispatch(SETTING_STORE_ACTIONS.UPDATE_SELECT_TRIPS_BY, criteria)\r\n localStorage.setItem('selectTripsBy', criteria)\r\n }\r\n }\r\n\r\n return {\r\n activeDates,\r\n selectReceiptsBy,\r\n selectTripsBy,\r\n setActiveDates,\r\n setDateSelectCriteria,\r\n selectPresetDates\r\n }\r\n}\r\n","import { computed } from 'vue'\r\nimport { RECEIPTS_STORE_ACTIONS, RECEIPTS_STORE_GETTERS } from '@/enums'\r\nimport { Receipt } from '@/models'\r\nimport xstore from '@/store'\r\nimport { useContext } from '@/composables'\r\n\r\nexport default function useDuplicates() {\r\n const { root } = useContext()\r\n\r\n const receiptId = computed(() => Number(root?.$route.params.receiptId))\r\n\r\n const loadDuplicates = async (companyId: any, receiptId: any): Promise => {\r\n return await xstore.dispatch(RECEIPTS_STORE_ACTIONS.GET_RECEIPT_DUPLICATES, {\r\n companyId,\r\n receiptId\r\n })\r\n }\r\n\r\n const activeReceiptDuplicates = computed(() => {\r\n return xstore.getters[RECEIPTS_STORE_GETTERS.RECEIPT_DUPLICATES](receiptId.value) || []\r\n })\r\n\r\n const duplicatesByReceiptId = (receiptId: number) => {\r\n return xstore.getters[RECEIPTS_STORE_GETTERS.RECEIPT_DUPLICATES](receiptId) || []\r\n }\r\n\r\n const markAsNonDuplicate = (companyId: any, receiptId: any) => {\r\n return xstore.dispatch(RECEIPTS_STORE_ACTIONS.MARK_AS_NON_DUPLICATE, {\r\n companyId,\r\n receiptId\r\n })\r\n }\r\n\r\n return {\r\n activeReceiptDuplicates,\r\n duplicatesByReceiptId,\r\n loadDuplicates,\r\n markAsNonDuplicate\r\n }\r\n}\r\n","import { computed, reactive, ref } from 'vue'\r\nimport Axios from 'axios'\r\nimport { xstore } from '@/store'\r\nimport { validateStatus } from '@/lib/status'\r\nimport {\r\n useContext,\r\n useUser,\r\n useExpenseFlow,\r\n useCompanies,\r\n useReceipts,\r\n useLoadingState,\r\n useHelpers,\r\n useInstanceHelpers,\r\n useTrips,\r\n useCardReconciliation\r\n} from '@/composables'\r\nimport {\r\n RECEIPTS_STORE_ACTIONS,\r\n RECEIPTS_STORE_MUTATIONS,\r\n RECEIPT_STATUS,\r\n TRIP_TYPE,\r\n PRICING_PLAN,\r\n BILLING_TYPE,\r\n DOCUMENT_TYPE\r\n} from '@/enums'\r\nimport { Receipt } from '@/models'\r\n\r\nexport default function useFileUpload() {\r\n const { root } = useContext()\r\n const { digitizeReceipt, submitReceipt } = useExpenseFlow()\r\n const { activeUser } = useUser()\r\n const { activeCompany } = useCompanies()\r\n const { activeTrip } = useTrips()\r\n const { activeTripStatement } = useCardReconciliation()\r\n const { receiptById } = useReceipts()\r\n const { setLoadingState } = useLoadingState()\r\n const { findFileExtension } = useHelpers()\r\n const { t } = useInstanceHelpers()\r\n\r\n const addedReceiptCount = ref(0)\r\n\r\n const tripId = computed(() => root?.$route.params.tripId)\r\n const companyId = computed(() => root.$route.params.companyId?.toString())\r\n\r\n const receiptsThisMonthCount = computed(() => {\r\n return (Number(activeCompany.value?.receiptsThisMonthCount) || 0) + addedReceiptCount.value\r\n })\r\n\r\n const monthlyLimitExceeded = computed(() => {\r\n return receiptsThisMonthCount.value > 4 && activeCompany.value?.planId === PRICING_PLAN.FREE_DEMO\r\n })\r\n\r\n const files: any = reactive({\r\n list: {},\r\n createdReceipts: []\r\n })\r\n\r\n const supportedFileFormats = [\r\n 'application/pdf',\r\n 'image/jpeg',\r\n 'image/png',\r\n 'image/bmp',\r\n 'image/tiff',\r\n 'image/heif',\r\n 'image/heic',\r\n 'image/heic-sequence',\r\n 'image/webp',\r\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\r\n ]\r\n\r\n const checkDocumentLimit = async () => {\r\n if (activeCompany.value?.planId !== PRICING_PLAN.FREE_DEMO) return false\r\n\r\n if (monthlyLimitExceeded.value) return true\r\n\r\n if (receiptsThisMonthCount.value > 4) return true\r\n }\r\n\r\n const addFiles = async (filesInput: any, digitize: boolean, uploadType = '') => {\r\n const fileList = [...filesInput]\r\n const keys = Object.keys(files.list)\r\n\r\n // Take previous biggest tempIndex to assign next ones\r\n let nextTempId = Number(keys[keys.length - 1] || 0) + 1\r\n\r\n if (fileList.length) {\r\n fileList.forEach((file, index) => {\r\n const fileInfo: any = {}\r\n fileInfo.imgPreviewUrl = URL.createObjectURL(file)\r\n fileInfo.tempId = nextTempId\r\n fileInfo.name = file.name\r\n fileInfo.extension = findFileExtension(file.name)\r\n if (!supportedFileFormats.includes(file.type)) {\r\n fileInfo.isNotSupported = true\r\n }\r\n\r\n fileInfo.uploadPercentage = 0\r\n files.list[nextTempId] = fileInfo\r\n fileList[index].tempId = nextTempId\r\n\r\n nextTempId += 1\r\n })\r\n\r\n for (const file of fileList) {\r\n const fileInfo = files.list[file.tempId]\r\n if (!fileInfo.isNotSupported) {\r\n await addNewReceipt(file, fileInfo, uploadType, digitize)\r\n }\r\n }\r\n }\r\n return true\r\n }\r\n\r\n const updateUploadProgress = (fileTempId: number, uploadProgressPercentage: number) => {\r\n files.list[fileTempId].uploadPercentage = uploadProgressPercentage\r\n }\r\n\r\n const createReceipt = async (initialPayload = {}) => {\r\n try {\r\n let newReceiptPayload: any = {\r\n tripId: Number(tripId.value) || null\r\n }\r\n\r\n if (activeTrip.value?.subtype === TRIP_TYPE.CREDIT_CARD || activeTrip.value?.subtype === TRIP_TYPE.DEBIT_CARD) {\r\n newReceiptPayload.billingType = BILLING_TYPE.COMPANY\r\n newReceiptPayload.paymentMethodId =\r\n activeTrip.value?.paymentCard?.id ||\r\n activeTripStatement.value?.paymentMethodId ||\r\n activeTrip.value?.extraData?.paymentMethodId // THIS HAS BEEN DEPRECATED, HERE FOR BACKWARDS COMPAT\r\n }\r\n\r\n if (activeTrip.value?.userId && activeUser.value?.id !== activeTrip.value?.userId) {\r\n newReceiptPayload.userId = activeTrip.value.userId\r\n }\r\n\r\n if (initialPayload) {\r\n Object.assign(newReceiptPayload, initialPayload)\r\n }\r\n\r\n const receipt = await xstore.dispatch(RECEIPTS_STORE_ACTIONS.CREATE_RECEIPT, {\r\n companyId: companyId.value,\r\n values: newReceiptPayload\r\n })\r\n return receipt\r\n } catch (error) {\r\n console.log('ERROR CREATING RECEIPT', error)\r\n throw error\r\n }\r\n }\r\n\r\n const uploadReceipt = async (receipt: Receipt, fileToUpload: any) => {\r\n try {\r\n const formData = new FormData()\r\n formData.append('file', fileToUpload)\r\n const uploadUrl = `@coreapi/companies/${companyId.value}/receipts/${receipt.id}/attachments`\r\n const fileUploaded = await Axios.post(uploadUrl, formData)\r\n xstore.commit(RECEIPTS_STORE_MUTATIONS.SET_RECEIPTS, [{ ...receipt, status: 1 }])\r\n return fileUploaded\r\n } catch (error) {\r\n console.log('ERROR UPLOADING FILE', error)\r\n throw error\r\n }\r\n }\r\n\r\n const receiveOcr = async (receipt: Receipt) => {\r\n let timeout = activeCompany.value?.dPreferences?.itemRowsDigitization ? 39000 : 19000\r\n try {\r\n const ocrData = await xstore.dispatch(RECEIPTS_STORE_ACTIONS.GET_OCR, {\r\n companyId: companyId.value,\r\n receipt,\r\n timeout\r\n })\r\n\r\n return ocrData\r\n } catch (error) {\r\n // IF FAILED FOR THE FIRST TIME TRY AGAIN\r\n timeout = 100000\r\n try {\r\n const ocrData = await xstore.dispatch(RECEIPTS_STORE_ACTIONS.GET_OCR, {\r\n companyId: companyId.value,\r\n receipt,\r\n timeout\r\n })\r\n return ocrData\r\n } catch (error) {\r\n console.log('ERROR RECEIVING OCR', error)\r\n throw error\r\n }\r\n }\r\n }\r\n\r\n const addNewReceipt = async (fileToUpload: any, fileInfo: any, uploadType: string, digitize = false) => {\r\n try {\r\n const limitExceeded = await checkDocumentLimit()\r\n if (limitExceeded) {\r\n updateUploadProgress(fileInfo.tempId, -1)\r\n return\r\n }\r\n\r\n const initialPayload: any = {}\r\n if (uploadType === 'attachment') {\r\n initialPayload.docType = DOCUMENT_TYPE.ATTACHMENT\r\n }\r\n\r\n const receiptCreated = await createReceipt(initialPayload)\r\n updateUploadProgress(fileInfo.tempId, 10)\r\n\r\n const fileUploaded = await uploadReceipt(receiptCreated, fileToUpload)\r\n updateUploadProgress(fileInfo.tempId, 80)\r\n\r\n files.createdReceipts.push(receiptCreated.id)\r\n files.list[fileInfo.tempId].receiptId = receiptCreated.id\r\n\r\n addedReceiptCount.value += 1\r\n\r\n if (uploadType !== 'attachment') {\r\n const ocrReceived = await receiveOcr(receiptCreated)\r\n }\r\n\r\n // SHOULD BE USED ONLY IN CLOUD FOR PREVENTING AUTOMATED ACCOUNTING \r\n // OVERRIDING ACCOUNTING REFS MANUALLY ENTERED BY USER\r\n if (digitize && activeCompany.value?.digitization !== true) {\r\n await digitizeReceipt(activeCompany.value, receiptCreated)\r\n }\r\n\r\n updateUploadProgress(fileInfo.tempId, 100)\r\n\r\n return true\r\n } catch (error: any) {\r\n updateUploadProgress(fileInfo.tempId, -1)\r\n if (error.response?.data?.message) {\r\n fileInfo.errored = true\r\n files.list[fileInfo.tempId].errorMessage = error.response.data.message\r\n }\r\n }\r\n }\r\n\r\n const addCarRegCard = async (event: any, payload: any) => {\r\n try {\r\n const cardFile = event.target.files[0]\r\n const receiptCreated = await createReceipt(payload)\r\n await uploadReceipt(receiptCreated, cardFile)\r\n } catch (error) {\r\n throw error\r\n }\r\n }\r\n\r\n const removeFromList = (fileReceiptId: number | undefined, index: number | undefined) => {\r\n if (!fileReceiptId || index === undefined) return\r\n delete files.list[index]\r\n files.createdReceipts = files.createdReceipts.filter((receiptId: number) => receiptId !== fileReceiptId)\r\n }\r\n\r\n const submitUploadedReceipts = async () => {\r\n setLoadingState(true)\r\n\r\n for (const receiptId of files.createdReceipts) {\r\n try {\r\n if (!isUploadedDocSubmitted(receiptId)) {\r\n const createdReceipt = receiptById(receiptId)\r\n if (createdReceipt.id && activeCompany.value?.id) {\r\n await submitReceipt(activeCompany.value, createdReceipt)\r\n }\r\n }\r\n const submittedFile: any = Object.values(files.list).find((file: any) => file.receiptId === receiptId)\r\n if (submittedFile.tempId !== undefined) {\r\n files.list[submittedFile.tempId].submitted = true\r\n }\r\n } catch (error) {\r\n const erroredFile: any = Object.values(files.list).find((file: any) => file.receiptId === receiptId)\r\n if (erroredFile?.tempId !== undefined) {\r\n files.list[erroredFile.tempId].errored = true\r\n files.list[erroredFile.tempId].errorMessage = `${t('unsubmitted')}: ${t(root?.eh(error))}`\r\n }\r\n console.log('ERROR SUBMITTING ADDED DOCS', error)\r\n }\r\n }\r\n\r\n setLoadingState(false)\r\n return files.createdReceipts\r\n }\r\n\r\n const isUploadedDocSubmitted = (receiptId: number | string | undefined): Boolean => {\r\n if (!receiptId) return false\r\n const createdReceipt = receiptById(receiptId)\r\n return Boolean(createdReceipt.status && validateStatus(createdReceipt.status, [RECEIPT_STATUS.SUBMITTED]))\r\n }\r\n\r\n return {\r\n files,\r\n monthlyLimitExceeded,\r\n addFiles,\r\n addNewReceipt,\r\n addCarRegCard,\r\n checkDocumentLimit,\r\n isUploadedDocSubmitted,\r\n receiveOcr,\r\n removeFromList,\r\n submitUploadedReceipts,\r\n }\r\n}\r\n","import { computed } from 'vue'\r\nimport { capitalize } from 'lodash-es'\r\nimport { xstore } from '@/store'\r\nimport { COST_TYPES_STORE_GETTERS, COST_TYPES_STORE_ACTIONS } from '@/enums'\r\nimport { Receipt, ExpenseType } from '@/models'\r\n\r\nexport default function useCostTypes() {\r\n const customCostTypes = computed(() => {\r\n return xstore.getters[COST_TYPES_STORE_GETTERS.EXPENSE_TYPES]\r\n })\r\n\r\n const loadExpenseTypes = (companyId: string | number) => {\r\n // TODO: Fix types\r\n // @ts-ignore\r\n return xstore.dispatch(COST_TYPES_STORE_ACTIONS.GET_EXPENSE_TYPES, companyId)\r\n }\r\n\r\n const costTypeById = (costTypeId: number | null): ExpenseType | undefined => {\r\n if (!costTypeId) return\r\n return xstore.getters[COST_TYPES_STORE_GETTERS.EXPENSE_TYPE_BY_ID](costTypeId)\r\n }\r\n\r\n const expenseTypeName = (expenseType: ExpenseType | undefined, language: string) => {\r\n if (expenseType?.translations && Object.values(expenseType?.translations).includes(expenseType?.name)) {\r\n return capitalize(expenseType.translations[language])\r\n }\r\n\r\n return expenseType?.name || ''\r\n }\r\n\r\n const setCostTypeName = (receipt: Receipt, language: string): string => {\r\n if (!receipt?.costType && !receipt?.costTypeId) return ''\r\n\r\n if (receipt.costType) return receipt.costType\r\n\r\n if (receipt.costTypeId) {\r\n const costType = costTypeById(receipt.costTypeId)\r\n return expenseTypeName(costType, language)\r\n }\r\n return ''\r\n }\r\n\r\n const createExpenseType = (companyId: string | number, expenseType: ExpenseType) => {\r\n return xstore.dispatch(COST_TYPES_STORE_ACTIONS.CREATE_EXPENSE_TYPE, {\r\n companyId,\r\n expenseType\r\n })\r\n }\r\n\r\n const updateExpenseType = (companyId: string | number, expenseTypeId: string | number, expenseType: ExpenseType) => {\r\n return xstore.dispatch(COST_TYPES_STORE_ACTIONS.UPDATE_EXPENSE_TYPE, {\r\n companyId,\r\n expenseTypeId,\r\n expenseType\r\n })\r\n }\r\n\r\n function deleteExpenseType(companyId: string | number, expenseTypeId: string | number) {\r\n return xstore.dispatch(COST_TYPES_STORE_ACTIONS.DELETE_EXPENSE_TYPE, {\r\n companyId,\r\n expenseTypeId\r\n })\r\n }\r\n\r\n return {\r\n customCostTypes,\r\n costTypeById,\r\n expenseTypeName,\r\n setCostTypeName,\r\n loadExpenseTypes,\r\n createExpenseType,\r\n updateExpenseType,\r\n deleteExpenseType\r\n }\r\n}\r\n","import { ComputedRef, computed } from 'vue'\r\nimport xstore from '@/store'\r\nimport { APPROVALS_STORE_ACTIONS, APPROVALS_STORE_GETTERS, APPROVAL_STATE } from '@/enums'\r\nimport { useContext, useTrips, useReceipts } from '@/composables'\r\nimport { ApprovalItem, Approvals } from '@/models'\r\n\r\nexport default function useApprovals() {\r\n const { root } = useContext()\r\n const { loadTrip } = useTrips()\r\n const { loadReceipt } = useReceipts()\r\n\r\n const companyId = computed(() => Number(root?.$route.params.companyId))\r\n const receiptId = computed(() => root?.$route.params.receiptId)\r\n const tripId = computed(() => root?.$route.params.tripId)\r\n\r\n const allApprovals: ComputedRef = computed(() => {\r\n if (!companyId.value) return {}\r\n return xstore.getters[APPROVALS_STORE_GETTERS.APPROVALS][companyId.value] || {}\r\n })\r\n\r\n const activeTripApproval: ComputedRef = computed(() => {\r\n if (!allApprovals.value) return\r\n return Object.values(allApprovals.value).find((approval) => Number(approval.tripId) == Number(tripId.value))\r\n })\r\n\r\n const activeReceiptApproval: ComputedRef = computed(() => {\r\n if (!allApprovals.value) return\r\n return Object.values(allApprovals.value).find((approval) => Number(approval.receiptId) == Number(receiptId.value))\r\n })\r\n\r\n const companyApproverOptions = computed(() => {\r\n return xstore.getters[APPROVALS_STORE_GETTERS.APPROVER_OPTIONS](companyId.value) || []\r\n })\r\n\r\n const pendingApprovals: ComputedRef = computed(() => {\r\n return Object.values(allApprovals.value).filter((approval) => {\r\n return approval.state === APPROVAL_STATE.PENDING\r\n })\r\n })\r\n\r\n const archivedApprovals: ComputedRef = computed(() => {\r\n return Object.values(allApprovals.value).filter((approval) => {\r\n return approval.state !== APPROVAL_STATE.PENDING\r\n })\r\n })\r\n\r\n const userActiveDecisions = (userId: string | number | undefined): ApprovalItem[] => {\r\n if (!userId) return []\r\n return Object.values(allApprovals.value).filter((approval) => {\r\n return approval.decisions?.find((decision: any) => {\r\n return decision.approvingUserId === Number(userId) && decision.state === APPROVAL_STATE.PENDING\r\n })\r\n })\r\n }\r\n\r\n const loadApprovals = (isAdmin: boolean, statuses: APPROVAL_STATE[] = []) => {\r\n if (!companyId.value) return\r\n return xstore.dispatch(APPROVALS_STORE_ACTIONS.GET_ALL_APPROVALS, {\r\n companyId: companyId.value,\r\n isAdmin,\r\n statuses\r\n })\r\n }\r\n\r\n const loadApproval = (approvalId: string | number) => {\r\n if (!companyId.value) return\r\n return xstore.dispatch(APPROVALS_STORE_ACTIONS.GET_APPROVAL, {\r\n companyId: companyId.value,\r\n approvalId\r\n })\r\n }\r\n\r\n const loadTripApproval = () => {\r\n if (!companyId.value || !tripId.value) return\r\n return xstore.dispatch(APPROVALS_STORE_ACTIONS.GET_TRIP_APPROVAL, {\r\n companyId: companyId.value,\r\n tripId: tripId.value\r\n })\r\n }\r\n\r\n const loadReceiptApproval = () => {\r\n if (!companyId.value || !receiptId.value) return\r\n return xstore.dispatch(APPROVALS_STORE_ACTIONS.GET_RECEIPT_APPROVAL, {\r\n companyId: companyId.value,\r\n receiptId: receiptId.value\r\n })\r\n }\r\n\r\n const deleteApproval = (approvalId: any) => {\r\n if (!companyId.value || !approvalId) return\r\n return xstore.dispatch(APPROVALS_STORE_ACTIONS.DELETE_APPROVAL, {\r\n companyId: companyId.value,\r\n approvalId\r\n })\r\n }\r\n\r\n const loadApproverOptions = async () => {\r\n if (companyApproverOptions.value && companyApproverOptions.value.length) return\r\n return xstore.dispatch(APPROVALS_STORE_ACTIONS.GET_APPROVER_OPTIONS, {\r\n companyId: companyId.value\r\n })\r\n }\r\n\r\n const approve = (approvalId: string | number, decisionId: string | number, reason = '') => {\r\n return xstore.dispatch(APPROVALS_STORE_ACTIONS.APPROVE, {\r\n companyId: companyId.value,\r\n approvalId,\r\n decisionId,\r\n reason\r\n })\r\n }\r\n\r\n const reject = (approvalId: string | number, decisionId: string | number, reason: string) => {\r\n const payloadData = { reason }\r\n return xstore.dispatch(APPROVALS_STORE_ACTIONS.REJECT, {\r\n companyId: companyId.value,\r\n approvalId,\r\n decisionId,\r\n payloadData\r\n })\r\n }\r\n\r\n const delegate = (\r\n approvalId: string | number,\r\n decisionId: string | number,\r\n delegateUserId: string | number,\r\n reason: string\r\n ) => {\r\n const payloadData = {\r\n reason,\r\n delegateUserId\r\n }\r\n return xstore.dispatch(APPROVALS_STORE_ACTIONS.DELEGATE, {\r\n companyId: companyId.value,\r\n approvalId,\r\n decisionId,\r\n payloadData\r\n })\r\n }\r\n\r\n const removeApprover = async (approvalId: string | number, decisionId: string | number) => {\r\n try {\r\n await xstore.dispatch(APPROVALS_STORE_ACTIONS.DELETE_DECISION, {\r\n companyId: companyId.value,\r\n approvalId,\r\n decisionId\r\n })\r\n root?.$notification('deleted', 'success', 4000)\r\n } catch (error) {\r\n root?.$notification(root?.eh(error), 'error', 9000)\r\n }\r\n }\r\n\r\n const addDecision = (approvalId: string | number, payloadData: any) => {\r\n return xstore.dispatch(APPROVALS_STORE_ACTIONS.ADD_DECISION, {\r\n companyId: companyId.value,\r\n approvalId,\r\n payloadData\r\n })\r\n }\r\n\r\n const appendApprover = (approvalId: string | number, decisionId: string | number, payloadData: any) => {\r\n return xstore.dispatch(APPROVALS_STORE_ACTIONS.APPEND, {\r\n companyId: companyId.value,\r\n approvalId,\r\n decisionId,\r\n payloadData\r\n })\r\n }\r\n\r\n const updateStatusAfterApproving = (\r\n tripId: string | number | undefined,\r\n receiptId: string | number | undefined,\r\n comparableStatus: number\r\n ) => {\r\n let currentAttempt: number = 0\r\n let nrOfAttempts: number = 10\r\n\r\n let sendWithRetry = async () => {\r\n try {\r\n if (tripId) {\r\n const trip = await loadTrip(tripId)\r\n if (trip?.status && trip?.status === comparableStatus) {\r\n return retry()\r\n }\r\n console.log('Success...')\r\n }\r\n if (receiptId) {\r\n const receipt = await loadReceipt(receiptId)\r\n if (receipt?.status && receipt?.status === comparableStatus) {\r\n return retry()\r\n }\r\n console.log('Success...')\r\n }\r\n } catch (error) {\r\n console.error('ERROR REQUESTING UPDATING STATUS OF APPROVAL SUBJECT', error)\r\n }\r\n }\r\n\r\n let retry = () => {\r\n if (currentAttempt < nrOfAttempts) {\r\n currentAttempt++\r\n console.log('Retrying...')\r\n sendWithRetry()\r\n } else {\r\n console.log('Retried updating status several times, status did not change')\r\n }\r\n }\r\n sendWithRetry()\r\n }\r\n\r\n return {\r\n allApprovals,\r\n activeTripApproval,\r\n activeReceiptApproval,\r\n archivedApprovals,\r\n companyApproverOptions,\r\n pendingApprovals,\r\n addDecision,\r\n appendApprover,\r\n approve,\r\n reject,\r\n delegate,\r\n deleteApproval,\r\n loadApprovals,\r\n loadApproval,\r\n loadApproverOptions,\r\n loadTripApproval,\r\n loadReceiptApproval,\r\n removeApprover,\r\n updateStatusAfterApproving,\r\n userActiveDecisions\r\n }\r\n}\r\n","import { SORT_DIRECTION, SORT_KEY, STATUS_SEQUENCE, TABLE_NAME, TRANSACTION_WARNING } from '@/enums'\r\nimport { receiptStatuses } from '@/lib/statuses/receiptStatuses'\r\nimport { useCompanies, useTripStatus, useCostTypes } from '@/composables'\r\nimport { ApprovalItem, PaymentTransaction, Receipt, Trip } from '@/models'\r\n\r\nexport default function useTableSort() {\r\n const { statusInfo: tripStatus } = useTripStatus()\r\n const { activeCompany } = useCompanies()\r\n const { setCostTypeName } = useCostTypes()\r\n\r\n const sortByDate = (aDateString: string, bDateString: string, sortDirection: SORT_DIRECTION) => {\r\n const dateA = new Date(aDateString).getTime()\r\n const dateB = new Date(bDateString).getTime()\r\n if (sortDirection === SORT_DIRECTION.DESCENDING) {\r\n return dateA - dateB // Sort from oldest to newest\r\n } else {\r\n return dateB - dateA // Sort from newest to oldest (default behavior)\r\n }\r\n }\r\n\r\n const transactionStatus = (transaction: PaymentTransaction) => {\r\n if (transaction.warning?.codename) {\r\n return TRANSACTION_WARNING[transaction.warning.codename as keyof typeof TRANSACTION_WARNING]\r\n } else if (transaction.receiptId) {\r\n return 'AAAAAA' // to differentiate matched and unmatched docs\r\n } else {\r\n return 'ZZZZZZ' // to differentiate matched and unmatched docs\r\n }\r\n }\r\n\r\n const receiptStatus = (receipt: Receipt) => {\r\n const statuses = receiptStatuses(receipt, activeCompany.value)\r\n return statuses[1]?.index || statuses[0]?.index || STATUS_SEQUENCE.NONE\r\n }\r\n\r\n const sortReceiptsTable = (sortableArray: Receipt[], sortKey: SORT_KEY, sortDirection: SORT_DIRECTION) => {\r\n const sorted = [...sortableArray]\r\n\r\n if (!sortKey) {\r\n return sorted\r\n }\r\n\r\n sorted.sort((a: { [key: string]: any }, b: { [key: string]: any }) => {\r\n let first: string | number = ''\r\n let second: string | number = ''\r\n\r\n if (sortKey === SORT_KEY.STATUS) {\r\n first = receiptStatus(a as Receipt)\r\n second = receiptStatus(b as Receipt)\r\n } else if (sortKey === SORT_KEY.EXPENSE_TYPE) {\r\n first = setCostTypeName(a as Receipt, localStorage.language) || ''\r\n second = setCostTypeName(b as Receipt, localStorage.language) || ''\r\n } else if (sortKey === SORT_KEY.SUBMITTER) {\r\n first = a.submitter?.fullName || a.submitter?.email || ''\r\n second = b.submitter?.fullName || b.submitter?.email || ''\r\n } else if (sortKey === SORT_KEY.SUM) {\r\n first = Number(a.sum) || 0\r\n second = Number(b.sum) || 0\r\n } else {\r\n first = a[sortKey] ?? ''\r\n second = b[sortKey] ?? ''\r\n }\r\n\r\n if (first === second) {\r\n return sortByDate(a.createdAt, b.createdAt, sortDirection)\r\n }\r\n\r\n if (typeof first === 'string' && typeof second === 'string') {\r\n return first.localeCompare(second)\r\n } else if (typeof first === 'number' && typeof second === 'number') {\r\n return first - second\r\n }\r\n\r\n return -1\r\n })\r\n\r\n if (sortDirection === SORT_DIRECTION.DESCENDING) {\r\n sorted.reverse()\r\n }\r\n\r\n return sorted\r\n }\r\n\r\n const sortTripsTable = (sortableArray: Trip[], sortKey: SORT_KEY, sortDirection: SORT_DIRECTION) => {\r\n const sorted = [...sortableArray]\r\n\r\n if (!sortKey) {\r\n return sorted\r\n }\r\n\r\n sorted.sort((a, b) => {\r\n let first: string | number = ''\r\n let second: string | number = ''\r\n\r\n if (sortKey === SORT_KEY.SUBMITTER) {\r\n first = a.submitter?.fullName || a.submitter?.email || ''\r\n second = b.submitter?.fullName || b.submitter?.email || ''\r\n } else if (sortKey === SORT_KEY.STATUS) {\r\n first = tripStatus(a, activeCompany.value).index\r\n second = tripStatus(b, activeCompany.value).index\r\n } else if (sortKey === SORT_KEY.DATE) {\r\n first = a.startDate || ''\r\n second = b.startDate || ''\r\n } else {\r\n first = a[sortKey] ?? ''\r\n second = b[sortKey] ?? ''\r\n }\r\n\r\n if (first === second) {\r\n return sortByDate(a.createdAt, b.createdAt, sortDirection)\r\n }\r\n\r\n if (typeof first === 'string' && typeof second === 'string') {\r\n return first.localeCompare(second)\r\n } else if (typeof first === 'number' && typeof second === 'number') {\r\n return first - second\r\n }\r\n\r\n return -1\r\n })\r\n\r\n if (sortDirection === SORT_DIRECTION.DESCENDING) {\r\n sorted.reverse()\r\n }\r\n\r\n return sorted\r\n }\r\n\r\n const sortApprovalsTable = (sortableArray: ApprovalItem[], sortKey: SORT_KEY, sortDirection: SORT_DIRECTION) => {\r\n const sorted = [...sortableArray]\r\n\r\n if (!sortKey) {\r\n return sorted\r\n }\r\n\r\n sorted.sort((a: { [key: string]: any }, b: { [key: string]: any }) => {\r\n let first: string | number = ''\r\n let second: string | number = ''\r\n\r\n if (sortKey === SORT_KEY.SUBMITTER) {\r\n first = a.data?.trip?.submitter?.fullName || a.data?.receipt?.submitter?.fullName || ''\r\n second = b.data?.trip?.submitter?.fullName || b.data?.receipt?.submitter?.fullName || ''\r\n } else if (sortKey === SORT_KEY.DOCUMENT_TYPE) {\r\n first = a.data?.trip?.subtype || a.data?.trip?.type || ''\r\n second = b.data?.trip?.subtype || b.data?.trip?.type || ''\r\n } else if (sortKey === SORT_KEY.DOCUMENT) {\r\n first = a.data?.trip?.name || a.data?.receipt?.supplier || ''\r\n second = b.data?.trip?.name || b.data?.receipt?.supplier || ''\r\n } else if (sortKey === SORT_KEY.SUM) {\r\n first = Number(a.data?.receipt?.sum) || 0\r\n second = Number(b.data?.receipt?.sum) || 0\r\n } else if (sortKey === SORT_KEY.DATE) {\r\n first = a.data?.trip?.startDate || a.data?.receipt?.issued || ''\r\n second = b.data?.trip?.startDate || b.data?.receipt?.issued || ''\r\n } else {\r\n first = a[sortKey] ?? ''\r\n second = b[sortKey] ?? ''\r\n }\r\n\r\n if (first === second) {\r\n return sortByDate(a.ts, b.ts, sortDirection)\r\n }\r\n\r\n if (typeof first === 'string' && typeof second === 'string') {\r\n return first.localeCompare(second)\r\n } else if (typeof first === 'number' && typeof second === 'number') {\r\n return first - second\r\n }\r\n\r\n return -1\r\n })\r\n\r\n if (sortDirection === SORT_DIRECTION.DESCENDING) {\r\n sorted.reverse()\r\n }\r\n\r\n return sorted\r\n }\r\n\r\n const sortTransactionsTable = (\r\n sortableArray: PaymentTransaction[],\r\n sortKey: SORT_KEY,\r\n sortDirection: SORT_DIRECTION\r\n ) => {\r\n const sorted = [...sortableArray]\r\n\r\n if (!sortKey) {\r\n return sorted\r\n }\r\n\r\n sorted.sort((a: { [key: string]: any }, b: { [key: string]: any }) => {\r\n let first: string | number = ''\r\n let second: string | number = ''\r\n\r\n if (sortKey === SORT_KEY.NAME) {\r\n first = typeof a.trip?.name === 'string' ? a.trip?.name : ''\r\n second = typeof b.trip?.name === 'string' ? b.trip?.name : ''\r\n } else if (sortKey === SORT_KEY.STATUS) {\r\n first = transactionStatus(a as PaymentTransaction)\r\n second = transactionStatus(b as PaymentTransaction)\r\n } else if (sortKey === SORT_KEY.CARDLFD) {\r\n first = Number(a.paymentMethod?.cardLfd) || 0\r\n second = Number(b.paymentMethod?.cardLfd) || 0\r\n } else if (sortKey === SORT_KEY.SUM) {\r\n first = Number(a.sum) || 0\r\n second = Number(b.sum) || 0\r\n } else {\r\n first = a[sortKey] ?? ''\r\n second = b[sortKey] ?? ''\r\n }\r\n\r\n if (first === second) {\r\n return sortByDate(a.date, b.date, sortDirection)\r\n }\r\n\r\n if (typeof first === 'string' && typeof second === 'string') {\r\n return first.localeCompare(second)\r\n } else if (typeof first === 'number' && typeof second === 'number') {\r\n return first - second\r\n }\r\n\r\n return -1\r\n })\r\n\r\n if (sortDirection === SORT_DIRECTION.DESCENDING) {\r\n sorted.reverse()\r\n }\r\n\r\n return sorted\r\n }\r\n\r\n const setSortToLocalstorage = (tableName: TABLE_NAME, key: SORT_KEY, direction: SORT_DIRECTION) => {\r\n localStorage.setItem(tableName + 'SortKey', key)\r\n localStorage.setItem(tableName + 'SortDirection', direction)\r\n }\r\n\r\n const getSortFromLocalstorage = (tableName: TABLE_NAME) => {\r\n const localSortKey = localStorage?.getItem(tableName + 'SortKey') || ''\r\n const localSortDirection = localStorage?.getItem(tableName + 'SortDirection') || ''\r\n return { key: localSortKey, direction: localSortDirection }\r\n }\r\n\r\n return {\r\n sortReceiptsTable,\r\n sortTransactionsTable,\r\n sortTripsTable,\r\n sortApprovalsTable,\r\n setSortToLocalstorage,\r\n getSortFromLocalstorage\r\n }\r\n}\r\n","import { computed, watch, ref } from 'vue'\nimport { CONFIG_STORE_GETTERS, COMPANIES_STORE_ACTIONS, COMPANIES_STORE_GETTERS, STORAGE } from '@/enums'\nimport { xstore } from '@/store'\nimport { Company } from '@/models'\nimport { useContext } from '@/composables'\nimport _storage from '@/lib/useLocalStorage'\n\nexport default function useCompanies() {\n const onCompanyChangeTargetFn = ref((id: number) => {})\n\n const { router, root, store } = useContext()\n\n const companyId = computed(() => {\n if (root?.$route.params.companyId) {\n return Number(root?.$route.params.companyId)\n } else {\n return 0\n }\n })\n\n const firstCompanyId = computed(() => {\n const allCompanies: Company[] = Object.values(companies.value || {})\n if (allCompanies?.length) {\n return allCompanies[0].id\n } else {\n return 0\n }\n })\n\n const companies = computed(() => {\n return xstore.getters[COMPANIES_STORE_GETTERS.COMPANIES] || {}\n })\n\n const activeCompany = computed(() => {\n return companies.value?.[companyId.value]\n })\n\n const activeUserIsAdmin = computed(() => {\n return Boolean(activeCompany.value?.companyRoles?.length)\n // for non admin user company roles are not available TODO: maybe there is/should be a better way to tell\n })\n\n const companyInbox = computed(() => {\n let mailDomain = xstore.getters[CONFIG_STORE_GETTERS.CONFIG].mailDomain\n let alias = activeCompany.value?.settings?.alias || activeCompany.value?.regCode\n return alias && mailDomain ? `${alias}@${mailDomain}` : ''\n })\n\n const companyUsesReports = computed(() => {\n if (!activeCompany.value) return false\n if (activeCompany.value?.settings?.enableReports !== undefined) {\n return activeCompany.value?.settings?.enableReports\n }\n return true\n })\n\n const getCompany = async (companyId: any) => {\n if (!companyId) return\n return await store.dispatch(COMPANIES_STORE_ACTIONS.GET_COMPANY, companyId)\n }\n\n const setActiveCompanyById = (id: number) => {\n _storage[STORAGE.ACTIVE_COMPANY] = id\n\n const lastSelectedTab = localStorage.getItem('last-selected-tab')\n localStorage.removeItem('last-selected-tab')\n\n const lastSelectedLayout = localStorage.getItem('last-selected-layout')\n localStorage.removeItem('last-selected-layout')\n\n const currentTab = root?.$route.params.tab || lastSelectedTab || ''\n const currentLayout = root?.$route.params.layout || lastSelectedLayout || ''\n const viewPath = currentTab && currentLayout ? `/${currentTab}/${currentLayout}` : ''\n\n const tripId = root?.$route.params.tripId || ''\n const receiptId = root?.$route.params.receiptId || ''\n const receiptPath = receiptId ? `/receipt/${receiptId}` : ''\n const tripPath = tripId ? `/trip/${tripId}` : ''\n\n router?.push(`/${id}${viewPath}${tripPath}${receiptPath}`)\n }\n\n const openDefaultView = () => {\n try {\n if ((!companyId.value || !activeCompany.value) && !(Object.values(companies.value).length === 1)) {\n router?.push('/overview/activity')\n return\n }\n\n if (firstCompanyId.value) {\n setActiveCompanyById(firstCompanyId.value)\n }\n } catch (error) {\n console.log('@openDefaultView', error)\n }\n }\n\n const onCompanyChange = (targetFn = (id: number) => {}) => {\n onCompanyChangeTargetFn.value = targetFn\n }\n\n const updateCompanySettings = async (settings: any) => {\n return xstore.dispatch(COMPANIES_STORE_ACTIONS.UPDATE_SETTINGS, {\n companyId: companyId.value,\n settings\n })\n }\n\n watch(\n () => companyId.value,\n (id, oldId) => {\n if (id !== undefined && id !== oldId) {\n onCompanyChangeTargetFn.value(id)\n }\n }\n )\n\n return {\n getCompany,\n setActiveCompanyById,\n openDefaultView,\n onCompanyChange,\n updateCompanySettings,\n activeCompany,\n activeUserIsAdmin,\n companies,\n companyInbox,\n companyUsesReports\n }\n}\n","import { validateStatus } from '@/lib/status'\r\nimport { TRIP_STATUS, TRIP_STATUS_CATEGORY, STATUS_COLORS } from '@/enums'\r\n\r\nexport default function tripCurrencyConversionStatus(trip) {\r\n if (validateStatus(trip.status, [TRIP_STATUS.CURRENCY_PROCESSING])) {\r\n return {\r\n color: STATUS_COLORS.BLUE,\r\n label: 'processingCurrency',\r\n status: TRIP_STATUS_CATEGORY.CURRENCY_PROCESSING\r\n }\r\n }\r\n\r\n if (validateStatus(trip.status, [TRIP_STATUS.CURRENCY_CONVERTED])) {\r\n return {\r\n color: STATUS_COLORS.GREEN,\r\n label: 'currencyConverted',\r\n status: TRIP_STATUS_CATEGORY.CURRENCY_CONVERTED\r\n }\r\n }\r\n\r\n return {}\r\n}\r\n","import { BILLING_TYPE, RECEIPT_STATUS_CATEGORY, TRIP_STATUS_CATEGORY, STATUS_BACKGROUND_COLORS, TRIP_TYPE } from '@/enums'\r\nimport { receiptStatuses } from '@/lib/statuses/receiptStatuses'\r\nimport { displayedTripStatus } from '@/lib/statuses/displayedTripStatus'\r\nimport tripCurrencyConversionStatus from '@/lib/statuses/tripCurrencyConversionStatus'\r\nimport { Receipt, Trip } from '@/models'\r\nimport { useCompanies, useCostTypes } from '@/composables'\r\n\r\nexport default function useFilters() {\r\n const { activeCompany } = useCompanies()\r\n const { setCostTypeName } = useCostTypes()\r\n\r\n const receiptFilterOptions = (receipts: Receipt[]) => {\r\n const filters = {\r\n reimbursement: {\r\n paidByUnspecified: {\r\n count: 0,\r\n label: 'paidByUnspecified',\r\n value: 'paidByUnspecified',\r\n color: STATUS_BACKGROUND_COLORS.BLUE\r\n },\r\n paidPersonally: {\r\n count: 0,\r\n label: 'paidPersonally',\r\n value: 'paidPersonally',\r\n color: STATUS_BACKGROUND_COLORS.BLUE\r\n },\r\n paidByCompanyFunds: {\r\n count: 0,\r\n label: 'paidByCompanyFunds',\r\n value: 'paidByCompanyFunds',\r\n color: STATUS_BACKGROUND_COLORS.BLUE\r\n }\r\n },\r\n status: {\r\n UNSUBMITTED: {\r\n count: 0,\r\n label: 'draft',\r\n value: RECEIPT_STATUS_CATEGORY.UNSUBMITTED,\r\n color: STATUS_BACKGROUND_COLORS.GREY\r\n },\r\n INVALID: {\r\n count: 0,\r\n label: 'notValid',\r\n value: RECEIPT_STATUS_CATEGORY.INVALID,\r\n color: STATUS_BACKGROUND_COLORS.RED\r\n },\r\n PICTURELESS: {\r\n count: 0,\r\n label: 'noPicture',\r\n value: RECEIPT_STATUS_CATEGORY.PICTURELESS,\r\n color: STATUS_BACKGROUND_COLORS.RED\r\n },\r\n DUPLICATE: {\r\n count: 0,\r\n label: 'notDistinct',\r\n value: RECEIPT_STATUS_CATEGORY.DUPLICATE,\r\n color: STATUS_BACKGROUND_COLORS.RED\r\n },\r\n BOUNCED: {\r\n count: 0,\r\n label: 'forwardingFailed',\r\n value: RECEIPT_STATUS_CATEGORY.BOUNCED,\r\n color: STATUS_BACKGROUND_COLORS.RED\r\n },\r\n REJECTED: {\r\n count: 0,\r\n label: 'rejected',\r\n value: RECEIPT_STATUS_CATEGORY.REJECTED,\r\n color: STATUS_BACKGROUND_COLORS.RED\r\n },\r\n DIGITIZING: {\r\n count: 0,\r\n label: 'digitizing',\r\n value: RECEIPT_STATUS_CATEGORY.DIGITIZING,\r\n color: STATUS_BACKGROUND_COLORS.BLUE\r\n },\r\n APPROVING: {\r\n count: 0,\r\n label: 'approving',\r\n value: RECEIPT_STATUS_CATEGORY.APPROVING,\r\n color: STATUS_BACKGROUND_COLORS.BLUE\r\n },\r\n CONFIRMING: {\r\n count: 0,\r\n label: 'pendingConfirmation',\r\n value: RECEIPT_STATUS_CATEGORY.CONFIRMING,\r\n color: STATUS_BACKGROUND_COLORS.BLUE\r\n },\r\n PROCESSING: {\r\n count: 0,\r\n label: 'tripProcessing',\r\n value: RECEIPT_STATUS_CATEGORY.PROCESSING,\r\n color: STATUS_BACKGROUND_COLORS.BLUE\r\n },\r\n DIGITIZED: {\r\n count: 0,\r\n label: 'digitized',\r\n value: RECEIPT_STATUS_CATEGORY.DIGITIZED,\r\n color: STATUS_BACKGROUND_COLORS.GREEN\r\n },\r\n APPROVED: {\r\n count: 0,\r\n label: 'approved',\r\n value: RECEIPT_STATUS_CATEGORY.APPROVED,\r\n color: STATUS_BACKGROUND_COLORS.GREEN\r\n },\r\n SENT: {\r\n count: 0,\r\n label: 'forwardingSuccess',\r\n value: RECEIPT_STATUS_CATEGORY.SENT,\r\n color: STATUS_BACKGROUND_COLORS.GREEN\r\n },\r\n CURRENCY_PROCESSING: {\r\n count: 0,\r\n label: 'processingCurrency',\r\n value: RECEIPT_STATUS_CATEGORY.CURRENCY_PROCESSING,\r\n color: STATUS_BACKGROUND_COLORS.YELLOW\r\n },\r\n CURRENCY_CONVERTED: {\r\n count: 0,\r\n label: 'currencyConverted',\r\n value: RECEIPT_STATUS_CATEGORY.CURRENCY_CONVERTED,\r\n color: STATUS_BACKGROUND_COLORS.GREEN\r\n }\r\n },\r\n costType: {}\r\n }\r\n\r\n receipts.forEach((receipt) => {\r\n const { billingType, docType } = receipt\r\n if (docType === 'nonexpense') return\r\n if (billingType === BILLING_TYPE.PERSONAL) {\r\n filters.reimbursement.paidPersonally.count += 1\r\n } else if (billingType === BILLING_TYPE.COMPANY) {\r\n filters.reimbursement.paidByCompanyFunds.count += 1\r\n } else {\r\n filters.reimbursement.paidByUnspecified.count += 1\r\n }\r\n\r\n const statuses = receiptStatuses(receipt, activeCompany.value).map((status) => status?.status)\r\n statuses.forEach((status) => {\r\n // @ts-ignore\r\n if (status && filters.status[status]) {\r\n // @ts-ignore\r\n filters.status[status].count += 1\r\n }\r\n })\r\n\r\n const costType = setCostTypeName(receipt, localStorage.language)\r\n if (costType) {\r\n // @ts-ignore\r\n if (filters.costType[costType]) {\r\n // @ts-ignore\r\n filters.costType[costType].count += 1\r\n } else {\r\n // @ts-ignore\r\n filters.costType[costType] = {\r\n count: 1,\r\n label: costType,\r\n value: costType,\r\n color: STATUS_BACKGROUND_COLORS.BLUE\r\n }\r\n }\r\n }\r\n })\r\n return filters\r\n }\r\n\r\n const reportFilterOptions = (trips: Trip[]) => {\r\n const filters = {\r\n reimbursement: {\r\n unspecifiedFunds: {\r\n count: 0,\r\n label: 'paidByUnspecified',\r\n value: 'unspecifiedFunds',\r\n color: STATUS_BACKGROUND_COLORS.BLUE\r\n },\r\n reimbursable: {\r\n count: 0,\r\n label: 'paidPersonally',\r\n value: 'reimbursable',\r\n color: STATUS_BACKGROUND_COLORS.BLUE\r\n },\r\n companyFunds: {\r\n count: 0,\r\n label: 'paidByCompanyFunds',\r\n value: 'companyFunds',\r\n color: STATUS_BACKGROUND_COLORS.BLUE\r\n }\r\n },\r\n status: {\r\n BOUNCED: {\r\n count: 0,\r\n label: 'forwardingFailed',\r\n value: TRIP_STATUS_CATEGORY.BOUNCED,\r\n color: STATUS_BACKGROUND_COLORS.RED\r\n },\r\n REJECTED: {\r\n count: 0,\r\n label: 'rejected',\r\n value: TRIP_STATUS_CATEGORY.REJECTED,\r\n color: STATUS_BACKGROUND_COLORS.RED\r\n },\r\n SUBMITTED: {\r\n count: 0,\r\n label: 'submitted',\r\n value: TRIP_STATUS_CATEGORY.SUBMITTED,\r\n color: STATUS_BACKGROUND_COLORS.BLUE\r\n },\r\n DIGITIZING: {\r\n count: 0,\r\n label: 'digitizing',\r\n value: TRIP_STATUS_CATEGORY.DIGITIZING,\r\n color: STATUS_BACKGROUND_COLORS.BLUE\r\n },\r\n APPROVING: {\r\n count: 0,\r\n label: 'approving',\r\n value: TRIP_STATUS_CATEGORY.APPROVING,\r\n color: STATUS_BACKGROUND_COLORS.BLUE\r\n },\r\n CONFIRMING: {\r\n count: 0,\r\n label: 'pendingConfirmation',\r\n value: TRIP_STATUS_CATEGORY.CONFIRMING,\r\n color: STATUS_BACKGROUND_COLORS.BLUE\r\n },\r\n PROCESSING: {\r\n count: 0,\r\n label: 'tripProcessing',\r\n value: TRIP_STATUS_CATEGORY.PROCESSING,\r\n color: STATUS_BACKGROUND_COLORS.BLUE\r\n },\r\n APPROVED: {\r\n count: 0,\r\n label: 'approved',\r\n value: TRIP_STATUS_CATEGORY.APPROVED,\r\n color: STATUS_BACKGROUND_COLORS.GREEN\r\n },\r\n SENT: {\r\n count: 0,\r\n label: 'forwardingSuccess',\r\n value: TRIP_STATUS_CATEGORY.SENT,\r\n color: STATUS_BACKGROUND_COLORS.GREEN\r\n },\r\n CURRENCY_PROCESSING: {\r\n count: 0,\r\n label: 'processingCurrency',\r\n value: TRIP_STATUS_CATEGORY.CURRENCY_PROCESSING,\r\n color: STATUS_BACKGROUND_COLORS.YELLOW\r\n },\r\n CURRENCY_CONVERTED: {\r\n count: 0,\r\n label: 'currencyConverted',\r\n value: TRIP_STATUS_CATEGORY.CURRENCY_CONVERTED,\r\n color: STATUS_BACKGROUND_COLORS.GREEN\r\n },\r\n DRAFT: {\r\n count: 0,\r\n label: 'draft',\r\n value: TRIP_STATUS_CATEGORY.DRAFT,\r\n color: STATUS_BACKGROUND_COLORS.GREY\r\n }\r\n },\r\n reportType: {\r\n [TRIP_TYPE.EXPENSE]: {\r\n count: 0,\r\n label: 'report',\r\n value: TRIP_TYPE.EXPENSE,\r\n color: STATUS_BACKGROUND_COLORS.BLUE\r\n },\r\n [TRIP_TYPE.TRAVEL]: {\r\n count: 0,\r\n label: 'travelReport',\r\n value: TRIP_TYPE.TRAVEL,\r\n color: STATUS_BACKGROUND_COLORS.BLUE\r\n },\r\n [TRIP_TYPE.MILEAGE]: {\r\n count: 0,\r\n label: 'mileageReport',\r\n value: TRIP_TYPE.MILEAGE,\r\n color: STATUS_BACKGROUND_COLORS.BLUE\r\n },\r\n [TRIP_TYPE.CREDIT_CARD]: {\r\n count: 0,\r\n label: 'creditCardReport',\r\n value: TRIP_TYPE.CREDIT_CARD,\r\n color: STATUS_BACKGROUND_COLORS.BLUE\r\n },\r\n [TRIP_TYPE.DEBIT_CARD]: {\r\n count: 0,\r\n label: 'debitCardReport',\r\n value: TRIP_TYPE.DEBIT_CARD,\r\n color: STATUS_BACKGROUND_COLORS.BLUE\r\n }\r\n }\r\n }\r\n\r\n const reimburementTypes = ['unspecifiedFunds', 'reimbursable', 'companyFunds']\r\n\r\n trips.forEach((trip) => {\r\n const statusInfo = displayedTripStatus(trip, activeCompany.value)\r\n // @ts-ignore\r\n if (statusInfo.status && filters.status[statusInfo.status]) {\r\n // @ts-ignore\r\n filters.status[statusInfo.status].count += 1\r\n }\r\n\r\n const currencyStatus = tripCurrencyConversionStatus(trip)\r\n // @ts-ignore\r\n if (currencyStatus.status && filters.status[currencyStatus.status]) {\r\n // @ts-ignore\r\n filters.status[currencyStatus.status].count += 1\r\n }\r\n\r\n if (trip.currencyTotals?.length) {\r\n reimburementTypes.forEach((reimbursementType) => {\r\n const hasReimbursementType = trip.currencyTotals.find(\r\n (currencyTotal: any) => currencyTotal[reimbursementType] > 0\r\n )\r\n if (hasReimbursementType) {\r\n // @ts-ignore\r\n filters.reimbursement[reimbursementType].count += 1\r\n }\r\n })\r\n }\r\n\r\n // @ts-ignore\r\n if (trip.subtype && filters.reportType[trip.subtype]) {\r\n // @ts-ignore\r\n filters.reportType[trip.subtype].count += 1\r\n // @ts-ignore\r\n } else if (trip.type && filters.reportType[trip.type]) {\r\n // @ts-ignore\r\n filters.reportType[trip.type].count += 1\r\n }\r\n })\r\n return filters\r\n }\r\n\r\n const filterReceiptsByReimbursement = (receipt: Receipt, filters: string[]) => {\r\n const reimbursementValue: any = {\r\n [BILLING_TYPE.COMPANY]: 'paidByCompanyFunds',\r\n [BILLING_TYPE.PERSONAL]: 'paidPersonally',\r\n unspecified: 'paidByUnspecified'\r\n }\r\n const paidBy = reimbursementValue[receipt.billingType || 'unspecified']\r\n return receipt.docType !== 'nonexpense' && filters.includes(paidBy)\r\n }\r\n\r\n const filterReportsByReimbursement = (trip: Trip, filters: string[]) => {\r\n let includesFilter = false\r\n filters.forEach((reimbursementType) => {\r\n if (trip.currencyTotals.find((currencyTotal: any) => currencyTotal[reimbursementType] > 0)) {\r\n includesFilter = true\r\n }\r\n })\r\n return includesFilter\r\n }\r\n\r\n return {\r\n receiptFilterOptions,\r\n reportFilterOptions,\r\n filterReceiptsByReimbursement,\r\n filterReportsByReimbursement\r\n }\r\n}\r\n","import { getCurrentInstance, computed, inject } from 'vue'\nimport { routerLocationKey } from '@/providers'\nimport { xstore } from '@/store'\n\nexport default function useContext () {\n const instance = getCurrentInstance()\n const root = instance?.proxy!\n const router = inject(routerLocationKey)!\n const store = xstore\n\n const route = computed(() => {\n return router?.currentRoute.value\n })\n\n return {\n router,\n route,\n store,\n root\n }\n}","/* eslint-disable */\r\n// @ts-nocheck\r\nimport { xstore } from '@/store'\r\nimport { Company, User, Trip } from '@/models'\r\nimport { useTrips, useContext, useIntegrations, useExpenseFlow, useLoadingState } from '@/composables'\r\nimport { TRIPS_STORE_ACTIONS, INTEGRATION } from '@/enums'\r\n\r\nexport default function useExport() {\r\n const { root } = useContext()\r\n const { loadTrip } = useTrips()\r\n const { activeIntegration } = useIntegrations()\r\n const { submitReport } = useExpenseFlow()\r\n const { setLoadingState } = useLoadingState()\r\n\r\n const canExport = (company: Company | undefined, user: User): Boolean => {\r\n const hasAllowedIntegration = [INTEGRATION.ASTERI, INTEGRATION.JUMIS_START, INTEGRATION.VISMA_FIVALDI_CSV].includes(\r\n activeIntegration.value?.id\r\n )\r\n const userRole = company.companyRoles ? company.companyRoles.find((role) => role.userId === user.id) : {}\r\n const isAdmin = userRole?.rolename === 'admin'\r\n return isAdmin && hasAllowedIntegration\r\n }\r\n\r\n const canExportAndCopy = (company: Company | undefined, user: User): Boolean => {\r\n const hasAllowedIntegration = [INTEGRATION.ASTERI, INTEGRATION.VISMA_FIVALDI_CSV].includes(\r\n activeIntegration.value?.id\r\n )\r\n const userRole = company.companyRoles ? company.companyRoles.find((role) => role.userId === user.id) : {}\r\n const isAdmin = userRole?.rolename === 'admin'\r\n return isAdmin && hasAllowedIntegration\r\n }\r\n\r\n const copyCSV = (dataToCopy: any) => {\r\n const reader = new FileReader()\r\n reader.onload = (event) => {\r\n const text = event.target.result\r\n if (text) {\r\n navigator['clipboard']\r\n .writeText(text)\r\n .then(() => {\r\n root?.$notification(`CSV ${root?.t('copied')}`, 'success', 5000)\r\n })\r\n .catch((e: any) => {\r\n root?.$notification('Failed to copy content', 'error', 5000)\r\n })\r\n return\r\n }\r\n root?.$notification('Failed to copy content', 'error', 5000)\r\n }\r\n reader.readAsText(dataToCopy)\r\n }\r\n\r\n const downloadFile = (response: any, trip: Trip) => {\r\n const blob = new Blob([response.data], { type: response.data.type })\r\n const url = window.URL.createObjectURL(blob)\r\n const link = document.createElement('a')\r\n link.href = url\r\n const contentDisposition = response.headers['content-disposition']\r\n let fileName = trip.alias ? trip.alias.replace('.', '_') : 'report'\r\n if (contentDisposition) {\r\n const fileNameMatch = contentDisposition.match(/filename=\"(.+)\"/)\r\n if (fileNameMatch.length === 2) fileName = fileNameMatch[1]\r\n }\r\n link.setAttribute('download', fileName)\r\n document.body.appendChild(link)\r\n link.click()\r\n link.remove()\r\n window.URL.revokeObjectURL(url)\r\n }\r\n\r\n const exportTrip = async (company: Company, trip: Trip, action: string, tripReceipts: any): Promise => {\r\n try {\r\n setLoadingState(true)\r\n\r\n await submitReport(company, trip, tripReceipts)\r\n\r\n const response = await xstore.dispatch(TRIPS_STORE_ACTIONS.IMPORT_TRIP, {\r\n trip,\r\n companyId: company?.id\r\n })\r\n\r\n if (action === 'COPY') {\r\n copyCSV(response.data)\r\n }\r\n\r\n if (action === 'DOWNLOAD') {\r\n downloadFile(response, trip)\r\n }\r\n\r\n await loadTrip(trip?.id)\r\n } catch (error) {\r\n throw error\r\n } finally {\r\n setLoadingState(false)\r\n }\r\n }\r\n\r\n return {\r\n canExport,\r\n canExportAndCopy,\r\n exportTrip\r\n }\r\n}\r\n","import { computed, watch } from 'vue'\r\nimport xstore from '@/store'\r\nimport { useContext } from '@/composables'\r\n\r\nimport {\r\n CONFIG_STORE_GETTERS,\r\n\r\n EVENT_COMPANY_UPDATED,\r\n EVENT_NEW_DOC,\r\n EVENT_NEW_REPORT,\r\n EVENT_EF_STATE_CHANGED,\r\n EVENT_APPROVAL_STATE_CHANGED,\r\n\r\n COMPANIES_STORE_ACTIONS,\r\n RECEIPTS_STORE_ACTIONS,\r\n TRIPS_STORE_ACTIONS,\r\n APPROVALS_STORE_ACTIONS\r\n} from '@/enums'\r\n\r\nexport default function useEvents() {\r\n const { root } = useContext()\r\n\r\n const companyId = computed(() => Number(root?.$route.params.companyId))\r\n\r\n let eventSource: EventSource|null = null;\r\n\r\n const subscribe = (companyId: Number) => {\r\n eventSource?.close()\r\n\r\n const uri = xstore.getters[CONFIG_STORE_GETTERS.CONFIG]?.services.coreapi.url\r\n + '/companies/' + companyId + '/eventstream?'\r\n + 'access_token=' + localStorage.getItem('token')\r\n\r\n eventSource = new EventSource(uri, {\r\n withCredentials: true\r\n })\r\n\r\n eventSource.onmessage = (event: MessageEvent) => {\r\n var ev = JSON.parse(event.data)\r\n\r\n switch(ev.subject) {\r\n case EVENT_COMPANY_UPDATED:\r\n xstore.dispatch(COMPANIES_STORE_ACTIONS.GET_COMPANY, ev.data.id)\r\n break;\r\n case EVENT_NEW_DOC:\r\n xstore.dispatch(RECEIPTS_STORE_ACTIONS.GET_RECEIPT, {\r\n companyId,\r\n receiptId: ev.data.id\r\n })\r\n break;\r\n case EVENT_NEW_REPORT:\r\n xstore.dispatch(TRIPS_STORE_ACTIONS.GET_TRIP, {\r\n companyId,\r\n tripId: ev.data.id\r\n })\r\n\r\n break;\r\n case EVENT_EF_STATE_CHANGED:\r\n\r\n if (ev.data.action == 'DELETE') {\r\n if (ev.data.target === 'EXPENSE_DOCUMENT') {\r\n xstore.dispatch(RECEIPTS_STORE_ACTIONS.REMOVE_RECEIPT, {\r\n receiptId: ev.data.receiptId\r\n })\r\n\r\n if (ev.data.tripId) {\r\n xstore.dispatch(TRIPS_STORE_ACTIONS.GET_TRIP, {\r\n companyId,\r\n tripId: ev.data.tripId\r\n })\r\n }\r\n }\r\n else if (ev.data.target === 'EXPENSE_REPORT') {\r\n xstore.dispatch(TRIPS_STORE_ACTIONS.REMOVE_TRIP, {\r\n tripId: ev.data.tripId\r\n })\r\n }\r\n break;\r\n }\r\n\r\n if (ev.data.receiptId) {\r\n xstore.dispatch(RECEIPTS_STORE_ACTIONS.GET_RECEIPT, {\r\n companyId,\r\n receiptId: ev.data.receiptId\r\n })\r\n }\r\n if (ev.data.tripId) {\r\n xstore.dispatch(TRIPS_STORE_ACTIONS.GET_TRIP, {\r\n companyId,\r\n tripId: ev.data.tripId\r\n })\r\n }\r\n\r\n break;\r\n case EVENT_APPROVAL_STATE_CHANGED:\r\n console.log('received event: ' + EVENT_APPROVAL_STATE_CHANGED + ' (no handler)')\r\n\r\n // TODO get approvals (not part of composables atm)\r\n // this is only a workaround:\r\n if (ev.data.receiptId) {\r\n xstore.dispatch(APPROVALS_STORE_ACTIONS.GET_RECEIPT_APPROVAL, {\r\n companyId,\r\n receiptId: ev.data.receiptId\r\n })\r\n }\r\n if (ev.data.tripId) {\r\n xstore.dispatch(TRIPS_STORE_ACTIONS.GET_TRIP, {\r\n companyId,\r\n tripId: ev.data.tripId\r\n })\r\n }\r\n\r\n break;\r\n }\r\n }\r\n\r\n eventSource.onerror = (err) => {\r\n console.log(err)\r\n setTimeout(subscribe, 2000, companyId)\r\n }\r\n }\r\n\r\n const initEventStream = () => {\r\n watch(\r\n () => companyId.value,\r\n (id, oldId) => {\r\n if (id !== undefined && id !== oldId) {\r\n subscribe(id)\r\n }\r\n }\r\n )\r\n }\r\n\r\n return {\r\n initEventStream\r\n }\r\n}","import { computed } from 'vue'\nimport { USERS_STORE_GETTERS, USERS_STORE_ACTIONS } from '@/enums'\nimport { xstore } from '@/store'\nimport { User } from '@/models'\nimport { useContext } from '@/composables'\n\nexport default function useUser() {\n const { root } = useContext()\n\n const activeUser = computed(() => {\n // Store return user | undefined. Thats why its using as User.\n // In general, this computed ref should reutrn User | undefined\n return xstore.getters[USERS_STORE_GETTERS.ACTIVE_USER] as unknown as User\n })\n\n const changeUserLanguage = async (language: string) => {\n try {\n localStorage.setItem('language', language)\n await xstore.dispatch(USERS_STORE_ACTIONS.UPDATE_USER, { lang: language })\n root?.$notification('saved', 'success', 3000)\n } catch (error) {\n root?.$notification(root.eh(error), 'error', 9000)\n }\n }\n\n const languages: Record = {\n fin: 'fi',\n lav: 'lv',\n pol: 'pl',\n est: 'et',\n rus: 'ru',\n lit: 'lt',\n swe: 'sv',\n esp: 'es',\n eng: 'en'\n };\n\n function convertTo3LetterLanguage(languageString: string): string {\n return Object.keys(languages).find((url: string) => languages[url] === languageString) ?? \"eng\";\n }\n\n function convertTo2LetterLanguage(languageString: string): string {\n return languages[languageString] ?? languages[\"eng\"];\n }\n\n return {\n activeUser,\n languages,\n changeUserLanguage,\n convertTo3LetterLanguage,\n convertTo2LetterLanguage\n }\n}\n","export enum COMPANIES_STORE_STATE {\n COMPANIES = 'Companies/COMPANIES',\n ACTIVE_COMPANY = 'Companies/ACTIVE_COMPANY'\n}\n\nexport enum COMPANIES_STORE_GETTERS {\n COMPANIES = 'Companies/COMPANIES',\n ACTIVE_COMPANY = 'Companies/ACTIVE_COMPANY',\n COMPANY_BY_ID = 'Companies/COMPANY_BY_ID'\n}\n\nexport enum COMPANIES_STORE_ACTIONS {\n GET_COMPANIES = 'Companies/GET_COMPANIES',\n GET_COMPANY_ROLES = 'Companies/GET_COMPANY_ROLES',\n SEND_INVITE = 'Companies/SEND_INVITE',\n REMOVE_COMPANY_ROLE = 'Companies/REMOVE_COMPANY_ROLE',\n SET_ACTIVE_COMPANY_BY_ID = 'Companies/SET_ACTIVE_COMPANY_BY_ID',\n GET_COMPANY = 'Companies/GET_COMPANY',\n UPDATE_SETTINGS = 'Companies/UPDATE_SETTINGS'\n}\n\nexport enum COMPANIES_STORE_MUTATIONS {\n SET_COMPANIES = 'Companies/SET_COMPANIES',\n SET_COMPANY_VALUES = 'Companies/SET_COMPANY_VALUES',\n SET_COMPANY_SETTINGS = 'Companies/SET_COMPANY_SETTINGS'\n}\n\nexport enum PRICING_PLAN {\n PAY_AS_YOU_GO = 'pay-as-you-go',\n PLATINUM = '11',\n GOLD = '14',\n FREE_DEMO = '15'\n}\n\nexport enum CARD_REPORTING_INTERVAL {\n WEEKLY = 'WEEKLY',\n MONTHLY = 'MONTHLY',\n YEARLY = 'YEARLY'\n}\n\nexport enum UNSUBMITTED_EXPENSE_REPORT_REMINDER_START {\n END_OF_MONTH = 'endOfMonth',\n BEGINNING_OF_MONTH = 'beginningOfMonth'\n}\n","export enum RECEIPTS_STORE_STATE {\n CANCEL_TOKENS = '_Receipts/CANCEL_TOKENSA',\n EXPENSE_TYPES = '_Receipts/EXPENSE_TYPES',\n RECEIPTS = '_Receipts/RECEIPTS',\n RECEIPT_DUPLICATES = '_Receipts/RECEIPT_DUPLICATES',\n RECEIPT_ATTACHMENTS = '_Receipts/RECEIPT_ATTACHMENTS',\n SELECTED_RECEIPTS = '_Receipts/SELECTED_RECEIPTS',\n RECEIPT_BROWSING_LIST = '_Receipts/RECEIPT_BROWSING_LIST'\n}\n\nexport enum RECEIPTS_STORE_GETTERS {\n EXPENSE_TYPE_BY_ID = '_Receipts/EXPENSE_TYPE_BY_ID',\n RECEIPTS_COUNT = '_Receipts/RECEIPTS_COUNT',\n RECEIPT_BY_ID = '_Receipts/RECEIPT_BY_ID',\n EXPENSE_TYPES = '_Receipts/EXPENSE_TYPES',\n RECEIPTS = '_Receipts/RECEIPTS',\n RECEIPT_ATTACHMENTS = '_Receipts/RECEIPT_ATTACHMENTS',\n RECEIPT_DUPLICATES = '_Receipts/RECEIPT_DUPLICATES',\n SELECTED_RECEIPTS = '_Receipts/SELECTED_RECEIPTS',\n RECEIPT_BROWSING_LIST = '_Receipts/RECEIPT_BROWSING_LIST'\n}\n\nexport enum RECEIPTS_STORE_ACTIONS {\n GET_FILTERED_RECEIPTS = '_Receipts/GET_FILTERED_RECEIPTS',\n GET_RECEIPT = '_Receipts/GET_RECEIPT',\n GET_RECEIPT_ATTACHMENTS = '_Receipts/GET_RECEIPT_ATTACHMENTS',\n GET_RECEIPT_DUPLICATES = '_Receipts/GET_RECEIPT_DUPLICATES',\n MARK_AS_NON_DUPLICATE = '_Receipts/MARK_AS_NON_DUPLICATE',\n UPDATE_RECEIPT_DATA = '_Receipts/UPDATE_RECEIPT_DATA',\n SEND_TO_OUTBOUND = '_Receipts/SEND_TO_OUTBOUND',\n DIGITIZE_RECEIPT = '_Receipts/DIGITIZE_RECEIPT',\n SUBMIT_RECEIPT = '_Receipts/SUBMIT_RECEIPT',\n UNSUBMIT_RECEIPT = '_Receipts/UNSUBMIT_RECEIPT',\n RESUBMIT_RECEIPT = '_Receipts/RESUBMIT_RECEIPT',\n CONFIRM_RECEIPT = '_Receipts/CONFIRM_RECEIPT',\n DELETE_RECEIPT = '_Receipts/DELETE_RECEIPT',\n DELETE_RECEIPTS_MASS = '_Receipts/DELETE_RECEIPTS_MASS',\n REMOVE_RECEIPT = '_Receipts/REMOVE_RECEIPT',\n GET_OCRDATA = '_Receipts/GET_OCRDATA',\n GET_OCR = '_Receipts/GET_OCR',\n GET_EXPENSE_TPYES = 'GET_EXPENSE_TPYES',\n EXPORT_PERIODIC = '_Receipts/EXPORT_PERIODIC',\n EXPORT_RECEIPTS = '_Receipts/EXPORT_RECEIPTS',\n DOWNLOAD_RECEIPTS = '_Receipts/DOWNLOAD_RECEIPTS',\n DOWNLOAD_RECEIPT_PDF = '_Receipts/DOWNLOAD_RECEIPT_PDF',\n DOWNLOAD_IMPORT_SOURCE_FILE = '_Receipts/DOWNLOAD_IMPORT_SOURCE_FILE',\n CREATE_RECEIPT = '_Receipts/CREATE_RECEIPT',\n UPDATE_RECEIPT_BROWSING_LIST = '_Receipts/UPDATE_RECEIPT_BROWSING_LIST'\n}\n\nexport enum RECEIPTS_STORE_MUTATIONS {\n UPDATE_LOCAL_RECEIPT = '_Receipts/UPDATE_LOCAL_RECEIPT',\n REMOVE_RECEIPT = '_Receipts/REMOVE_RECEIPT',\n SET_RECEIPTS = '_Receipts/SET_RECEIPTS',\n SET_RECEIPT_VALUES = '_Receipts/SET_RECEIPT_VALUES',\n SET_RECEIPT_ATTACHMENTS = '_Receipts/SET_RECEIPT_ATTACHMENTS',\n SET_RECEIPT_DUPLICATES = '_Receipts/SET_RECEIPT_DUPLICATES',\n SET_EXPENSE_TYPES = '_Receipts/SET_EXPENSE_TYPES',\n SET_SELECTED_RECEIPTS = '_Receipts/SET_SELECTED_RECEIPTS',\n CLEAR_SELECTED_RECEIPTS = '_Receipts/CLEAR_SELECTED_RECEIPTS',\n SET_RECEIPT_BROWSING_LIST = '_Receipts/SET_RECEIPT_BROWSING_LIST',\n}\n\nexport enum EDITABLE_RECEIPT_KEY {\n PAYMENT_METHOD_ID = 'paymentMethodId',\n SUPPLIER_REG_NR = 'supplierRegNumber',\n SUPPLIER_VAT_NR = 'supplierVATNumber',\n BILLING_TYPE = 'billingType',\n DOCUMENT_ID = 'documentId',\n PAID_WITH = 'paidWith',\n COST_TYPE = 'costType',\n SUPPLIER = 'supplier',\n CURRENCY = 'currency',\n ITEM_ROWS = 'itemRows',\n DOC_TYPE = 'docType',\n DUE_DATE = 'dueDate',\n COMMENT = 'comment',\n REF_NUM = 'refNum',\n ORDER_ID = 'orderId',\n TRIP_ID = 'tripId',\n ISSUED = 'issued',\n IBAN = 'IBAN',\n SUM = 'sum',\n PAID = 'paid'\n}\n\nexport enum DOCUMENT_TYPE {\n ATTACHMENT = 'nonexpense',\n INVOICE = 'invoice',\n RECEIPT = 'receipt'\n}\n\nexport enum DOCUMENT_SUBTYPE {\n CAR_REGISTRATION_CARD = 'carRegistrationCard',\n CARD_STATEMENT = 'ccstatement'\n}\n\nexport enum BILLING_TYPE {\n PERSONAL = 'personal',\n COMPANY = 'company'\n}\n\nexport const BILLING_TYPE_TEXT = {\n [BILLING_TYPE.PERSONAL]: 'paidPersonally',\n [BILLING_TYPE.COMPANY]: 'paidByCompanyFunds'\n}\n\nexport enum PAID_WITH {\n TRANSFER = 'transfer',\n CASH = 'cash',\n CC = 'cc'\n}\n\nexport enum FIELD_TYPE {\n COST_TYPE = 'costType',\n ITEM_ROWS = 'itemRows',\n TEXTAREA = 'textarea',\n NUMBER = 'number',\n SELECT = 'select',\n TEXT = 'text',\n DATE = 'date',\n TIME = 'time',\n CHECKBOX = 'checkbox',\n CHECKMARK = 'checkmark',\n LIST = 'list'\n}\n\nexport enum COST_TYPE {\n REPRESENTATION = 'representationCost',\n BUSINESS = 'businessCost',\n TRANSPORT = 'transport',\n OTHER = 'otherCost',\n CAR = 'car'\n}\n\nexport enum ITEM_ROW_COLUMN_KEY {\n DESCRIPTION = 'description',\n CODE = 'code',\n UNIT = 'unit',\n QUANTITY = 'quantity',\n PRICE = 'price',\n VAT_RATE = 'vrt',\n VAT= 'vat',\n SUM = 'snv',\n TOTAL = 'sum',\n ITEM_CODE = 'itemCode',\n COST_OBJECTIVE = 'costObjective',\n PROJECT = 'project',\n ACCOUNT = 'account',\n DIMENSION = 'dimension',\n DEPARTMENT = 'department',\n VAT_CODE = 'VATCode'\n}\n\nexport enum DISPLAYED_ITEM_ROW_TYPE {\n SUM_INPUT = 'SUM_INPUT',\n VAT_LINE_INPUT = 'VAT_LINE_INPUT',\n ITEM_ROW_TOTALS = 'ITEM_ROW_TOTALS'\n}\n\nexport enum ITEM_ROW_KEY {\n ROW_NUM = 'rowNum',\n DESCRIPTION = 'description',\n CODE = 'code',\n UNIT = 'unit',\n QUANTITY = 'quantity',\n PRICE = 'price',\n VAT_RATE = 'VATrate',\n VAT = 'VATsum',\n SUM = 'sum',\n TOTAL = 'total'\n}\n\nexport enum RECEIPT_STATUS {\n FILE_RECEIVED = 1,\n DATA_RECEIVED = 2,\n THUMB_CREATED = 4,\n OCRDONE = 8,\n DIGITIZED = 16,\n XML_CREATED = 32,\n CHANNEL_AUTO = 64,\n CHANNEL_MANUAL = 128,\n CHANNEL_CANCEL = 256,\n DEPARTED = 512,\n NOT_DISTINCT = 1024,\n FROM_EMAIL = 2048,\n FILE_UPLOAD_STARTED = 4096,\n PROCESSING = 8192,\n APPROVING = 16384,\n APPROVED = 32768,\n BOUNCED = 65536,\n SUBMITTED = 131072,\n REJECTED = 262144,\n CURRENCY_PROCESSING = 524288,\n CURRENCY_CONVERTED = 1048576,\n READY = 2097152\n}\n\nexport enum RECEIPT_STATUS_CATEGORY {\n ATTACHMENT = 'ATTACHMENT',\n PROCESSING = 'PROCESSING',\n SUBMITTED = 'SUBMITTED',\n DIGITIZED = 'DIGITIZED',\n DIGITIZING = 'DIGITIZING',\n DRAFT = 'DRAFT',\n SENT = 'SENT',\n DUPLICATE = 'DUPLICATE',\n APPROVING = 'APPROVING',\n CONFIRMING = 'CONFIRMING',\n APPROVED = 'APPROVED',\n APPROVED_AND_SENT = 'APPROVED_AND_SENT',\n BOUNCED = 'BOUNCED',\n REJECTED = 'REJECTED',\n INVALID = 'INVALID',\n PICTURELESS = 'PICTURELESS',\n UNSUBMITTED = 'UNSUBMITTED',\n CURRENCY_PROCESSING = 'CURRENCY_PROCESSING',\n CURRENCY_CONVERTED = 'CURRENCY_CONVERTED'\n}\n\nexport enum STATUS_COLORS {\n YELLOW = '#ffcc14',\n PURPLE = '#7a0fce',\n GREEN = '#0fce91',\n BLUE = '#0053FF',\n RED = '#F22C5A',\n GREY = '#969bb0',\n WHITE = '#ffffff'\n}\n\nexport enum STATUS_BACKGROUND_COLORS {\n YELLOW = '#fff5d1',\n PURPLE = '#efdefd',\n GREEN = '#e3fdf5',\n BLUE = '#ebf2ff',\n RED = '#fee7ec',\n GREY = '#e4e7ed'\n}\n\nexport enum STATUS_SEQUENCE {\n NONE = 16,\n DRAFT = 15,\n BOUNCED = 14,\n INVALID = 13,\n PICTURELESS = 12,\n DUPLICATE = 11,\n REJECTED = 10,\n PROCESSING = 9,\n DIGITIZING = 8,\n APPROVING = 7,\n DIGITIZED = 6,\n CONFIRMING = 5,\n APPROVED = 4,\n APPROVED_AND_SENT = 3,\n SENT = 2,\n ATTACHMENT = 1,\n}\n","export const RECEIPT_UPLOADED = 'RECEIPT_UPLOADED'\r\n\r\nexport const EVENT_EF_STATE_CHANGED = 'ef-state-changed'\r\nexport const EVENT_APPROVAL_STATE_CHANGED = 'approval-state-changed'\r\nexport const EVENT_NEW_DOC = 'new-doc'\r\nexport const EVENT_NEW_REPORT = 'new-report'\r\nexport const EVENT_COMPANY_UPDATED = 'company-updated'","export enum COST_TYPES_STORE_STATE {\r\n EXPENSE_TYPES = 'CostTypes/EXPENSE_TYPES'\r\n}\r\n\r\nexport enum COST_TYPES_STORE_GETTERS {\r\n EXPENSE_TYPE_BY_ID = 'CostTypes/EXPENSE_TYPE_BY_ID',\r\n EXPENSE_TYPES = 'CostTypes/EXPENSE_TYPES'\r\n}\r\n\r\nexport enum COST_TYPES_STORE_ACTIONS {\r\n GET_EXPENSE_TYPES = 'CostTypes/GET_EXPENSE_TYPES',\r\n CREATE_EXPENSE_TYPE = 'CostTyes/CREATE_EXPENSE_TYPE',\r\n UPDATE_EXPENSE_TYPE = 'CostTypes/UPDATE_EXPENSE_TYPE',\r\n DELETE_EXPENSE_TYPE = 'CostTypes/DELETE_EXPENSE_TYPE'\r\n}\r\n\r\nexport enum COST_TYPES_STORE_MUTATIONS {\r\n SET_EXPENSE_TYPES = 'CostTypes/SET_EXPENSE_TYPES',\r\n SET_EXPENSE_TYPE = 'CostTypes/SET_EXPENSE_TYPE',\r\n DELETE_EXPENSE_TYPE = 'CostTypes/DELETE_EXPENSE_TYPE'\r\n}\r\n\r\nexport const DEFAULT_EXPENSE_TYPES = [\r\n {\r\n name: 'business cost',\r\n translations: {\r\n eng: 'business cost',\r\n est: 'majanduskulu',\r\n fin: 'liiketoimintakustannukset',\r\n lav: 'biznesa izmaksas',\r\n pol: 'koszty biznesowe',\r\n rus: 'экономические расходы',\r\n swe: 'företagskostnad',\r\n lit: 'verslo kaštai'\r\n }\r\n },\r\n {\r\n name: 'car',\r\n translations: {\r\n eng: 'car',\r\n est: 'sõiduauto',\r\n fin: 'auto',\r\n lav: 'automašīna',\r\n pol: 'samochód',\r\n rus: 'автомобиль',\r\n swe: 'bil',\r\n lit: 'automobilis'\r\n }\r\n },\r\n {\r\n name: 'other cost',\r\n translations: {\r\n eng: 'other cost',\r\n est: 'muu kulu',\r\n fin: 'muut kustannukset',\r\n lav: 'citas izmaksas',\r\n pol: 'inne koszty',\r\n rus: 'другие расходы',\r\n swe: 'övrig kostnad',\r\n lit: 'kiti kaštai'\r\n }\r\n },\r\n {\r\n name: 'representation cost',\r\n translations: {\r\n eng: 'representation cost',\r\n est: 'esinduskulu',\r\n fin: 'edustuskustannukset',\r\n lav: 'reprezentācijas izdevumi',\r\n pol: 'koszty reprezentacyjne',\r\n rus: 'представительские расходы',\r\n swe: 'representationskostnad',\r\n lit: 'reprezentaciniai kaštai'\r\n }\r\n },\r\n {\r\n name: 'transport',\r\n translations: {\r\n eng: 'transport',\r\n est: 'transport',\r\n fin: 'kuljetus',\r\n lav: 'cits transports',\r\n pol: 'transport',\r\n rus: 'транспорт',\r\n swe: 'transport',\r\n lit: 'transportas'\r\n }\r\n }\r\n]\r\n","export enum TRIPS_STORE_STATE {\n TRIPS = 'Trips/TRIPS',\n ALLOWANCE = 'Trips/ALLOWANCE',\n STATEMENT = 'Trips/STATEMENT',\n STATEMENT_FORMATS = 'Trips/STATEMENT_FORMATS'\n}\n\nexport enum TRIPS_STORE_MUTATIONS {\n SET_TRIPS = 'Trips/SET_TRIPS',\n SET_TRIP_VALUES = 'Trips/SET_TRIP_VALUES',\n REMOVE_TRIP = 'Trips/REMOVE_TRIP',\n SET_DAILY_ALLOWANCE = 'Trips/SET_DAILY_ALLOWANCE',\n SET_DAILY_ALLOWANCE_ITEM = 'Trips/SET_DAILY_ALLOWANCE_ITEM',\n REMOVE_DAILY_ALLOWANCE_ITEM = 'Trips/REMOVE_DAILY_ALLOWANCE_ITEM',\n SET_STATEMENT = 'Trips/SET_STATEMENT',\n REMOVE_STATEMENT = 'Trips/REMOVE_STATEMENT',\n SET_STATEMENT_TRANSACTION = 'Trips/SET_STATEMENT_TRANSACTION',\n SET_STATEMENT_FORMATS = 'Trips/SET_STATEMENT_FORMATS'\n}\n\nexport enum TRIPS_STORE_ACTIONS {\n GET_TRIPS = 'Trips/GET_TRIPS',\n GET_FILTERED_TRIPS= 'Trips/GET_FILTERED_TRIPS',\n GET_UNSUBMITTED_CARD_REPORTS = 'Trips/GET_UNSUBMITTED_CARD_REPORTS',\n UPDATE_TRIP_VALUES = 'Trips/UPDATE_TRIP_VALUES',\n DELETE_TRIP = 'Trips/DELETE_TRIP',\n REMOVE_TRIP = 'Trips/REMOVE_TRIP',\n GET_TRIP = 'Trips/GET_TRIP',\n NEW_TRIP = 'Trips/NEW_TRIP',\n EXPORT_TRIP = 'Trips/EXPORT_TRIP',\n IMPORT_TRIP = 'Trips/IMPORT_TRIP',\n GET_ALLOWANCE = 'Trips/GET_ALLOWNACE',\n SAVE_ALLOWANCE = 'Trips/SAVE_ALLOWANCE',\n UPDATE_ALLOWANCE = 'Trips/UPDATE_ALLOWANCE',\n DELETE_ALLOWANCE = 'Trips/DELETE_ALLOWANCE',\n GET_STATEMENT = 'Trips/GET_STATEMENT',\n DELETE_STATEMENT = 'Trips/DELETE_STATEMENT',\n GET_STATEMENT_FORMATS = 'Trips/GET_STATEMENT_FORMATS',\n SUBMIT_TRIP = 'Trips/SUBMIT_TRIP',\n UNSUBMIT_TRIP = 'Trips/UNSUBMIT_TRIP',\n RESUBMIT_TRIP = 'Trips/RESUBMIT_TRIP',\n SEND_TRIP_TO_SOFTWARE = 'Trips/SEND_TRIP_TO_SOFTWARE',\n CONFIRM_AND_SEND = 'Trips/CONFIRM_AND_SEND'\n}\n\nexport enum TRIPS_STORE_GETTERS {\n TRIPS = 'Trips/TRIPS',\n ALLOWANCE = 'Trips/ALLOWANCE',\n STATEMENT = 'Trips/STATEMENT',\n STATEMENT_FORMATS = 'Trips/STATEMENT_FORMATS'\n}\n\nexport enum TRIP_TYPE {\n EXPENSE = 'expense',\n TRAVEL = 'travel',\n MILEAGE = 'mileage',\n CREDIT_CARD = 'creditcard',\n DEBIT_CARD = 'debitcard'\n}\n\nexport enum TRIP_ACTION {\n ADD_DOCUMENT = 'ADD_DOCUMENT',\n ADD_MILEAGE = 'ADD_MILEAGE',\n SUBMIT = 'SUBMIT',\n SEND = 'SEND',\n CONFIRM_AND_SEND = 'CONFIRM_AND_SEND',\n EXPORT = 'EXPORT',\n EXPORT_AND_COPY = 'EXPORT_AND_COPY',\n UNARCHIVE = 'UNARCHIVE',\n EDIT = 'EDIT',\n COPY_EMAIL = 'COPY_EMAIL',\n DELETE = 'DELETE'\n}\n\nexport enum TRIP_CONTENT_TAB {\n RECEIPTS = 'receipts',\n MILEAGE = 'mileage'\n}\n\nexport enum TRIP_STATUS {\n NONE = 0,\n CONFIRMED = 1,\n PROCESSING = 2,\n SENT = 4,\n BOUNCED = 8,\n DIGITIZING = 16,\n DIGITIZED = 32,\n APPROVING = 64,\n APPROVED = 128,\n REJECTED = 256,\n READY = 512,\n CURRENCY_PROCESSING = 1024,\n CURRENCY_CONVERTED = 2048\n}\n\nexport enum TRIP_STATUS_CATEGORY {\n SUBMITTED = 'SUBMITTED',\n PROCESSING = 'PROCESSING',\n DIGITIZING = 'DIGITIZING',\n DRAFT = 'DRAFT',\n SENT = 'SENT',\n APPROVING = 'APPROVING',\n APPROVED = 'APPROVED',\n APPROVED_AND_SENT = 'APPROVED_AND_SENT',\n BOUNCED = 'BOUNCED',\n REJECTED = 'REJECTED',\n CONFIRMING = 'CONFIRMING',\n CURRENCY_PROCESSING = 'CURRENCY_PROCESSING',\n CURRENCY_CONVERTED = 'CURRENCY_CONVERTED'\n}\n\nexport enum TRIP_STATUS_SEQUENCE {\n SENT = 1,\n APPROVED_AND_SENT = 2,\n APPROVED = 3,\n CONFIRMING = 4,\n APPROVING = 5,\n DIGITIZING = 6,\n PROCESSING = 7,\n SUBMITTED = 8,\n REJECTED = 9,\n BOUNCED = 10,\n DRAFT = 11\n}\n\nexport const TRIP_STATUS_VALIDATOR = {\n NONE: [\n -TRIP_STATUS.CONFIRMED,\n -TRIP_STATUS.PROCESSING,\n -TRIP_STATUS.SENT,\n -TRIP_STATUS.BOUNCED,\n -TRIP_STATUS.APPROVING,\n -TRIP_STATUS.APPROVED,\n -TRIP_STATUS.REJECTED,\n -TRIP_STATUS.READY\n ],\n CONFIRMED: [+TRIP_STATUS.CONFIRMED, -TRIP_STATUS.READY, -TRIP_STATUS.SENT, -TRIP_STATUS.BOUNCED],\n PROCESSING: [+TRIP_STATUS.PROCESSING, -TRIP_STATUS.READY, -TRIP_STATUS.BOUNCED, -TRIP_STATUS.SENT],\n APPROVING: [+TRIP_STATUS.APPROVING, -TRIP_STATUS.BOUNCED, -TRIP_STATUS.SENT],\n APPROVED: [+TRIP_STATUS.APPROVED],\n REJECTED: [+TRIP_STATUS.REJECTED, -TRIP_STATUS.BOUNCED, -TRIP_STATUS.SENT],\n READY: [+TRIP_STATUS.READY, -TRIP_STATUS.BOUNCED, -TRIP_STATUS.SENT],\n SENT: [+TRIP_STATUS.CONFIRMED, +TRIP_STATUS.SENT, -TRIP_STATUS.BOUNCED],\n BOUNCED: [+TRIP_STATUS.BOUNCED]\n}\n\nexport enum TRAVEL_REPORT_FIELDS {\n DESTINATION = 'destination',\n START_DATE = 'startDate',\n END_DATE = 'endDate',\n START_TIME = 'startTime',\n END_TIME = 'endTime',\n DEPART_BEFORE_3 = 'departBefore03',\n DEPART_AFTER_22 = 'departAfter22',\n ONE_FREE_MEAL = 'oneFreeMeal',\n TWO_FREE_MEALS = 'twoFreeMeals',\n MEAL_AND_ACCOMODATION = 'mealAndAccomodation',\n RETURN_OVERNIGHT = 'returnOvernight',\n CALCULATE_WEEKENDS = 'calculateWeekends',\n BREAKFAST_INCLUDED = 'breakfastIncluded',\n LUNCH_INCLUDED = 'lunchIncluded',\n DINNER_INCLUDED = 'dinnerIncluded',\n NEXT_TRIP_ON_LAST_DAY = 'nextTripOnLastDay',\n MAX_ALLOWANCE = 'maxAllowance'\n}\n\nexport const TRIP_CHECKBOX_FIELD_LABEL = {\n [TRAVEL_REPORT_FIELDS.DEPART_BEFORE_3]: 'arrivedBefore',\n [TRAVEL_REPORT_FIELDS.DEPART_AFTER_22]: 'businessTripStarted',\n [TRAVEL_REPORT_FIELDS.MEAL_AND_ACCOMODATION]: 'accomodationAndFreeMeal',\n [TRAVEL_REPORT_FIELDS.RETURN_OVERNIGHT]: 'returnedHomeOvernight',\n [TRAVEL_REPORT_FIELDS.CALCULATE_WEEKENDS]: 'calculateAllowanceWeekends',\n [TRAVEL_REPORT_FIELDS.BREAKFAST_INCLUDED]: 'breakfastIncluded',\n [TRAVEL_REPORT_FIELDS.LUNCH_INCLUDED]: 'lunchIncluded',\n [TRAVEL_REPORT_FIELDS.DINNER_INCLUDED]: 'dinnerIncluded',\n [TRAVEL_REPORT_FIELDS.NEXT_TRIP_ON_LAST_DAY]: 'nextTripOnLastDay'\n}\n","export enum APPROVALS_STORE_STATE {\n APPROVALS = 'Approvals/APPROVALS',\n APPROVERS = 'Approvals/APPROVERS'\n}\n\nexport enum APPROVALS_STORE_GETTERS {\n APPROVALS = 'Approvals/APPROVALS',\n APPROVAL_ITEM = 'Approvals/APPROVAL_ITEM',\n APPROVER_OPTIONS = 'Approvals/APPROVER_OPTIONS'\n}\n\nexport enum APPROVALS_STORE_ACTIONS {\n GET_ALL_APPROVALS = 'Approvals/GET_ALL_APPROVALS',\n GET_APPROVAL = 'Approvals/GET_APPROVAL',\n GET_TRIP_APPROVAL = 'Approvals/GET_TRIP_APPROVAL',\n GET_RECEIPT_APPROVAL = 'Approvals/GET_RECEIPT_APPROVAL',\n GET_APPROVER_OPTIONS = 'Approvals/GET_APPROVER_OPTIONS',\n DELETE_APPROVAL = 'Approvals/DELETE_APPROVAL',\n APPROVE = 'Approvals/APPROVE',\n REJECT = 'Approvals/REJECT',\n APPEND = 'Approvals/APPEND',\n DELEGATE = 'Approvals/DELEGATE',\n ADD_DECISION = 'Approvals/ADD_DECISION',\n DELETE_DECISION = 'Approvals/DELETE_DECISION'\n}\n\nexport enum APPROVALS_STORE_MUTATIONS {\n SET_APPROVALS = 'Approvals/SET_APPROVALS',\n SET_APPROVAL = 'Approvals/SET_APPROVAL',\n SET_APPROVER_OPTIONS = 'Approvals/SET_APPROVER_OPTIONS',\n DELETE_APPROVAL = 'Approvals/DELETE_APPROVAL'\n}\n\nexport enum APPROVAL_STATE {\n PREPARED = 'PREPARED', // Approval or decision has been created. In case of decision, the approver has not been notified yet. Approval decision cannot be made in this state.\n DELEGATED = 'DELEGATED', // Approval has been delegated to another approver.\n PENDING = 'PENDING', // Approval / decision is in process.\n REJECTED = 'REJECTED', // Approval has been rejected, or decision has been made against.\n APPROVED = 'APPROVED' // Approval has been approved, or decision has been made for.\n}\n\nexport enum APPROVAL_STATE_COLOR {\n PREPARED = '#e3e3e4',\n DELEGATED = '#e3e3e4',\n PENDING = '#ffcc14',\n REJECTED = '#f22c5a',\n APPROVED = '#0fce91'\n}\n\nexport enum APPROVAL_ACTION {\n REJECT = 'reject',\n APPROVE = 'approve',\n COMMENT_AND_APPROVE = 'commentAndApprove',\n DELEGATE = 'delegateDecision',\n APPEND = 'addApprover',\n CANCEL_APPROVAL = 'cancelApproval',\n DELETE_APPROVER = 'delete',\n UNSELECT = 'unselect'\n}\n","export enum APPROVAL_SETTINGS_STORE_STATE {\r\n APPROVAL_WORKFLOWS = 'ApprovalSettings/APPROVAL_WORKFLOWS',\r\n APPROVAL_POLICIES = 'ApprovalSettings/APPROVAL_POLICIES',\r\n APPROVAL_OPTIONS = 'ApprovalSettings/APPROVAL_OPTIONS'\r\n}\r\n\r\nexport enum APPROVAL_SETTINGS_STORE_GETTERS {\r\n APPROVAL_WORKFLOWS = 'ApprovalSettings/APPROVAL_WORKFLOWS',\r\n APPROVAL_POLICIES = 'ApprovalSettings/APPROVAL_POLICIES',\r\n APPROVAL_WORKFLOW = 'ApprovalSettings/APPROVAL_WORKFLOW',\r\n APPROVAL_POLICY = 'ApprovalSettings/APPROVAL_POLICY',\r\n APPROVAL_OPTIONS = 'ApprovalSettings/APPROVAL_OPTIONS'\r\n}\r\n\r\nexport enum APPROVAL_SETTINGS_STORE_ACTIONS {\r\n GET_WORKFLOWS = 'ApprovalSettings/GET_WORKFLOWS',\r\n GET_WORKFLOW = 'ApprovalSettings/GET_WORKFLOW',\r\n GET_POLICIES = 'ApprovalSettings/GET_POLICIES',\r\n GET_APPROVAL_OPTIONS = 'ApprovalSettings/GET_APPROVAL_OPTIONS',\r\n CREATE_WORKFLOW = 'ApprovalSettings/CREATE_WORKFLOW',\r\n CREATE_POLICY = 'ApprovalSettings/CREATE_POLICY',\r\n CREATE_ROUND = 'ApprovalSettings/CREATE_ROUND',\r\n ADD_ROUND_APPROVER = 'ApprovalSettings/ADD_ROUND_APPROVER',\r\n UPDATE_WORKFLOW = 'ApprovalSettings/UPDATE_WORKFLOW',\r\n DELETE_ROUND_APPROVER = 'ApprovalSettings/DELETE_ROUND_APPROVER',\r\n DELETE_ROUND = 'ApprovalSettings/DELETE_ROUND',\r\n DELETE_TARGET = 'ApprovalSettings/DELETE_TARGET',\r\n DELETE_WORKFLOW = 'ApprovalSettings/DELETE_WORKFLOW',\r\n DELETE_POLICY = 'ApprovalSettings/DELETE_POLICY'\r\n}\r\n\r\nexport enum APPROVAL_SETTINGS_STORE_MUTATIONS {\r\n SET_APPROVAL_WORKFLOWS = 'ApprovalSettings/SET_APPROVAL_WORKFLOWS',\r\n SET_APPROVAL_POLICIES = 'ApprovalSettings/SET_APPROVAL_POLICIES',\r\n SET_APPROVAL_WORKFLOW = 'ApprovalSettings/SET_APPROVAL_WORKFLOW',\r\n SET_WORKFLOW_VALUE = 'ApprovalSettings/SET_WORKFLOW_VALUE',\r\n SET_APPROVAL_POLICY = 'ApprovalSettings/SET_APPROVAL_POLICY',\r\n SET_APPROVAL_ROUND = 'ApprovalSettings/SET_APPROVAL_ROUND',\r\n SET_APPROVAL_OPTIONS = 'ApprovalSettings/SET_APPROVAL_OPTIONS',\r\n DELETE_WORKFLOW = 'ApprovalSettings/DELETE_WORKFLOW',\r\n DELETE_POLICY = 'ApprovalSettings/DELETE_POLICY'\r\n}\r\n\r\nexport enum APPROVAL_SCOPE {\r\n ROUND = 'ROUND',\r\n WORKFLOW = 'WORKFLOW',\r\n COMPANY = 'COMPANY'\r\n}\r\n\r\nexport enum POLICY {\r\n TARGET_SUBMITTERS = 'TARGET_SUBMITTERS',\r\n MIN_AUTOAPPORVAL_SUM = 'MIN_AUTOAPPORVAL_SUM',\r\n MAX_APPROVABLE_SUM = 'MAX_APPROVABLE_SUM',\r\n DISABLE_NOTIFICATIONS = 'DISABLE_NOTIFICATIONS',\r\n NOTIFICATION_SCHEDULE = 'NOTIFICATION_SCHEDULE',\r\n REMINDER_INTERVAL_DAYS = 'REMINDER_INTERVAL_DAYS',\r\n OUT_OF_WORKFLOW_APPROVAL_ACTION = 'OUT_OF_WORKFLOW_APPROVAL_ACTION',\r\n ALLOW_ANYONE_AS_DELEGATE = 'ALLOW_ANYONE_AS_DELEGATE',\r\n NUM_OF_REQUIRED_APPROVALS = 'NUM_OF_REQUIRED_APPROVALS',\r\n TARGET_TYPE = 'TARGET_TYPE',\r\n APPROVAL_DEFAULT = 'APPROVAL_DEFAULT',\r\n TARGET_SUM = 'TARGET_SUM',\r\n TARGET_MINIMUM_SUM = 'TARGET_MINIMUM_SUM',\r\n TARGET_MAXIMUM_SUM = 'TARGET_MAXIMUM_SUM',\r\n TARGET_COST_TYPES = 'TARGET_COST_TYPES',\r\n SPENDING_LIMIT = 'SPENDING_LIMIT',\r\n MAX_MONTHLY_SPENDING_LIMIT = 'MAX_MONTHLY_SPENDING_LIMIT',\r\n MAX_QUARTERLY_SPENDING_LIMIT = 'MAX_QUARTERLY_SPENDING_LIMIT',\r\n MAX_YEARLY_SPENDING_LIMIT = 'MAX_YEARLY_SPENDING_LIMIT',\r\n INPUT_ACCOUNTING_FIELDS = 'INPUT_ACCOUNTING_FIELDS'\r\n}\r\n\r\nexport enum POLICY_TITLE {\r\n TARGET_SUBMITTERS = 'addTargetSubmitters',\r\n MIN_AUTOAPPORVAL_SUM = 'minAutoApprovalSum',\r\n MAX_APPROVABLE_SUM = 'maxApprovableSum',\r\n DISABLE_NOTIFICATIONS = 'disableNotifications',\r\n NOTIFICATION_SCHEDULE = 'notificationSchedule',\r\n REMINDER_INTERVAL_DAYS = 'reminderIntervalDays',\r\n OUT_OF_WORKFLOW_APPROVAL_ACTION = 'approvalDefault', //'outOfWorkflowAction',\r\n ALLOW_ANYONE_AS_DELEGATE = 'allowAnyoneAsDelegate',\r\n NUM_OF_REQUIRED_APPROVALS = 'numOfRequiredApprovals',\r\n TARGET_TYPE = 'targetType',\r\n APPROVAL_DEFAULT = 'approvalDefault',\r\n TARGET_SUM = 'targetSum',\r\n TARGET_MINIMUM_SUM = 'targetMinimumSum',\r\n TARGET_MAXIMUM_SUM = 'targetMaximumSum',\r\n TARGET_COST_TYPES = 'targetExpenseTypes',\r\n SPENDING_LIMIT = 'spendingLimit',\r\n MAX_MONTHLY_SPENDING_LIMIT = 'monthlySpendingLimit',\r\n MAX_QUARTERLY_SPENDING_LIMIT = 'quarterlySpendingLimit',\r\n MAX_YEARLY_SPENDING_LIMIT = 'yearlySpendingLimit',\r\n INPUT_ACCOUNTING_FIELDS = 'approverInput'\r\n}\r\n\r\nexport enum POLICY_DESCRIPTION {\r\n MIN_AUTOAPPORVAL_SUM = 'minAutoApprSumDescr',\r\n MAX_APPROVABLE_SUM = 'maxApprSumDescr',\r\n // DISABLE_NOTIFICATIONS = 'disableNotificDescr',\r\n NOTIFICATION_SCHEDULE = 'notificationScheduleDescr',\r\n OUT_OF_WORKFLOW_APPROVAL_ACTION = 'nonWorkflowActionDescr',\r\n ALLOW_ANYONE_AS_DELEGATE = 'allowAnyoneDelegateDescr',\r\n NUM_OF_REQUIRED_APPROVALS = 'numRequiredApprDescr',\r\n TARGET_TYPE = 'targetTypeDescr',\r\n APPROVAL_DEFAULT = 'approvalDefaultDescr',\r\n TARGET_SUM = 'targetSumDescr',\r\n TARGET_MINIMUM_SUM = 'targetSumDescr',\r\n TARGET_MAXIMUM_SUM = 'targetSumDescr',\r\n TARGET_COST_TYPES = 'targetExpenseTypesDescr',\r\n SPENDING_LIMIT = 'spendingLimitDescr',\r\n MAX_MONTHLY_SPENDING_LIMIT = 'spendingLimitDescr',\r\n MAX_QUARTERLY_SPENDING_LIMIT = 'spendingLimitDescr',\r\n MAX_YEARLY_SPENDING_LIMIT = 'spendingLimitDescr',\r\n INPUT_ACCOUNTING_FIELDS = 'approverInputDescr'\r\n}\r\n\r\nexport enum COMPANY_CURRENCY {\r\n DEFAULT = 'EUR',\r\n SE = 'SEK',\r\n PL = 'PLN'\r\n}\r\n\r\nexport enum SUBJECT_ROLENAME {\r\n SUBMITTER = 'allSubmitters',\r\n ADMIN = 'allAdmins'\r\n}\r\n\r\nexport enum SPENDING_LIMIT {\r\n MAX_MONTHLY_SPENDING_LIMIT = 'monthlySpendingLimit',\r\n MAX_QUARTERLY_SPENDING_LIMIT = 'quarterlySpendingLimit',\r\n MAX_YEARLY_SPENDING_LIMIT = 'yearlySpendingLimit'\r\n}\r\n\r\nexport enum TARGET_SUM {\r\n TARGET_MINIMUM_SUM = 'TARGET_MINIMUM_SUM',\r\n TARGET_MAXIMUM_SUM = 'TARGET_MAXIMUM_SUM'\r\n}\r\n\r\nexport enum APPROVAL_DEFAULT {\r\n REJECT = 'reject',\r\n APPROVE = 'approve'\r\n}\r\n\r\nexport enum OUT_OF_WORKFLOW_APPROVAL_ACTION {\r\n REJECT = 'reject',\r\n APPROVE = 'approve'\r\n}\r\n\r\nexport enum TARGET_SUBTYPE {\r\n DAILY_ALLOWANCE = 'dailyAllowance',\r\n ADVANCE_PAYMENT = 'advancePayment'\r\n}\r\n\r\nexport enum TARGET_TYPE {\r\n DOCUMENT = 'receipts',\r\n RECEIPT = 'onlyReceipts',\r\n INVOICE = 'invoices',\r\n EINVOICE = 'einvoices',\r\n EMAIL = 'submittedByEmail',\r\n REPORT = 'reports',\r\n EXPENSE_REPORT = 'expenseReports',\r\n TRAVEL_REPORT = 'travelReports',\r\n MILEAGE_REPORT = 'mileageReports',\r\n CREDIT_CARD_REPORT = 'creditCardReports'\r\n}\r\n\r\nexport enum TARGET_TYPE_PARENT {\r\n RECEIPT = 'DOCUMENT',\r\n INVOICE = 'DOCUMENT',\r\n EINVOICE = 'DOCUMENT',\r\n EMAIL = 'DOCUMENT',\r\n EXPENSE_REPORT = 'REPORT',\r\n TRAVEL_REPORT = 'REPORT',\r\n MILEAGE_REPORT = 'REPORT',\r\n CREDIT_CARD_REPORT = 'REPORT'\r\n}\r\n\r\nexport const enumOptions = {\r\n OUT_OF_WORKFLOW_APPROVAL_ACTION,\r\n TARGET_SUBTYPE,\r\n TARGET_TYPE,\r\n APPROVAL_DEFAULT\r\n}\r\n","export enum MILEAGE_STORE_STATE {\r\n MILEAGE = 'Mileage/MILEAGE'\r\n}\r\n\r\nexport enum MILEAGE_STORE_GETTERS {\r\n MILEAGE = 'Mileage/MILEAGE',\r\n MILEAGE_ITEM = 'Mileage/MILEAGE_ITEM'\r\n}\r\n\r\nexport enum MILEAGE_STORE_ACTIONS {\r\n GET_MILEAGE = 'Mileage/GET_MILEAGE',\r\n GET_TRIP_MILEAGE = 'Mileage/GET_TRIP_MILEAGE',\r\n ADD_MILEAGE_ITEM = 'Mileage/ADD_MILEAGE_ITEM',\r\n UPDATE_MILEAGE_ITEM = 'Mileage/UPDATE_MILEAGE_ITEM',\r\n DELETE_MILEAGE_ITEM = 'Mileage/DELETE_MILEAGE_ITEM'\r\n}\r\n\r\nexport enum MILEAGE_STORE_MUTATIONS {\r\n SET_MILEAGE = 'Mileage/SET_MILEAGE',\r\n REMOVE_MILEAGE = 'Mileage/REMOVE_MILEAGE'\r\n}\r\n\r\nexport enum MILEAGE_FIELDS {\r\n VEHICLE = 'vehicle',\r\n PLATE_NUMBER = 'plateNumber',\r\n START_ADDRESS = 'startingPointAddress',\r\n DESTINATION_ADDRESS = 'destinationAddress',\r\n DISTANCE = 'totalDistance',\r\n ROUND_TRIP = 'roundTrip',\r\n DATE = 'date',\r\n COMMENT = 'comment',\r\n SUM = 'sum',\r\n ADDITIONAL_INFO = 'additionalInfoShort'\r\n}\r\n\r\nexport enum VEHICLE_TYPE {\r\n PRIVATE_CAR = 'privateCar',\r\n COMPANY_CAR = 'companyCar',\r\n MOTORBOAT = 'motorboat',\r\n MOTORCYCLE = 'motorcycle',\r\n MOPED = 'moped',\r\n SNOWMOBILE = 'snowmobile',\r\n QUADBIKE = 'quadbike',\r\n OTHER = 'other'\r\n}\r\n","export enum CURRENCY {\n EUR = 'EUR',\n GBP = 'GBP',\n USD = 'USD'\n}\n\nexport enum CURRENCY_SYMBOL {\n EUR = '€',\n GBP = '£',\n USD = '$',\n SEK = 'kr',\n NOK = 'kr',\n PLN = 'zł',\n RUB = '₽'\n}\n\nexport enum CONVERSION_MODE {\n TRANSACTION_DAY = 'transaction-day',\n PREVIOUS_DAY = 'previous-transaction-day',\n FOLLOWING_WORKDAY = 'first-workday-after-trip'\n}\n","export enum SETTING_STORE_STATE {\r\n ACTIVE_DATES = 'Setting/ACTIVE_DATES',\r\n SELECT_RECEIPTS_BY = 'Setting/SELECT_RECEIPTS_BY',\r\n SELECT_TRIPS_BY = 'Setting/SELECT_TRIPS_BY',\r\n LOADING_STATE = 'Setting/LOADING_STATE'\r\n}\r\n\r\nexport enum SETTING_STORE_MUTATIONS {\r\n SET_ACTIVE_DATES = 'Setting/SET_ACTIVE_DATES',\r\n SET_SELECT_RECEIPTS_BY = 'Seting/SET_SELECT_RECEIPTS_BY',\r\n SET_SELECT_TRIPS_BY = 'Seting/SET_SELECT_TRIPS_BY',\r\n SET_LOADING_STATE = 'Setting/SET_LOADING_STATE'\r\n}\r\n\r\nexport enum SETTING_STORE_ACTIONS {\r\n UPDATE_ACTIVE_DATES = 'Setting/UPDATE_ACTIVE_DATES',\r\n UPDATE_LOADING_STATE = 'Setting/UPDATE_LOADING_STATE',\r\n UPDATE_SELECT_RECEIPTS_BY = 'Seting/UPDATE_SELECT_RECEIPTS_BY',\r\n UPDATE_SELECT_TRIPS_BY = 'Seting/UPDATE_SELECT_TRIPS_BY',\r\n}\r\n\r\nexport enum SETTING_STORE_GETTERS {\r\n ACTIVE_DATES = 'Setting/ACTIVE_DATES',\r\n SELECT_RECEIPTS_BY = 'Setting/SELECT_RECEIPTS_BY',\r\n SELECT_TRIPS_BY = 'Setting/SELECT_TRIPS_BY',\r\n IS_LOADING = 'Setting/IS_LOADING'\r\n}\r\n\r\nexport enum SORT_KEY {\r\n STATUS = 'status',\r\n ISSUED = 'issued',\r\n SUBMITTER = 'submitter',\r\n CREATED_AT = 'createdAt',\r\n SUBMITTED_AT = 'submittedAt',\r\n TIME_SUBMITTED = 'ts',\r\n DOCUMENT_ID = 'documentId',\r\n SUPPLIER = 'supplier',\r\n NAME = 'name',\r\n SUM = 'sum',\r\n REIMBURSABLE = 'billingType',\r\n EXTREF = 'extRef',\r\n CARDLFD = 'cardLfd',\r\n BANKNAME = 'bankName',\r\n DATE = 'date',\r\n CURRENCY = 'currency',\r\n DOCUMENT_TYPE = 'docType',\r\n DOCUMENT = 'document',\r\n EXPENSE_TYPE = 'costType',\r\n COMMENT = 'comment'\r\n}\r\n\r\nexport enum SORT_DIRECTION {\r\n ASCENDING = 'ascending',\r\n DESCENDING = 'descending'\r\n}\r\n\r\nexport enum TABLE_NAME {\r\n APPROVALS = 'approvals',\r\n DOCUMENTS = 'documents',\r\n TRANSACTIONS = 'transactions',\r\n TRIPS = 'trips'\r\n}\r\n\r\nexport enum DATE_FILTER_SELECTIONS {\r\n FROM_PAST_MONTH = 'FROM_PAST_MONTH',\r\n ONGOING_MONTH = 'ONGOING_MONTH',\r\n ONGOING_YEAR = 'ONGOING_YEAR',\r\n PAST_MONTH = 'PAST_MONTH',\r\n YESTERDAY = 'YESTERDAY',\r\n CUSTOM = 'CUSTOM',\r\n TODAY = 'TODAY'\r\n}\r\n\r\nexport enum NAVIGATION_TAB {\r\n RECEIPTS = 'receipts',\r\n REPORTS = 'reports',\r\n TRANSACTIONS = 'transactions',\r\n APPROVALS = 'approvals'\r\n}\r\n\r\nexport enum TRIP_DATES_CRITERIA {\r\n CREATED_AT = 'reportAddedBetween',\r\n CREATED_FOR = 'reportDatedBetween',\r\n ALL = 'reportDatedOrAdded'\r\n}\r\n\r\nexport enum RECEIPT_DATES_CRITERIA {\r\n ISSUED = 'docIssuedBetween',\r\n CREATED = 'docAddedBetween'\r\n}","export enum OVERVIEW_STORE_STATE {\r\n TRIPS_COUNT = 'Overview/TRIPS_COUNT',\r\n RECEIPTS_COUNT = 'Overvoew/RECEIPTS_COUNT'\r\n}\r\n\r\nexport enum OVERVIEW_STORE_GETTERS {\r\n TRIPS_COUNT = 'Overview/TRIPS_COUNT',\r\n RECEIPTS_COUNT = 'Overview/RECEIPTS_COUNT'\r\n}\r\n\r\nexport enum OVERVIEW_STORE_ACTIONS {\r\n GET_TRIPS_COUNT = 'Overview/GET_TRIPS_COUNT',\r\n GET_RECEIPTS_COUNT = 'Overview/GET_RECEIPTS_COUNT',\r\n}\r\n\r\nexport enum OVERVIEW_STORE_MUTATIONS {\r\n SET_TRIPS_COUNT = 'Overview/SET_TRIPS_COUNT',\r\n SET_RECEIPTS_COUNT = 'Overview/SET_RECEIPTS_COUNT',\r\n}\r\n\r\nexport enum OVERVIEW_STATUS_LABELS {\r\n PICTURELESS = 'noPicture',\r\n UNSUBMITTED = 'draft',\r\n DUPLICATE = 'notDistinct',\r\n DIGITIZING = 'digitizing',\r\n DIGITIZED = 'digitized',\r\n PROCESSING = 'tripProcessing',\r\n APPROVING = 'approving',\r\n BOUNCED = 'forwardingFailed',\r\n SENT = 'forwardingSuccess',\r\n DRAFT = 'draft'\r\n}\r\n\r\nexport enum OVERVIEW_STATUS_KEYS {\r\n NoPicture = 'PICTURELESS',\r\n Unsubmitted = 'UNSUBMITTED',\r\n NotDistinct = 'DUPLICATE',\r\n Digitizing = 'DIGITIZING',\r\n Digitized = 'DIGITIZED',\r\n Processing = 'PROCESSING',\r\n Approving = 'APPROVING',\r\n Bounced = 'BOUNCED',\r\n Sent = 'SENT',\r\n Draft = 'DRAFT',\r\n}\r\n\r\nexport enum OVERVIEW_STATUS_COLORS {\r\n PICTURELESS = 'RED',\r\n UNSUBMITTED = 'GREY',\r\n DUPLICATE = 'RED',\r\n DIGITIZING = 'BLUE',\r\n DIGITIZED = 'YELLOW',\r\n PROCESSING = 'BLUE',\r\n APPROVING = 'BLUE',\r\n BOUNCED = 'RED',\r\n SENT = 'GREEN',\r\n DRAFT = 'GREY',\r\n}\r\n","export enum E_INVOICING_INTEGRATION_STATUS {\r\n PENDING = 'PENDING',\r\n INACTIVE = 'INACTIVE',\r\n ACTIVE = 'ACTIVE'\r\n}\r\n\r\nexport enum E_INVOICING_SETTINGS {\r\n EINVOICE_PREFER_ROW_GROUPS = 'EINVOICE_PREFER_ROW_GROUPS',\r\n EINVOICE_NOTIFICATIONS = 'EINVOICE_NOTIFICATIONS',\r\n EINVOICE_DISABLE_AUTOACCEPT = 'EINVOICE_DISABLE_AUTOACCEPT'\r\n}\r\n\r\nexport enum E_INVOICING_WARNING {\r\n EINVOICING_CONTRACT_ALREADY_EXISTS = 'EINVOICING_CONTRACT_ALREADY_EXISTS',\r\n COMPANY_REQ_EXISTS = 'COMPANY_REQ_EXISTS'\r\n}\r\n","export enum TRANSACTIONS_STORE_STATE {\r\n TRANSACTIONS = 'Transactions/TRANSACTIONS',\r\n BANK_ACCOUNT_LIST = 'Transactions/BANK_ACCOUNT_LIST'\r\n}\r\n\r\nexport enum TRANSACTIONS_STORE_GETTERS {\r\n TRANSACTIONS = 'Transactions/TRANSACTIONS',\r\n BANK_ACCOUNT_LIST = 'Transactions/BANK_ACCOUNT_LIST'\r\n}\r\n\r\nexport enum TRANSACTIONS_STORE_ACTIONS {\r\n GET_TRANSACTIONS = 'Transactions/GET_TRANSACTIONS',\r\n UPDATE_TRANSACTION = 'Transactions/UPDATE_TRANSACTION',\r\n DELETE_TRANSACTION = 'Transaction/DELETE_TRANSACTION',\r\n AUTOGENERATE_REPORTS = 'Transactions/UTOGENERATE_REPORTS',\r\n IMPORT_TRANSACTIONS_FROM_FILE = 'Transactions/IMPORT_TRANSACTIONS_FROM_FILE',\r\n GET_BANK_ACCOUNT_LIST = 'Transactions/GET_BANK_ACCOUNT_LIST'\r\n}\r\n\r\nexport enum TRANSACTIONS_STORE_MUTATIONS {\r\n SET_TRANSACTIONS = 'Transactions/SET_TRANSACTIONS',\r\n UPDATE_TRANSACTION = 'Transactions/UPDATE_TRANSACTION',\r\n DELETE_TRANSACTION = 'Transactions/DELETE_TRANSACTION',\r\n SET_BANK_ACCOUNT_LIST = 'Transactions/SET_BANK_ACCOUNT_LIST'\r\n}\r\n\r\nexport enum TRANSACTION_WARNING_CODENAME {\r\n CARD_UNIDENTIFIABLE = 'CARD_UNIDENTIFIABLE',\r\n STATEMENT_WITHIN_SUBMITTED_REPORT = 'STATEMENT_WITHIN_SUBMITTED_REPORT',\r\n PAYMENT_METHOD_NOT_FOUND = 'PAYMENT_METHOD_NOT_FOUND',\r\n MULTIPLE_PAYMENT_METHODS_FOUND = 'MULTIPLE_PAYMENT_METHODS_FOUND'\r\n}\r\n\r\nexport const TRANSACTION_WARNING = {\r\n [TRANSACTION_WARNING_CODENAME.CARD_UNIDENTIFIABLE]: 'cardUnidentifiable',\r\n [TRANSACTION_WARNING_CODENAME.STATEMENT_WITHIN_SUBMITTED_REPORT]: 'withinSubmittedReport',\r\n [TRANSACTION_WARNING_CODENAME.PAYMENT_METHOD_NOT_FOUND]: 'methodNotFound',\r\n [TRANSACTION_WARNING_CODENAME.MULTIPLE_PAYMENT_METHODS_FOUND]: 'multipleMethodsFound'\r\n}\r\n\r\n\r\nexport enum TRANSACTION_ACTIONS {\r\n DELETE = 'DELETE',\r\n ADD_REPORT = 'ADD_REPORT',\r\n REMOVE_FROM_REPORT = 'REMOVE_FROM_REPORT',\r\n ADD_CARD = 'ADD_CARD',\r\n SET_DATE = 'SET_DATE',\r\n UNMATCH = 'UNMATCH',\r\n MATCH = 'MATCH',\r\n ADD_COST_WITHOUT_DOCUMENT = 'ADD_COST_WITHOUT_DOCUMENT',\r\n UNSELECT = 'UNSELECT'\r\n}\r\n","export enum ACCOUNTING_STORE_STATE {\r\n ACCOUNTING_OBJECTS = 'Accounting/ACCOUNTING_OBJECTS',\r\n AUTOACCOUNTING_RULES = 'Accounting/AUTOACCOUNTING_RULES',\r\n RECEIPT_ACCOUNTING_ENTRIES = 'Accounting/RECEIPT_ACCOUNTING_ENTRIES',\r\n TRIP_ACCOUNTING_ENTRIES = 'Accounting/TRIP_ACCOUNTING_ENTRIES',\r\n RECEIPT_ACCOUNTING_REFS = 'Accounting/RECEIPT_ACCOUNTING_REFS',\r\n TRIP_ACCOUNTING_REFS = 'Accounting/TRIP_ACCOUNTING_REFS',\r\n MANAGED_REFS = 'Accounting/MANAGED_REFS'\r\n}\r\n\r\nexport enum ACCOUNTING_STORE_GETTERS {\r\n ACCOUNTING_OBJECTS = 'Accounting/ACCOUNTING_OBJECTS',\r\n AUTOACCOUNTING_RULES = 'Accounting/AUTOACCOUNTING_RULES',\r\n RECEIPT_ACCOUNTING_ENTRIES = 'Accounting/RECEIPT_ACCOUNTING_ENTRIES',\r\n TRIP_ACCOUNTING_ENTRIES = 'Accounting/TRIP_ACCOUNTING_ENTRIES',\r\n RECEIPT_ACCOUNTING_REFS = 'Accounting/RECEIPT_ACCOUNTING_REFS',\r\n TRIP_ACCOUNTING_REFS = 'Accounting/TRIP_ACCOUNTING_REFS',\r\n MANAGED_REFS = 'Accounting/MANAGED_REFS'\r\n}\r\n\r\nexport enum ACCOUNTING_STORE_ACTIONS {\r\n GET_ACCOUNTING_OBJECTS = 'Accounting/GET_ACCOUNTING_OBJECTS',\r\n GET_RECEIPT_ACCOUNTING_ENTRIES = 'Accounting/GET_RECEIPT_ACCOUNTING_ENTRIES',\r\n GET_TRIP_ACCOUNTING_ENTRIES = 'Accounting/GET_TRIP_ACCOUNTING_ENTRIES',\r\n GET_RECEIPT_ACCOUNTING_REFS = 'Accounting/GET_RECEIPT_ACCOUNTING_REFS',\r\n GET_TRIP_ACCOUNTING_REFS = 'Accounting/GET_TRIP_ACCOUNTING_REFS',\r\n GET_MANAGED_REFS = 'Accounting/GET_MANAGED_REFS',\r\n GET_AUTOMATION_RULES = 'Accounting/GET_AUTOMATION_RULES',\r\n UPDATE_AUTOMATION_RULES = 'Accounting/UPDATE_AUTOMATION_RULES',\r\n UPDATE_ACCOUNTING_REF = 'Accounting/UPDATE_ACCOUNTING_REF',\r\n DELETE_RECEIPT_ACCOUNTING_REF = 'Accounting/DELETE_RECEIPT_ACCOUNTING_REF',\r\n DELETE_TRIP_ACCOUNTING_REF = 'Accounting/DELETE_TRIP_ACCOUNTING_REF',\r\n CREATE_ACCOUNTING_OBJECT = 'Accounting/CREATE_ACCOUNTING_OBJECT',\r\n UPDATE_ACCOUNTING_OBJECT = 'Accounting/UPDATE_ACCOUNTING_OBJECT',\r\n DELETE_ACCOUNTING_OBJECT = 'Accounting/DELETE_ACCOUNTING_OBJECT',\r\n DOWNLOAD_CONTEXT_TEMPLATE = 'Accounting/DOWNLOAD_TEMPLATE',\r\n UPDATE_CONTEXT_FROM_CSV = 'Accounting/UPDATE_CONTEXT_FROM_CSV',\r\n UPDATE_ACCOUNTING_CONFIG = 'Accounting/UPDATE_ACCOUNTING_CONFIG',\r\n ENABLE_AUTOACCOUNTING = 'Accounting/ENABLE_AUTOACCOUNTING'\r\n}\r\n\r\nexport enum ACCOUNTING_STORE_MUTATIONS {\r\n SET_ACCOUNTING_OBJECTS = 'Accounting/SET_ACCOUNTING_OBJECTS',\r\n SET_ACCOUNTING_OBJECT = 'Accounting/SET_ACCOUNTING_OBJECT',\r\n SET_AUTOACCOUNTING_RULES = 'Accounting/SET_AUTOACCOUNTING_RULES',\r\n DELETE_ACCOUNTING_OBJECT = 'Accounting/DELETE_ACCOUNTING_OBJECT',\r\n SET_RECEIPT_ACCOUNTING_ENTRIES = 'Accounting/SET_RECEIPT_ACCOUNTING_ENTRIES',\r\n SET_TRIP_ACCOUNTING_ENTRIES = 'Accounting/SET_TRIP_ACCOUNTING_ENTRIES',\r\n SET_RECEIPT_ACCOUNTING_REFS = 'Accounting/SET_RECEIPT_ACCOUNTING_REFS',\r\n SET_TRIP_ACCOUNTING_REFS = 'Accounting/SET_TRIP_ACCOUNTING_REFS',\r\n SET_MANAGED_REFS = 'Accounting/SET_MANAGED_REFS',\r\n DELETE_RECEIPT_ACCOUNTING_ENTRIES = 'Accounting/DELETE_RECEIPT_ACCOUNTING_ENTRIES',\r\n DELETE_RECEIPT_ACCOUNTING_REF = 'Accounting/DELETE_RECEIPT_ACCOUNTING_REF',\r\n DELETE_TRIP_ACCOUNTING_REF = 'Accounting/DELETE_TRIP_ACCOUNTING_REF'\r\n}\r\n\r\nexport enum REFERENCE_OBJECT_TYPE {\r\n COST_TYPE = 'COST_TYPE',\r\n PAYMENT_METHOD = 'PAYMENT_METHOD',\r\n RECEIPT = 'RECEIPT',\r\n VAT_ROW = 'VAT_ROW',\r\n ITEM_ROW = 'ITEM_ROW',\r\n TRIP = 'TRIP',\r\n TRIP_MILEAGE = 'TRIP_MILEAGE',\r\n TRIP_ALLOWANCE = 'TRIP_ALLOWANCE'\r\n}\r\n\r\nexport enum REFERENCE_OBJECT_TYPE_NAME {\r\n COST_TYPE = 'costType',\r\n PAYMENT_METHOD = 'paidBy',\r\n RECEIPT = 'document',\r\n ITEM_ROW = 'itemRows',\r\n TRIP = 'oneReport',\r\n TRIP_MILEAGE = 'mileage',\r\n TRIP_ALLOWANCE = 'dailyAllowance'\r\n}\r\n\r\nexport enum ACCOUNTING_OBJECT_TYPE {\r\n ITEM_CODE = 'itemCode',\r\n COST_OBJECTIVE = 'costObjective',\r\n PROJECT = 'project',\r\n ACCOUNT = 'account',\r\n DIMENSION = 'dimension',\r\n DEPARTMENT = 'department',\r\n VAT_CODE = 'VATCode'\r\n}\r\n\r\nexport enum ACCOUNTING_ENTRY_TYPE {\r\n ACCOUNT = 'account',\r\n VAT_CODE = 'vatCode'\r\n}\r\n\r\nexport enum ACCOUNTING_ENTRY_REFERENCE_TYPE {\r\n RECEIPT = 'document',\r\n MILEAGE = 'mileage',\r\n DAILY_ALLOWANCE = 'dailyAllowance'\r\n}\r\n\r\nexport enum FILTER_OPERATOR {\r\n EQUAL = 'EQUAL',\r\n EQUIVALENT = 'EQUIVALENT'\r\n}\r\n\r\nexport enum FILTER_VECTOR {\r\n SUBMITTER_EMAIL = 'submitterEmail',\r\n SUPPLIER_NAME = 'supplierName',\r\n SUPPLIER_REG_CODE = 'supplierRegCode',\r\n SUPPLIER_VAT_NUMBER = 'supplierVATNumber',\r\n SUPPLIER_COUNTRY_CODE = 'supplierCountryCode',\r\n SUPPLIER_BANK_ACCOUNT_NR = 'supplierBankAccountNr',\r\n ORDER_ID = 'orderId',\r\n ITEM_ROWS_VAT_RATE = 'itemRows[].VATrate',\r\n ITEM_ROWS_CODE = 'itemRows[].code',\r\n ITEM_ROWS_DESCRIPTION = 'itemRows[].description',\r\n COST_TYPE = 'costType',\r\n PAID_WITH = 'paidWith',\r\n BILLING_TYPE = 'billingType',\r\n COMMENT = 'comment',\r\n COST_TYPE_NAME = 'costTypeName',\r\n PAYMENT_METHOD_TYPE = 'paymentMethodType',\r\n PAYMENT_METHOD_CARD_NR = 'paymentCardNr',\r\n PAYMENT_METHOD_ACCOUNT_NR = 'paymentBankAccountNr',\r\n PAYMENT_REF_NR = 'paymentRefNr'\r\n}\r\n\r\nexport const FILTER_VECTOR_TEXT = {\r\n [FILTER_VECTOR.SUBMITTER_EMAIL]: 'submittedBy',\r\n [FILTER_VECTOR.SUPPLIER_NAME]: 'supplierName',\r\n [FILTER_VECTOR.SUPPLIER_REG_CODE]: 'supplierRegNumber',\r\n [FILTER_VECTOR.SUPPLIER_VAT_NUMBER]: 'supplierVATNumber',\r\n [FILTER_VECTOR.SUPPLIER_COUNTRY_CODE]: 'supplierCountry',\r\n [FILTER_VECTOR.ORDER_ID]: 'orderId',\r\n [FILTER_VECTOR.ITEM_ROWS_VAT_RATE]: 'vrt',\r\n [FILTER_VECTOR.ITEM_ROWS_CODE]: 'code',\r\n [FILTER_VECTOR.ITEM_ROWS_DESCRIPTION]: 'description',\r\n [FILTER_VECTOR.COST_TYPE]: 'costType',\r\n [FILTER_VECTOR.PAID_WITH]: 'paidBy',\r\n [FILTER_VECTOR.BILLING_TYPE]: 'billingType',\r\n [FILTER_VECTOR.COMMENT]: 'comment',\r\n [FILTER_VECTOR.COST_TYPE_NAME]: 'costType',\r\n [FILTER_VECTOR.PAYMENT_METHOD_TYPE]: 'paidBy',\r\n [FILTER_VECTOR.PAYMENT_METHOD_CARD_NR]: 'cardLfd',\r\n [FILTER_VECTOR.PAYMENT_METHOD_ACCOUNT_NR]: 'bankAccount',\r\n [FILTER_VECTOR.PAYMENT_REF_NR]: 'refNum',\r\n [FILTER_VECTOR.SUPPLIER_BANK_ACCOUNT_NR]: 'supplierAccount'\r\n}\r\n\r\nexport enum TARGET_VECTOR {\r\n ACCOUNTING = 'accounting',\r\n COST_TYPE = 'costType.accounting',\r\n PAYMENT_METHOD = 'paymentMethod.accounting',\r\n ITEM_ROWS = 'itemRows[].accounting',\r\n REPORT = 'report.accounting',\r\n MILEAGE = 'mileage.accounting'\r\n // DAILY_ALLOWANCE = 'allowance.accounting'\r\n // TODO: report.documents[].* where * is any from the document vectors\r\n}\r\n\r\nexport const TARGET_VECTOR_TEXT = {\r\n [TARGET_VECTOR.ACCOUNTING]: 'document',\r\n [TARGET_VECTOR.ITEM_ROWS]: 'itemRows',\r\n [TARGET_VECTOR.COST_TYPE]: 'costType',\r\n [TARGET_VECTOR.PAYMENT_METHOD]: 'paidBy',\r\n [TARGET_VECTOR.MILEAGE]: 'mileage',\r\n [TARGET_VECTOR.REPORT]: 'report'\r\n}\r\n","import { validateStatus } from '@/lib/status'\r\nimport { Company, Receipt, ReceiptStatus } from '@/models'\r\nimport { RECEIPT_STATUS, RECEIPT_STATUS_CATEGORY, STATUS_COLORS, STATUS_SEQUENCE, DOCUMENT_TYPE } from '@/enums'\r\n\r\nexport const receiptGeneralStatus = (receipt: Receipt, company: Company): ReceiptStatus | null => {\r\n if (!receipt?.id || receipt.status == null) return null\r\n\r\n switch (true) {\r\n case receipt?.docType === DOCUMENT_TYPE.ATTACHMENT: {\r\n return {\r\n color: STATUS_COLORS.WHITE,\r\n status: RECEIPT_STATUS_CATEGORY.ATTACHMENT,\r\n label: 'nonCostDocument',\r\n index: STATUS_SEQUENCE.ATTACHMENT\r\n }\r\n }\r\n\r\n case validateStatus(receipt.status, [RECEIPT_STATUS.DEPARTED, RECEIPT_STATUS.APPROVED, -RECEIPT_STATUS.BOUNCED]): {\r\n return {\r\n color: STATUS_COLORS.GREEN,\r\n label: 'approvedAndSent',\r\n status: RECEIPT_STATUS_CATEGORY.APPROVED_AND_SENT,\r\n index: STATUS_SEQUENCE.APPROVED_AND_SENT\r\n }\r\n }\r\n\r\n case validateStatus(receipt.status, [RECEIPT_STATUS.DEPARTED, -RECEIPT_STATUS.BOUNCED]): {\r\n return {\r\n color: STATUS_COLORS.GREEN,\r\n label: 'forwardingSuccess',\r\n status: RECEIPT_STATUS_CATEGORY.SENT,\r\n index: STATUS_SEQUENCE.SENT\r\n }\r\n }\r\n\r\n case receipt.extraData?.emptyReceipt: {\r\n return {\r\n color: STATUS_COLORS.GREEN,\r\n label: 'digitized',\r\n status: RECEIPT_STATUS_CATEGORY.DIGITIZED,\r\n index: STATUS_SEQUENCE.DIGITIZED\r\n }\r\n }\r\n\r\n case receipt.notApplicable: {\r\n return {\r\n color: STATUS_COLORS.RED,\r\n label: 'notValid',\r\n status: RECEIPT_STATUS_CATEGORY.INVALID,\r\n index: STATUS_SEQUENCE.INVALID\r\n }\r\n }\r\n\r\n case receipt.noPicture || !validateStatus(receipt.status, [RECEIPT_STATUS.FILE_RECEIVED]): {\r\n return {\r\n color: STATUS_COLORS.RED,\r\n label: 'noPicture',\r\n status: RECEIPT_STATUS_CATEGORY.PICTURELESS,\r\n index: STATUS_SEQUENCE.PICTURELESS\r\n }\r\n }\r\n\r\n case validateStatus(receipt.status, [RECEIPT_STATUS.BOUNCED]): {\r\n return {\r\n color: STATUS_COLORS.RED,\r\n label: 'forwardingFailed',\r\n status: RECEIPT_STATUS_CATEGORY.BOUNCED,\r\n index: STATUS_SEQUENCE.BOUNCED\r\n }\r\n }\r\n\r\n case validateStatus(receipt.status, [RECEIPT_STATUS.REJECTED]): {\r\n return {\r\n color: STATUS_COLORS.RED,\r\n label: 'rejected',\r\n status: RECEIPT_STATUS_CATEGORY.REJECTED,\r\n index: STATUS_SEQUENCE.REJECTED\r\n }\r\n }\r\n\r\n case validateStatus(receipt.status, [-RECEIPT_STATUS.SUBMITTED]): {\r\n return {\r\n color: STATUS_COLORS.GREY,\r\n label: 'draft',\r\n status: RECEIPT_STATUS_CATEGORY.UNSUBMITTED,\r\n index: STATUS_SEQUENCE.DRAFT\r\n }\r\n }\r\n\r\n case validateStatus(receipt.status, [RECEIPT_STATUS.APPROVING]): {\r\n return {\r\n color: STATUS_COLORS.BLUE,\r\n label: 'approving',\r\n status: RECEIPT_STATUS_CATEGORY.APPROVING,\r\n index: STATUS_SEQUENCE.APPROVING\r\n }\r\n }\r\n\r\n case validateStatus(receipt.status, [RECEIPT_STATUS.PROCESSING]): {\r\n return {\r\n color: STATUS_COLORS.BLUE,\r\n label: 'tripProcessing',\r\n status: RECEIPT_STATUS_CATEGORY.PROCESSING,\r\n index: STATUS_SEQUENCE.PROCESSING\r\n }\r\n }\r\n\r\n case validateStatus(receipt.status, [RECEIPT_STATUS.APPROVED]): {\r\n return {\r\n color: STATUS_COLORS.GREEN,\r\n label: 'approved',\r\n status: RECEIPT_STATUS_CATEGORY.APPROVED,\r\n index: STATUS_SEQUENCE.APPROVED\r\n }\r\n }\r\n\r\n case validateStatus(receipt.status, [RECEIPT_STATUS.SUBMITTED, RECEIPT_STATUS.DIGITIZED]) &&\r\n company?.settings?.requireExpenseConfirmation &&\r\n !company?.settings?.disableSendingSingleDocuments &&\r\n !receipt.tripId: {\r\n return {\r\n color: STATUS_COLORS.BLUE,\r\n label: 'pendingConfirmation',\r\n status: RECEIPT_STATUS_CATEGORY.CONFIRMING,\r\n index: STATUS_SEQUENCE.CONFIRMING\r\n }\r\n }\r\n\r\n case validateStatus(receipt.status, [RECEIPT_STATUS.DIGITIZED, -RECEIPT_STATUS.DEPARTED]): {\r\n return {\r\n color: receipt.tripId ? STATUS_COLORS.GREEN : STATUS_COLORS.YELLOW,\r\n label: 'digitized',\r\n status: RECEIPT_STATUS_CATEGORY.DIGITIZED,\r\n index: STATUS_SEQUENCE.DIGITIZED\r\n }\r\n }\r\n\r\n case validateStatus(receipt.status, [RECEIPT_STATUS.OCRDONE, -RECEIPT_STATUS.DEPARTED]) && !company?.digitization: {\r\n return {\r\n color: receipt.tripId ? STATUS_COLORS.GREEN : STATUS_COLORS.YELLOW,\r\n label: 'digitized',\r\n status: RECEIPT_STATUS_CATEGORY.DIGITIZED,\r\n index: STATUS_SEQUENCE.DIGITIZED\r\n }\r\n }\r\n\r\n case validateStatus(receipt.status, [RECEIPT_STATUS.OCRDONE, -RECEIPT_STATUS.DEPARTED]) && company?.digitization: {\r\n return {\r\n color: STATUS_COLORS.BLUE,\r\n label: 'digitizing',\r\n status: RECEIPT_STATUS_CATEGORY.DIGITIZING,\r\n index: STATUS_SEQUENCE.DIGITIZING\r\n }\r\n }\r\n\r\n default: {\r\n return null\r\n }\r\n }\r\n}\r\n\r\nexport const receiptCurrencyConversionStatus = (receipt: Receipt): ReceiptStatus | null => {\r\n if (!receipt || !receipt.id || !receipt.status || receipt.docType === DOCUMENT_TYPE.ATTACHMENT) return null\r\n if (validateStatus(receipt.status, [RECEIPT_STATUS.CURRENCY_PROCESSING])) {\r\n return {\r\n color: STATUS_COLORS.BLUE,\r\n label: 'processingCurrency',\r\n status: RECEIPT_STATUS_CATEGORY.CURRENCY_PROCESSING\r\n }\r\n }\r\n if (validateStatus(receipt.status, [RECEIPT_STATUS.CURRENCY_CONVERTED])) {\r\n return {\r\n color: STATUS_COLORS.GREEN,\r\n label: 'currencyConverted',\r\n status: RECEIPT_STATUS_CATEGORY.CURRENCY_CONVERTED\r\n }\r\n }\r\n return null\r\n}\r\n\r\nexport const receiptDuplicateStatus = (receipt: Receipt): ReceiptStatus | null => {\r\n if (!receipt || !receipt.id || !receipt.status || receipt.docType === DOCUMENT_TYPE.ATTACHMENT) return null\r\n if (validateStatus(receipt.status, [RECEIPT_STATUS.NOT_DISTINCT])) {\r\n return {\r\n color: STATUS_COLORS.RED,\r\n label: 'notDistinct',\r\n status: RECEIPT_STATUS_CATEGORY.DUPLICATE,\r\n index: STATUS_SEQUENCE.DUPLICATE\r\n }\r\n }\r\n return null\r\n}\r\n\r\nexport const receiptStatuses = (receipt: Receipt, company: Company | undefined): (ReceiptStatus | null)[] => {\r\n if (!receipt || !company) return []\r\n const statuses = [\r\n receiptGeneralStatus(receipt, company),\r\n receiptDuplicateStatus(receipt),\r\n receiptCurrencyConversionStatus(receipt)\r\n ]\r\n return statuses.filter((status) => status !== null)\r\n}\r\n","/**\n * Test that localStorage is available. If writing throws an exception\n * or read value is incorrect, return a dummy object with expected fields\n * that are actually no-op functions.\n */\n interface MockStorage {\n getItem: () => any,\n setItem: () => any,\n removeItem: () => any,\n clear: () => any,\n [key: string]: any\n}\n\nconst isLocalStorageAvailable = () => {\n try {\n localStorage.setItem('testLocalStorageFunctionality', 'true')\n return localStorage.getItem('testLocalStorageFunctionality') === 'true'\n } catch {\n return false\n }\n}\n\nconst getLocal = (): Storage | MockStorage => {\n return isLocalStorageAvailable()\n ? localStorage\n : {\n getItem: () => {},\n setItem: () => {},\n removeItem: () => {},\n clear: () => {}\n }\n}\n\nexport default getLocal()\n","/* eslint-disable no-unused-vars */\nexport { default as findMostCommonOccurence } from './findMostCommonOccurence'\nexport { default as isSaveAndExportEnabled } from './isSaveAndExportEnabled'\nexport { default as getQueryFromObj } from './getQueryFromObj'\nexport { default as getRandomId } from './getRandomId'\nexport { isMobileDevice } from './isMobileDevice'\n\n\nexport function isObjEmpty (payload = {}) {\n return !payload || payload.constructor === Object && Object.entries(payload).length === 0\n}\n\nexport function isNullOrUndeclared (value) {\n return typeof value === \"undefined\" || (typeof value === \"object\" && !value)\n}\n\nexport const asyncSleep = (timeout = 0) => new Promise((r) => setTimeout(r, timeout)) \n\n\nexport function isIncluding (first = '', second = '') {\n try {\n return first.toUpperCase().includes(second.toUpperCase())\n } \n catch (error) {\n return false\n }\n}\n\nexport const getQueryObjectFromWindowLocation = () => {\n // Original version\n // https://stackoverflow.com/questions/8648892/how-to-convert-url-parameters-to-a-javascript-object\n const search = location.search.substring(1)\n \n try {\n return JSON.parse('{\"' + search.replace(/&/g, '\",\"').replace(/=/g,'\":\"') + '\"}', (key, value) => key === \"\" ? value : decodeURIComponent(value))\n }\n\n catch (error) {\n return {}\n }\n}\n\nexport function renderQueryFromObject (payload = {}) {\n try {\n if (isObjEmpty(payload)) {\n return ''\n }\n\n const getCommandValuesAsQuery = (targetObject = {}) => Object\n .entries(targetObject)\n .reduce((result, [targetKey, {key, value} = {}], index) => `${ result }${ targetKey }${ key }${ value }${ index < Object.entries(targetObject).length - 1 ? ';' : '' }`, '') \n\n return Object\n .entries(payload)\n .reduce((result, [commandKey, commandValues], currentIndex) => {\n return `${ result }${ currentIndex > 0 ? ';' : '' }${ commandKey }=${ getCommandValuesAsQuery(commandValues) }`\n }, '')\n }\n\n catch (error) {\n return ''\n }\n}\n\nexport function reduceArrayToObject (\n targetArray = [], \n defineItemKeyFn = null, \n includeDataToObject = (obj) => obj\n) {\n try {\n if (!Array.isArray(targetArray) || !targetArray.length) {\n return {}\n }\n\n if (isNullOrUndeclared(defineItemKeyFn) || typeof defineItemKeyFn !== \"function\") {\n console.error('@reduceArrayToObject | Must include defineItemKeyFn as a function')\n return {}\n }\n\n return targetArray \n .reduce((result, oneItem) => ({ \n ...result, \n [defineItemKeyFn(oneItem)]: includeDataToObject(oneItem)\n }), {})\n }\n\n catch (error) {\n return {}\n }\n}\n\nexport const capitalize = (str) => {\n if (typeof str !== 'string') {\n return ''\n }\n\n return str.charAt(0).toUpperCase() + str.slice(1)\n}\n\n/**\n * Adds 2 numbers and returns sum with maximum 2 decimal spaces after comma\n * @param {number} value1\n * @param {number} value2\n */\nexport const safeAdd = (value1, value2) => {\n return Number((Number(value1 || 0) + Number(value2 || 0)).toFixed(2))\n}\n\n\nexport const compareObjAgainstTarget = (obj_1 = {}, obj_2 = {}) => {\n try { \n return Object\n .entries(obj_1)\n .every(([key, value]) => {\n if (obj_2[key] === null && [null, undefined, ''].includes(value)) {\n return true\n }\n\n return obj_2[key] === value\n })\n }\n \n catch (error) {\n return false \n }\n}","import { INTEGRATION } from '@/enums'\n\nexport default function (integration, countryCode) {\n if (!integration?.id) {\n return ''\n }\n\n switch (integration.id) {\n case INTEGRATION.COMARCH_OPTIMA:\n return 'Comarch Optima (Excel)'\n case INTEGRATION.E_ARVELDAJA:\n case INTEGRATION.E_ARVELDAJA_NEW:\n return 'E-arveldaja'\n case INTEGRATION.EMAIL:\n return 'Excel / PDF'\n case INTEGRATION.EMCE_XML:\n return 'EmCe (XML)'\n case INTEGRATION.ENOVA:\n return 'enova365 CSV'\n case INTEGRATION.ERPLYBOOKS:\n return 'ERPLY Books'\n case INTEGRATION.MERIT:\n if (countryCode === 'PL') {\n return '360 Księgowość'\n }\n if (countryCode === 'FI') {\n return 'Passeli Merit'\n }\n return 'Merit Aktiva'\n case INTEGRATION.TELEMA:\n return 'Telema eFlow'\n case INTEGRATION.HANSAWORLD:\n return 'Standard ERP'\n case INTEGRATION.I_FIRMA:\n return 'iFirma'\n case 'omniva':\n return 'Omniva'\n case INTEGRATION.ONE_S:\n if (countryCode === 'EE') {\n return 'DataService 1C'\n }\n return 'FastSoft 1C'\n case INTEGRATION.RAPID:\n return 'Rapid'\n case INTEGRATION.MSBC:\n return 'Business Central'\n case INTEGRATION.JOOSEP_EMAIL:\n return 'Joosep (email)'\n case INTEGRATION.RAKS_SQL:\n return 'RAKS'\n case INTEGRATION.SAF:\n return 'SAF'\n case INTEGRATION.SIMPLBOOKS:\n return 'SimplBooks'\n case INTEGRATION.SMARTACCOUNTS:\n return 'SmartAccounts'\n case INTEGRATION.JUMIS_START:\n return 'Jumis Start'\n case INTEGRATION.JUMIS_PRO:\n return 'Jumis Pro'\n case INTEGRATION.VISMA_NETVISOR:\n return 'Visma Netvisor'\n case INTEGRATION.VISMA_FIVALDI:\n return 'Visma Fivaldi'\n case INTEGRATION.VISMA_FIVALDI_CSV:\n return 'Visma Fivaldi (CSV)'\n case INTEGRATION.VISMA_HORIZON:\n return 'Visma Horizon'\n case INTEGRATION.FITEK:\n if (integration.name === INTEGRATION.E_ARVELDAJA) {\n return 'E-arveldaja (vana)'\n } else if (integration.name) {\n return integration.name[0].toUpperCase() + integration.name.substring(1)\n }\n default:\n return integration.id[0].toUpperCase() + integration.id.substring(1)\n }\n}\n","const _log = process.env.NODE_ENV === 'development'\n\nexport const log = _log && _log === true\n ? console.log\n : () => {}\n\nexport default log","import Axios from 'axios'\nimport { PRICING_PLAN } from '@/enums'\nimport { setReceiptCustomTripId } from '../trips'\n\nfunction load(companyId, receiptId) {\n const getURL = `@coreapi/companies/${companyId}/receipts/${receiptId}?itemrows=true`\n return Axios.get(getURL).then(({ data: receipt = {} }) => receipt)\n}\n\n/**\n * Creates a new receipt\n */\nfunction create(companyId, tripId, extras) {\n var initialData = {}\n // it would be correct to check against company's (integration) settings\n\n if (isNaN(tripId)) {\n // TTU REPORTS\n initialData.extraData = {}\n initialData.extraData.uid = tripId\n } else if (tripId > 0) {\n // NORMAL REPORTS\n initialData.tripId = tripId\n }\n\n if (extras) {\n Object.assign(initialData, extras)\n }\n\n const { company = {} } = extras || {}\n\n if (company.monthlyThreshold5Exceeded && company.planId == PRICING_PLAN.FREE_DEMO) {\n return Promise.reject('monthlyThreshold5Exceeded')\n }\n\n var createURL = this.$config.services.coreapi.url + '/companies/' + companyId + '/receipts?itemrows=true'\n return Axios.post(createURL, initialData).then(function (result) {\n var receipt = result.data\n return receipt\n })\n}\n\n/**\n * Updates the receipt\n */\nfunction update(companyId, receiptId, key, value, callback) {\n var payload = {\n [key]: value\n }\n\n var uri = `@coreapi/companies/${companyId}/receipts/${receiptId}?itemrows=true`\n Axios.put(uri, payload)\n .then((edit) => {\n callback(null, edit.data)\n })\n .catch((error) => {\n callback(error)\n })\n}\n\n/**\n * UPDATE RECEIPT DATA BY OBJECT\n * @param {number} companyId\n * @param {number} receiptId\n * @param {object} payload\n * @returns {function} axios call\n */\nconst massUpdate = function (companyId, receiptId, payload) {\n return new Promise((resolve, reject) => {\n if (!companyId || !receiptId) {\n return reject(\n `Sorry, something went wrong... Create screenshot for developers [companyId: ${companyId}, receiptId: ${receiptId}]`\n )\n }\n // HERE GOES EXTRA LOGIC IF NEEDED\n\n const URI = '@coreapi/companies/' + companyId + '/receipts/' + receiptId\n\n Axios.put(URI, payload)\n .then(({ data }) => resolve(data))\n .catch((error) => {\n reject(error)\n })\n })\n}\n\n/**\n * DELETE RECEIPT\n * @param {number} companyId\n * @param {number} receiptId\n * @returns {function} axios call\n */\nconst deleteReceipt = function (companyId, receiptId) {\n return new Promise((resolve, reject) => {\n if (!companyId || !receiptId) {\n return reject(\n `Sorry, something went wrong... Create screenshot for developers [companyId: ${companyId}, receiptId: ${receiptId}]`\n )\n }\n // HERE GOES EXTRA LOGIC IF NEEDED\n\n const URI = this.$config.services.coreapi.url + '/companies/' + companyId + '/receipts/' + receiptId\n\n Axios.delete(URI)\n .then(resolve)\n .catch(() => reject('somethingWentWrong'))\n })\n}\n\nfunction addToTrip(receipt, trip, callback) {\n if (trip._custom) {\n return setReceiptCustomTripId.call(this, receipt, trip, callback)\n }\n\n // default to regular update\n update.call(this, receipt.companyId, receipt.id, 'tripId', trip.id, callback)\n}\n\nexport { load, create, update, addToTrip, massUpdate, deleteReceipt }\n\nexport default {\n load,\n create,\n update,\n addToTrip,\n massUpdate,\n deleteReceipt\n}\n","'use strict'\n\nimport Receipts from '../receipts'\nimport { safeAdd } from '../helpers'\nimport { BILLING_TYPE } from '@/enums'\n\n/**\n * General trip-related functions that try to resolve discrepancies w/ custom trips\n */\n\nconst CustomTrips = {\n TUT: 1\n}\n\n/**\n * Interface for custom trip handler:\n * supportsEditing: Boolean // weather the handler supports editing\n * forcedReportChoice: String // type of report that is automatically chosen on report choice\n *\n * getReceiptTripId(receipt) // return the working id for the trip\n * setReceiptTripId(receipt, trip, callback) // sets the custom tripId for receipt\n * transformTrip(trip) // transforms the server returned trip\n */\nconst CustomTripHandlers = {\n [CustomTrips.TUT]: {\n supportsEditing: false,\n forcedReportChoice: 'default',\n\n getReceiptTripId(receipt) {\n return receipt.extraData && receipt.extraData.uid\n },\n setReceiptCustomTripId(receipt, trip, callback) {\n if (!receipt.extraData) {\n receipt.extraData = {}\n }\n receipt.extraData.uid = trip.uid || trip.id\n\n Receipts.update.call(\n this,\n receipt.companyId,\n receipt.id,\n 'extraData',\n receipt.extraData,\n function (error, result) {\n if (error) {\n return callback(error)\n }\n\n result.tripId = trip.uid || trip.id\n callback(null, result)\n }\n )\n },\n transformTrip(trip) {\n trip.id = trip.uid || trip.id\n trip._custom = CustomTrips.TUT\n trip._customSupportsEdit = this.supportsEditing\n }\n }\n}\n\n/**\n * Gets the trip customization identifier for the given company\n * @param {Object} company\n * @returns {Number}\n */\nfunction _getCustomizationId(company) {\n switch (company?.extraData?.tripHandler) {\n case 'custom/taltech':\n return CustomTrips.TUT\n }\n}\n\n/**\n * Returns valid trip id bound to the receipt.\n * @param {*} receipt\n */\nfunction getReceiptTripId(receipt, { company }) {\n // TODO: this should be deprecated at some point\n if (receipt.tripId) {\n return receipt.tripId\n }\n\n var customizationId = _getCustomizationId(company)\n if (!customizationId) {\n return receipt.tripId\n }\n\n var handler = CustomTripHandlers[customizationId]\n if (!handler) {\n return receipt.tripId\n }\n\n return handler.getReceiptTripId(receipt)\n}\n\n/**\n * Binds the trip to receipt using custom rule (if present).\n */\nfunction setReceiptCustomTripId(receipt, trip, callback) {\n var handler = CustomTripHandlers[trip._custom]\n if (!handler) {\n return callback()\n }\n\n handler.setReceiptCustomTripId.call(this, receipt, trip, callback)\n}\n\n/**\n * Preprocesses the trips returned from server.\n * @param {*} trips\n */\nfunction preprocessTrips(trips, { company }) {\n var _trips = {}\n\n var handler\n var customizationId = _getCustomizationId(company)\n if (customizationId) {\n handler = CustomTripHandlers[customizationId]\n }\n\n for (var i = 0; i < trips.length; i++) {\n var trip = trips[i]\n\n if (handler) {\n handler.transformTrip(trip)\n }\n\n _trips[trip.id] = trip\n }\n return _trips\n}\n\n/**\n * Transforms the trip returned from server based on custom rule if present\n * @param {Object} trip\n * @param {Object} params\n */\nfunction transformTrip(trip, { company, user }) {\n var customizationId = _getCustomizationId(company)\n if (!customizationId) {\n return\n }\n\n var handler = CustomTripHandlers[customizationId]\n\n handler.transformTrip(trip)\n}\n\n/**\n *\n * @param {Object} company\n * @returns {String}\n */\nfunction getForcedReportChoice(company) {\n var customizationId = _getCustomizationId(company)\n if (!customizationId) {\n return\n }\n\n var handler = CustomTripHandlers[customizationId]\n\n return handler.forcedReportChoice\n}\n\nexport { getReceiptTripId, preprocessTrips, setReceiptCustomTripId, transformTrip, getForcedReportChoice }\n","// 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};","// 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 \"chunk-\" + chunkId + \".\" + {\"1467\":\"ec66d877\",\"3715\":\"925d13f2\",\"3870\":\"7a7aaa89\",\"4868\":\"eed2aa77\"}[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 + \".\" + {\"1467\":\"d6cd8419\",\"3715\":\"2d7390ab\",\"3870\":\"4a25417a\",\"4868\":\"30c0d2bd\"}[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__.hmd = function(module) {\n\tmodule = Object.create(module);\n\tif (!module.children) module.children = [];\n\tObject.defineProperty(module, 'exports', {\n\t\tenumerable: true,\n\t\tset: function() {\n\t\t\tthrow new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id);\n\t\t}\n\t});\n\treturn module;\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var inProgress = {};\nvar dataWebpackPrefix = \"cp:\";\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\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__.j = 4826;","__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\t4826: 0\n};\n\n__webpack_require__.f.miniCss = function(chunkId, promises) {\n\tvar cssChunks = {\"1467\":1,\"3715\":1,\"3870\":1,\"4868\":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","// no baseURI\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\t4826: 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} else installedChunks[chunkId] = 0;\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[\"webpackChunkcp\"] = self[\"webpackChunkcp\"] || [];\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, [4998,3064], function() { return __webpack_require__(28512); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["__exports__","notification","message","type","timeToDisappear","bottomOffset","options","emit","console","log","Plugin","app","config","globalProperties","$notification","component","UiNotification","routes","path","meta","isPublic","appRoot","router","history","beforeEach","to","from","next","redirect","startsWith","replace","class","t","label","reloadPage","name","setup","window","location","encodeURIComponent","Date","toISOString","render","key","_","src","_hoisted_3","__props","activeCompany","activeUserIsAdmin","openDefaultView","onCompanyChange","getCompany","loadExpenseTypes","loadPaymentMethods","setActiveDates","selectPresetDates","setDateSelectCriteria","checkServiceActivationState","loadApprovals","loadBankAccounts","initEventStream","updateRequired","initUpdateChecker","convertTo3LetterLanguage","store","root","isConfigLoaded","getters","companyIdInRoute","$route","params","companyId","isDataLoaded","isOverviewRoute","pathname","includes","async","value","dispatch","localStorage","language","length","converted","setItem","CONFIG","user","lang","getItem","originalUrl","redirectUri","auth","authUrl","url","clientId","href","lastSelectedTab","settings","usesCreditCardReports","enableApprovals","removeItem","lastSelectedLayout","setTimeout","startDate","endDate","selectReceiptsBy","selectTripsBy","id","companyResult","isAdmin","Boolean","companyRoles","usesCustomCostTypes","usesCustomPaymentMethods","_ctx","_cache","_component_ui_notification","_component_router_view","CloudUpdateWarning","Cloud","use","helpers","l10n","icons","provide","mount","then","data","catch","undefined","error","createReceipt","tripId","extras","initialPayload","isNaN","extraData","uid","Object","assign","receipt","loadReceipt","receiptId","updateReceipt","updateReceiptValues","values","deleteReceipt","useTravelReportFields","countries","featuredCountries","companyTrips","useTrips","trips","slice","trip","dailyAllowanceInfo","destination","push","uniq","map","country","title","mapDestinationOptions","countryCode","destinationCountries","surroundingCountries","countryName","code","sort","a","b","localeCompare","concat","featured","uniqBy","hasSpecialTerritories","specialTerritories","keys","forEach","cc","countryIndex","findIndex","option","territories","territory","territoryTranslation","ter","splice","canHaveDailyAllowance","destinations","tripFieldsByCountry","canAddDestination","destinationOptions","fields","additionalFields","oneDestinationFields","index","days","sum","currency","searchInput","isDestinationValid","isStartDateValid","isEndDateValid","calculateAllowance","tripDestinations","extraInfo","companyMaxAllowance","oldTrips","updatedDestinations","updatedExtraInfo","maxAllowance","tripInput","departBefore03","departAfter22","dailyAllowance","newTrip","includesDailyAllowance","mealAndAccomodation","returnOvernight","excludeWeekends","calculateWeekends","dest","entries","format","Number","dataPerDestination","dataItem","freeMealsButton","isStartTimeValid","isEndTimeValid","oneFreeMeal","twoFreeMeals","i","allowanceInfo","breakfastIncluded","lunchIncluded","dinnerIncluded","startTime","endTime","nextTripOnLastDay","__","filterDestinationSuggestions","allOptions","filter","toLowerCase","useActivityOverview","activeDates","useActiveDates","tripsCount","receiptsCount","tripsCountByCompany","receiptsCountByCompany","tripsCountTotals","statusTotals","company","status","receiptsCountTotals","loadTripsCount","payload","$snackbar","loadReceiptsCount","setTagColor","colorKey","color","background","useDailyAllowance","formatDate","useFormatters","minStartDate","minEndDate","mapDailyAllowanceData","dailyAllowanceData","start","entry","oneDestination","find","end","info","freeMeal","calculateTripDuration","allDestinations","hasTimeFields","duration","d","h","m","tripTotalTime","diff","Math","floor","remainingTime","calculateDailyAllowanceTotals","tripAllowanceEntries","allowance","toFixed","validateDateInput","dateField","dateIndex","updateValidity","prevDestEnd","nextDestStart","validateTimeInput","timeField","timeIndex","prevDate","prevTime","currentDate","prevFullDate","convertToDate","currentFullDate","isSameOrAfter","input","isValid","validateReport","item","isReportValid","every","date","time","setDailyAllowancePayload","companyCountryCode","dailyAllowanceItems","dailyAllowanceItem","ceil","postNewEntry","newAllowanceEntry","putUpdatedEntry","allowanceEntry","deleteEntry","allowanceEntryId","saveDailyAllowance","allowanceEntries","entriesToSave","Promise","all","updateDailyAllowance","initialDailyAllowanceEntries","entriesToUpdate","entryDidExist","e","removableEntries","usePaymentMethods","paymentMethods","paymentMethodsForUser","userId","sortBy","method","paymentMethod","defaultPaymentMethods","userCustomPaymentMethods","availableDefaultMethods","hasAccount","paymentMethodById","createPaymentMethod","newPaymentMethod","updatePaymentMethod","paymentMethodId","updatedPaymentMethod","deletePaymentMethod","useAccountingRefs","allReceiptAccountingEntries","allTripAccountingEntries","allReceiptAccountingRefs","allTripAccountingRefs","receiptAccountingEntries","tripAccountingEntries","preparedEntries","accounting","totals","transaction","preparedArray","unspecifiedIndex","unshift","receiptAccountingRefs","tripAccountingRefs","loadReceiptAccountingEntries","loadTripAccountingEntries","loadReceiptAccountingRefs","loadTripAccountingRefs","deleteAccountingRef","baseRefKey","baseRefId","accountingRef","updateAccountingRef","accountingObjectId","accountingObjectType","isTrip","allRefs","refsToArray","refWithSameTypeExists","refObject","refId","refType","useOCRCoordinates","getOcrCoordinates","OCRCoordinates","ocrData","ocr","subKey","subValue","source","subberKey","subberValue","documentId","totalHeight","metadata","imageHeight","finalHeight","coordinates","imageWidth","oldPDF","originalName","endsWith","getDrawableOcrCoordinates","field","matchingField","findFromObject","object","matches","Array","isArray","useBankConnection","useConfig","bankAccountList","reportingIntervalOptions","connectToBank","account","cid","connectUrl","services","api","bic","iban","hub","psuType","useItemRowFields","updateItemRow","useItemRows","activeAccountingFields","accountingEntriesEnabled","useAccountingSettings","accountingFieldOptions","useAccountingFields","defaultColumns","VATcolumns","accountingColumns","toString","activeRefs","itemRowAccountingFields","target","types","isSameAsExisting","rowNum","itemRows","existingRow","row","updateValue","rowKey","updatedValue","eh","columnConfig","cellWidth","fieldConfig","inputType","getValue","handleOnChange","itemRow","description","unit","minValue","quantity","price","transformSumInput","VATrate","VATsum","total","ACCOUNT","updated","filterAvailableItemColumns","columns","isVATAccountable","VATAccountable","column","isDefault","VATColumnSupported","accountingColumnSupported","mapItemColumnConfig","cloudViewCustomization","itemColumnOrder","useReceiptSelect","selectedReceipts","receiptBrowsingList","setSelectedReceipt","selected","receiptIds","isReceiptSelected","setMultipleSelectedReceipts","receipts","clearSelectedReceipts","setReceiptBrowsingList","useReportButtons","activeUser","useUser","useCompanies","activeTrip","canExport","canExportAndCopy","useExport","activeTripReceipts","useReceipts","isButtonAccessible","buttonAction","tripStatus","requireReportConfirmation","subtype","useReceiptFields","loadingFields","updateCompanySettings","activeReceipt","digitizeReceipt","useExpenseFlow","setLoadingState","useLoadingState","deleteAllItemRows","addItemRow","duplicatesByReceiptId","useDuplicates","findMostUsedCurrencies","ocrWordList","useHelpers","isAttachment","docType","isCostWithoutDocument","emptyReceipt","isPaymentCardStatement","docSubType","isEditBlocked","tripBlocked","receiptBlocked","updateReceiptField","getParentObj","disableLoading","disablePopUp","receiptDuplicates","duplicate","receiptFields","isHighlighted","supplier","isVisible","isLoading","supportsSuggestions","filterSuggestions","getValueSuggestions","supplierRegNumber","supplierVATNumber","issued","maxLength","toUpperCase","comment","canUnselect","isMissing","billingType","paidWith","methodsForUser","defaultMethods","customMethods","methodTitle","bankAccountNr","cardLfd","costType","costTypeId","isInExtraFields","companyExtraFieldsIncludes","isExtraField","extraFieldLabel","enableExtraField","addToExtraFields","paymentDetails","accounts","number","refNum","orderId","dueDate","paid","extraReceiptFields","extraDocumentFields","extraDocumentFieldsCloud","extraDocumentFieldsApp","appViewCustomization","indexOf","useMileageFields","formatSum","formatInteger","formatDateSlashes","activeMileageRefs","mileageAccountingFields","mileageFields","accountingFieldVisible","fieldType","hasActiveRef","displayVehicleName","vehicle","ownerTranslation","private","owner","split","allFields","mileageItem","plateNumber","startPointAddress","endPointAddress","distance","roundTrip","list","over50hp","withCanteen","withCaravan","withDog","withHeavyLoad","withTrailer","roughRoadDistance","coworkers","useUpdateChecker","latestVersion","interval","setInterval","currentVersion","useTransactions","transactionList","TRANSACTIONS","unmatchedList","unmatchedCount","transactionById","transactionId","importFromFile","formData","FormData","files","uploadedFile","append","loadTransactions","autogenerateReports","updateTransaction","deleteTransaction","isDataLoading","useIntegrations","paramsContext","useParamsContext","loadAccountingObjects","companies","COMPANIES","activeIntegration","serviceActivation","isEmailAllowed","enteredEmail","mailDomain","getActiveIntegration","serviceActivationWarning","state","partnerId","integrationName","integrationTitle","confirmServiceActivation","accepted","isExtRefIntegration","integrationIds","allowModifyingFwdMode","allowOnlyReports","canEnableAutoaccounting","oldId","integration","configuration","selectableDates","useDateFilters","dates","savePresetPereference","preset","sessionStorage","sessionStartDate","sessionEndDate","dateRangePreference","selectedDates","subtract","startOf","criteria","documentType","loadDuplicates","activeReceiptDuplicates","markAsNonDuplicate","useFileUpload","submitReceipt","activeTripStatement","useCardReconciliation","receiptById","findFileExtension","addedReceiptCount","receiptsThisMonthCount","monthlyLimitExceeded","planId","createdReceipts","supportedFileFormats","checkDocumentLimit","addFiles","filesInput","digitize","uploadType","fileList","nextTempId","file","fileInfo","imgPreviewUrl","URL","createObjectURL","tempId","extension","isNotSupported","uploadPercentage","addNewReceipt","updateUploadProgress","fileTempId","uploadProgressPercentage","newReceiptPayload","paymentCard","uploadReceipt","fileToUpload","uploadUrl","fileUploaded","receiveOcr","timeout","dPreferences","itemRowsDigitization","limitExceeded","receiptCreated","digitization","response","errored","errorMessage","addCarRegCard","event","cardFile","removeFromList","fileReceiptId","submitUploadedReceipts","isUploadedDocSubmitted","createdReceipt","submittedFile","submitted","erroredFile","useCostTypes","customCostTypes","costTypeById","expenseTypeName","expenseType","translations","capitalize","setCostTypeName","createExpenseType","updateExpenseType","expenseTypeId","deleteExpenseType","useApprovals","loadTrip","allApprovals","APPROVALS","activeTripApproval","approval","activeReceiptApproval","companyApproverOptions","pendingApprovals","archivedApprovals","userActiveDecisions","decisions","decision","approvingUserId","statuses","loadApproval","approvalId","loadTripApproval","loadReceiptApproval","deleteApproval","loadApproverOptions","approve","decisionId","reason","reject","payloadData","delegate","delegateUserId","removeApprover","addDecision","appendApprover","updateStatusAfterApproving","comparableStatus","currentAttempt","nrOfAttempts","sendWithRetry","retry","useTableSort","statusInfo","sortByDate","aDateString","bDateString","sortDirection","dateA","getTime","dateB","transactionStatus","warning","codename","receiptStatus","receiptStatuses","sortReceiptsTable","sortableArray","sortKey","sorted","first","second","submitter","fullName","email","createdAt","reverse","sortTripsTable","sortApprovalsTable","ts","sortTransactionsTable","setSortToLocalstorage","tableName","direction","getSortFromLocalstorage","localSortKey","localSortDirection","onCompanyChangeTargetFn","firstCompanyId","allCompanies","companyInbox","alias","regCode","companyUsesReports","enableReports","setActiveCompanyById","currentTab","tab","currentLayout","layout","viewPath","receiptPath","tripPath","targetFn","tripCurrencyConversionStatus","validateStatus","TRIP_STATUS","STATUS_COLORS","TRIP_STATUS_CATEGORY","useFilters","receiptFilterOptions","filters","reimbursement","paidByUnspecified","count","paidPersonally","paidByCompanyFunds","UNSUBMITTED","INVALID","PICTURELESS","DUPLICATE","BOUNCED","REJECTED","DIGITIZING","APPROVING","CONFIRMING","PROCESSING","DIGITIZED","APPROVED","SENT","CURRENCY_PROCESSING","CURRENCY_CONVERTED","reportFilterOptions","unspecifiedFunds","reimbursable","companyFunds","SUBMITTED","DRAFT","reportType","reimburementTypes","displayedTripStatus","currencyStatus","currencyTotals","reimbursementType","hasReimbursementType","currencyTotal","filterReceiptsByReimbursement","reimbursementValue","unspecified","paidBy","filterReportsByReimbursement","includesFilter","instance","proxy","route","currentRoute","submitReport","hasAllowedIntegration","userRole","role","rolename","copyCSV","dataToCopy","reader","FileReader","onload","text","result","navigator","writeText","readAsText","downloadFile","blob","Blob","link","document","createElement","contentDisposition","headers","fileName","fileNameMatch","match","setAttribute","body","appendChild","click","remove","revokeObjectURL","exportTrip","action","tripReceipts","useEvents","eventSource","subscribe","close","uri","coreapi","EventSource","withCredentials","onmessage","ev","JSON","parse","subject","onerror","err","changeUserLanguage","languages","fin","lav","pol","est","rus","lit","swe","esp","eng","languageString","convertTo2LetterLanguage","COMPANIES_STORE_STATE","COMPANIES_STORE_GETTERS","COMPANIES_STORE_ACTIONS","COMPANIES_STORE_MUTATIONS","PRICING_PLAN","CARD_REPORTING_INTERVAL","UNSUBMITTED_EXPENSE_REPORT_REMINDER_START","RECEIPTS_STORE_STATE","RECEIPTS_STORE_GETTERS","RECEIPTS_STORE_ACTIONS","RECEIPTS_STORE_MUTATIONS","EDITABLE_RECEIPT_KEY","DOCUMENT_TYPE","DOCUMENT_SUBTYPE","BILLING_TYPE","BILLING_TYPE_TEXT","PERSONAL","COMPANY","PAID_WITH","FIELD_TYPE","COST_TYPE","ITEM_ROW_COLUMN_KEY","DISPLAYED_ITEM_ROW_TYPE","ITEM_ROW_KEY","RECEIPT_STATUS","RECEIPT_STATUS_CATEGORY","STATUS_BACKGROUND_COLORS","STATUS_SEQUENCE","EVENT_EF_STATE_CHANGED","EVENT_APPROVAL_STATE_CHANGED","EVENT_NEW_DOC","EVENT_NEW_REPORT","EVENT_COMPANY_UPDATED","COST_TYPES_STORE_STATE","COST_TYPES_STORE_GETTERS","COST_TYPES_STORE_ACTIONS","COST_TYPES_STORE_MUTATIONS","TRIPS_STORE_STATE","TRIPS_STORE_MUTATIONS","TRIPS_STORE_ACTIONS","TRIPS_STORE_GETTERS","TRIP_TYPE","TRIP_ACTION","TRIP_CONTENT_TAB","TRIP_STATUS_SEQUENCE","TRIP_STATUS_VALIDATOR","NONE","CONFIRMED","READY","TRAVEL_REPORT_FIELDS","TRIP_CHECKBOX_FIELD_LABEL","DEPART_BEFORE_3","DEPART_AFTER_22","MEAL_AND_ACCOMODATION","RETURN_OVERNIGHT","CALCULATE_WEEKENDS","BREAKFAST_INCLUDED","LUNCH_INCLUDED","DINNER_INCLUDED","NEXT_TRIP_ON_LAST_DAY","APPROVALS_STORE_STATE","APPROVALS_STORE_GETTERS","APPROVALS_STORE_ACTIONS","APPROVALS_STORE_MUTATIONS","APPROVAL_STATE","APPROVAL_STATE_COLOR","APPROVAL_ACTION","APPROVAL_SETTINGS_STORE_STATE","APPROVAL_SETTINGS_STORE_GETTERS","APPROVAL_SETTINGS_STORE_ACTIONS","APPROVAL_SETTINGS_STORE_MUTATIONS","APPROVAL_SCOPE","POLICY","POLICY_TITLE","POLICY_DESCRIPTION","COMPANY_CURRENCY","SUBJECT_ROLENAME","SPENDING_LIMIT","TARGET_SUM","APPROVAL_DEFAULT","OUT_OF_WORKFLOW_APPROVAL_ACTION","TARGET_SUBTYPE","TARGET_TYPE","TARGET_TYPE_PARENT","MILEAGE_STORE_STATE","MILEAGE_STORE_GETTERS","MILEAGE_STORE_ACTIONS","MILEAGE_STORE_MUTATIONS","MILEAGE_FIELDS","VEHICLE_TYPE","CURRENCY","CURRENCY_SYMBOL","CONVERSION_MODE","SETTING_STORE_STATE","SETTING_STORE_MUTATIONS","SETTING_STORE_ACTIONS","SETTING_STORE_GETTERS","SORT_KEY","SORT_DIRECTION","TABLE_NAME","DATE_FILTER_SELECTIONS","NAVIGATION_TAB","TRIP_DATES_CRITERIA","RECEIPT_DATES_CRITERIA","OVERVIEW_STORE_STATE","OVERVIEW_STORE_GETTERS","OVERVIEW_STORE_ACTIONS","OVERVIEW_STORE_MUTATIONS","OVERVIEW_STATUS_LABELS","OVERVIEW_STATUS_KEYS","OVERVIEW_STATUS_COLORS","E_INVOICING_INTEGRATION_STATUS","E_INVOICING_SETTINGS","E_INVOICING_WARNING","TRANSACTIONS_STORE_STATE","TRANSACTIONS_STORE_GETTERS","TRANSACTIONS_STORE_ACTIONS","TRANSACTIONS_STORE_MUTATIONS","TRANSACTION_WARNING_CODENAME","TRANSACTION_WARNING","CARD_UNIDENTIFIABLE","STATEMENT_WITHIN_SUBMITTED_REPORT","PAYMENT_METHOD_NOT_FOUND","MULTIPLE_PAYMENT_METHODS_FOUND","TRANSACTION_ACTIONS","ACCOUNTING_STORE_STATE","ACCOUNTING_STORE_GETTERS","ACCOUNTING_STORE_ACTIONS","ACCOUNTING_STORE_MUTATIONS","REFERENCE_OBJECT_TYPE","REFERENCE_OBJECT_TYPE_NAME","ACCOUNTING_OBJECT_TYPE","ACCOUNTING_ENTRY_TYPE","ACCOUNTING_ENTRY_REFERENCE_TYPE","FILTER_OPERATOR","FILTER_VECTOR","SUBMITTER_EMAIL","SUPPLIER_NAME","SUPPLIER_REG_CODE","SUPPLIER_VAT_NUMBER","SUPPLIER_COUNTRY_CODE","ORDER_ID","ITEM_ROWS_VAT_RATE","ITEM_ROWS_CODE","ITEM_ROWS_DESCRIPTION","COMMENT","COST_TYPE_NAME","PAYMENT_METHOD_TYPE","PAYMENT_METHOD_CARD_NR","PAYMENT_METHOD_ACCOUNT_NR","PAYMENT_REF_NR","SUPPLIER_BANK_ACCOUNT_NR","TARGET_VECTOR","ACCOUNTING","ITEM_ROWS","PAYMENT_METHOD","MILEAGE","REPORT","receiptGeneralStatus","notApplicable","noPicture","requireExpenseConfirmation","disableSendingSingleDocuments","receiptCurrencyConversionStatus","receiptDuplicateStatus","isLocalStorageAvailable","getLocal","clear","getQueryObjectFromWindowLocation","search","substring","decodeURIComponent","safeAdd","value1","value2","compareObjAgainstTarget","obj_1","obj_2","INTEGRATION","_log","process","load","getURL","Axios","create","initialData","monthlyThreshold5Exceeded","createURL","this","$config","update","callback","edit","massUpdate","resolve","URI","addToTrip","_custom","setReceiptCustomTripId","call","CustomTrips","TUT","CustomTripHandlers","supportsEditing","forcedReportChoice","getReceiptTripId","Receipts","transformTrip","_customSupportsEdit","handler","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","loaded","__webpack_modules__","deferred","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","r","n","getter","__esModule","definition","o","defineProperty","enumerable","get","f","chunkId","reduce","promises","u","miniCssF","g","globalThis","Function","hmd","children","set","Error","obj","prop","prototype","hasOwnProperty","inProgress","dataWebpackPrefix","l","done","script","needAttach","scripts","getElementsByTagName","s","getAttribute","charset","nc","onScriptComplete","prev","clearTimeout","doneFns","parentNode","removeChild","bind","head","Symbol","toStringTag","nmd","paths","p","createStylesheet","fullhref","oldTag","linkTag","rel","onLinkComplete","errorType","realHref","request","insertBefore","nextSibling","findStylesheet","existingLinkTags","tag","dataHref","existingStyleTags","loadStylesheet","installedCssChunks","miniCss","cssChunks","installedChunks","installedChunkData","promise","loadingEnded","realSrc","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","self","__webpack_exports__"],"sourceRoot":""}