(env, utils)\r\n","import env from \"core/env\";\r\n\r\nexport const imageEndpoint: string = env(\"VITE_VUE_APP_IMAGE_ENDPOINT\") ?? \"\";\r\n\r\nexport const firebaseConfig = {\r\n apiKey: \"AIzaSyA6SZbGnRKB5Uo3z-B_yjQT6S8fPnn8roE\",\r\n authDomain: \"emeco-timesheets-prod.firebaseapp.com\",\r\n projectId: \"emeco-timesheets-prod\",\r\n storageBucket: \"emeco-timesheets-prod.appspot.com\",\r\n messagingSenderId: \"339673293686\",\r\n appId: \"1:339673293686:web:ff2671af63b343640a1057\",\r\n measurementId: \"G-ZQSV22BWES\",\r\n};\r\n","export default \"__VITE_ASSET__ee1cdae8__\"","import { BrowserCacheLocation, Configuration, LogLevel, PublicClientApplication } from \"@azure/msal-browser\";\r\nimport env from \"./core/env\";\r\n\r\n// Config object to be passed to Msal on creation\r\nconst msalConfig: Configuration = {\r\n auth: {\r\n clientId:\r\n env('VITE_VUE_APP_MSAL_CLIENT_ID') ?? '91a3dbda-0af0-40cd-a33a-feaf1587c581',\r\n authority:\r\n env('VITE_VUE_APP_MSAL_AUTHORITY') ??\r\n 'https://etsidentitiesprod.b2clogin.com/etsidentitiesprod.onmicrosoft.com/B2C_1_SignIn',\r\n redirectUri:\r\n env('VITE_VUE_APP_MSAL_REDIRECT_URI') ?? 'https://103.153.73.223/callback',\r\n postLogoutRedirectUri: env('VITE_VUE_APP_MSAL_REDIRECT_LOGOUT_URI') ?? '/login',\r\n knownAuthorities: ['etsidentitiesprod.b2clogin.com'],\r\n },\r\n cache: {\r\n cacheLocation: BrowserCacheLocation.LocalStorage,\r\n storeAuthStateInCookie: true,\r\n },\r\n system: {\r\n loggerOptions: {\r\n loggerCallback: (\r\n level: LogLevel,\r\n message: string,\r\n containsPii: boolean\r\n ) => {\r\n if (containsPii) {\r\n return;\r\n }\r\n switch (level) {\r\n case LogLevel.Error:\r\n console.error(message);\r\n return;\r\n case LogLevel.Info:\r\n // console.info(message);\r\n return;\r\n case LogLevel.Verbose:\r\n // console.debug(message);\r\n return;\r\n case LogLevel.Warning:\r\n // console.warn(message);\r\n return;\r\n default:\r\n return;\r\n }\r\n },\r\n logLevel: LogLevel.Verbose,\r\n },\r\n },\r\n};\r\n\r\nexport const msalInstance = new PublicClientApplication(msalConfig);\r\n\r\n// Add here scopes for id token to be used at MS Identity Platform endpoints.\r\nexport const loginRequest = {\r\n scopes: ['openid profile'],\r\n};\r\n\r\n\r\n/**\r\n * Scopes you add here will be used to request a token from Azure AD B2C to be used for accessing a protected resource.\r\n * To learn more about how to work with scopes and resources, see:\r\n * https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/resources-and-scopes.md\r\n */\r\n\r\nexport const tokenRequest = {\r\n scopes: ['https://etsidentitiesprod.onmicrosoft.com/api/System.Admin', \r\n 'https://etsidentitiesprod.onmicrosoft.com/api/Timesheet.Submit',\r\n 'https://etsidentitiesprod.onmicrosoft.com/api/Timesheet.Approve',\r\n 'https://etsidentitiesprod.onmicrosoft.com/api/Timesheet.Review',\r\n 'https://etsidentitiesprod.onmicrosoft.com/api/User.Manage',\r\n 'https://etsidentitiesprod.onmicrosoft.com/api/System.Admin',\r\n 'openid', 'profile', 'offline_access'],\r\n forceRefresh: true, // Set this to \"true\" to skip a cached token and go to the server to get a new token\r\n};\r\n\r\n\r\n// Add here the endpoints for MS Graph API services you would like to use.\r\nexport const graphConfig = {\r\n graphMeEndpoint: 'https://graph.microsoft.com/v1.0/me',\r\n};","import moment from 'moment';\r\n\r\nexport const getHoursAndMinutes = (totalMinutes : number, timesheetLineMinutes?: number) => {\r\n if (totalMinutes == null) {\r\n return {\r\n hours: 12,\r\n minutes: 0,\r\n isAm: true,\r\n isInit: true \r\n }\r\n }\r\n if (totalMinutes == 1440 || totalMinutes == 0) {\r\n return {\r\n hours: 12,\r\n minutes: 0,\r\n isAm: true,\r\n isInit: false\r\n }\r\n }\r\n if (totalMinutes < 60) {\r\n return {\r\n hours: 12,\r\n minutes: totalMinutes % 60,\r\n isAm: true,\r\n isInit: false\r\n }\r\n }\r\n\r\n if (Math.floor(totalMinutes / 60) > 12) {\r\n return {\r\n hours: Math.floor(totalMinutes / 60),\r\n minutes: totalMinutes % 60,\r\n isAm: Math.floor(totalMinutes / 60) < 12,\r\n isInit: false\r\n }\r\n }\r\n\r\n return {\r\n hours: Math.floor(totalMinutes / 60),\r\n minutes: totalMinutes % 60,\r\n isAm: Math.floor(totalMinutes / 60) < 12,\r\n isInit: false\r\n }\r\n}\r\n\r\nexport function convertMinutesToHours(minutes: number) {\r\n let hours = minutes / 60;\r\n return parseFloat(hours.toFixed(2));\r\n}\r\n\r\nexport const formatDate = (date: string) => {\r\n return moment(date).format('HH:mm, DD MMM YYYY')\r\n}\r\n\r\nexport const formatDateLocale = (date: string) => {\r\n return moment(date).format('DD/MM/YYYY HH:mm')\r\n}\r\n\r\nexport const formatOnlyDate = (date: string) => {\r\n const parsedDate = moment(date, 'MMM D, YYYY');\r\n return parsedDate.format('DD/MM/YYYY')\r\n}\r\n\r\nexport const formatOnlyHours = (totalHours: number) => {\r\n // 1.1 -> 01h01m\r\n const hours = Math.floor(totalHours);\r\n const minutes = Math.round((totalHours - hours) * 60);\r\n return `${hours.toString().padStart(2, '0')}h${minutes.toString().padStart(2, '0')}m`;\r\n}\r\n\r\nexport const getTimezone = () => {\r\n const currentDate = new Date();\r\n const timezoneOffset = currentDate.getTimezoneOffset();\r\n const hours = Math.abs(Math.floor(timezoneOffset / 60));\r\n return timezoneOffset >= 0 ? -hours : hours;\r\n}\r\n","import { AuthState } from './types'\r\nimport { AUTH_TOKEN_KEY } from '../../../core/constants'\r\n\r\nexport const state: AuthState = {\r\n isAuthenticated: !!localStorage.getItem(AUTH_TOKEN_KEY) || sessionStorage.getItem(AUTH_TOKEN_KEY),\r\n currentUser: {},\r\n allFieldIsValid: false\r\n}\r\n\r\n","import axios from 'axios';\r\nimport env from './env'\r\n\r\nexport const refreshTokenInstance = axios.create({\r\n baseURL: env('VITE_SERVICE_ENDPOINT'),\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n});","import axios from 'axios'\r\nimport type { AxiosInstance, AxiosRequestConfig, Method, AxiosError } from 'axios'\r\nimport {\r\n AUTH_TOKEN_KEY,\r\n ID_TOKEN_KEY,\r\n LOGIN_ID_KEY,\r\n EXPIRE_TIME_KEY,\r\n REFRESH_TOKEN_KEY,\r\n} from './constants'\r\nimport env from './env'\r\nimport store from 'store'\r\nimport { loginRequest, msalInstance, tokenRequest } from \"../authConfig\";\r\nimport { autoForceLogout, autoRefreshToken, checkTokenExpire, getCookie, isAuthenticated } from '../utils'\r\nimport { InteractionType } from '@azure/msal-browser'\r\nimport { refreshTokenInstance } from './refreshTokenService'\r\n\r\n// const { cookies } = useCookies()\r\naxios.interceptors.request.use(async (req: any) => {\r\n const token = localStorage.getItem(AUTH_TOKEN_KEY) || sessionStorage.getItem(AUTH_TOKEN_KEY);\r\n const isTokenExpire = checkTokenExpire(token);\r\n if(!token) return req\r\n if (!isTokenExpire) return req\r\n if(sessionStorage.getItem(AUTH_TOKEN_KEY)) {\r\n return req\r\n }\r\n try {\r\n const refreshToken = getCookie(REFRESH_TOKEN_KEY)\r\n const response:any = await refreshTokenInstance.post('auth/refresh-token', { refreshToken: refreshToken })\r\n req.headers.Authorization = `Bearer ${response.data.access_token}`\r\n localStorage.setItem(AUTH_TOKEN_KEY, response.data.access_token);\r\n } catch (error) {\r\n localStorage.setItem(AUTH_TOKEN_KEY, '');\r\n document.cookie = `${REFRESH_TOKEN_KEY}=`;\r\n window.location.href = '/login';\r\n }\r\n return req\r\n})\r\naxios.interceptors.response.use(\r\n (response) => Promise.resolve(response),\r\n (error) => {\r\n if (error?.response.status === 403) {\r\n if (error?.response.data.message === \"Your account has been disabled. Contact your support person to enable it, then try again.\") {\r\n localStorage.setItem(AUTH_TOKEN_KEY, '');\r\n sessionStorage.setItem(AUTH_TOKEN_KEY, '');\r\n // msalInstance.logoutRedirect()\r\n }\r\n\r\n if (error?.response.data.message === \"You need to log in again to access\") {\r\n autoForceLogout()\r\n }\r\n }\r\n\r\n if (error?.response.status === 403 && !window.location.pathname.includes('login')) {\r\n return store.commit('SET_OPEN_POPUP_TIMEOUT', true)\r\n }\r\n\r\n if (error?.response.status === 401) {\r\n autoRefreshToken()\r\n }\r\n\r\n return Promise.reject(error)\r\n },\r\n)\r\naxios.defaults.headers.post['Content-Type'] = 'application/json'\r\n\r\nfunction toQueryString(params: { [key: string]: any } = {}) {\r\n const keys: string[] = Object.keys(params || {})\r\n const segments: string[] = []\r\n keys.forEach((k) => {\r\n if (params[k] || params[k] === 0) {\r\n\r\n segments.push(`${encodeURIComponent(k)}=${encodeURIComponent(params[k])}`)\r\n }\r\n })\r\n\r\n return segments.join('&')\r\n}\r\n\r\nexport interface ServiceOptions {\r\n namespace?: string\r\n scope?: string\r\n endpoint?: string\r\n axios?: AxiosRequestConfig\r\n}\r\n\r\nconst defaultOptions: ServiceOptions = {\r\n namespace: undefined,\r\n endpoint: env('VITE_SERVICE_ENDPOINT'),\r\n axios: {},\r\n}\r\n\r\nexport default class Service {\r\n axios: AxiosInstance\r\n\r\n private headers: any\r\n\r\n private options: ServiceOptions = { ...defaultOptions }\r\n\r\n private token: string | null = ''\r\n\r\n /**\r\n * Creates an instance of Service.\r\n *\r\n * @memberOf Service\r\n */\r\n constructor(options?: ServiceOptions) {\r\n this.options = { ...defaultOptions, ...options }\r\n const baseURL = this.options.endpoint || env('VITE_SERVICE_ENDPOINT')\r\n this.axios = axios.create({\r\n baseURL,\r\n ...this.options.axios,\r\n })\r\n // this.token = cookies.get(AUTH_TOKEN_KEY)\r\n }\r\n\r\n /**\r\n * Call a service action via REST API\r\n *\r\n * @param {any} action name of action\r\n * @param {any} params parameters to request\r\n * @returns {Promise}\r\n *\r\n * @memberOf Service\r\n */\r\n public async rest(\r\n action: string,\r\n params?: P,\r\n options = {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n method: 'post',\r\n },\r\n ) {\r\n const { headers } = options\r\n try {\r\n this.token = localStorage.getItem(AUTH_TOKEN_KEY) || sessionStorage.getItem(AUTH_TOKEN_KEY)\r\n // const isTokenExpire = checkTokenExpire(this.token);\r\n\r\n // const request = {\r\n // ...loginRequest,\r\n // };\r\n\r\n // if(isTokenExpire){\r\n // await isAuthenticated(\r\n // msalInstance,\r\n // InteractionType.Redirect,\r\n // request\r\n // );\r\n // const response = await msalInstance.acquireTokenSilent({\r\n // ...tokenRequest,\r\n // });\r\n // this.token = response.accessToken\r\n // localStorage.setItem(AUTH_TOKEN_KEY, response.accessToken);\r\n // }\r\n\r\n\r\n const opts: AxiosRequestConfig = {\r\n url: action.startsWith(\"http\") ? action : `${env('VITE_SERVICE_ENDPOINT')}${action}`,\r\n method: options.method as Method,\r\n data: JSON.stringify(params),\r\n headers: {\r\n ...(this.headers || {}),\r\n ...headers,\r\n Authorization: this.token ? `Bearer ${this.token}` : '',\r\n },\r\n }\r\n const response = await axios.request(opts)\r\n return response.data\r\n } catch (err) {\r\n throw (err as AxiosError).response\r\n }\r\n }\r\n\r\n public get
(action: string, params?: P, options: any = {}) {\r\n const { headers = {} } = options\r\n let query = ''\r\n if (params) {\r\n query = toQueryString(params)\r\n }\r\n const path = query ? `${action}?${query}` : action\r\n return this.rest(\r\n path,\r\n {},\r\n {\r\n method: 'get',\r\n headers,\r\n },\r\n )\r\n }\r\n\r\n public post(action: string, params?: any, options: any = {}) {\r\n const { headers = {} } = options\r\n return this.rest(action, params, {\r\n method: 'post',\r\n headers,\r\n })\r\n }\r\n\r\n public put(action: string, params?: any, options?: any) {\r\n return this.rest(action, params, {\r\n method: 'put',\r\n baseURL: `${env('VITE_SERVICE_ENDPOINT')}`,\r\n ...options,\r\n headers: {\r\n Authorization: this.token ? `Bearer ${this.token}` : '',\r\n 'Content-Type': 'application/json',\r\n },\r\n })\r\n }\r\n\r\n public patch(action: string, params?: any, options?: any) {\r\n return this.rest(action, params, {\r\n method: 'Patch',\r\n baseURL: `${env('VITE_SERVICE_ENDPOINT')}`,\r\n ...options,\r\n headers: {\r\n Authorization: this.token ? `Bearer ${this.token}` : '',\r\n 'Content-Type': 'application/json',\r\n },\r\n })\r\n }\r\n public delete(action: string, params?: any, options: any = {}) {\r\n const { headers = {} } = options\r\n const query = toQueryString(params)\r\n const path = query ? `${action}/${query}` : action\r\n return this.rest(\r\n path,\r\n {},\r\n {\r\n method: 'delete',\r\n headers,\r\n },\r\n )\r\n }\r\n\r\n /**\r\n * POST FORM DATA FILE\r\n * @param action \r\n * @param data \r\n * @param options \r\n */\r\n public async postFormData(action: string, data: any, options: any = {}) {\r\n this.token = localStorage.getItem(AUTH_TOKEN_KEY) || sessionStorage.getItem(AUTH_TOKEN_KEY)\r\n var config = {\r\n method: 'POST',\r\n url: `${env('VITE_SERVICE_ENDPOINT')}${action}`,\r\n ...options,\r\n headers: {\r\n 'Content-Type': 'multipart/form-data',\r\n Authorization: this.token ? `Bearer ${this.token}` : '',\r\n },\r\n data: data\r\n };\r\n\r\n return await axios(config).then(function (response) {\r\n if (response.status == 200 || response.status == 201) {\r\n return response.data;\r\n }\r\n })\r\n .catch(function (error) {\r\n throw (error as AxiosError).response\r\n });\r\n\r\n }\r\n\r\n /**\r\n * Download file function\r\n * @param action \r\n * @param params \r\n * @param options \r\n * @returns \r\n */\r\n public async downloadFile
(action: string, params?: P, options: any = {}) {\r\n this.token = localStorage.getItem(AUTH_TOKEN_KEY) || sessionStorage.getItem(AUTH_TOKEN_KEY)\r\n var config = {\r\n method: 'GET',\r\n url: `${env('VITE_SERVICE_ENDPOINT')}${action}`,\r\n ...options,\r\n headers: {\r\n Authorization: this.token ? `Bearer ${this.token}` : '',\r\n },\r\n // responseType: 'blob',\r\n };\r\n\r\n return await axios(config)\r\n\r\n .catch(function (error) {\r\n throw (error as AxiosError).response\r\n });\r\n\r\n }\r\n // public async renewToken() {\r\n // store.commit('SET_LOADING', true)\r\n // return axios\r\n // .post(`${env('VITE_SERVICE_ENDPOINT')}/admin/renew-token`, {\r\n // loginId: cookies.get(LOGIN_ID_KEY),\r\n // id_token: cookies.get(ID_TOKEN_KEY),\r\n // refresh_token: cookies.get(REFRESH_TOKEN_KEY),\r\n // })\r\n // .then((res) => {\r\n // if (res.data.data) {\r\n // const { data } = res.data\r\n // store.dispatch('auth/actSetToken', {\r\n // idToken: data.id_token,\r\n // accessToken: data.access_token,\r\n // refreshToken: data.refresh_token,\r\n // })\r\n // this.token = cookies.get(AUTH_TOKEN_KEY)\r\n // }\r\n // })\r\n // .catch(() => store.dispatch('auth/actLogout'))\r\n // .finally(() => store.commit('SET_LOADING', false))\r\n // }\r\n}\r\n","import Service from 'core/service'\r\nimport { CurrentUserModel } from '../store/types'\r\nimport { AxiosError } from 'axios';\r\nexport class AuthService extends Service {\r\n me(): Promise {\r\n return this.get('/auth/me')\r\n }\r\n login(body: any, options: any): Promise {\r\n return this.post(\"/auth/login\", body, options);\r\n }\r\n forgotPassword(body: any, options: any): Promise {\r\n return this.post(\"/auth/forgot-password\", body, options);\r\n }\r\n verifyCode(body: any, options: any): Promise {\r\n return this.post(\"/auth/verify-code\", body, options);\r\n }\r\n resetPassword(body: any, options: any): Promise {\r\n return this.post(\"/auth/new-password\", body, options);\r\n }\r\n resendCode(body: any, options: any): Promise {\r\n return this.post(\"/auth/resend-code\", body, options);\r\n }\r\n refreshToken(body: any, options: any): Promise {\r\n return this.post(\"/auth/refresh-token\", body, options);\r\n }\r\n}\r\n\r\n","export interface AuthState {\r\n isAuthenticated: boolean,\r\n currentUser: CurrentUserModel,\r\n allFieldIsValid: boolean,\r\n}\r\n \r\nexport interface CurrentUserModel {\r\n userId?: string;\r\n firstName?: string;\r\n lastName?: string;\r\n email?: string;\r\n userType?: string;\r\n taskType?: number;\r\n approvalGroups?: any[];\r\n approvalUsers?: any[];\r\n scopes?: string[];\r\n userStatus?: string;\r\n hasProfile?: boolean;\r\n defaultStartTime?: string;\r\n payLocation?: string;\r\n division?: string|any[];\r\n}\r\n \r\n\r\nexport const SET_USER = 'SET_USER'\r\nexport const SET_IS_VALID = 'SET_IS_VALID'\r\n","import { AUTH_TOKEN_KEY, REFRESH_TOKEN_KEY } from \"core/constants\";\r\nimport { RootState } from \"store\";\r\nimport { ActionTree } from \"vuex\";\r\nimport { AuthService } from \"../service\";\r\nimport { AuthState, CurrentUserModel, SET_USER } from \"./types\";\r\nconst service = new AuthService()\r\nexport const actions: ActionTree = {\r\n actClearToken({ commit }) {\r\n localStorage.removeItem(AUTH_TOKEN_KEY);\r\n },\r\n actSetToken({ commit }, params: any) {\r\n if(params.rememberMe) {\r\n localStorage.setItem(AUTH_TOKEN_KEY, params.token);\r\n }\r\n else {\r\n sessionStorage.setItem(AUTH_TOKEN_KEY, params.token);\r\n }\r\n },\r\n actSetRefreshToken({ commit }, token: string) {\r\n document.cookie = `${REFRESH_TOKEN_KEY}=${token}`;\r\n },\r\n async actGetMe({commit}){\r\n try {\r\n const currentUser = await service.me()\r\n commit(SET_USER, currentUser)\r\n return currentUser\r\n } catch (error) {\r\n return null\r\n }\r\n },\r\n async actLogin({ commit }, params: any, options?: any) {\r\n if(params){\r\n const data = await service.login(params, options);\r\n return data;\r\n }\r\n },\r\n async actForgotPassword({ commit }, params: any, options?: any) {\r\n if(params){\r\n const data = await service.forgotPassword(params, options);\r\n return data;\r\n }\r\n },\r\n async actVerifyCode({ commit }, params: any, options?: any) {\r\n if(params){\r\n const data = await service.verifyCode(params, options);\r\n return data;\r\n }\r\n },\r\n async actResetPassword({ commit }, params: any, options?: any) {\r\n if(params){\r\n const data = await service.resetPassword(params, options);\r\n return data;\r\n }\r\n },\r\n async actResendCode({ commit }, params: any, options?: any) {\r\n if(params){\r\n const data = await service.resendCode(params, options);\r\n return data;\r\n }\r\n },\r\n async actRefreshToken({ commit }, params: any, options?: any) {\r\n if(params){\r\n const data = await service.refreshToken(params, options);\r\n return data;\r\n }\r\n },\r\n};\r\n","import { GetterTree } from 'vuex'\r\nimport { RootState } from 'store'\r\nimport { AuthState } from './types'\r\nimport { AUTH_TOKEN_KEY } from 'core/constants'\r\n\r\nexport const getters: GetterTree = {\r\n isAuthenticated: (state: AuthState) => {\r\n var token =localStorage.getItem(AUTH_TOKEN_KEY) || sessionStorage.getItem(AUTH_TOKEN_KEY);\r\n if(!token){\r\n return false;\r\n }else{\r\n const base64Url = token.split('.')[1];\r\n const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\r\n const jsonPayload = decodeURIComponent(atob(base64).split('').map(function(c) {\r\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\r\n }).join(''));\r\n const jwtPayload = JSON.parse(jsonPayload);\r\n if (jwtPayload.exp < Date.now()/1000) {\r\n return false;\r\n }else{\r\n return true;\r\n }\r\n }\r\n },\r\n currentUser:(state: AuthState) => state.currentUser,\r\n allFieldIsValid:(state: AuthState) => state.allFieldIsValid,\r\n}\r\n","import { MutationTree } from \"vuex\";\r\nimport { AuthState, CurrentUserModel, SET_USER, SET_IS_VALID } from \"./types\";\r\n\r\nexport const mutations: MutationTree = {\r\n [SET_USER](state: AuthState, user: CurrentUserModel) {\r\n state.currentUser = user;\r\n },\r\n [SET_IS_VALID](state: AuthState, data: boolean ) {\r\n state.allFieldIsValid = data;\r\n },\r\n};\r\n","import { Module } from 'vuex'\r\nimport { state } from './state'\r\nimport { actions } from './actions'\r\nimport { getters } from './getters'\r\nimport { mutations } from './mutations'\r\nimport { RootState } from 'store'\r\nimport { AuthState } from './types'\r\n\r\nexport const auth: Module = {\r\n namespaced: true,\r\n state,\r\n getters,\r\n actions,\r\n mutations,\r\n}\r\n\r\n","import { DashboardState } from './types'\r\n\r\nexport const state: DashboardState = {\r\n dropdownSite: [],\r\n action: undefined,\r\n timeSheets: [],\r\n countTimeSheetStatus: {\r\n total: 0,\r\n totalApproved: 0,\r\n totalCanceled: 0,\r\n totalDraft: 0,\r\n totalPendingApproved: 0,\r\n totalDeclined: 0\r\n },\r\n filterTimeSheet: {},\r\n countNotiUnRead: 0,\r\n loading: false,\r\n isEditAddTask: false,\r\n totalHour: 0,\r\n timeSheetsLine: []\r\n}","import { AxiosError } from 'axios';\r\nimport Service from 'core/service'\r\n\r\nconst PAGE_SIZE = 25;\r\nexport class DashboardService extends Service {\r\n createTimeSheet(data: TimeSheetHeader){\r\n return this.post('/Timesheet',data)\r\n }\r\n\r\n fetchTimeSheet(expand?: string, filter?: string, pageSize: number = PAGE_SIZE, currentPage: number = 1){\r\n let params: any = {\r\n '$orderby': 'CreatedOn desc'\r\n };\r\n if (expand) {\r\n params[\"$expand\"] = expand;\r\n }\r\n if(filter){\r\n params[\"$filter\"] = filter;\r\n }\r\n params[\"$top\"] = pageSize;\r\n params[\"$skip\"] = currentPage == 1 ? 0 : (currentPage - 1) * pageSize;\r\n return this.get(\"/Timesheet\", params);\r\n }\r\n\r\n fetchTimeSheetById(id:number, expand?: string, select?: string){\r\n let params: any = {\r\n };\r\n if (expand) {\r\n params[\"$expand\"] = expand;\r\n }\r\n if (select) {\r\n params[\"$select\"] = select;\r\n }\r\n return this.get(`/Timesheet(${id})`, params);\r\n }\r\n\r\n countTimeSheetByStatus(filter?: string){\r\n let params: any = {\r\n $count: true\r\n };\r\n params[\"$top\"] = 0\r\n if (filter) {\r\n params[\"$filter\"] = filter;\r\n }\r\n return this.get(\"/Timesheet\", params);\r\n }\r\n\r\n updateTimeSheet(dataUpdate: any){\r\n return this.patch(`/Timesheet(${dataUpdate.Id})`, dataUpdate)\r\n }\r\n\r\n fetchTimesheetEvent(expand?: string, filter?: string){\r\n let params: any = {\r\n '$orderby': 'TimesheetEventDateTime desc'\r\n };\r\n if (expand) {\r\n params[\"$expand\"] = expand;\r\n }\r\n if (filter) {\r\n params[\"$filter\"] = filter;\r\n }\r\n return this.get(\"/TimesheetEvent\", params);\r\n }\r\n\r\n async fetchAllTimesheet(expand: string, filterStr?: string, params?: any){\r\n const response = await this.fetchTimeSheet(expand, filterStr, PAGE_SIZE, params?.page ?? 1);\r\n return response.value;\r\n }\r\n\r\n async uploadSignature (formData: any): Promise {\r\n try {\r\n return this.postFormData(\"/Timesheet/UploadSignature\", formData);\r\n\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n }\r\n\r\n async getBase64FromUrl(url: string) {\r\n const data = await this.get(url);\r\n const blob = await data.blob();\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.readAsDataURL(blob);\r\n reader.onloadend = () => {\r\n const base64data = reader.result;\r\n resolve(base64data);\r\n }\r\n });\r\n }\r\n\r\n async fetchTotalTimesheet(selectProps: string, expand: string, filter?: string, pageSize: number = 100, currentPage: number = 1){\r\n let params: any = {\r\n '$orderby': 'CreatedOn desc',\r\n $select: selectProps,\r\n };\r\n if(filter){\r\n params[\"$filter\"] = filter;\r\n }\r\n if (expand) {\r\n params[\"$expand\"] = expand;\r\n }\r\n params[\"$top\"] = pageSize;\r\n params[\"$skip\"] = currentPage == 1 ? 0 : (currentPage - 1) * pageSize;\r\n return this.get(\"/Timesheet\", params);\r\n }\r\n}\r\n\r\n","export interface DashboardState {\r\n dropdownSite: Equipment[]\r\n action?: Actions\r\n timeSheets?: TimeSheetHeader[]\r\n timeSheetEvents?: [],\r\n countNotiUnRead?: number,\r\n countTimeSheetStatus: CountTimeSheetStatus\r\n filterTimeSheet: FilterTimeSheet,\r\n loading: boolean,\r\n isEditAddTask: boolean,\r\n totalHour: number,\r\n timeSheetsLine: any[];\r\n}\r\n\r\nexport enum Actions {\r\n SAVE = 'SAVE',\r\n UPDATE = 'UPDATE',\r\n UPDATE_CONFIRM = 'UPDATE_CONFIRM',\r\n CONFIRM = 'CONFIRM',\r\n}\r\n\r\nexport interface CountTimeSheetStatus {\r\n totalDraft: number,\r\n total: number,\r\n totalApproved: number,\r\n totalPendingApproved: number,\r\n totalCanceled: number,\r\n totalDeclined: number,\r\n}\r\n\r\nexport const timeSheetStatusName = Object.freeze({\r\n 0: 'Draft',\r\n 1: 'Pending',\r\n 2: 'Approved',\r\n 3: 'Declined',\r\n 4: 'Recalled',\r\n 5: 'Cancelled',\r\n})\r\n\r\nexport interface FilterTimeSheet {\r\n fromDay?: string,\r\n toDay?: string,\r\n timeSheetStatus?: number,\r\n timeSheetId?: string,\r\n divisionJob?: string,\r\n}\r\n\r\nexport const SET_DROPDOWN_SITE = 'SET_DROPDOWN_SITE'\r\nexport const SET_ACTION_TIME_SHEET = 'SET_ACTION_TIME_SHEET'\r\nexport const SET_LIST_TIME_SHEET = 'SET_LIST_TIME_SHEET'\r\nexport const SET_COUNT_TIME_SHEET_STATUS = 'SET_COUNT_TIME_SHEET_STATUS'\r\nexport const SET_LIST_TIME_SHEET_EVENT = 'SET_LIST_TIME_SHEET_EVENT'\r\nexport const SET_COUNT_NOTI_UNREAD = 'SET_COUNT_NOTI_UNREAD'\r\nexport const SET_FILTER_TIME_SHEET = 'SET_FILTER_TIME_SHEET'\r\nexport const SET_LOADING_NOTI = 'SET_LOADING_NOTI'\r\nexport const SET_IS_EDIT_ADD_TASK = 'SET_IS_EDIT_ADD_TASK'\r\nexport const SET_TOTAL_HOUR_TIME_SHEET = 'SET_TOTAL_HOUR_TIME_SHEET'\r\nexport const SET_LIST_TIME_SHEET_LINE = 'SET_LIST_TIME_SHEET_LINE'","import Service from \"core/service\";\r\nexport class NotificationService extends Service {\r\n fetchNotification(\r\n currentPage: number,\r\n pageSize: number,\r\n expand?: string,\r\n filter?: string,\r\n orderby?: string,\r\n count: boolean = false,\r\n ) {\r\n let params: any = {\r\n \"$expand\": \"TimesheetHeader($expand=Approver, User), User, ActorUser\",\r\n \"$orderby\": 'TimesheetNotificationDateTime desc'\r\n };\r\n if (expand) {\r\n params[\"$expand\"] = expand;\r\n }\r\n if (filter) {\r\n params[\"$filter\"] = filter;\r\n }\r\n if (orderby) {\r\n params[\"$orderby\"] = orderby;\r\n }\r\n if (count) {\r\n params[\"$count\"] = true;\r\n params[\"$top\"] = pageSize;\r\n params[\"$skip\"] = currentPage == 1 ? 0 : (currentPage - 1) * pageSize;\r\n }\r\n return this.get(\"/TimesheetNotification\", params);\r\n }\r\n\r\n fetchCountNotiUnRead(\r\n ) {\r\n let params: any = {\r\n \"$filter\": \"IsRead eq false\",\r\n \"$orderby\": 'TimesheetNotificationDateTime desc'\r\n };\r\n return this.get(\"/TimesheetNotification/$count\", params);\r\n }\r\n\r\n markAllRead(\r\n ) {\r\n return this.post(\"/TimesheetNotification/MarkAllRead\");\r\n }\r\n\r\n updateNotification(dataUpdate: any) {\r\n return this.patch(`/TimesheetNotification/${dataUpdate.Id}`, {\r\n IsRead: dataUpdate.IsRead\r\n });\r\n }\r\n\r\n registerToken(data: any) {\r\n return this.post(`/NotificationHub`, data);\r\n }\r\n}\r\n","import { RootState } from \"store\";\r\nimport { ActionTree } from \"vuex\";\r\nimport { DashboardService } from \"../service\";\r\nimport {\r\n DashboardState,\r\n FilterTimeSheet,\r\n SET_COUNT_NOTI_UNREAD,\r\n SET_COUNT_TIME_SHEET_STATUS,\r\n SET_LIST_TIME_SHEET, SET_LIST_TIME_SHEET_EVENT,\r\n timeSheetStatusName,\r\n SET_TOTAL_HOUR_TIME_SHEET,\r\n SET_LIST_TIME_SHEET_LINE\r\n} from \"./types\";\r\nimport dayjs from \"dayjs\";\r\nimport { NotificationService } from \"modules/notifications/service\";\r\nimport { SET_USER } from \"modules/auth/store/types\";\r\n\r\n\r\nconst service = new DashboardService();\r\nconst notificationService = new NotificationService();\r\nexport const actions: ActionTree = {\r\n async actCreateTimeSheet({ commit }, params: any) {\r\n return service.createTimeSheet(params)\r\n },\r\n\r\n async actLoadTimeSheet({ commit }, params: any) {\r\n const filterTimeSheet: FilterTimeSheet = this.getters[\"dashboard/filterTimeSheet\"];\r\n let filterExpandLine = \"\"\r\n // if (filterTimeSheet.divisionJob) {\r\n // filterExpandLine = `$filter=(TimesheetLineType eq 2 and (JobCostCode eq null or JobCostCode/Job/Division eq '${filterTimeSheet.divisionJob}')) or TimesheetLineType ne 2;`\r\n // }\r\n const expand = `TimesheetLines(${filterExpandLine}$expand=WorkOrder,JobCostCode($expand=Job),GLAccount,WorkOrderTask,TimesheetAdditionals($select=Manufacturer)),Approver`\r\n let filterStr = []\r\n const lstTimeSheet = this.getters[\"dashboard/timeSheets\"]\r\n if (filterTimeSheet.timeSheetId) {\r\n filterStr.push(`startswith(cast(TimesheetHeaderId, 'Edm.String'),'${filterTimeSheet.timeSheetId.toString()}')`)\r\n }\r\n if (filterTimeSheet.fromDay && filterTimeSheet.toDay) {\r\n filterStr.push(`StartDate ge ${filterTimeSheet.fromDay} and StartDate le ${filterTimeSheet.toDay}`);\r\n }\r\n if (filterTimeSheet.timeSheetStatus || filterTimeSheet.timeSheetStatus == 0) {\r\n filterStr.push(`TimesheetStatus eq ${filterTimeSheet.timeSheetStatus}`);\r\n }\r\n\r\n // if (filterTimeSheet.divisionJob) {\r\n // filterStr.push(`TimesheetLines/any(line: (line/TimesheetLineType eq 2 and (line/JobCostCode eq null or line/JobCostCode/Job/Division eq '${filterTimeSheet.divisionJob}')) or line/TimesheetLineType ne 2)`)\r\n // }\r\n\r\n const result = await service.fetchAllTimesheet(expand, filterStr.join(' and '), params)\r\n const data = result.map((item: TimeSheetHeader) => {\r\n const timeSheet: TimeSheetHeader = {\r\n ...item\r\n }\r\n if (timeSheet.StartDate) {\r\n timeSheet.StartDate = dayjs(timeSheet.StartDate).format('MMM DD, YYYY')\r\n }\r\n timeSheet.TimesheetLines = []\r\n if (timeSheet.TimesheetStatus || timeSheet.TimesheetStatus === 0) {\r\n timeSheet.TimesheetStatusName = timeSheetStatusName[timeSheet.TimesheetStatus as keyof typeof timeSheetStatusName]\r\n }\r\n if (item.TimesheetLines && item.TimesheetLines.length > 0) {\r\n item.TimesheetLines.forEach((line) => {\r\n\r\n const timesheetLine: TimeSheetLine = {\r\n ...line\r\n }\r\n timesheetLine.JobTitle = '---'\r\n\r\n if (line.TimesheetLineType === 0) {\r\n timesheetLine.JobType = 'Rental'\r\n } else if (line.TimesheetLineType === 1) {\r\n timesheetLine.JobType = 'Unbill'\r\n } else if (line.TimesheetLineType === 2) {\r\n timesheetLine.JobType = 'Job cost'\r\n }\r\n\r\n if (line.WorkOrderTaskId && line.WorkOrderTask) {\r\n timesheetLine.JobTitle = `${line.WorkOrderTask.Name} ${line.WorkOrderTask.Description}`\r\n }\r\n if (line.JobCostCodeId && line.JobCostCode) {\r\n timesheetLine.JobTitle = `${line.JobCostCode.Name} ${line.JobCostCode.Description}`\r\n }\r\n if (line.Glaccount && line.GlaccountId) {\r\n timesheetLine.JobTitle = `${line.Glaccount.Description}`\r\n }\r\n if (line.TimesheetLineMinutes && line.TimesheetLineMinutes > 0) {\r\n timesheetLine.TimesheetLineMinutesTitle = `${Math.floor(line.TimesheetLineMinutes / 60)}h ${line.TimesheetLineMinutes % 60}min`\r\n }\r\n timeSheet.TimesheetLines?.push(timesheetLine)\r\n })\r\n }\r\n if (timeSheet.TotalDuration > 0) {\r\n timeSheet.TotalWorkingTitle = `${Math.floor(timeSheet.TotalDuration / 60)}h ${timeSheet.TotalDuration % 60}min`\r\n timeSheet.TotalWorkingHours = timeSheet.TotalDuration / 60\r\n } else {\r\n timeSheet.TotalWorkingTitle = '0h'\r\n timeSheet.TotalWorkingHours = 0\r\n }\r\n return timeSheet;\r\n })\r\n commit(SET_LIST_TIME_SHEET, [...lstTimeSheet, ...data])\r\n },\r\n\r\n async actCountTimeSheetStatus({ commit }, params: any) {\r\n let filterStr = undefined\r\n const filterTimeSheet: FilterTimeSheet = this.getters[\"dashboard/filterTimeSheet\"]\r\n if (filterTimeSheet.timeSheetId) {\r\n filterStr = `startswith(cast(TimesheetHeaderId, 'Edm.String'),'${filterTimeSheet.timeSheetId.toString()}')`;\r\n }\r\n if (filterTimeSheet.fromDay && filterTimeSheet.toDay) {\r\n filterStr = filterStr ? filterStr + ` and StartDate ge ${filterTimeSheet.fromDay} and StartDate le ${filterTimeSheet.toDay}` : `StartDate ge ${filterTimeSheet.fromDay} and StartDate le ${filterTimeSheet.toDay}`;\r\n }\r\n // if (filterTimeSheet.divisionJob) {\r\n // const filterDivisionJob = `TimesheetLines/any(line: (line/TimesheetLineType eq 2 and (line/JobCostCode eq null or line/JobCostCode/Job/Division eq '${filterTimeSheet.divisionJob}')) or line/TimesheetLineType ne 2)`\r\n // filterStr = filterStr ? filterStr + `and (${filterDivisionJob})` : `(${filterDivisionJob})`\r\n // }\r\n const promise = []\r\n promise.push(service.countTimeSheetByStatus(filterStr).then((res: any) => res['@odata.count'])) // count all\r\n promise.push(service.countTimeSheetByStatus(`TimesheetStatus eq 0 ${filterStr ? 'and ' + filterStr : ''}`).then((res: any) => res['@odata.count'])) // count Draft\r\n promise.push(service.countTimeSheetByStatus(`TimesheetStatus eq 1 ${filterStr ? 'and ' + filterStr : ''}`).then((res: any) => res['@odata.count'])) // count Pending\r\n promise.push(service.countTimeSheetByStatus(`TimesheetStatus eq 2 ${filterStr ? 'and ' + filterStr : ''}`).then((res: any) => res['@odata.count'])) // count Approve\r\n promise.push(service.countTimeSheetByStatus(`TimesheetStatus eq 3 ${filterStr ? 'and ' + filterStr : ''}`).then((res: any) => res['@odata.count'])) // count Declined\r\n promise.push(service.countTimeSheetByStatus(`TimesheetStatus eq 5 ${filterStr ? 'and ' + filterStr : ''}`).then((res: any) => res['@odata.count'])) // count Cancelled\r\n const [total, totalDraft, totalPendingApproved, totalApproved, totalDeclined, totalCanceled] = await Promise.all(promise)\r\n const data = {\r\n total,\r\n totalDraft,\r\n totalPendingApproved,\r\n totalApproved,\r\n totalDeclined,\r\n totalCanceled,\r\n }\r\n commit(SET_COUNT_TIME_SHEET_STATUS, data)\r\n return data\r\n },\r\n\r\n async actGetTimeSheet({ commit }, params: any) {\r\n const expand = `TimesheetLines($expand=JobCostCode,GLAccount,WorkOrderTask,\r\n TimesheetAdditionals(select=TimesheetAdditionalId,Manufacturer,Model,Smureading,SerialNumber,CustomerName,CustomerEmail,Locations,TravelKms,\r\n Rego,WorkerSignature,CustomerSignature,AdditionalInfo,CustomerAcceptanceName))\r\n ,Approver,User`\r\n const select = `EndTime,Shift,StartDate,StartTime,SubmittedCount,TimesheetHeaderId,TimesheetStatus,UserId`\r\n const result = await service.fetchTimeSheetById(params.id, expand, select)\r\n return result\r\n },\r\n\r\n async actGetTimeSheetEvent({ commit }, params: any) {\r\n const countNotiUnRead = await notificationService.fetchCountNotiUnRead()\r\n const result = await notificationService.fetchNotification(1, 1000000)\r\n commit(SET_LIST_TIME_SHEET_EVENT, result)\r\n commit(SET_COUNT_NOTI_UNREAD, countNotiUnRead)\r\n return result\r\n },\r\n\r\n async actUpdateTimeSheet({ commit }, params: any) {\r\n const result = await service.updateTimeSheet(params)\r\n return result\r\n },\r\n\r\n async actFetchMessage({ commit }, params: any) {\r\n const filters = `TimesheetHeaderId eq ${params.TimesheetHeaderId}`\r\n const expand = `TimesheetEventNotifications(expand=User(select=FirstName,LastName,Email,AvatarUrl))`\r\n const result = await service.fetchTimesheetEvent(expand, filters)\r\n const messageModel: MessageEventModel[] = []\r\n if (result.value) {\r\n result.value.forEach((timesheetEvent: TimesheetEvent) => {\r\n if (timesheetEvent.TimesheetEventNotifications) {\r\n timesheetEvent.TimesheetEventNotifications.forEach((timesheetEventNotification) => {\r\n messageModel.push({\r\n TimesheetEventDateTime: timesheetEventNotification.TimesheetEventNotificationDateTime,\r\n TimesheetEventId: timesheetEvent.TimesheetEventId,\r\n TimesheetEventType: timesheetEvent.TimesheetEventType,\r\n User: timesheetEventNotification.User,\r\n Message: timesheetEventNotification.Message,\r\n TimesheetEventNotificationId: timesheetEventNotification.TimesheetEventNotificationId\r\n })\r\n })\r\n }\r\n });\r\n }\r\n return messageModel\r\n },\r\n\r\n async uploadSignature({ commit }, params: any) {\r\n const data = await service.uploadSignature(params);\r\n return data;\r\n },\r\n async getBase64FromUrl({ commit }, params: any) {\r\n const data = await service.getBase64FromUrl(params);\r\n return data;\r\n },\r\n\r\n async loadCountTotalTimesheet({ commit }, params: any) {\r\n let filterStr = ''\r\n let totalHour = 0\r\n filterStr = (`StartDate ge ${params.date} and StartDate le ${params.date} and TimesheetStatus eq 1 or StartDate ge ${params.date} and StartDate le ${params.date} and TimesheetStatus eq 2`);\r\n const selectProps = 'TotalDuration,UserId,TimesheetHeaderId'\r\n const expand = `TimesheetLines($select=StartTime,EndTime)`\r\n let currentUser = this.getters[\"auth/currentUser\"];\r\n\r\n const data = await service.fetchTotalTimesheet(selectProps, expand, filterStr)\r\n\r\n const dataByUserId = data.value.filter((item: any) => params?.userId ? item.UserId == params?.userId : item.UserId == currentUser.userId)\r\n const checkCurrentData = dataByUserId.filter((item: any) => item?.TimesheetHeaderId !== params?.timesheetId)\r\n\r\n if (checkCurrentData.length > 0) {\r\n totalHour = checkCurrentData.reduce((accumulator: any, currentValue: any) => accumulator + currentValue.TotalDuration, 0);\r\n }\r\n commit(SET_TOTAL_HOUR_TIME_SHEET, totalHour);\r\n commit(SET_LIST_TIME_SHEET_LINE, checkCurrentData);\r\n },\r\n\r\n};\r\n","import { GetterTree } from 'vuex'\r\nimport { RootState } from 'store'\r\nimport { DashboardState } from './types'\r\n\r\nexport const getters: GetterTree = {\r\n dropdownSite:(state: DashboardState) => state.dropdownSite,\r\n action:(state: DashboardState) => state.action,\r\n timeSheets:(state: DashboardState) => state.timeSheets,\r\n timeSheetEvents:(state: DashboardState) => state.timeSheetEvents,\r\n countNotiUnRead:(state: DashboardState) => state.countNotiUnRead,\r\n countTimeSheetStatus:(state: DashboardState) => state.countTimeSheetStatus,\r\n filterTimeSheet:(state: DashboardState) => state.filterTimeSheet,\r\n loading: (state: DashboardState) => state.loading,\r\n isEditAddTask: (state: DashboardState) => state.isEditAddTask,\r\n totalHour: (state: DashboardState) => state.totalHour,\r\n timeSheetsLine: (state: DashboardState) => state.timeSheetsLine,\r\n}\r\n","import { MutationTree } from \"vuex\";\r\nimport {\r\n DashboardState,\r\n SET_DROPDOWN_SITE,\r\n SET_ACTION_TIME_SHEET,\r\n SET_LIST_TIME_SHEET,\r\n SET_COUNT_TIME_SHEET_STATUS,\r\n SET_FILTER_TIME_SHEET,\r\n CountTimeSheetStatus,\r\n FilterTimeSheet,\r\n Actions, SET_LIST_TIME_SHEET_EVENT, SET_COUNT_NOTI_UNREAD,\r\n SET_LOADING_NOTI,\r\n SET_IS_EDIT_ADD_TASK,\r\n SET_TOTAL_HOUR_TIME_SHEET,\r\n SET_LIST_TIME_SHEET_LINE\r\n} from \"./types\";\r\n\r\nexport const mutations: MutationTree = {\r\n [SET_DROPDOWN_SITE](state: DashboardState, data: Equipment[]) {\r\n state.dropdownSite = data;\r\n },\r\n [SET_ACTION_TIME_SHEET](state: DashboardState, data: Actions) {\r\n state.action = data;\r\n },\r\n [SET_LIST_TIME_SHEET](state: DashboardState, data: TimeSheetHeader[]) {\r\n state.timeSheets = data;\r\n },\r\n [SET_COUNT_TIME_SHEET_STATUS](state: DashboardState, data: CountTimeSheetStatus) {\r\n state.countTimeSheetStatus = data;\r\n },\r\n [SET_FILTER_TIME_SHEET](state: DashboardState, data: FilterTimeSheet) {\r\n state.filterTimeSheet = data;\r\n },\r\n [SET_LIST_TIME_SHEET_EVENT](state: DashboardState, data: any) {\r\n state.timeSheetEvents = data;\r\n },\r\n [SET_COUNT_NOTI_UNREAD](state: DashboardState, data: any) {\r\n state.countNotiUnRead = data;\r\n },\r\n [SET_LOADING_NOTI](state: DashboardState, status: boolean) {\r\n state.loading = status;\r\n },\r\n [SET_IS_EDIT_ADD_TASK](state: DashboardState, status: boolean) {\r\n state.isEditAddTask = status;\r\n },\r\n [SET_TOTAL_HOUR_TIME_SHEET](state: DashboardState, data: number) {\r\n state.totalHour = data;\r\n },\r\n [SET_LIST_TIME_SHEET_LINE](state: DashboardState, data: any) {\r\n state.timeSheetsLine = data;\r\n },\r\n};\r\n","import { Module } from 'vuex'\r\nimport { state } from './state'\r\nimport { actions } from './actions'\r\nimport { getters } from './getters'\r\nimport { mutations } from './mutations'\r\nimport { RootState } from 'store'\r\nimport { DashboardState } from './types'\r\n\r\nexport const dashboard: Module = {\r\n namespaced: true,\r\n state,\r\n getters,\r\n actions,\r\n mutations,\r\n}\r\n\r\n","import { ProfileState } from './types'\r\n\r\nexport const state: ProfileState = {\r\n}","import Service from \"core/service\";\r\nimport type { AxiosError } from 'axios';\r\nexport class ProfileService extends Service {\r\n dropDownSite(selectProps?: string, filter?: string, apply?: string, limit?: number, active?: number): Promise {\r\n let params: any = { \"$filter\": active == -1 ? '' : active == 1 || active == undefined ? \"(Active eq true)\" : \"(Active eq false)\" };\r\n if (selectProps) {\r\n params['$select'] = selectProps\r\n }\r\n if (filter && apply) {\r\n params[\"$apply\"] = `filter(${filter})/${apply}`;\r\n } else {\r\n if (filter) {\r\n params[\"$filter\"] += params[\"$filter\"].length > 0 ? ` and (${filter})` : `${filter}`;\r\n }\r\n if (apply) {\r\n params[\"$apply\"] = apply;\r\n }\r\n }\r\n if (limit) {\r\n params[\"$top\"] = limit;\r\n }\r\n\r\n return this.get(\"/Site\", params);\r\n }\r\n\r\n dropDownEquipment(selectProps?: string, filter?: string, apply?: string, limit?: number, active?: number): Promise {\r\n let params: any = { \"$filter\": active == -1 ? '' : active == 1 || active == undefined ? \"(Active eq true)\" : \"(Active eq false)\" };\r\n if (selectProps) {\r\n params['$select'] = selectProps\r\n }\r\n if (filter && apply) {\r\n params[\"$apply\"] = `filter(${filter})/${apply}`;\r\n } else {\r\n if (filter) {\r\n params[\"$filter\"] += params[\"$filter\"].length > 0 ? ` and ${filter}` : `${filter}`;\r\n }\r\n if (apply) {\r\n params[\"$apply\"] = apply;\r\n }\r\n }\r\n if (limit) {\r\n params[\"$top\"] = limit;\r\n }\r\n return this.get(\"/Equipment\", params);\r\n }\r\n\r\n getEquipmentById(id: number, expand?: string): Promise {\r\n let params: any = {};\r\n if (expand) {\r\n params['$expand'] = expand\r\n }\r\n return this.get(`/Equipment(${id})`, params);\r\n }\r\n\r\n dropDownJob(selectProps: string, filter: string | null, limit?: number, active?: number): Promise {\r\n let params: any = {\r\n $select: selectProps,\r\n \"$filter\": active == -1 ? '' : active == 1 || active == undefined ? \"(Active eq true)\" : \"(Active eq false)\"\r\n };\r\n if (filter) {\r\n params[\"$filter\"] += params[\"$filter\"].length > 0 ? ` and (${filter})` : `${filter}`;\r\n }\r\n if (limit) {\r\n params[\"$top\"] = limit;\r\n }\r\n return this.get(\"/Job\", params);\r\n }\r\n\r\n dropDownJobCost(selectProps: string, filter: string | null, limit?: number, active?: number): Promise {\r\n let params: any = {\r\n $select: selectProps,\r\n \"$filter\": active == -1 ? '' : active == 1 || active == undefined ? \"(Active eq true)\" : \"(Active eq false)\"\r\n };\r\n if (filter) {\r\n params[\"$filter\"] += params[\"$filter\"].length > 0 ? ` and (${filter})` : `${filter}`;\r\n }\r\n if (limit) {\r\n params[\"$top\"] = limit;\r\n }\r\n return this.get(\"/JobCostCode\", params);\r\n }\r\n\r\n dropDownWorkOrder(selectProps: string, filter: string | null, expand?: string | null, limit?: number, active?: number): Promise {\r\n let params: any = {\r\n $select: selectProps,\r\n \"$filter\": active == -1 ? '' : active == 1 || active == undefined ? \"(Active eq true)\" : \"(Active eq false)\"\r\n };\r\n if (filter) {\r\n params[\"$filter\"] += params[\"$filter\"].length > 0 ? ` and (${filter})` : `${filter}`;\r\n }\r\n if (expand) {\r\n params['$expand'] = expand\r\n }\r\n\r\n params[\"$top\"] = limit || 200;\r\n\r\n return this.get(\"/WorkOrder\", params);\r\n }\r\n\r\n getWorkOrderById(id: number, expand?: string): Promise {\r\n let params: any = {\r\n\r\n };\r\n if (expand) {\r\n params['$expand'] = expand\r\n }\r\n return this.get(`/WorkOrder(${id})`, params);\r\n }\r\n\r\n dropDownWorkOrderTask(selectProps: string, filter: string | null, limit?: number, active?: number): Promise {\r\n let params: any = {\r\n $select: selectProps,\r\n \"$filter\": active == -1 ? '' : active == 1 || active == undefined ? \"(Active eq true)\" : \"(Active eq false)\"\r\n };\r\n if (filter) {\r\n params[\"$filter\"] += params[\"$filter\"].length > 0 ? ` and (${filter})` : `${filter}`;\r\n }\r\n if (limit) {\r\n params[\"$top\"] = limit;\r\n }\r\n return this.get(\"/WorkOrderTask\", params);\r\n }\r\n\r\n dropDownGLAccount(selectProps: string, filter: string | null, active?: number): Promise {\r\n let params: any = {\r\n $select: selectProps,\r\n \"$filter\": active == -1 ? '' : active == 1 || active == undefined ? \"(Active eq true)\" : \"(Active eq false)\"\r\n };\r\n if (filter) {\r\n params[\"$filter\"] += params[\"$filter\"].length > 0 ? ` and (${filter})` : `${filter}`;\r\n }\r\n return this.get(\"/GLAccount\", params);\r\n }\r\n\r\n getWorkOrderTaskById(id: number, expand?: string): Promise {\r\n let params: any = {\r\n\r\n };\r\n if (expand) {\r\n params['$expand'] = expand\r\n }\r\n return this.get(`/WorkOrderTask(${id})`, params);\r\n }\r\n\r\n getJobCostCodeById(id: number, expand?: string): Promise {\r\n let params: any = {\r\n\r\n };\r\n if (expand) {\r\n params['$expand'] = expand\r\n }\r\n return this.get(`/JobCostCode(${id})`, params);\r\n }\r\n\r\n getGlAccountById(id: number): Promise {\r\n return this.get(`/GLAccount(${id})`);\r\n }\r\n\r\n fetchTimeSheet(expand?: string, filter?: string) {\r\n let params: any = {\r\n // '$orderby': 'CreatedOn desc'\r\n };\r\n if (expand) {\r\n params[\"$expand\"] = expand;\r\n }\r\n if (filter) {\r\n params[\"$filter\"] = filter;\r\n }\r\n return this.get(\"/Timesheet\", params);\r\n }\r\n\r\n getTopApprover(expand?: string, filter?: string) {\r\n let params: any = {\r\n // '$orderby': 'CreatedOn desc'\r\n };\r\n if (expand) {\r\n params[\"$expand\"] = expand;\r\n }\r\n if (filter) {\r\n params[\"$filter\"] = filter;\r\n }\r\n return this.get(\"/Timesheet\", params);\r\n }\r\n\r\n async updateAvatar(formData: any): Promise {\r\n try {\r\n return this.postFormData(\"/User/Avatar\", formData);\r\n\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n }\r\n\r\n async selectWorkingHour(param: any) {\r\n try {\r\n let params: any = {\r\n };\r\n\r\n if (param) {\r\n params[\"summary\"] = param.sortBy; //Month or Year\r\n }\r\n const res = this.get(\"/Profile/WorkingHours\", params);\r\n return res;\r\n\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n }\r\n\r\n async selectTopApprover(param: any) {\r\n try {\r\n let params: any = {\r\n };\r\n\r\n if (param) {\r\n params[\"summary\"] = param.sortBy; //Month or Year\r\n }\r\n const res = this.get(\"/Profile/TopApprovers\", params);\r\n return res;\r\n\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n }\r\n\r\n patchForceLogout() {\r\n try {\r\n return this.patch(\"/Profile/ForceLogout\");\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n }\r\n\r\n dropDownTaskCategory(filter?: string): Promise {\r\n let params: any = {};\r\n\r\n if (filter) {\r\n params[\"$filter\"] = filter;\r\n }\r\n return this.get(\"/TaskCategory\", params);\r\n }\r\n\r\n}\r\n","import itemVue from \"modules/super/notifications/components/item.vue\";\r\nimport { RootState } from \"store\";\r\nimport { ActionTree } from \"vuex\";\r\nimport { ProfileService } from \"../service\";\r\nimport { ProfileState } from \"./types\";\r\nconst service = new ProfileService()\r\nexport const actions: ActionTree = {\r\n async actGetDropDownSite({ commit }, params: any) {\r\n let filter = ``\r\n const active = params?.active\r\n if (params.filter) {\r\n filter = filter + `contains(tolower(Location),'${params.filter.toLowerCase()}')`\r\n }\r\n const data = await service.dropDownSite('', filter, undefined, params.limit, active);\r\n return data.value;\r\n },\r\n async actGetDropDownFleet({ commit }, params: any) {\r\n const active = params?.active\r\n\r\n if (params.filter && (params.search !== undefined)) {\r\n const filter = `(Location eq '${params.filter}') and (contains(tolower(Name),'${params.search.toLowerCase()}'))`\r\n const data = await service.dropDownEquipment('EquipmentId, Location, Name,Description', filter, undefined, params.limit, active);\r\n return data.value;\r\n }\r\n\r\n if (params.id) {\r\n const filter = `EquipmentId eq ${params.id}`\r\n const data = await service.dropDownEquipment('EquipmentId, Location, Name,Description', filter, undefined, params.limit, active);\r\n return data.value;\r\n }\r\n\r\n if (params.filter) {\r\n const filter = `Location eq '${params.filter}'`\r\n const data = await service.dropDownEquipment('EquipmentId, Location, Name,Description', filter, undefined, params.limit, active);\r\n return data.value;\r\n }\r\n\r\n if (params.search !== undefined) {\r\n const filter = `(contains(tolower(Name),'${params.search.toLowerCase()}'))`\r\n const data = await service.dropDownEquipment('EquipmentId, Location, Name,Description', filter, undefined, params.limit, active);\r\n return data.value;\r\n }\r\n return []\r\n },\r\n async actGetFleetById({ commit }, params: any) {\r\n const data = await service.getEquipmentById(\r\n params.id,\r\n params.expand\r\n );\r\n return data;\r\n },\r\n async actGetDropDownWorkOrder({ commit }, params: any) {\r\n const active = params?.active\r\n if (params.search == undefined && !params.filter) return []\r\n\r\n let filter = ``;\r\n\r\n if (params.filter) {\r\n filter = `(EquipmentId eq ${params.filter})`;\r\n }\r\n\r\n if (params.search !== undefined) {\r\n filter = `(contains(tolower(Name),'${params.search.toLowerCase()}') or contains(tolower(Description),'${params.search.toLowerCase()}'))`\r\n }\r\n\r\n if (params.filter && (params.search !== undefined)) {\r\n console.log(`(EquipmentId eq ${params.filter}) and (contains(tolower(Name),'${params.search.toLowerCase()}') or contains(tolower(Description),'${params.search.toLowerCase()}'))`)\r\n filter = `(EquipmentId eq ${params.filter}) and (contains(tolower(Name),'${params.search.toLowerCase()}') or contains(tolower(Description),'${params.search.toLowerCase()}'))`\r\n }\r\n\r\n if (params.filter && params.parent == 'Site') {\r\n filter = params.filter\r\n }\r\n if (params.filter && params.parent == 'Site' && (params.search !== undefined)) {\r\n filter = `(${params.filter}) and (contains(tolower(Name),'${params.search.toLowerCase()}') or contains(tolower(Description),'${params.search.toLowerCase()}'))`\r\n }\r\n\r\n const data = await service.dropDownWorkOrder(\r\n \"WorkOrderId, Name, EquipmentId, Description, Active\",\r\n filter,\r\n undefined, params.limit,\r\n active\r\n );\r\n\r\n return data.value.map((item: any) => {\r\n return {\r\n ...item,\r\n FullName: `${item.Name} ${item.Description}`,\r\n };\r\n });\r\n },\r\n async actGetWorkOrderById({ commit }, params: any) {\r\n const data = await service.getWorkOrderById(\r\n params.id,\r\n params.expand\r\n );\r\n return data;\r\n },\r\n async actGetDropDownWorkOrderTask({ commit }, params: any) {\r\n const active = params?.active\r\n if (params.search == undefined && !params.filter) return []\r\n\r\n let filter = ``;\r\n\r\n if (params.filter) {\r\n filter = `WorkOrderId eq ${params.filter}`;\r\n }\r\n\r\n if (params.search) {\r\n filter = `(contains(tolower(Name),'${params.search.toLowerCase()}') or contains(tolower(Description),'${params.search.toLowerCase()}'))`;\r\n }\r\n\r\n if (params.filter && (params.search !== undefined)) {\r\n filter = `(WorkOrderId eq ${params.filter}) and (contains(tolower(Name),'${params.search.toLowerCase()}') or contains(tolower(Description),'${params.search.toLowerCase()}'))`\r\n }\r\n\r\n if (params.filter && params.parent == 'Site') {\r\n filter = params.filter\r\n }\r\n if (params.filter && params.parent == 'Site' && (params.search !== undefined)) {\r\n filter = `(${params.filter}) and (contains(tolower(Name),'${params.search.toLowerCase()}') or contains(tolower(Description),'${params.search.toLowerCase()}'))`\r\n }\r\n\r\n const data = await service.dropDownWorkOrderTask(\r\n \"WorkOrderTaskId, WorkOrderId, Name, Description, Active\",\r\n filter,\r\n params.limit,\r\n active\r\n );\r\n\r\n return data.value.map((item: any) => {\r\n return {\r\n ...item,\r\n FullName: `${item.Name} ${item.Description}`,\r\n };\r\n });\r\n },\r\n async actGetWorkOrderTaskById({ commit }, params: any) {\r\n const data = await service.getWorkOrderTaskById(\r\n params.id,\r\n params.expand\r\n );\r\n return data;\r\n },\r\n async actGetDropDownJob({ commit }, params: any) {\r\n const active = params?.active\r\n let filter = null\r\n let data: any\r\n if (params.filter) {\r\n filter = `contains(tolower(Name),'${params.filter.toLowerCase()}') or contains(tolower(Description),'${params.filter.toLowerCase()}')`\r\n }\r\n if (params.division && !Array.isArray(params.division)) {\r\n const filterDivision = `Division eq '${params.division}'`\r\n filter = filter ? `(${filter}) and ${filterDivision}` : filterDivision\r\n }\r\n if (params.division && Array.isArray(params.division)) {\r\n const conditions = params.division.map((item: any) => `(Division eq '${item}')`);\r\n const filterDivision = conditions.join(' or ');\r\n filter = filter ? `(${filter}) ${filterDivision ? `and (${filterDivision})` : ''}` : filterDivision\r\n }\r\n if (params.JobId) {\r\n filter = `JobId eq ${params.JobId}`\r\n }\r\n data = await service.dropDownJob('JobId, Division, Name, Description', filter, params.limit, active);\r\n return data.value.map((item: any) => {\r\n return {\r\n ...item,\r\n FullName: `${item.Name} ${item.Description} (${item.Division})`\r\n }\r\n });\r\n },\r\n async actGetDropDownJobCost({ commit }, params: any) {\r\n const active = params?.active\r\n let filter = ``;\r\n\r\n if (params.filter) {\r\n filter = `JobId eq ${params.filter}`\r\n }\r\n\r\n if (params.search) {\r\n filter = `(contains(tolower(Name),'${params.search.toLowerCase()}') or contains(tolower(Description),'${params.search.toLowerCase()}'))`\r\n }\r\n\r\n if (params.filter && (params.search !== undefined)) {\r\n filter = `JobId eq ${params.filter} and (contains(tolower(Name),'${params.search.toLowerCase()}') or contains(tolower(Description),'${params.search.toLowerCase()}'))`\r\n }\r\n\r\n if (params.division && !Array.isArray(params.division)) {\r\n const filterDivision = `Job/Division eq '${params.division}'`\r\n filter = filter ? `(${filter}) and ${filterDivision}` : filterDivision\r\n }\r\n\r\n if (params.division && Array.isArray(params.division)) {\r\n const conditions = params.division.map((item: any) => `(Job/Division eq '${item}')`);\r\n const filterDivision = conditions.join(' or ')\r\n filter = filter ? `(${filter}) ${filterDivision ? `and (${filterDivision})` : ''}` : filterDivision\r\n }\r\n\r\n const data = await service.dropDownJobCost('JobCostCodeId, JobId, Name, Description', filter, params.limit, active);\r\n return data.value.map((item: any) => {\r\n return {\r\n ...item,\r\n FullName: `${item.Name} ${item.Description}`\r\n }\r\n });\r\n },\r\n\r\n async actGetDropDownGLAccount({ commit }, params: any) {\r\n const active = params?.active\r\n const data = await service.dropDownGLAccount('GLAccountId, Description', null, active);\r\n return data.value\r\n },\r\n\r\n async actGetJobCostCodeById({ commit }, params: any) {\r\n const expand = `Job`\r\n const data = await service.getJobCostCodeById(params.id, expand)\r\n return data\r\n },\r\n\r\n async actGetGlAccountById({ commit }, params: any) {\r\n const data = await service.getGlAccountById(params.id)\r\n return data\r\n },\r\n\r\n async selectWorkingHour({ commit }, params: any) {\r\n const data = await service.selectWorkingHour(params);\r\n return data;\r\n },\r\n\r\n async selectTopApprover({ commit }, params: any) {\r\n const data = await service.selectTopApprover(params);\r\n return data.data.map((item: any) => {\r\n return {\r\n ...item,\r\n total: item.totalApproved,\r\n totalApprover: data[\"totalApproved\"],\r\n }\r\n });\r\n },\r\n\r\n async updateAvatar({ commit }, params: any) {\r\n let data: any;\r\n data = await service.updateAvatar(params);\r\n return data;\r\n },\r\n\r\n async forceLogout({ commit }) {\r\n await service.patchForceLogout();\r\n return;\r\n },\r\n\r\n async actGetDropDownTaskCategory({ commit }, params: any) {\r\n let filter = ``\r\n const active = params?.active\r\n if (params.filter) {\r\n filter = filter + `contains(tolower(Name),'${params.filter.toLowerCase()}')`\r\n }\r\n const data = await service.dropDownTaskCategory(filter);\r\n console.log(data)\r\n return data.value;\r\n },\r\n\r\n};\r\n","import { GetterTree } from 'vuex'\r\nimport { RootState } from 'store'\r\nimport { ProfileState } from './types'\r\nimport { AUTH_TOKEN_KEY } from 'core/constants'\r\n\r\nexport const getters: GetterTree = {\r\n \r\n}\r\n","import { MutationTree } from \"vuex\";\r\nimport { ProfileState, } from \"./types\";\r\n\r\nexport const mutations: MutationTree = {\r\n \r\n};\r\n","import { Module } from 'vuex'\r\nimport { state } from './state'\r\nimport { actions } from './actions'\r\nimport { getters } from './getters'\r\nimport { mutations } from './mutations'\r\nimport { RootState } from 'store'\r\nimport { ProfileState } from './types'\r\n\r\nexport const profile: Module = {\r\n namespaced: true,\r\n state,\r\n getters,\r\n actions,\r\n mutations,\r\n}\r\n\r\n","import { ManualState } from './types'\r\n\r\nexport const state: ManualState = {\r\n percent: 0,\r\n loading: false\r\n}","import Service from \"core/service\";\r\nimport type { AxiosInstance, AxiosRequestConfig, Method, AxiosError } from 'axios'\r\n\r\nexport class ManualService extends Service {\r\n\r\n insert(formData: any, options: any): Promise {\r\n try {\r\n return this.postFormData(\"/Manual\", formData, options);\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n \r\n }\r\n\r\n update(body: any, id: any): Promise {\r\n try {\r\n return this.patch(`/Manual/${id}`, body);\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n \r\n }\r\n\r\n select(selectProps: string, filter: string | null, active?:number): Promise {\r\n try {\r\n let params: any = {\r\n $select: selectProps,\r\n \"$filter\": active == -1 ? '' : active == 1|| active == undefined ? \"(Active eq true)\" : \"(Active eq false)\"\r\n };\r\n if (filter) {\r\n params[\"$filter\"] += params[\"$filter\"].length > 0 ? ` and (${filter})` : `${filter}`;\r\n }\r\n return this.get(\"/Manual\", params);\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n \r\n }\r\n\r\n selectById(selectProps: string, id: number | null): Promise {\r\n try {\r\n \r\n return this.get(`/Manual/${id}`);\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n \r\n }\r\n\r\n deleteManual(params: any): Promise {\r\n try {\r\n return this.delete(`/Manual/${params.ManualId}`);\r\n\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n \r\n }\r\n\r\n downloadFileById(id: number | null): Promise {\r\n try {\r\n const options = {responseType: 'blob',};\r\n return this.downloadFile(`/Manual/downloadFile/${id}`, null,options);\r\n \r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n \r\n }\r\n}\r\n","import { RootState } from \"store\";\r\nimport { ActionTree } from \"vuex\";\r\nimport { ManualService } from \"../service\";\r\nimport { ManualState } from \"./types\";\r\n\r\nconst service = new ManualService()\r\n\r\nexport const actions: ActionTree = {\r\n \r\n async insert({ commit }, params: any, options?: any) {\r\n\r\n const config = {\r\n onUploadProgress: function(progressEvent: any) {\r\n const percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total);\r\n if(percentCompleted < 100 ){\r\n commit('SET_PERCENT_UPLOAD', percentCompleted);\r\n\r\n }\r\n }\r\n }\r\n\r\n if(params){\r\n const data = await service.insert(params, config).then(((res) => {\r\n commit('SET_PERCENT_UPLOAD', 100);\r\n }));\r\n return data;\r\n }\r\n },\r\n async update ({ commit }, params: any) {\r\n if(params){\r\n const data = await service.update(params, params.ManualId);\r\n return data;\r\n }\r\n},\r\n\r\n async select({ commit }, params: any) {\r\n const filter = null;\r\n const active = params?.active\r\n const selectProps = 'ManualId, Name, Description, Active, VisibleTypes';\r\n \r\n const data = await service.select(selectProps, filter, active);\r\n return data.value.map((item:any) => {\r\n return {\r\n ...item,\r\n }\r\n });\r\n },\r\n async selectById({ commit }, id: any) {\r\n let data: any;\r\n data = await service.selectById('ManualId, Name, Description, Active, VisibleTypes', id);\r\n return data;\r\n },\r\n\r\n async deleteManual({ commit }, params: any) {\r\n if(params){\r\n const data = await service.deleteManual(params);\r\n return data;\r\n }\r\n },\r\n\r\n async downloadFileById({ commit }, id: any) {\r\n let data: any;\r\n data = await service.downloadFileById(id);\r\n return data;\r\n },\r\n \r\n \r\n};\r\n","import { GetterTree } from 'vuex'\r\nimport { RootState } from 'store'\r\nimport { ManualState } from './types'\r\n\r\nexport const getters: GetterTree = {\r\n percentUpload: (state: ManualState) => state.percent,\r\n loading: (state: ManualState) => state.loading,\r\n}\r\n","import { MutationTree } from \"vuex\";\r\nimport { ManualState, SET_PERCENT_UPLOAD} from \"./types\";\r\n\r\nexport const mutations: MutationTree = {\r\n SET_PERCENT_UPLOAD: (state: ManualState, percent: number) => {\r\n state.percent = percent;\r\n },\r\n SET_LOADING_MANUAL: (state: ManualState, status: boolean) => {\r\n state.loading = status\r\n },\r\n \r\n};\r\n","import { Module } from 'vuex'\r\nimport { state } from './state'\r\nimport { actions } from './actions'\r\nimport { getters } from './getters'\r\nimport { mutations } from './mutations'\r\nimport { RootState } from 'store'\r\nimport { ManualState } from './types'\r\n\r\nexport const manual: Module = {\r\n namespaced: true,\r\n state,\r\n getters,\r\n actions,\r\n mutations,\r\n}\r\n\r\n","import { ApprovalGroupState } from './types'\r\n\r\nexport const state: ApprovalGroupState = {\r\n lsGroupApproval: [],\r\n countGroupApproval: 0,\r\n loading: false,\r\n}","import Service from \"core/service\";\r\nimport type { AxiosInstance, AxiosRequestConfig, Method, AxiosError } from 'axios'\r\n\r\nexport class ApprovalGroupService extends Service {\r\n\r\n insert(formData: any, options: any): Promise {\r\n try {\r\n return this.post(\"/approvalGroup\", formData, options);\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n \r\n }\r\n update(body: any, id: any): Promise {\r\n try {\r\n return this.patch(`/approvalGroup/${id}`, body);\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n \r\n }\r\n\r\n select(currentPage: number = 1,pageSize: number = 20,selectProps: string, expand: string | null, filter: string | null, sort:{ field:string, sortOrder:string}): Promise {\r\n try {\r\n let params: any = {\r\n $select: selectProps,\r\n $Count: true\r\n };\r\n if (expand) {\r\n params[\"$expand\"] = expand;\r\n }\r\n if(filter){\r\n params[\"$filter\"] = filter;\r\n }\r\n if(sort){\r\n params[\"$orderby\"] = `${sort.field} ${sort.sortOrder || \"asc\"}`\r\n }\r\n params[\"$Top\"] = pageSize;\r\n params[\"$Skip\"] = currentPage == 1 ? 0 : (currentPage - 1) * pageSize;\r\n return this.get(\"/approvalGroup\", params);\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n \r\n }\r\n\r\n selectSubmitter(currentPage: number = 1,pageSize: number = 20, filter: string | null, sort: string, expand?: string): Promise {\r\n try {\r\n let params: any = {\r\n $Count: true\r\n };\r\n if (expand) {\r\n params[\"$expand\"] = expand;\r\n }\r\n if(filter){\r\n params[\"$filter\"] = filter;\r\n }\r\n if(sort){\r\n params[\"$orderby\"] = `${sort}`\r\n }\r\n params[\"$Top\"] = pageSize;\r\n params[\"$Skip\"] = currentPage == 1 ? 0 : (currentPage - 1) * pageSize;\r\n return this.get(\"/User\", params);\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n \r\n }\r\n\r\n deleteApprovalGroup(params: any): Promise {\r\n try {\r\n return this.delete(`/approvalGroup/${params.ApprovalGroupId}`);\r\n\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n \r\n }\r\n\r\n userList(selectProps: string, filter: string | null, limit: number | null): Promise {\r\n try {\r\n let params: any = {\r\n $select: selectProps,\r\n };\r\n if (filter) {\r\n params[\"$filter\"] = filter;\r\n \r\n }\r\n if (limit) {\r\n params[\"$top\"] = limit;\r\n } else {\r\n params[\"$top\"] = 100;\r\n }\r\n return this.get(\"/user\", params);\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n \r\n }\r\n}\r\n","import { RootState } from \"store\";\r\nimport { ActionTree } from \"vuex\";\r\nimport { ApprovalGroupService } from \"../service\";\r\nimport { ApprovalGroupState } from \"./types\";\r\nconst service = new ApprovalGroupService();\r\n\r\nexport const actions: ActionTree = {\r\n async insert({ commit }, params: any, options?: any) {\r\n if (params) {\r\n const data = await service.insert(params, options);\r\n return data;\r\n }\r\n },\r\n\r\n async update({ commit }, params: any) {\r\n if (params) {\r\n const _params = {\r\n ...params,\r\n }\r\n delete _params.Users\r\n delete _params['Users@odata.count']\r\n const data = await service.update(_params, params.ApprovalGroupId);\r\n return data;\r\n }\r\n },\r\n\r\n async select({ commit }, params: any) {\r\n let filterStr = [];\r\n if (params.filter && params.filter.Search !== undefined) {\r\n filterStr.push(\r\n `(contains(Name,'${params.filter.Search}') or contains(cast(ApprovalGroupId, 'Edm.String'),'${params.filter.Search}'))`\r\n );\r\n }\r\n if (params.filter && params.filter.Status !== undefined) {\r\n filterStr.push(`(Status eq ${params.filter.Status})`);\r\n }\r\n if (params.filter && params.filter.ApprovalGroupId !== undefined) {\r\n filterStr.push(`(ApprovalGroupId eq ${params.filter.ApprovalGroupId})`);\r\n }\r\n const expand =\r\n \"ApprovalGroupMembers($expand=Approver), Users($count=true;$top=0)\";\r\n\r\n const selectProps = \"ApprovalGroupId, Name, Status, CreatedOn, UpdatedOn, GPBatchPrefix, GPBatchNotificationTo, GPBatchNotificationCC\";\r\n\r\n const data = await service.select(\r\n params.currentPage || 1,\r\n params.pageSize || 20,\r\n selectProps,\r\n expand,\r\n filterStr.join(\" and \"),\r\n params.sort\r\n );\r\n commit(\"SET_LIST_APPROVAL\", data.value);\r\n commit(\"SET_COUNT_APPROVAL\", data[\"@odata.count\"]);\r\n return data.value;\r\n },\r\n\r\n async selectSubmitter({ commit }, params: any) {\r\n let filterStr = [];\r\n if (params.filter && params.filter.ApprovalGroupId !== undefined) {\r\n filterStr.push(`(ApprovalGroupId eq ${params.filter.ApprovalGroupId})`);\r\n }\r\n const expand =\r\n \"ApprovalGroupMembers($expand=ApprovalGroup)\";\r\n const data = await service.selectSubmitter(\r\n params.currentPage || 1,\r\n params.pageSize || 20,\r\n filterStr.join(\" and \"),\r\n params.sort,\r\n expand\r\n );\r\n\r\n return data;\r\n },\r\n\r\n async userList({ commit }, params: any) {\r\n let selectProps = \"\";\r\n let expand = \"\";\r\n let filter = `UserType eq 1 and UserStatus eq 1 or UserType eq 3 and UserStatus eq 1`;\r\n if (params.query) {\r\n filter = `UserType eq 1 and UserStatus eq 1 and (contains(tolower(FirstName), '${params.query.toLowerCase()}') or contains(tolower(LastName), '${params.query.toLowerCase()}') or contains(tolower(Email),'${params.query.toLowerCase()}')) or UserType eq 3 and UserStatus eq 1 and (contains(tolower(FirstName), '${params.query.toLowerCase()}') or contains(tolower(LastName), '${params.query.toLowerCase()}') or contains(tolower(Email),'${params.query.toLowerCase()}'))`;\r\n }\r\n if (params.userIds && params.userIds.length > 0) {\r\n if (params.query) {\r\n filter = `UserType eq 1 and UserStatus eq 1 and (contains(tolower(FirstName), '${params?.query?.toLowerCase()}') or contains(tolower(LastName), '${params?.query?.toLowerCase()}') or contains(tolower(Email),'${params?.query?.toLowerCase()}')) and not(UserId in (${params?.userIds?.join(\",\")})) or UserType eq 3 and UserStatus eq 1 and (contains(tolower(FirstName), '${params?.query?.toLowerCase()}') or contains(tolower(LastName), '${params?.query?.toLowerCase()}') or contains(tolower(Email),'${params?.query?.toLowerCase()}')) and not(UserId in (${params?.userIds?.join(\",\")}))` ;\r\n } else {\r\n filter = `UserType eq 1 and UserStatus eq 1 and not(UserId in (${params.userIds.join(\",\")})) or UserType eq 3 and UserStatus eq 1 and not(UserId in (${params.userIds.join(\",\")}))` ;\r\n }\r\n }\r\n const data = await service.userList(selectProps, filter, params.limit);\r\n return data.value.map((item: any) => {\r\n return {\r\n ...item,\r\n FullName: `${item.FirstName} ${item.LastName ? item.LastName : \"\"}`,\r\n };\r\n });\r\n },\r\n\r\n async deleteApprovalGroup({ commit }, params: any) {\r\n if (params) {\r\n const data = await service.deleteApprovalGroup(params);\r\n return data;\r\n }\r\n },\r\n};\r\n","import { GetterTree } from 'vuex'\r\nimport { RootState } from 'store'\r\nimport { ApprovalGroupState } from './types'\r\n\r\nexport const getters: GetterTree = {\r\n lsGroupApproval: (state: ApprovalGroupState) => state.lsGroupApproval,\r\n countGroupApproval: (state: ApprovalGroupState) => state.countGroupApproval,\r\n loading: (state: ApprovalGroupState) => state.loading,\r\n}\r\n","import { MutationTree } from \"vuex\";\r\nimport { ApprovalGroupState, } from \"./types\";\r\n\r\nexport const mutations: MutationTree = {\r\n SET_LIST_APPROVAL: (state: ApprovalGroupState, lsGroupApproval: ApprovalGroupModel[]) => {\r\n state.lsGroupApproval = lsGroupApproval;\r\n },\r\n SET_COUNT_APPROVAL: (state: ApprovalGroupState, countGroupApproval: number) => {\r\n state.countGroupApproval = countGroupApproval;\r\n },\r\n SET_LOADING_GROUP: (state: ApprovalGroupState, status: boolean) => {\r\n state.loading = status\r\n },\r\n};\r\n","import { Module } from 'vuex'\r\nimport { state } from './state'\r\nimport { actions } from './actions'\r\nimport { getters } from './getters'\r\nimport { mutations } from './mutations'\r\nimport { RootState } from 'store'\r\nimport { ApprovalGroupState } from './types'\r\n\r\nexport const approvalGroup: Module = {\r\n namespaced: true,\r\n state,\r\n getters,\r\n actions,\r\n mutations,\r\n}\r\n\r\n","import { UserState } from './types'\r\n\r\nexport const state: UserState = {\r\n userList: [],\r\n userCount: 1,\r\n userParam: null,\r\n defaultStartTime: null,\r\n loading: false,\r\n employeeList: [],\r\n loadingEmployee: false,\r\n employeeCount: 1,\r\n loadingSendMail: false,\r\n sendMailResult: 'INIT',\r\n userLogs: [],\r\n userLogsCount: 1,\r\n loadingUserLogs: false,\r\n}","import Service from \"core/service\";\r\nimport type { AxiosError } from 'axios'\r\nimport axios from \"axios\";\r\n\r\nexport class UserService extends Service {\r\n\r\n insert(body: any, options: any): Promise {\r\n try {\r\n return this.post(\"/User\", body, options);\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n \r\n }\r\n\r\n update(params: any): Promise {\r\n try {\r\n return this.updateUserById(params[0].UserId, params[0]);\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n \r\n }\r\n\r\n updateDetail(params: any): Promise {\r\n try {\r\n return this.patch(`/user/${params.UserId}`, params);\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n \r\n }\r\n\r\n updateUserById(id: any, user: any): Promise {\r\n try {\r\n return this.patch(`/User/${id}`, user);\r\n\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n \r\n }\r\n\r\n updateStatus(params: any, newStatus: number) {\r\n try {\r\n if(params['Users'].length > 0){\r\n let arrPromise = [];\r\n for(let i = 0; i < params['Users'].length; i ++ ){\r\n const promise = this.updateStatusByUser(params.Users[i].UserId, params.Users[i]);\r\n arrPromise.push(promise);\r\n }\r\n return Promise.all(arrPromise);\r\n }\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n \r\n }\r\n updateStatusByUser(id: any, user: any): Promise {\r\n try {\r\n return this.patch(`/User/${id}`, user);\r\n\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n \r\n }\r\n \r\n select(selectProps: string, req: any | null): Promise {\r\n try {\r\n let params: any = {\r\n $select: selectProps,\r\n $expand: \"ApprovalGroupMembers($expand=ApprovalGroup), TimesheetHeaderUsers\",\r\n '$orderby': 'CreatedOn desc'\r\n };\r\n\r\n if(req){\r\n if(req.filter){\r\n params[\"$filter\"] = req.filter;\r\n }\r\n\r\n if (req.orderBy) {\r\n params[\"$orderby\"] = req.orderBy;\r\n }\r\n \r\n params[\"$count\"] = req.count ? req.count : true;\r\n params[\"$top\"] = req.pageSize ? req.pageSize : 100;\r\n params[\"$skip\"] = req.pageSize * (req.currentPage ? req.currentPage - 1 : 0);\r\n \r\n } else {\r\n params[\"$count\"] = true;\r\n params[\"$top\"] = 1;\r\n params[\"$skip\"] = 0;\r\n }\r\n const response = this.get(\"/User\", params);\r\n return response;\r\n\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n \r\n }\r\n\r\n selectUserById(id: number, expand?: string) {\r\n let params: any = {};\r\n if (expand) {\r\n params[\"$expand\"] = expand;\r\n }\r\n return this.get(`/User(${id})`, params);\r\n }\r\n\r\n\r\n selectByUserId(selectProps: string, req: any | null): Promise {\r\n try {\r\n\r\n let params: any = {\r\n $select: selectProps,\r\n };\r\n\r\n if(req){\r\n if(req.filter){\r\n params[\"$filter\"] = req.filter;\r\n\r\n }\r\n }\r\n const response = this.get(\"/User\", params);\r\n return response;\r\n\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n \r\n }\r\n\r\n isExistEmail(email: any | null): Promise {\r\n try {\r\n\r\n let params: any = {\r\n $filter: email\r\n };\r\n\r\n const response = this.get(\"/User\", params);\r\n return response;\r\n\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n \r\n }\r\n\r\n deleteUsers(params: any) {\r\n try {\r\n if(params['Users'].length > 0){\r\n let arrPromise = [];\r\n for(let i = 0; i < params['Users'].length; i ++ ){\r\n const promise = this.deleteUserById(params['Users'][i].UserId);\r\n arrPromise.push(promise);\r\n }\r\n return Promise.all(arrPromise);\r\n }\r\n\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n \r\n }\r\n\r\n deleteUserById(id: any): Promise {\r\n try {\r\n return this.delete(`/User/${id}`);\r\n\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n \r\n }\r\n\r\n appovalGroupList(selectProps: string, filter: string | null, limit: number | null): Promise {\r\n try {\r\n let params: any = {\r\n $select: selectProps,\r\n };\r\n \r\n return this.get(\"/approvalGroup\", params);\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n \r\n }\r\n\r\n dropDownDivisionPayLocation(selectProps: string, filter: string | null, active?:number): Promise {\r\n let params: any = {\r\n $select: selectProps,\r\n \"$filter\": active == -1 ? '' : active == 1|| active == undefined ? \"(Active eq true)\" : \"(Active eq false)\"\r\n };\r\n if (filter) {\r\n params[\"$filter\"] += params[\"$filter\"].length > 0 ? ` and (${filter})` : `${filter}`;\r\n }\r\n return this.get(\"/JobDivisionPayLocation\", params);\r\n }\r\n \r\n dropPayLocation(selectProps: string, filter: string | null, active?:number): Promise {\r\n let params: any = {\r\n $select: selectProps,\r\n $filter: filter,\r\n };\r\n return this.get(\"/PayLocation\", params);\r\n }\r\n\r\n getListGPEmployee(selectProps: string, req: any | null): Promise {\r\n try {\r\n let params: any = {\r\n $select: selectProps,\r\n };\r\n\r\n if(req){\r\n if(req.filter){\r\n params[\"$filter\"] = req.filter;\r\n }\r\n\r\n if (req.orderBy) {\r\n params[\"$orderby\"] = req.orderBy;\r\n }\r\n \r\n params[\"$count\"] = req.count ? req.count : true;\r\n params[\"$top\"] = req.pageSize ? req.pageSize : 100;\r\n params[\"$skip\"] = req.pageSize * (req.currentPage ? req.currentPage - 1 : 0);\r\n \r\n } else {\r\n params[\"$count\"] = true;\r\n params[\"$top\"] = 1;\r\n params[\"$skip\"] = 0;\r\n }\r\n const response = this.get(\"/GPEmployee\", params);\r\n return response;\r\n\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n\r\n }\r\n \r\n getGroupMember(selectProps: string, expand: string | null): Promise {\r\n try {\r\n let params: any = {\r\n $select: selectProps,\r\n $Count: true\r\n };\r\n if (expand) {\r\n params[\"$expand\"] = expand;\r\n }\r\n return this.get(\"/approvalGroup\", params);\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n }\r\n \r\n sendWelcomeEmail(params: any) {\r\n try {\r\n if(params['Users'].length > 0){\r\n let arrPromise = [];\r\n for(let i = 0; i < params['Users'].length; i ++ ){\r\n const promise = this.sendWelcomeByEmail(params.Users[i].UserId);\r\n arrPromise.push(promise);\r\n }\r\n return Promise.all(arrPromise);\r\n }\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n \r\n }\r\n sendWelcomeByEmail(id: any): Promise {\r\n try {\r\n return this.get(`/Profile/SendWelComeEmail/${id}`);\r\n\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n \r\n }\r\n\r\n getAprrovalgroup(selectProps: string, expand: string | null): Promise {\r\n try {\r\n let params: any = {\r\n $select: selectProps,\r\n $Count: true\r\n };\r\n if (expand) {\r\n params[\"$expand\"] = expand;\r\n }\r\n params[\"$filter\"] = 'Status eq 1';\r\n params[\"$Top\"] = 100;\r\n params[\"$Skip\"] = 0;\r\n return this.get(\"/approvalGroup\", params);\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n \r\n }\r\n\r\n selectUserLogs(req: any | null): Promise {\r\n try {\r\n let params: any = {};\r\n\r\n if(req){\r\n if(req.filter){\r\n params[\"$filter\"] = req.filter;\r\n }\r\n if(req.UserLogType !== null){\r\n params[\"UserLogType\"] = req.UserLogType;\r\n }\r\n if(req.orderBy){\r\n params[\"$orderBy\"] = req.orderBy;\r\n }\r\n params[\"$count\"] = req.count ? req.count : true;\r\n params[\"$top\"] = req.pageSize ? req.pageSize : 100;\r\n params[\"$skip\"] = req.pageSize * (req.currentPage ? req.currentPage - 1 : 0);\r\n \r\n } else {\r\n params[\"$count\"] = true;\r\n params[\"$top\"] = 1;\r\n params[\"$skip\"] = 0;\r\n }\r\n const response = this.get(\"/UserLog\", params);\r\n return response;\r\n\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n \r\n }\r\n}\r\n\r\n\r\n","import { RootState } from \"store\";\r\nimport { ActionTree } from \"vuex\";\r\nimport { UserService } from \"../service\";\r\nimport { UserState } from \"./types\";\r\nconst service = new UserService()\r\n\r\nexport const actions: ActionTree = {\r\n \r\n async insert({ commit }, params: any, options?: any) {\r\n if(params){\r\n const data = await service.insert(params, options);\r\n return data;\r\n }\r\n },\r\n \r\n async update ({ commit }, params: any) {\r\n if(params){\r\n const data = await service.update(params);\r\n return data;\r\n }\r\n },\r\n\r\n async updateDetail ({ commit }, params: any) {\r\n if(params){\r\n const data = await service.updateDetail(params);\r\n return data;\r\n }\r\n },\r\n\r\n async updateStatus ({ commit }, params: any) {\r\n if(params){\r\n const newStatus = params.UserStatus;\r\n const data = await service.updateStatus(params, newStatus);\r\n return data;\r\n }\r\n },\r\n\r\n async select({ commit }, params: any) {\r\n if(params) {\r\n let filter = \"\";\r\n if(params.conditionSearch) {\r\n filter = params.conditionSearch.join(' and ');\r\n }\r\n const selectProps = \"\"; \r\n params.filter = filter;\r\n const response = await service.select(selectProps, params);\r\n return response;\r\n }\r\n return [];\r\n },\r\n\r\n async selectUserLog({ commit }, params: any) {\r\n if(params) {\r\n let filter = \"\";\r\n if(params.conditionSearch) {\r\n filter = params.conditionSearch.join(' and ');\r\n }\r\n if(!params?.orderBy) {\r\n params.orderBy = 'UserLogDateTime desc'\r\n }\r\n params.filter = filter;\r\n const response = await service.selectUserLogs(params);\r\n commit(\"SET_USER_LOGS\", response.value);\r\n commit(\"SET_USER_LOGS_COUNT\", response[\"@odata.count\"]);\r\n }\r\n },\r\n\r\n async selectByUserId({ commit }, params: any) {\r\n if(params) {\r\n let filter = \"\";\r\n if(params.Email) {\r\n filter = `tolower(Email) eq tolower('${params.Email}')`;\r\n }\r\n const selectProps = \"\"; \r\n params.filter = filter;\r\n const response = await service.selectByUserId(selectProps, params);\r\n return response;\r\n }\r\n return [];\r\n },\r\n\r\n async selectUserById({ commit }, id: any) {\r\n if(id) {\r\n const response = await service.selectUserById(id);\r\n return response;\r\n }\r\n return [];\r\n },\r\n\r\n async isExistEmail({ commit }, email: any) {\r\n if(email) {\r\n const filter = `tolower(Email) eq tolower('${email}')`;\r\n const response = await service.isExistEmail(filter);\r\n if(response.value && response.value.length > 0){\r\n return true;\r\n }\r\n return false;\r\n }\r\n return false;\r\n },\r\n\r\n async appovalGroupList({ commit }, params: any) {\r\n let selectProps = \"\";\r\n let expand = \"\";\r\n const filter = \"\";\r\n const data = await service.appovalGroupList(selectProps, filter, params.limit);\r\n return data.value;\r\n },\r\n \r\n async delete({ commit }, params: any) {\r\n if(params){\r\n const data = await service.deleteUsers(params);\r\n return data;\r\n }\r\n },\r\n\r\n async dropDownDivisionPayLocation({ commit }, params: any) {\r\n let filter = ``;\r\n const active = params?.active\r\n if (params.search) {\r\n filter = `contains(tolower(PayLocation),'${params.search.toLowerCase()}')`\r\n }\r\n const data = await service.dropDownDivisionPayLocation(\"JobDivisionPayLocationId, PayLocation, Division, Active\", filter, active)\r\n return data.value\r\n },\r\n async dropPayLocation({ commit }, params: any) {\r\n let filter = ``;\r\n if (params.search) {\r\n filter = `contains(tolower(Name),'${params.search.toLowerCase()}')`\r\n }\r\n const data = await service.dropPayLocation(\"Name\", filter)\r\n return data.value\r\n },\r\n \r\n async getListGPEmployee({ commit }, params: any) {\r\n if(params) {\r\n let filter = \"\";\r\n\r\n if(params.conditionSearch) {\r\n filter = params.conditionSearch.join(' and ');\r\n }\r\n const selectProps = \"\"; \r\n params.filter = filter;\r\n const response = await service.getListGPEmployee(selectProps, params);\r\n return response;\r\n }\r\n return [];\r\n },\r\n\r\n async getGroupMember({ commit }, params: any) {\r\n const expand =\r\n \"ApprovalGroupMembers($expand=Approver($select=FirstName, LastName, Email, AvatarUrl, UserType))\";\r\n const selectProps = \"ApprovalGroupId, Name, Status, CreatedOn, UpdatedOn, GPBatchPrefix, GPBatchNotificationTo, GPBatchNotificationCC\";\r\n const data = await service.getGroupMember(\r\n selectProps,\r\n expand,\r\n );\r\n return data.value;\r\n },\r\n\r\n async sendWelcomeEmail ({ commit }, params: any) {\r\n if(params){\r\n const data = await service.sendWelcomeEmail(params);\r\n return data;\r\n }\r\n },\r\n \r\n async getAprrovalgroup ({ commit }, params: any) {\r\n \r\n const expand =\r\n \"ApprovalGroupMembers($expand=Approver), Users($count=true)\";\r\n\r\n const selectProps = \"ApprovalGroupId, Name, Status, CreatedOn, UpdatedOn, GPBatchPrefix, GPBatchNotificationTo, GPBatchNotificationCC\";\r\n\r\n const data = await service.getAprrovalgroup(\r\n selectProps,\r\n expand,\r\n );\r\n return data.value\r\n },\r\n\r\n\r\n};\r\n","import { GetterTree } from 'vuex'\r\nimport { RootState } from 'store'\r\nimport { UserState } from './types'\r\n\r\nexport const getters: GetterTree = {\r\n userList: (state: UserState) => state.userList,\r\n userCount: (state: UserState) => state.userCount,\r\n userParam: (state: UserState) => state.userParam,\r\n defaultStartTime: (state: UserState) => state.defaultStartTime,\r\n loading: (state: UserState) => state.loading,\r\n employeeList: (state: UserState) => state.employeeList,\r\n loadingEmployee: (state: UserState) => state.loadingEmployee,\r\n employeeCount: (state: UserState) => state.employeeCount,\r\n loadingSendMail: (state: UserState) => state.loadingSendMail,\r\n sendMailResult: (state: UserState) => state.sendMailResult,\r\n userLogs: (state: UserState) => state.userLogs,\r\n userLogsCount: (state: UserState) => state.userLogsCount,\r\n loadingUserLogs: (state: UserState) => state.loadingUserLogs\r\n}\r\n","import { MutationTree } from \"vuex\";\r\nimport { UserState } from \"./types\";\r\n\r\nexport const mutations: MutationTree = {\r\n SET_USER_LIST: (state: UserState, userList: UserModel[]) => {\r\n state.userList = userList;\r\n },\r\n SET_USER_LOGS: (state: UserState, userLogs: UserModel[]) => {\r\n state.userLogs = userLogs;\r\n },\r\n SET_USER_COUNT: (state: UserState, userCount: number) => {\r\n state.userCount = userCount;\r\n },\r\n SET_USER_LOGS_COUNT: (state: UserState, userLogscount: number) => {\r\n state.userLogsCount = userLogscount;\r\n },\r\n SET_LOADING_USER_LOGS: (state: UserState, status: boolean) => {\r\n state.loadingUserLogs = status\r\n },\r\n SET_USER_PRAM: (state: UserState, userParam: any) => {\r\n state.userParam = userParam;\r\n },\r\n SET_DEFAULT_START_TIME: (state: UserState, defaultStartTime: any) => {\r\n state.defaultStartTime = defaultStartTime;\r\n },\r\n SET_LOADING_USER: (state: UserState, status: boolean) => {\r\n state.loading = status\r\n },\r\n SET_EMPLOYEE_LIST: (state: UserState, userList: UserModel[]) => {\r\n state.employeeList = userList;\r\n },\r\n SET_LOADING_EMPLOYEE: (state: UserState, status: boolean) => {\r\n state.loadingEmployee = status\r\n },\r\n SET_EMPLOYEE_COUNT: (state: UserState, userCount: number) => {\r\n state.employeeCount = userCount;\r\n },\r\n SET_LOADING_SEND_MAIL: (state: UserState, status: boolean) => {\r\n state.loadingSendMail = status;\r\n },\r\n SET_LOADING_SEND_MAIL_SUCCESS: (state: UserState, status: string) => {\r\n state.sendMailResult = status;\r\n },\r\n SET_LOADING_SEND_MAIL_FAIL: (state: UserState, status: string) => {\r\n state.sendMailResult = status;\r\n },\r\n};\r\n","import { Module } from 'vuex'\r\nimport { state } from './state'\r\nimport { actions } from './actions'\r\nimport { getters } from './getters'\r\nimport { mutations } from './mutations'\r\nimport { RootState } from 'store'\r\nimport { UserState } from './types'\r\n\r\nexport const user: Module = {\r\n namespaced: true,\r\n state,\r\n getters,\r\n actions,\r\n mutations,\r\n}\r\n\r\n","import { TimesheetApproveState } from './types'\r\n\r\nexport const state: TimesheetApproveState = {\r\n timeSheetsApprove: [],\r\n filters: {},\r\n totalRowFetchTimeSheet: 0,\r\n loading: false,\r\n totalHour: 0,\r\n sortParams: '',\r\n}","import Service from \"core/service\";\r\nexport class TimeSheetApproveService extends Service {\r\n fetchTimeSheet(\r\n currentPage: number,\r\n pageSize: number,\r\n expand?: string,\r\n filter?: string,\r\n orderby?: string\r\n ) {\r\n let params: any = {\r\n $orderby: \"CreatedOn desc\",\r\n };\r\n if (expand) {\r\n params[\"$expand\"] = expand;\r\n }\r\n if (filter) {\r\n params[\"$filter\"] = filter;\r\n }\r\n if (orderby) {\r\n params[\"$orderby\"] = orderby;\r\n }\r\n params[\"$count\"] = true;\r\n params[\"$top\"] = pageSize;\r\n params[\"$skip\"] = currentPage == 1 ? 0 : (currentPage - 1) * pageSize;\r\n return this.get(\"/Timesheet\", params);\r\n }\r\n\r\n fetchTimeSheetById(id: number, expand?: string) {\r\n let params: any = {};\r\n if (expand) {\r\n params[\"$expand\"] = expand;\r\n }\r\n return this.get(`/Timesheet(${id})`, params);\r\n }\r\n\r\n updateTimeSheet(dataUpdate: any) {\r\n return this.patch(`/Timesheet(${dataUpdate.Id})`, dataUpdate);\r\n }\r\n\r\n approveTimeSheets(ids: any) {\r\n return this.post(`/Timesheet/Approvals`, { ids });\r\n }\r\n\r\n fetchUserApprove(filter?: string) {\r\n let params: any = {};\r\n if (filter) {\r\n params[\"$filter\"] = filter;\r\n }\r\n return this.get(\"/User\", params);\r\n }\r\n\r\n updateApprovalGroup(TimesheetHeaderId: number, approvalGroupId: number) {\r\n return this.patch(`/Timesheet/${TimesheetHeaderId}/approval-groups/${approvalGroupId}`);\r\n }\r\n}\r\n","export interface TimesheetApproveState {\r\n timeSheetsApprove?: TimeSheetHeader[],\r\n totalRowFetchTimeSheet: number,\r\n filters?: FilterTimeSheet,\r\n loading: boolean,\r\n totalHour: number,\r\n sortParams: string,\r\n}\r\n\r\nexport interface FilterTimeSheet {\r\n fromDay?: string,\r\n toDay?: string,\r\n status?: number,\r\n approveBy?: string,\r\n search?: string,\r\n searchById?: string,\r\n searchSubmitter?: string,\r\n searchReviewer?: string,\r\n timeSheetId?: string;\r\n divisionJob?: string,\r\n searchApprovalGroup?: string,\r\n ownTimesheet?: number;\r\n}\r\n\r\nexport const SET_TIME_SHEETS_APPROVE = 'SET_TIME_SHEETS_APPROVE'\r\nexport const SET_TIME_SHEETS_FILTER = 'SET_TIME_SHEETS_FILTER'\r\nexport const SET_LOADING_TIME_SHEETS = 'SET_LOADING_TIME_SHEETS'\r\nexport const SET_TOTAL_HOUR_TIME_SHEET = 'SET_TOTAL_HOUR_TIME_SHEET'\r\nexport const SET_SORT_PARAMS_TIME_SHEET = 'SET_SORT_PARAMS_TIME_SHEET'\r\n","import { RootState } from \"store\";\r\nimport { ActionTree } from \"vuex\";\r\nimport { TimeSheetApproveService } from \"../service\";\r\nimport { TimesheetApproveState, SET_TIME_SHEETS_APPROVE, FilterTimeSheet, SET_TOTAL_HOUR_TIME_SHEET, SET_SORT_PARAMS_TIME_SHEET } from \"./types\";\r\nimport { timeSheetStatusName } from '../../../dashboard/store/types'\r\nimport _ from 'lodash'\r\nimport dayjs from \"dayjs\";\r\nimport { convertTaskIdToType, formatTime } from \"../../../../utils\";\r\nimport { ProfileService } from '../../../profile/service'\r\n\r\nconst service = new TimeSheetApproveService();\r\nconst profileService =new ProfileService()\r\nexport const actions: ActionTree = {\r\n\r\n async actLoadTimeSheet({ commit }, params: any) {\r\n const filterTimeSheet:FilterTimeSheet = this.getters['timeSheetsApprove/filters']\r\n let expand = `TimesheetLines($expand=Job,JobCostCode,GLAccount,WorkOrderTask, WorkOrder,TimesheetAdditionals($select=Manufacturer)),User($expand=ApprovalGroup),LastActorUser($select=Email,FirstName,LastName),\r\n ApprovalGroup($select=Name,ApprovalGroupId)`\r\n const filters = []\r\n const currentUser = this.getters['auth/currentUser']\r\n if (filterTimeSheet){\r\n if (filterTimeSheet.fromDay && filterTimeSheet.toDay){\r\n filters.push(`StartDate ge ${filterTimeSheet.fromDay} and StartDate le ${filterTimeSheet.toDay}`)\r\n }\r\n if ((filterTimeSheet.status || filterTimeSheet.status === 0) && filterTimeSheet.status != -1) {\r\n filters.push(`TimesheetStatus eq ${filterTimeSheet.status}`)\r\n }\r\n if (filterTimeSheet.approveBy) {\r\n filters.push(`ApproverId eq ${filterTimeSheet.approveBy}`)\r\n }\r\n if (filterTimeSheet.search) {\r\n const isNumber = !isNaN(parseInt(filterTimeSheet.search))\r\n if (isNumber) {\r\n filters.push(`startswith(cast(TimesheetHeaderId, 'Edm.String'),'${filterTimeSheet.search.toString()}')`)\r\n }else{\r\n filters.push(`(contains(tolower(User/FirstName),'${filterTimeSheet.search.toLowerCase()}') or contains(tolower(User/LastName),'${filterTimeSheet.search.toLowerCase()}'))`)\r\n }\r\n }\r\n\r\n if (filterTimeSheet.searchById) {\r\n filters.push(`startswith(cast(TimesheetHeaderId, 'Edm.String'),'${filterTimeSheet.searchById.toString()}')`)\r\n }\r\n\r\n if(filterTimeSheet.searchSubmitter) {\r\n filters.push(`(contains(tolower(User/Email), '${filterTimeSheet.searchSubmitter}') or contains(tolower(concat(concat(User/FirstName,' '), User/LastName)), '${filterTimeSheet.searchSubmitter}') )`);\r\n }\r\n\r\n if(filterTimeSheet.searchReviewer) {\r\n filters.push(`(contains(tolower(Approver/Email), '${filterTimeSheet.searchReviewer}') or contains(tolower(concat(concat(Approver/FirstName,' '), Approver/LastName)), '${filterTimeSheet.searchReviewer}') )`);\r\n }\r\n if (filterTimeSheet.searchApprovalGroup) {\r\n const isNumber = !isNaN(parseInt(filterTimeSheet.searchApprovalGroup))\r\n if (isNumber) {\r\n filters.push(`startswith(cast(User/ApprovalGroupId, 'Edm.String'),'${filterTimeSheet.searchApprovalGroup.toString()}')`)\r\n } else {\r\n filters.push(`contains(tolower(User/ApprovalGroup/Name),'${filterTimeSheet.searchApprovalGroup.toLowerCase()}')`)\r\n }\r\n }\r\n if(filterTimeSheet.ownTimesheet) {\r\n filters.push(`UserId eq ${currentUser.userId}`)\r\n }\r\n }\r\n \r\n const result = await service.fetchTimeSheet(params.currentPage, params.pageSize, expand, filters.join(' and '), params.orderby)\r\n const data = result.value.map((item: TimeSheetHeader)=>{\r\n const timeSheet: TimeSheetHeader = {\r\n ...item\r\n }\r\n if (timeSheet.StartDate) {\r\n timeSheet.StartDate = dayjs(timeSheet.StartDate).format('MMM DD, YYYY')\r\n }\r\n timeSheet.TimesheetLines = []\r\n if (timeSheet.TimesheetStatus || timeSheet.TimesheetStatus === 0) {\r\n timeSheet.TimesheetStatusName = timeSheetStatusName[timeSheet.TimesheetStatus as keyof typeof timeSheetStatusName]\r\n }\r\n if (item.User) {\r\n item.User.FullName = `${item.User.LastName ?? ''} ${item.User.FirstName ?? ''}`\r\n }\r\n if (item.Approver) {\r\n item.Approver.FullName = `${item.Approver.LastName ?? ''} ${item.Approver.FirstName ?? ''}`\r\n }\r\n \r\n if (item.TimesheetLines && item.TimesheetLines.length > 0){\r\n item.TimesheetLines.forEach((line)=> {\r\n \r\n const timesheetLine: TimeSheetLine = {\r\n ...line\r\n }\r\n timesheetLine.JobTitle = '---'\r\n\r\n if (line.TimesheetLineType === 0){\r\n timesheetLine.JobType = 'Rental'\r\n } else if(line.TimesheetLineType === 1){\r\n timesheetLine.JobType = 'Unbill'\r\n } else if(line.TimesheetLineType === 2){\r\n timesheetLine.JobType = 'Job cost'\r\n }\r\n\r\n if (line.WorkOrderTaskId && line.WorkOrderTask) {\r\n timesheetLine.JobTitle = `${line.WorkOrderTask.Name} ${line.WorkOrderTask.Description}`\r\n }\r\n if (line.JobCostCodeId && line.JobCostCode) {\r\n timesheetLine.JobTitle = `${line.JobCostCode.Name} ${line.JobCostCode.Description}`\r\n }\r\n if (line.Glaccount && line.GlaccountId) {\r\n timesheetLine.JobTitle = `${line.Glaccount.Description}`\r\n }\r\n if (line.TimesheetLineMinutes && line.TimesheetLineMinutes > 0) {\r\n timesheetLine.TimesheetLineMinutesTitle = `${Math.floor(line.TimesheetLineMinutes/60)}h ${line.TimesheetLineMinutes%60}min`\r\n }\r\n timeSheet.TimesheetLines?.push(timesheetLine)\r\n })\r\n }\r\n if (timeSheet.TotalDuration > 0){\r\n timeSheet.TotalWorkingTitle = `${Math.floor(timeSheet.TotalDuration/60)}h ${timeSheet.TotalDuration%60}min`\r\n timeSheet.TotalWorkingHours = timeSheet.TotalDuration/60\r\n }else {\r\n timeSheet.TotalWorkingTitle = '0h'\r\n timeSheet.TotalWorkingHours = 0\r\n }\r\n return timeSheet;\r\n })\r\n commit(SET_TIME_SHEETS_APPROVE, {lstTimeSheets: data, count: result['@odata.count']})\r\n commit(SET_SORT_PARAMS_TIME_SHEET, params?.orderby || \"\")\r\n },\r\n\r\n async actGetTimeSheet({ commit }, params: any){\r\n const expand = `TimesheetLines($expand=JobCostCode,GLAccount,WorkOrderTask,\r\n TimesheetAdditionals(select=TimesheetAdditionalId,Manufacturer,Model,Smureading,SerialNumber,CustomerName,CustomerEmail,Locations,TravelKms,\r\n Rego,WorkerSignature,CustomerSignature,AdditionalInfo,CustomerAcceptanceName)),Approver`\r\n const result: TimeSheetHeader = await service.fetchTimeSheetById(params.id, expand)\r\n const lstTimeSheetLineRental:any = []\r\n const lstTimeSheetLineJob:any = []\r\n const lstTimeSheetLineUnbill:any = []\r\n if (result) {\r\n if (result.TimesheetLines){\r\n for (let index = 0; index < result.TimesheetLines.length; index++) {\r\n const line = result.TimesheetLines[index]\r\n \r\n line.JobTitle = ''\r\n if (line.TimesheetLineMinutes && line.TimesheetLineMinutes > 0) {\r\n line.TimesheetLineMinutesTitle = `${Math.floor(line.TimesheetLineMinutes/60)}h ${line.TimesheetLineMinutes%60}min`\r\n }else {\r\n line.TimesheetLineMinutesTitle = '0h'\r\n }\r\n if (line.WorkOrderTaskId && line.WorkOrderTask) {\r\n line.JobTitle = `${line.WorkOrderTask.Name} ${line.WorkOrderTask.Description}`\r\n line.JobType = 'Rental'\r\n const expandWorkOrder = 'WorkOrder($expand=Equipment)'\r\n const workOder = await profileService.getWorkOrderTaskById(line.WorkOrderTaskId, expandWorkOrder)\r\n line.WorkOrderTask = { ...workOder }\r\n lstTimeSheetLineRental.push({...line})\r\n \r\n }\r\n if (line.JobCostCodeId && line.JobCostCode) {\r\n line.JobTitle = `${line.JobCostCode.Name} ${line.JobCostCode.Description}`\r\n line.JobType = 'Job cost'\r\n lstTimeSheetLineJob.push({...line})\r\n }\r\n if (line.Glaccount && line.GlaccountId) {\r\n line.JobTitle = `${line.Glaccount.Description}`\r\n line.JobType = 'Unbill'\r\n lstTimeSheetLineUnbill.push({...line})\r\n }\r\n }\r\n }\r\n if (result.StartDate) {\r\n result.StartDate = dayjs(result.StartDate).format('MMM DD, YYYY')\r\n }\r\n if (result.StartTime) {\r\n result.StartTimeObjects = formatTime(result.StartTime)\r\n }\r\n if (result.TimesheetStatus || result.TimesheetStatus === 0) {\r\n result.TimesheetStatusName = timeSheetStatusName[result.TimesheetStatus as keyof typeof timeSheetStatusName]\r\n }\r\n if (result.TotalDuration > 0){\r\n result.TotalWorkingTitle = `${Math.floor(result.TotalDuration/60)}h ${result.TotalDuration%60}min`\r\n result.TotalWorkingHours = result.TotalDuration/60\r\n }else {\r\n result.TotalWorkingTitle = '0h'\r\n result.TotalWorkingHours = result.TotalDuration/60\r\n }\r\n result.StartDate\r\n }\r\n return {\r\n timeSheetHeader: result,\r\n lstTimeSheetLineRental,\r\n lstTimeSheetLineJob,\r\n lstTimeSheetLineUnbill\r\n }\r\n },\r\n\r\n async actApproveTimeSheet({ commit }, params: any){\r\n const dataApprove = {\r\n Id: params.id,\r\n TimesheetStatus: 2\r\n }\r\n const result = await service.updateTimeSheet(dataApprove)\r\n return result\r\n },\r\n\r\n async actApproveTimeSheets({ commit }, params: any){\r\n const result = await service.approveTimeSheets( params.ids )\r\n return result\r\n },\r\n \r\n async actCancelTimeSheet({ commit }, params: any){\r\n const dataApprove = {\r\n Id: params.id,\r\n TimesheetStatus: 5\r\n }\r\n const result = await service.updateTimeSheet(dataApprove)\r\n return result\r\n },\r\n\r\n async actDeclineTimeSheet({ commit }, params: any){\r\n const dataApprove = {\r\n Id: params.id,\r\n TimesheetStatus: 3,\r\n Reason: params.reason\r\n }\r\n const result = await service.updateTimeSheet(dataApprove)\r\n return result\r\n },\r\n\r\n async actReassignApprovalGroup({ commit }, params: any) {\r\n const result = await service.updateApprovalGroup(params.TimesheetHeaderId, params.ApprovalGroupId)\r\n return result\r\n },\r\n\r\n async actFetchUserApprove({commit}, params:any){\r\n let filter = 'UserType ne 0'\r\n const result = await service.fetchUserApprove(filter)\r\n return result.value;\r\n },\r\n \r\n async loadCountSuperTotalTimesheet({ commit }, params: any) {\r\n let filterStr = ''\r\n let totalHour = 0\r\n const currentUser:any = this.getters['auth/currentUser']\r\n const filterTimeSheet = dayjs().format(\"YYYY-MM-DD\");\r\n filterStr = (`StartDate ge ${filterTimeSheet} and StartDate le ${filterTimeSheet} and TimesheetStatus eq 1 or StartDate ge ${filterTimeSheet} and StartDate le ${filterTimeSheet} and TimesheetStatus eq 2`);\r\n const response = await service.fetchTimeSheet(1, 100, '', filterStr, params?.orderby)\r\n const result = response.value.filter((item: any) => item.UserId == currentUser.userId)\r\n if (result.length > 0) {\r\n totalHour = result.reduce((accumulator: any, currentValue: any) => accumulator + currentValue.TotalDuration, 0);\r\n }\r\n commit(SET_TOTAL_HOUR_TIME_SHEET, totalHour)\r\n },\r\n};\r\n","import { GetterTree } from 'vuex'\r\nimport { RootState } from 'store'\r\nimport { TimesheetApproveState } from './types'\r\n\r\nexport const getters: GetterTree = {\r\n listTimeSheets:(state: TimesheetApproveState) => state.timeSheetsApprove,\r\n filters:(state: TimesheetApproveState) => state.filters,\r\n totalRowFetchTimeSheet:(state: TimesheetApproveState) => state.totalRowFetchTimeSheet,\r\n loading: (state: TimesheetApproveState) => state.loading,\r\n totalHour: (state: TimesheetApproveState) => state.totalHour,\r\n sortParams: (state: TimesheetApproveState) => state.sortParams,\r\n}\r\n","import { MutationTree } from \"vuex\";\r\nimport { TimesheetApproveState, \r\n SET_TIME_SHEETS_APPROVE,\r\n SET_TIME_SHEETS_FILTER,\r\n FilterTimeSheet,\r\n SET_LOADING_TIME_SHEETS,\r\n SET_TOTAL_HOUR_TIME_SHEET,\r\n SET_SORT_PARAMS_TIME_SHEET,\r\n} from \"./types\";\r\n\r\nexport const mutations: MutationTree = {\r\n [SET_TIME_SHEETS_APPROVE](state: TimesheetApproveState, data: any) {\r\n state.timeSheetsApprove = data.lstTimeSheets;\r\n state.totalRowFetchTimeSheet = data.count;\r\n },\r\n [SET_TIME_SHEETS_FILTER](state: TimesheetApproveState, data: FilterTimeSheet) {\r\n state.filters = data\r\n },\r\n [SET_LOADING_TIME_SHEETS](state: TimesheetApproveState, status: boolean) {\r\n state.loading = status\r\n },\r\n [SET_TOTAL_HOUR_TIME_SHEET](state: TimesheetApproveState, data: number) {\r\n state.totalHour = data;\r\n },\r\n [SET_SORT_PARAMS_TIME_SHEET](state: TimesheetApproveState, data: string) {\r\n state.sortParams = data;\r\n },\r\n};\r\n","import { Module } from 'vuex'\r\nimport { state } from './state'\r\nimport { actions } from './actions'\r\nimport { getters } from './getters'\r\nimport { mutations } from './mutations'\r\nimport { RootState } from 'store'\r\nimport { TimesheetApproveState } from './types'\r\n\r\nexport const timeSheetsApprove: Module = {\r\n namespaced: true,\r\n state,\r\n getters,\r\n actions,\r\n mutations,\r\n}\r\n\r\n","import { TimeSheetTrackingState } from './types'\r\n\r\nexport const state: TimeSheetTrackingState = {\r\n filterTimeSheetTracking: {},\r\n timeSheetTrackings: [],\r\n timeSheetTrackingCount: 0,\r\n loading: false\r\n}","import Service from 'core/service'\r\nimport { FilterTimeSheetTracking } from '../store/types';\r\n\r\nconst PAGE_SIZE = 25;\r\nexport class TimeSheetTrackingService extends Service {\r\n fetchTimeSheetTracking(filter: FilterTimeSheetTracking, currentPage: number = 1, pageSize: number = PAGE_SIZE,) {\r\n const dataFilter = {...filter}\r\n dataFilter._Top = pageSize;\r\n dataFilter._Skip = currentPage == 1 ? 0 : (currentPage - 1) * pageSize;\r\n if(dataFilter.Status == -1){\r\n dataFilter.Status = undefined\r\n }\r\n return this.get(\"/TimesheetHistory/GetExpands\", dataFilter);\r\n }\r\n\r\n}","import { convertStatusTimeSheet, convertTaskIdToType } from \"../../../../utils\"\r\nimport {getHoursAndMinutes} from \"../../../../utils/time\"\r\n\r\nexport interface FilterTimeSheetTracking {\r\n UserId?: string,\r\n Search?: string,\r\n Email?: string,\r\n SearchByField?: string,\r\n TimesheetHeaderId?: number,\r\n ActionArea?: number,\r\n ActionType?: number,\r\n Status?: number,\r\n FromDate?: number,\r\n ToDate?: number,\r\n _Top?: number,\r\n _Skip?: number,\r\n _OrderBy?: string,\r\n _OrderType?: string,\r\n}\r\n\r\nexport interface TimeSheetHistory {\r\n timesheetHistoryId: number\r\n timesheetHeaderId: number\r\n userId: string\r\n actionType: number\r\n actionArea: number\r\n time: string\r\n changeDetail: string\r\n user: {\r\n userId: string\r\n userType: number\r\n firstName?: string\r\n email?: string\r\n lastName?: string\r\n avatarUrl?: string\r\n }\r\n}\r\n\r\nexport interface TimeSheetHistoryParse {\r\n timesheetHistoryId: number\r\n timesheetHeaderId: number\r\n taskId?: number\r\n userId: string\r\n actionType: string\r\n actionArea: string\r\n time: string\r\n changeDetail: {\r\n field: string\r\n previousValue?: string | number | null\r\n currentValue?: string | number | null\r\n previousTextValue?: string | null\r\n currentTextValue?: string | null\r\n }[]\r\n user: {\r\n userId: string\r\n userType: number\r\n avatarUrl?: string\r\n name?: string\r\n email?: string\r\n }\r\n}\r\n\r\nexport interface TimeSheetTrackingState {\r\n timeSheetTrackings: TimeSheetHistory[],\r\n filterTimeSheetTracking: FilterTimeSheetTracking,\r\n timeSheetTrackingCount: number,\r\n loading: boolean\r\n}\r\n\r\nexport const SET_LIST_TIME_SHEET_TRACKING = 'SET_LIST_TIME_SHEET_TRACKING'\r\nexport const SET_FILTER_TIME_SHEET_TRACKING = 'SET_FILTER_TIME_SHEET_TRACKING'\r\nexport const SET_TIME_SHEET_TRACKING_COUNT = 'SET_TIME_SHEET_TRACKING_COUNT'\r\nexport const SET_LOADING_TIME_SHEET_TRACKING = 'SET_LOADING_TIME_SHEET_TRACKING'\r\n\r\nexport const timesheetActionArea = Object.freeze({\r\n 0: 'Header',\r\n 1: 'Task',\r\n 2: 'Status changed',\r\n 3: 'Field Service'\r\n\r\n})\r\n\r\nexport const timesheetActionType = Object.freeze({\r\n 0: 'Create',\r\n 1: 'Edit',\r\n 2: 'Delete'\r\n})\r\n\r\nexport const convertValueHistory = (field: string, value: string): string => {\r\n switch (field) {\r\n case \"Header.TimesheetStatus\":\r\n return value != null ? convertStatusTimeSheet(+value) : value\r\n case \"Task.TimesheetLineType\":\r\n return value != null ? convertTaskIdToType(+value) : value\r\n case \"Task.StartTime\":\r\n case \"Task.EndTime\":\r\n if(value == null || value === '')\r\n return value\r\n const hoursAndMinutes = getHoursAndMinutes(+value)\r\n const hours = hoursAndMinutes.hours<10?\"0\"+hoursAndMinutes.hours:hoursAndMinutes.hours\r\n const minutes = hoursAndMinutes.minutes<10?\"0\"+hoursAndMinutes.minutes:hoursAndMinutes.minutes\r\n let formatHours\r\n if (hours == 0) {\r\n formatHours = 12\r\n } else {\r\n formatHours = hours > 12 ? hours as number % 12 : hours \r\n }\r\n return `${formatHours}:${minutes} ${hoursAndMinutes.isAm? \"am\" : \"pm\"}`\r\n default:\r\n return value\r\n }\r\n}","export interface UserState {\r\n userList: UserModel[],\r\n userCount: number,\r\n userParam: any,\r\n defaultStartTime: any,\r\n loading: boolean,\r\n employeeList: any[],\r\n loadingEmployee: boolean,\r\n employeeCount: number,\r\n loadingSendMail: boolean,\r\n sendMailResult: string,\r\n userLogs: any[],\r\n userLogsCount: number,\r\n loadingUserLogs: boolean,\r\n}\r\n\r\nexport const userTypeList = Object.freeze({\r\n 0: 'Staff',\r\n 1: 'Approver',\r\n 2: 'User_Administrator',\r\n 3: 'System_Administrator',\r\n})\r\n\r\nexport const userStatusList = Object.freeze({\r\n 0: 'Disabled',\r\n 1: 'Enabled',\r\n 2: 'Created'\r\n})\r\n\r\nexport interface JobDivisionPayLocation {\r\n JobDivisionPayLocationId: number\r\n PayLocation: string\r\n Division: string\r\n Active?: boolean\r\n}\r\n\r\nexport interface PayLocation {\r\n Name: string\r\n}","import { RootState } from \"store\";\r\nimport { ActionTree } from \"vuex\";\r\nimport { TimeSheetTrackingService } from \"../service\";\r\nimport { FilterTimeSheetTracking, SET_LIST_TIME_SHEET_TRACKING, SET_TIME_SHEET_TRACKING_COUNT, TimeSheetHistoryParse, TimeSheetTrackingState, TimeSheetHistory, timesheetActionArea, timesheetActionType, convertValueHistory } from \"./types\";\r\nimport { userTypeList } from \"modules/admin/users/store/types\";\r\nimport { formatDate } from \"../../../../utils/time\";\r\n\r\nconst service = new TimeSheetTrackingService();\r\nexport const actions: ActionTree = {\r\n async actLoadTimeSheetTracking({ commit }, params: any) {\r\n const filterTimeSheet: FilterTimeSheetTracking = this.getters[\"timeSheetTracking/filterTimeSheetTracking\"];\r\n const data = await service.fetchTimeSheetTracking(filterTimeSheet, params.currentPage, params.pageSize)\r\n const result: TimeSheetHistoryParse[] = data.data.map((e: TimeSheetHistory) => {\r\n let dataChange = JSON.parse(e.changeDetail);\r\n let changeDetail = [];\r\n if ([1,3].includes(e.actionArea)) {\r\n changeDetail = dataChange[\"Detail\"].map((c: any) => ({\r\n field: c.Field,\r\n textField: c.TextField,\r\n previousValue: convertValueHistory(`Task.${c.Field}`,c.PreviousValue),\r\n currentValue: convertValueHistory(`Task.${c.Field}`,c.CurrentValue),\r\n previousTextValue: c.PreviousTextValue,\r\n currentTextValue: c.CurrentTextValue\r\n }))\r\n } else {\r\n changeDetail = dataChange.map((c: any) => {\r\n return {\r\n field: c.Field,\r\n textField: c.TextField,\r\n previousValue: convertValueHistory(`Header.${c.Field}`,c.PreviousValue),\r\n currentValue: convertValueHistory(`Header.${c.Field}`,c.CurrentValue),\r\n previousTextValue: c.PreviousTextValue,\r\n currentTextValue: c.CurrentTextValue\r\n }\r\n })\r\n }\r\n return {\r\n timesheetHistoryId: e.timesheetHistoryId,\r\n timesheetHeaderId: e.timesheetHeaderId,\r\n taskId: e.actionArea == 1 ? dataChange[\"TimesheetLineId\"] : null,\r\n userId: e.userId,\r\n actionType: timesheetActionType[e.actionType],\r\n actionArea: timesheetActionArea[e.actionArea],\r\n time: formatDate(e.time),\r\n changeDetail,\r\n user: {\r\n userId: e.userId,\r\n userType: userTypeList[e.user?.userType],\r\n email: e.user.email,\r\n name: e.user?.firstName + \" \" + e.user?.lastName,\r\n avatarUrl: e.user?.avatarUrl,\r\n }\r\n }\r\n })\r\n commit(SET_LIST_TIME_SHEET_TRACKING, result)\r\n commit(SET_TIME_SHEET_TRACKING_COUNT, data.count)\r\n },\r\n};","import { GetterTree } from 'vuex'\r\nimport { RootState } from 'store'\r\nimport { TimeSheetTrackingState } from './types'\r\n\r\nexport const getters: GetterTree = {\r\n timeSheetTrackings: (state: TimeSheetTrackingState) => state.timeSheetTrackings,\r\n filterTimeSheetTracking: (state: TimeSheetTrackingState) => state.filterTimeSheetTracking,\r\n timeSheetTrackingCount: (state: TimeSheetTrackingState) => state.timeSheetTrackingCount,\r\n loading: (state: TimeSheetTrackingState) => state.loading,\r\n}","import { MutationTree } from \"vuex\";\r\nimport {\r\n TimeSheetTrackingState,\r\n FilterTimeSheetTracking,\r\n SET_LIST_TIME_SHEET_TRACKING,\r\n SET_FILTER_TIME_SHEET_TRACKING,\r\n SET_TIME_SHEET_TRACKING_COUNT,\r\n TimeSheetHistory,\r\n SET_LOADING_TIME_SHEET_TRACKING\r\n} from \"./types\";\r\n\r\nexport const mutations: MutationTree = {\r\n [SET_FILTER_TIME_SHEET_TRACKING](state: TimeSheetTrackingState, data: FilterTimeSheetTracking) {\r\n state.filterTimeSheetTracking = data;\r\n },\r\n [SET_LIST_TIME_SHEET_TRACKING](state: TimeSheetTrackingState, data: TimeSheetHistory[]) {\r\n state.timeSheetTrackings = data;\r\n },\r\n [SET_TIME_SHEET_TRACKING_COUNT](state: TimeSheetTrackingState, data: number) {\r\n state.timeSheetTrackingCount = data;\r\n },\r\n [SET_LOADING_TIME_SHEET_TRACKING](state: TimeSheetTrackingState, status: boolean) {\r\n state.loading = status;\r\n },\r\n\r\n};\r\n","import { Module } from 'vuex'\r\nimport { state } from './state'\r\nimport { actions } from './actions'\r\nimport { getters } from './getters'\r\nimport { mutations } from './mutations'\r\nimport { RootState } from 'store'\r\nimport { TimeSheetTrackingState } from './types'\r\n\r\nexport const timeSheetTracking: Module = {\r\n namespaced: true,\r\n state,\r\n getters,\r\n actions,\r\n mutations,\r\n}","import { SettingState } from './types'\r\n\r\nexport const state: SettingState = {\r\n paylocationCount: 1,\r\n settings: {}\r\n}","import { AxiosError } from \"axios\";\r\nimport Service from \"core/service\";\r\n\r\nexport class SettingsService extends Service {\r\n getSettings(): Promise {\r\n try {\r\n return this.get(\"/Setting\");\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n }\r\n \r\n patchSettings(params: any): Promise {\r\n try {\r\n return this.patch(\"/Setting\", params);\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n }\r\n\r\n dropdownPayLocation(\r\n selectProps: string,\r\n req: any | null\r\n ): Promise {\r\n try {\r\n let params: any = {\r\n $select: selectProps,\r\n };\r\n if (req) {\r\n if (req.filter) {\r\n params[\"$filter\"] = req.filter;\r\n }\r\n\r\n if (req.orderBy) {\r\n params[\"$orderby\"] = req.orderBy;\r\n }\r\n\r\n params[\"$count\"] = req.count ? req.count : true;\r\n params[\"$top\"] = req.pageSize ? req.pageSize : 100;\r\n params[\"$skip\"] =\r\n req.pageSize * (req.currentPage ? req.currentPage - 1 : 0);\r\n } else {\r\n params[\"$count\"] = true;\r\n params[\"$top\"] = 1;\r\n params[\"$skip\"] = 0;\r\n }\r\n\r\n return this.get(\"/PayLocation\", params);\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n }\r\n\r\n patchPayLocation(params: any): Promise {\r\n try {\r\n return this.post(\"/PayLocation\", params);\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n }\r\n\r\n updatePayLocation(params: any, id: string): Promise {\r\n try {\r\n return this.patch(`/PayLocation/${id}`, params);\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n }\r\n\r\n deletePayLocation(params: any): Promise {\r\n try {\r\n return this.post(\"/PayLocation/DeleteMany\", params);\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n }\r\n\r\n resetSetting(): Promise {\r\n try {\r\n return this.put(\"/Setting/Reset\");\r\n } catch (error) {\r\n throw (error as AxiosError).response;\r\n }\r\n }\r\n}\r\n","import store, { RootState } from \"store\";\r\nimport { ActionTree } from \"vuex\";\r\nimport { SettingsService } from \"../service\";\r\nimport { SettingState } from \"./types\";\r\n\r\nconst service = new SettingsService()\r\n\r\nexport const actions: ActionTree = {\r\n\r\n async getSettings({ commit }, params: any) {\r\n const data = await service.getSettings()\r\n commit('SET_SETTINGS', data);\r\n return data\r\n },\r\n\r\n async deletePayLocation({ commit }, params: any) {\r\n const data = await service.deletePayLocation(params)\r\n return data\r\n },\r\n\r\n async patchSettings({ commit }, params: any) {\r\n const data = await service.patchSettings(params)\r\n commit('SET_SETTINGS', data);\r\n },\r\n \r\n async resetSetting({ commit }) {\r\n await service.resetSetting()\r\n },\r\n\r\n async dropdownPayLocation({ commit }, params: any) {\r\n let filter = ``;\r\n if (params.search) {\r\n filter = `contains(tolower(Name),'${params.search.toLowerCase()}')`\r\n }\r\n params.filter = filter;\r\n const selectProps = \"PayLocationId, Name, Region\"; \r\n const data = await service.dropdownPayLocation(selectProps, params)\r\n commit('SET_PAYLOCATION_COUNT', data[\"@odata.count\"])\r\n return data.value\r\n },\r\n\r\n async patchPayLocation({ commit }, params: any) {\r\n await service.patchPayLocation(params)\r\n },\r\n \r\n async updatePayLocation({ commit }, params: any) {\r\n await service.updatePayLocation(params.data, params.id)\r\n },\r\n\r\n async getPayLocationAndRegion({ commit }, params: any) {\r\n let filter = ``;\r\n if (params.search) {\r\n if (params.search.Region) {\r\n filter = `contains(tolower(Name),'${params.search.Name.toLowerCase()}') and Region eq '${params.search.Region}'`\r\n } else {\r\n filter = `contains(tolower(Name),'${params.search.Name.toLowerCase()}')`\r\n }\r\n }\r\n params.filter = filter;\r\n const selectProps = \"PayLocationId, Name, Region\"; \r\n const data = await service.dropdownPayLocation(selectProps, params)\r\n return data.value\r\n },\r\n \r\n async getListRegion({ commit }, params: any) {\r\n const selectProps = \"PayLocationId, Name, Region\"; \r\n const data = await service.dropdownPayLocation(selectProps, params)\r\n return data.value\r\n },\r\n\r\n\r\n};","import { GetterTree } from 'vuex'\r\nimport { RootState } from 'store'\r\nimport { SettingState } from './types'\r\n\r\nexport const getters: GetterTree = {\r\n payLocationCount: (state: SettingState) => state.paylocationCount,\r\n settings: (state: SettingState) => state.settings,\r\n}","import { MutationTree } from \"vuex\";\r\nimport { SettingState } from \"./types\";\r\n\r\nexport const mutations: MutationTree = {\r\n SET_PAYLOCATION_COUNT: (state: SettingState, itemCount: number) => {\r\n state.paylocationCount = itemCount;\r\n },\r\n SET_SETTINGS: (state: SettingState, data: any) => {\r\n state.settings = data;\r\n },\r\n};","import { Module } from 'vuex'\r\nimport { state } from './state'\r\nimport { actions } from './actions'\r\nimport { getters } from './getters'\r\nimport { mutations } from './mutations'\r\nimport { RootState } from 'store'\r\nimport { SettingState } from './types'\r\n\r\nexport const setting: Module = {\r\n namespaced: true,\r\n state,\r\n getters,\r\n actions,\r\n mutations,\r\n}","import { createStore } from 'vuex'\r\nimport { auth } from '../modules/auth/store/index'\r\nimport { dashboard } from '../modules/dashboard/store/index'\r\nimport { profile } from '../modules/profile/store/index'\r\nimport { manual } from '../modules/manual/store/index'\r\nimport { approvalGroup } from '../modules/admin/groups/store/index'\r\nimport { user } from '../modules/admin/users/store/index'\r\nimport { timeSheetsApprove } from '../modules/super/dashboard/store/index'\r\nimport { timeSheetTracking } from 'modules/super/timesheetTrackings/store'\r\nimport { setting } from '../modules/settings/store/index'\r\nimport { AUTO_THEME, DARK_THEME, LIGHT_THEME } from 'core/constants'\r\n\r\nexport type RootState = {\r\n version: string\r\n initialized: boolean\r\n loading: boolean\r\n statusCode: number\r\n isOpen: boolean\r\n currentTheme: string\r\n isOpenPopupUserForm: boolean\r\n isOpenPopupGroupForm: boolean\r\n editApproveGroup?: ApprovalGroupModel\r\n isOpenPopupAddTask: boolean\r\n isAfterEditAprroveGroup: boolean\r\n filterSelect: any\r\n isCollapseSidebar: boolean\r\n}\r\n\r\nconst store = createStore({\r\n state: {\r\n version: '1.0.0',\r\n initialized: false,\r\n loading: false,\r\n statusCode: 404,\r\n isOpen: false,\r\n currentTheme: 'light',\r\n isOpenPopupUserForm: false,\r\n isOpenPopupGroupForm: false,\r\n isOpenPopupAddTask: false,\r\n isAfterEditAprroveGroup: false,\r\n filterSelect: {},\r\n isCollapseSidebar: false\r\n },\r\n mutations: {\r\n INITIALIZED: (state: RootState, status: boolean) => {\r\n state.initialized = status\r\n },\r\n SET_LOADING: (state: RootState, status: boolean) => {\r\n state.loading = status\r\n },\r\n SET_STATUS_CODE: (state: RootState, statusCode: number) => {\r\n state.statusCode = statusCode\r\n },\r\n SET_OPEN_POPUP_TIMEOUT: (state: RootState, open: boolean) => {\r\n state.isOpen = open\r\n },\r\n SET_THEME: (state: RootState, theme: string) => {\r\n console.log(theme)\r\n state.currentTheme = theme\r\n },\r\n SET_OPEN_POPUP_USER_FORM: (state: RootState, isOpen: boolean) => {\r\n state.isOpenPopupUserForm = isOpen\r\n },\r\n SET_OPEN_POPUP_GROUP_FORM: (state: RootState, isOpen: boolean) => {\r\n state.isOpenPopupGroupForm = isOpen\r\n },\r\n SET_EDIT_GROUP_FORM: (state: RootState, itemGroup?: ApprovalGroupModel) => {\r\n state.editApproveGroup = itemGroup\r\n },\r\n SET_OPEN_POPUP_ADD_TASK: (state: RootState, isOpen: boolean) => {\r\n state.isOpenPopupAddTask = isOpen\r\n },\r\n SET_AFTER_EDIT_APPROVE_GROUP: (state: RootState, isOpen: boolean) => {\r\n state.isAfterEditAprroveGroup = isOpen\r\n },\r\n SET_FILTER_SELECT_APPROVE_GROUP: (state: RootState, filter: any) => {\r\n state.filterSelect = filter\r\n },\r\n TOGGLE_SIDEBAR: (state: RootState) => {\r\n state.isCollapseSidebar = !state.isCollapseSidebar\r\n }\r\n },\r\n actions: {\r\n initialized(ctx, status?: boolean) {\r\n ctx.commit('INITIALIZED', status)\r\n let theme = localStorage.getItem('vueuse-color-scheme');\r\n const prefersDark = window.matchMedia('(prefers-color-scheme: dark)');\r\n const prefersLight = window.matchMedia('(prefers-color-scheme: light)');\r\n\r\n if (theme === AUTO_THEME) {\r\n if (prefersDark.matches) {\r\n ctx.commit('SET_THEME', DARK_THEME)\r\n }\r\n if (prefersLight.matches) {\r\n ctx.commit('SET_THEME', LIGHT_THEME)\r\n }\r\n } else {\r\n if (theme === LIGHT_THEME) {\r\n ctx.commit('SET_THEME', LIGHT_THEME)\r\n }\r\n if (theme === DARK_THEME) {\r\n ctx.commit('SET_THEME', DARK_THEME)\r\n }\r\n }\r\n },\r\n },\r\n getters: {\r\n currentTheme: (state: RootState) => state.currentTheme,\r\n },\r\n modules: {\r\n auth,\r\n dashboard,\r\n profile,\r\n manual,\r\n approvalGroup,\r\n user,\r\n timeSheetsApprove,\r\n timeSheetTracking,\r\n setting\r\n },\r\n})\r\n\r\nexport default store","import {\r\n InteractionType,\r\n PopupRequest,\r\n PublicClientApplication,\r\n RedirectRequest,\r\n} from \"@azure/msal-browser\";\r\nimport { AUTH_TOKEN_KEY, REFRESH_TOKEN_KEY, TASK_TYPES } from \"core/constants\";\r\nimport { msalInstance, tokenRequest } from \"../authConfig\";\r\nimport { getHoursAndMinutes } from \"./time\";\r\nimport store from \"store\";\r\n\r\nexport async function isAuthenticated(\r\n instance: PublicClientApplication,\r\n interactionType: InteractionType,\r\n loginRequest: PopupRequest | RedirectRequest\r\n): Promise {\r\n // If your application uses redirects for interaction, handleRedirectPromise must be called and awaited on each page load before determining if a user is signed in or not\r\n return instance\r\n .handleRedirectPromise()\r\n .then(() => {\r\n const accounts = instance.getAllAccounts();\r\n if (accounts.length > 0) {\r\n return true;\r\n }\r\n\r\n // User is not signed in and attempting to access protected route. Sign them in.\r\n if (interactionType === InteractionType.Popup) {\r\n return instance\r\n .loginPopup(loginRequest)\r\n .then(() => {\r\n return true;\r\n })\r\n .catch(() => {\r\n return false;\r\n });\r\n } else if (interactionType === InteractionType.Redirect) {\r\n return instance\r\n .loginRedirect(loginRequest)\r\n .then(() => {\r\n return true;\r\n })\r\n .catch(() => {\r\n return false;\r\n });\r\n }\r\n\r\n return false;\r\n })\r\n .catch(() => {\r\n return false;\r\n });\r\n}\r\n\r\nexport function checkTokenExpire(token: string | null) {\r\n if (!token) {\r\n return true;\r\n }\r\n const base64Url = token.split(\".\")[1];\r\n const base64 = base64Url.replace(/-/g, \"+\").replace(/_/g, \"/\");\r\n const jsonPayload = decodeURIComponent(\r\n atob(base64)\r\n .split(\"\")\r\n .map(function (c) {\r\n return \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2);\r\n })\r\n .join(\"\")\r\n );\r\n const jwtPayload = JSON.parse(jsonPayload);\r\n if (jwtPayload.exp < Date.now() / 1000) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n}\r\n\r\nexport function getTaskTypId(taskType: TASK_TYPES) {\r\n switch (taskType) {\r\n case TASK_TYPES.Rental:\r\n return 0;\r\n case TASK_TYPES.UnBilled:\r\n return 1;\r\n case TASK_TYPES.JobCost:\r\n return 2;\r\n default:\r\n return 0;\r\n }\r\n}\r\n\r\n\r\nexport function convertTaskIdToType(taskTypeId: number) {\r\n switch (taskTypeId) {\r\n case 0:\r\n return TASK_TYPES.Rental.toString();\r\n case 1:\r\n return TASK_TYPES.UnBilled.toString();\r\n case 2:\r\n return TASK_TYPES.JobCost.toString();\r\n default:\r\n return TASK_TYPES.JobCost.toString();\r\n }\r\n}\r\n\r\nexport function convertTaskIdToTypeText(taskTypeId: number) {\r\n switch (taskTypeId) {\r\n case 0:\r\n return 'Rental';\r\n case 1:\r\n return 'Unbilled';\r\n case 2:\r\n return 'Job Cost';\r\n default:\r\n return 'Job Cost';\r\n }\r\n}\r\n\r\n\r\nexport function convertTaskIdToVisbleType(taskTypeId: number) {\r\n switch (taskTypeId) {\r\n case 0:\r\n return 1\r\n case 1:\r\n return 2\r\n case 2:\r\n return 2\r\n default:\r\n return null\r\n }\r\n}\r\n\r\n\r\nexport function formatTime(timeVal: string): TimeObject {\r\n let timeObj: TimeObject = {\r\n hour: 0,\r\n minutes: 0,\r\n isAm: true,\r\n hours: 0,\r\n };\r\n\r\n if (timeVal) {\r\n const newStr = timeVal.replace('PT', '').replace('M', '').replace('H', ':').replace('S', '');\r\n if (!newStr.includes(\":\")) {\r\n if (newStr === '0') {\r\n return {\r\n hour: 12,\r\n minutes: 0,\r\n isAm: true,\r\n hours: 12,\r\n }\r\n } else {\r\n return {\r\n hour: 12,\r\n minutes: Number(newStr),\r\n isAm: true,\r\n hours: 12,\r\n }\r\n }\r\n }\r\n let [strHour, strMins] = newStr.split(':');\r\n if (!strMins) {\r\n strMins = '0'\r\n }\r\n if (strHour && strMins) {\r\n timeObj.hours = Number(strHour);\r\n timeObj.minutes = Number(strMins);\r\n let isAm = true;\r\n if (timeObj.hours > 12) {\r\n isAm = false;\r\n timeObj.hour = timeObj.hours - 12;\r\n } else {\r\n timeObj.hour = timeObj.hours;\r\n if (timeObj.hours === 12) {\r\n isAm = false;\r\n }\r\n }\r\n timeObj.isAm = isAm;\r\n }\r\n }\r\n\r\n return timeObj;\r\n}\r\n\r\nexport function convertStrToTime(timeVal: any) {\r\n let str = 'PT00H00M';\r\n //12:00:00.00\r\n if (timeVal) {\r\n const [strFullTime, strmiliSec] = timeVal.split('.');\r\n if (strFullTime) {\r\n const [hour, min, sec] = strFullTime.split(':');\r\n const value = `PT${hour.toLocaleString('en-US', { minimumIntegerDigits: 2, useGrouping: false })}H${min.toLocaleString('en-US', { minimumIntegerDigits: 2, useGrouping: false })}M`;\r\n str = value;\r\n }\r\n }\r\n\r\n return str;\r\n}\r\n\r\nexport function getClassByStatusTimeSheet(status: number) {\r\n switch (status) {\r\n case 0:\r\n return 'status-draff';\r\n case 1:\r\n return 'status-pending';\r\n case 2:\r\n return 'status-approve';\r\n case 3:\r\n return 'status-declined';\r\n case 5:\r\n return 'status-cancel';\r\n default:\r\n return 'status-draff';\r\n }\r\n}\r\n\r\nexport function setTimeStart(startTime: number, startDate: string) {\r\n const hourAndMinutes = getHoursAndMinutes(startTime);\r\n const hour = hourAndMinutes.hours.toString().padStart(2, '0');\r\n const minute = hourAndMinutes.minutes.toString().padStart(2, '0');\r\n return `${hour}:${minute}, ${startDate}`\r\n}\r\n\r\nexport function convertStatusTimeSheet(status?: number) {\r\n switch (status) {\r\n case 0:\r\n return 'Draft';\r\n case 1:\r\n return 'Pending Approval';\r\n case 2:\r\n return 'Approved';\r\n case 3:\r\n return 'Declined';\r\n case 5:\r\n return 'Cancelled';\r\n default:\r\n return 'Draft';\r\n }\r\n}\r\n\r\nexport function clearAllCookies() {\r\n // Get all cookies as a string (name=value; pairs)\r\n const cookies = document.cookie.split(';');\r\n // Loop through and delete each cookie\r\n cookies.forEach((cookie) => {\r\n // Extract cookie name\r\n const cookieName = cookie.split('=')[0].trim();\r\n // Set each cookie's expiration to a past date to delete it\r\n document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/`;\r\n document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; domain=${location.hostname}`;\r\n });\r\n}\r\n\r\nexport function getCookie(name: string) {\r\n function escape(s: string) { return s.replace(/([.*+?\\^$(){}|\\[\\]\\/\\\\])/g, '\\\\$1'); }\r\n var match = document.cookie.match(RegExp('(?:^|;\\\\s*)' + escape(name) + '=([^;]*)'));\r\n return match ? match[1] : null;\r\n}\r\n\r\nexport async function autoRefreshToken() {\r\n window.location.href = '/login';\r\n localStorage.setItem(AUTH_TOKEN_KEY, '');\r\n sessionStorage.removeItem(AUTH_TOKEN_KEY)\r\n document.cookie = `${REFRESH_TOKEN_KEY}=`;\r\n}\r\n\r\nexport async function clearCookie() {\r\n var cookies = document.cookie.split(\"; \");\r\n for (var c = 0; c < cookies.length; c++) {\r\n var d = window.location.hostname.split(\".\");\r\n while (d.length > 0) {\r\n var cookieBase = encodeURIComponent(cookies[c].split(\";\")[0].split(\"=\")[0]) + '=; expires=Thu, 01-Jan-1970 00:00:01 GMT; domain=' + d.join('.') + ' ;path=';\r\n var p = location.pathname.split('/');\r\n document.cookie = cookieBase + '/';\r\n while (p.length > 0) {\r\n document.cookie = cookieBase + p.join('/');\r\n p.pop();\r\n };\r\n d.shift();\r\n }\r\n }\r\n}\r\n\r\nexport async function autoForceLogout() {\r\n await store.dispatch(\"profile/forceLogout\");\r\n let currentUser = store.getters[\"auth/currentUser\"];\r\n if (currentUser?.userId === undefined) {\r\n // frist login\r\n currentUser = await store.dispatch(\"auth/actGetMe\");\r\n if (!currentUser) {\r\n localStorage.setItem(AUTH_TOKEN_KEY, '');\r\n sessionStorage.setItem(AUTH_TOKEN_KEY, '');\r\n msalInstance.logoutRedirect()\r\n }\r\n } else {\r\n // had token\r\n localStorage.setItem(AUTH_TOKEN_KEY, '');\r\n sessionStorage.setItem(AUTH_TOKEN_KEY, '');\r\n msalInstance.logoutRedirect()\r\n }\r\n}\r\n","\r\n \r\n\r\n\r\n\r\n\r\n\r\n\r\n","import firebase from 'firebase/app';\r\nimport 'firebase/messaging';\r\nimport {firebaseConfig} from \"config/enviroments\";\r\n\r\nfirebase.initializeApp(firebaseConfig);\r\n\r\nexport const messaging = firebase.messaging();","\r\n \r\n\r\n\r\n\r\n\r\n","\r\n \r\n \r\n \r\n

\r\n
{{ displayHour }}:\r\n
{{ displayMinute }}\r\n
{{ isAm ? \"AM\" : \"PM\" }}\r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n
Enter Time
\r\n
\r\n
\r\n
\r\n
\r\n 12) this.value=12;\"\r\n :value=\"displayEnterHour\" onclick=\"this.select()\"\r\n @change=\"handleChangeHour($event)\" />\r\n
\r\n
\r\n Hours\r\n
\r\n
\r\n
\r\n
:
\r\n
\r\n
\r\n
\r\n 59) this.value=59;\"\r\n :value=\"minutes\" @change=\"handleChangeMin($event)\" onclick=\"this.select()\" />\r\n
\r\n
\r\n Minute\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n Cancel\r\n Apply\r\n
\r\n \r\n\r\n\r\n","export default \"__VITE_ASSET__23c34e33__\"","\r\n \r\n \r\n
\r\n\r\n\r\n\r\n\r\n","\r\n \r\n
\r\n\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n {{ scope.row.EmployeeId }}\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n
\r\n \r\n
\r\n Cancel\r\n \r\n Ok\r\n \r\n
\r\n
\r\n\r\n\r\n\r\n\r\n\r\n","\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Look up\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n {{ item.Name }}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n
\r\n \r\n \r\n\r\n\r\n\r\n","\r\n \r\n \r\n
\r\n \r\n
\r\n
{{ type }}
\r\n
\r\n {{ message }}\r\n
\r\n
\r\n \r\n \r\n {{ lblBtnCancel }}\r\n {{lblBtnSubmit?'No':'Ok'}}\r\n \r\n \r\n \r\n \r\n {{ lblBtnSubmit }}\r\n \r\n
\r\n \r\n \r\n \r\n \r\n
\r\n \r\n
\r\n
{{ type }}
\r\n
\r\n {{ message }}\r\n
\r\n
\r\n \r\n \r\n {{ lblBtnCancel }}\r\n {{lblBtnSubmit?'No':'Ok'}}\r\n \r\n \r\n \r\n \r\n {{ lblBtnSubmit }}\r\n \r\n
\r\n \r\n \r\n\r\n \r\n \r\n
\r\n {{ message }}\r\n
\r\n
\r\n \r\n reason for decline\r\n
\r\n
\r\n \r\n \r\n No\r\n \r\n \r\n \r\n \r\n {{ lblBtnSubmit }}\r\n \r\n
\r\n \r\n \r\n\r\n\r\n\r\n \r\n","\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {{ emailErrorTo }}
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {{ emailErrorCC }}
\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
![\"avatar\"]()
\r\n
\r\n
\r\n
\r\n
{{ item.FullName }}
\r\n
{{ item.Email }}
\r\n
\r\n
\r\n
\r\n \r\n\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
![]()
\r\n
\r\n
\r\n
\r\n
{{ item.FullName }}
\r\n
{{ item.Email }}
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n \r\n Cancel\r\n 0) : false\">\r\n {{ titleBtn }}\r\n \r\n \r\n {{ titleBtn }}\r\n \r\n
\r\n \r\n \r\n \r\n \r\n\r\n\r\n","\r\n \r\n \r\n

\r\n
{{\r\n `${orgHours >= 10 ? orgHours : \"0\" + orgHours}h:${orgMins >= 10 ? orgMins : \"0\" + orgMins\r\n }m`\r\n }}\r\n
\r\n \r\n \r\n
\r\n \r\n {{errorMessage}}\r\n {{ msgExceedingTime }}\r\n Please choose working time\r\n
\r\n \r\n \r\n
\r\n
Enter Time
\r\n
\r\n
\r\n
\r\n
\r\n 23) this.value=23;\" \r\n onclick=\"this.select()\"\r\n style=\"\r\n font-size: 36px;\r\n border: 1px solid #246bfd;\r\n border-radius: 6px;\r\n \"\r\n :value=\"hoursTmp\" @change=\"handleUpdateStartTime($event, true)\" />\r\n
\r\n
\r\n Hours\r\n
\r\n
\r\n
\r\n
:
\r\n
\r\n
\r\n
\r\n 59) this.value=59;\"\r\n onclick=\"this.select()\"\r\n style=\"font-size: 36px; border: 1px solid #246bfd; border-radius: 6px;\" :value=\"minutesTmp\"\r\n @change=\"handleUpdateStartTime($event, false)\" />\r\n
\r\n
\r\n Minute\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n Cancel\r\n Apply\r\n
\r\n \r\n\r\n\r\n","\r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n {{ item.Location }}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {{ item.Name }}\r\n
\r\n \r\n {{ item.Description }}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {{ item.Name }}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {{ item.Name }}\r\n
\r\n \r\n {{ item.Description }}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {{ item.Name }}\r\n
\r\n \r\n {{ item.Description }}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n handleSignatureClick(e, 'customer')\"\r\n >\r\n \r\n handleClearSignature('customer')\"\r\n >Clear\r\n
\r\n \r\n
\r\n handleSignatureClick(e, 'mechanical')\"\r\n >\r\n \r\n handleClearSignature('mechanical')\"\r\n >Clear\r\n
\r\n \r\n
\r\n \r\n\r\n\r\n","\r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n {{ item.Name }}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {{ item.Name }}\r\n
\r\n \r\n {{ item.Description }}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {{ item.Name }}\r\n
\r\n \r\n {{ item.Description }}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n \r\n \r\n {{ item.Location }}\r\n \r\n \r\n \r\n
\r\n \r\n \r\n {{ item.Name }}\r\n
\r\n \r\n {{ item.Description }}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n {{ item.Name }}\r\n
\r\n \r\n {{ item.Description }}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n handleSignatureClick(e, 'customer')\" class=\"sign-pad pad-signatureCustomer\"\r\n ref=\"signatureCustomer\" :sigOption=\"sigOption\" :h=\"'200px'\" :w=\"'400px'\"\r\n :disabled=\"timeSheetStatus != 0 || allowUpdate == false\">\r\n\r\n \r\n handleClearSignature('customer')\">Clear\r\n
\r\n \r\n
\r\n handleSignatureClick(e, 'mechanical')\" class=\"sign-pad\"\r\n ref=\"signatureMechanical\" :sigOption=\"sigOption\" :h=\"'200px'\" :w=\"'400px'\"\r\n :disabled=\"timeSheetStatus != 0 || allowUpdate == false\">\r\n \r\n \r\n handleClearSignature('mechanical')\">Clear\r\n
\r\n \r\n
\r\n\r\n \r\n\r\n\r\n","\r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n handleSignatureClick(e, 'customer')\" class=\"sign-pad\" ref=\"signatureCustomer\" :sigOption=\"sigOption\" :h=\"'200px'\" :w=\"'400px'\" :disabled=\"timeSheetStatus != 0 || allowUpdate == false\">\r\n \r\n handleClearSignature('customer')\">Clear\r\n
\r\n \r\n
\r\n handleSignatureClick(e, 'mechanical')\" class=\"sign-pad\" ref=\"signatureMechanical\" :sigOption=\"sigOption\" :h=\"'200px'\" :w=\"'400px'\" :disabled=\"timeSheetStatus != 0 || allowUpdate == false\">\r\n \r\n handleClearSignature('mechanical')\">Clear\r\n
\r\n \r\n
\r\n \r\n\r\n \r\n ","\r\n \r\n \r\n
\r\n\r\n\r\n\r\n\r\n","export const standardizeTime = (option: any) => {\r\n const data = {\r\n startTime: 0,\r\n endTime: 0,\r\n };\r\n\r\n if (!option.startTime?.isInit && !option.endTime?.isInit) {\r\n let startTimeHours = option?.startTime?.hours ?? 0;\r\n let endTimeHours = option?.endTime?.hours ?? 0;\r\n\r\n if (option?.startTime?.isAm) {\r\n if (option?.startTime?.hours == 12) {\r\n startTimeHours = 0;\r\n } else {\r\n startTimeHours = option?.startTime?.hours ?? 0;\r\n }\r\n }\r\n if (option?.endTime?.isAm) {\r\n if (option?.endTime?.hours == 12) {\r\n endTimeHours = 0;\r\n } else {\r\n endTimeHours = option?.endTime?.hours ?? 0;\r\n }\r\n }\r\n\r\n const startTimeMinutes = option?.startTime?.minutes ?? 0;\r\n const endTimeMinutes = option?.endTime?.minutes ?? 0;\r\n\r\n const totalStartTimeMinutes = startTimeMinutes + startTimeHours * 60;\r\n const totalEndTimeMinutes = endTimeMinutes + endTimeHours * 60;\r\n\r\n data.startTime = totalStartTimeMinutes;\r\n data.endTime = totalEndTimeMinutes;\r\n } else {\r\n if (option?.startTime?.isAm && option?.startTime?.hours == 12) {\r\n if (option?.startTime?.minutes == 0) {\r\n data.startTime = 0;\r\n } else {\r\n data.startTime =\r\n option?.startTime?.hours * 60 + option?.startTime?.minutes - 720;\r\n }\r\n }\r\n }\r\n\r\n return data;\r\n};\r\n\r\nexport const checkTimeInit = (timeSheetHeader: TimeSheetHeader) => {\r\n const result = timeSheetHeader.TimesheetLines?.map((timesheet) => {\r\n if (timesheet?.Option?.endTime?.isInit) {\r\n timesheet.EndTime = undefined;\r\n }\r\n if (timesheet?.Option?.startTime?.isInit) {\r\n timesheet.StartTime = undefined;\r\n }\r\n return timesheet;\r\n });\r\n\r\n return result;\r\n};\r\n","import {\r\n MESSAGE_CODES,\r\n TASK_TYPES,\r\n TASK_TYPES_VALUE,\r\n USER_TYPE_APPROVER,\r\n USER_TYPE_SYSTEM_ADMINISTRATOR,\r\n USER_TYPE_USER_ADMINISTRATOR,\r\n} from \"core/constants\";\r\nimport dayjs from \"dayjs\";\r\nimport { CurrentUserModel } from \"modules/auth/store/types\";\r\nimport { timeSheetStatusName } from \"modules/dashboard/store/types\";\r\nimport { computed, inject, ref, watch } from \"vue\";\r\nimport { useStore } from \"vuex\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport {\r\n convertTaskIdToType,\r\n convertTaskIdToVisbleType,\r\n formatTime,\r\n getTaskTypId,\r\n} from \"../utils\";\r\nimport { getHoursAndMinutes } from \"../utils/time\";\r\nimport { standardizeTime, checkTimeInit } from \"../utils/taskDetail\";\r\n\r\ninterface TimeRange {\r\n StartTime: number;\r\n EndTime: number;\r\n}\r\n\r\nexport default function useTaskDetail(ctx: any) {\r\n const store = useStore();\r\n\r\n const allowUpdate = ref(true);\r\n const totalHours = ref(0);\r\n const totalMins = ref(0);\r\n const displayButtonAddTask = ref(true);\r\n const currentTaskVisibleType = ref(null);\r\n const oldData = ref();\r\n\r\n const allTimesheetLine = computed(\r\n () => store.getters[\"dashboard/timeSheetsLine\"]\r\n );\r\n\r\n const timesheetOverlapCheckingEnable = computed(\r\n () => store.getters[\"setting/settings\"].TimesheetOverlapCheckingEnable\r\n );\r\n\r\n const timeSheetHeader = ref({\r\n Shift: false,\r\n StartDate: dayjs().format(\"YYYY-MM-DD\"),\r\n TimesheetLines: [],\r\n });\r\n\r\n const notify = inject(\"notify\", (type: string, message: string) => ({}));\r\n const currentUser = computed(\r\n () => store.getters[\"auth/currentUser\"]\r\n );\r\n\r\n const taskTypeDisplay = computed(() => {\r\n const userTaskType = currentUser.value.taskType;\r\n let taskType = userTaskType;\r\n const showConfig = {\r\n rental: false,\r\n jobCost: false,\r\n unBilled: false,\r\n };\r\n if (taskType === TASK_TYPES_VALUE.All) {\r\n showConfig.rental = true;\r\n showConfig.jobCost = true;\r\n showConfig.unBilled = true;\r\n } else if (taskType === TASK_TYPES_VALUE.Rental) {\r\n showConfig.rental = true;\r\n } else if (taskType === TASK_TYPES_VALUE.JobCost) {\r\n showConfig.jobCost = true;\r\n showConfig.unBilled = true;\r\n }\r\n return showConfig;\r\n });\r\n\r\n const defaultTaskHeaderType = computed(() => {\r\n if (taskTypeDisplay.value.rental) {\r\n return TASK_TYPES.Rental;\r\n }\r\n return TASK_TYPES.JobCost;\r\n });\r\n\r\n const timesheetLineOptionInitData = {\r\n isExpend: true,\r\n type: defaultTaskHeaderType.value,\r\n hours: 0,\r\n mins: 0,\r\n visiblePopover: false,\r\n isValid: false,\r\n startTime: {\r\n hours: 0,\r\n isAm: true,\r\n minutes: 0,\r\n isInit: true,\r\n },\r\n endTime: {\r\n hours: 0,\r\n isAm: true,\r\n minutes: 0,\r\n isInit: true,\r\n },\r\n };\r\n\r\n const initTimesheetLine = async () => {\r\n timeSheetHeader.value.TimesheetLines?.push({\r\n TaskUuid: uuidv4(),\r\n Option: {\r\n ...timesheetLineOptionInitData,\r\n name: \"Task 1\"\r\n },\r\n });\r\n timeSheetHeader.value.StartDate = dayjs().format(\"YYYY-MM-DD\");\r\n timeSheetHeader.value.Shift = false\r\n await store.dispatch(\"setting/getSettings\").then((setting) => {\r\n if (\r\n currentUser.value.defaultStartTime &&\r\n timeSheetHeader?.value?.TimesheetLines?.[0]?.Option?.startTime\r\n ) {\r\n let timeObj\r\n if (setting.EnableUseDefaultStartTime) {\r\n timeObj = formatTime(setting.DefaultStartTime);\r\n } else {\r\n timeObj = formatTime(currentUser.value.defaultStartTime);\r\n }\r\n timeSheetHeader.value.TimesheetLines[0].StartTime =\r\n timeObj.hours * 60 + timeObj.minutes;\r\n timeSheetHeader.value.TimesheetLines[0].Option.startTime = {\r\n ...timeObj,\r\n }\r\n timeSheetHeader.value.TimesheetLines[0].Option.startTime.isInit = false\r\n }\r\n }).catch((error) => {\r\n if (\r\n currentUser.value.defaultStartTime &&\r\n timeSheetHeader?.value?.TimesheetLines?.[0]?.Option?.startTime\r\n ) {\r\n const timeObj = formatTime(currentUser.value.defaultStartTime);\r\n timeSheetHeader.value.TimesheetLines[0].StartTime =\r\n timeObj.hours * 60 + timeObj.minutes;\r\n timeSheetHeader.value.TimesheetLines[0].Option.startTime = {\r\n ...timeObj,\r\n }\r\n timeSheetHeader.value.TimesheetLines[0].Option.startTime.isInit = false\r\n }\r\n })\r\n };\r\n\r\n const funcFindMaxMinTime = () => {\r\n const arrayList = timeSheetHeader.value.TimesheetLines || [];\r\n const errors = [];\r\n const convertList = arrayList.map((item: any) => {\r\n return item;\r\n });\r\n\r\n convertList.sort(\r\n (taskA: any, taskB: any) => taskA.StartTime - taskB.StartTime\r\n );\r\n\r\n for (const shift of convertList) {\r\n if (\r\n !shift?.Option?.startTime?.isInit &&\r\n !shift?.Option?.endTime?.isInit\r\n ) {\r\n if (\r\n shift &&\r\n shift.StartTime !== undefined &&\r\n shift.EndTime !== undefined\r\n ) {\r\n const amStartTime = shift?.StartTime >= 0 && shift.StartTime <= 719;\r\n const pmStartTime = shift.StartTime >= 720 && shift.StartTime <= 1439;\r\n const amEndTime = shift.EndTime >= 0 && shift.EndTime <= 719;\r\n const pmEndTime = shift.EndTime >= 720 && shift.EndTime <= 1439;\r\n\r\n if (timeSheetHeader.value.Shift) {\r\n if (\r\n (amStartTime && pmEndTime) ||\r\n (pmStartTime && pmEndTime && shift?.EndTime < shift?.StartTime)\r\n ) {\r\n // case 1: shift flag = 'night shift', (startTime = AM time & endTime = PM Time)\r\n // case 2: ((startTime = PM time & endTime = PM time) & (endTime < startTime))\r\n errors.push({ dayShift: true });\r\n }\r\n } else {\r\n if (\r\n (pmStartTime && amEndTime) ||\r\n (amStartTime && amEndTime && shift?.EndTime < shift?.StartTime)\r\n ) {\r\n // case 1: shift flag = 'day shift', (startTime = PM time & endTime = AM Time)\r\n // case 2: ((startTime = AM time & endTime = AM time) & (endTime < startTime))\r\n errors.push({ nightShift: true });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return errors;\r\n };\r\n\r\n const funcOverLap = () => {\r\n if(!timesheetOverlapCheckingEnable.value) return\r\n let hasOverlap = false;\r\n const timesheetLines = timeSheetHeader?.value?.TimesheetLines ?? [];\r\n\r\n if (timesheetLines.length) {\r\n const sortedTasks: any = [...timesheetLines].sort(\r\n (a: any, b: any) => a.StartTime - b.StartTime\r\n );\r\n\r\n for (let i = 0; i < sortedTasks.length - 1; i++) {\r\n for (let j = i + 1; j < sortedTasks.length; j++) {\r\n let isInitStart1 = false;\r\n let isInitEnd1 = false;\r\n let isInitStart2 = false;\r\n let isInitEnd2 = false;\r\n\r\n let start1 =\r\n (timesheetLines?.[i]?.Option?.startTime?.hours ?? 0) * 60 +\r\n (timesheetLines?.[i]?.Option?.startTime?.minutes ?? 0);\r\n if (timesheetLines?.[i]?.Option?.startTime?.hours == 12) {\r\n if (timesheetLines?.[i]?.Option?.startTime?.isAm) {\r\n if (timesheetLines?.[i]?.Option?.startTime?.minutes ?? 0 > 0) {\r\n start1 = start1 - 720;\r\n } else {\r\n start1 = 0;\r\n }\r\n }\r\n }\r\n isInitStart1 = !!timesheetLines?.[i]?.Option?.startTime?.isInit;\r\n\r\n let end1 =\r\n (timesheetLines?.[i]?.Option?.endTime?.hours ?? 0) * 60 +\r\n (timesheetLines?.[i]?.Option?.endTime?.minutes ?? 0);\r\n if (timesheetLines?.[i]?.Option?.endTime?.hours == 12) {\r\n if (timesheetLines?.[i]?.Option?.endTime?.isAm) {\r\n if (timesheetLines?.[i]?.Option?.endTime?.minutes ?? 0 > 0) {\r\n end1 = end1 - 720;\r\n } else {\r\n end1 = 0;\r\n }\r\n }\r\n }\r\n isInitEnd1 = !!timesheetLines?.[i]?.Option?.endTime?.isInit;\r\n\r\n let start2 =\r\n (timesheetLines?.[j]?.Option?.startTime?.hours ?? 0) * 60 +\r\n (timesheetLines?.[j]?.Option?.startTime?.minutes ?? 0);\r\n if (timesheetLines?.[j]?.Option?.startTime?.hours == 12) {\r\n if (timesheetLines?.[j]?.Option?.startTime?.isAm) {\r\n if (timesheetLines?.[j]?.Option?.startTime?.minutes ?? 0 > 0) {\r\n start2 = start2 - 720;\r\n } else {\r\n start2 = 0;\r\n }\r\n }\r\n }\r\n isInitStart2 = !!timesheetLines?.[j]?.Option?.startTime?.isInit;\r\n\r\n let end2 =\r\n (timesheetLines?.[j]?.Option?.endTime?.hours ?? 0) * 60 +\r\n (timesheetLines?.[j]?.Option?.endTime?.minutes ?? 0);\r\n if (timesheetLines?.[j]?.Option?.endTime?.hours == 12) {\r\n if (timesheetLines?.[j]?.Option?.endTime?.isAm) {\r\n if (timesheetLines?.[j]?.Option?.endTime?.minutes ?? 0 > 0) {\r\n end2 = end2 - 720;\r\n } else {\r\n end2 = 0;\r\n }\r\n }\r\n }\r\n isInitEnd2 = !!timesheetLines?.[j]?.Option?.endTime?.isInit;\r\n\r\n const allIsInit =\r\n !isInitStart1 && !isInitEnd1 && !isInitStart2 && !isInitEnd2;\r\n\r\n if (allIsInit) {\r\n if (start1 > end1) {\r\n if (\r\n (start2 >= 0 && start2 < end1) ||\r\n (end2 > start1 && end2 <= 24 * 60)\r\n ) {\r\n hasOverlap = true;\r\n break;\r\n }\r\n }\r\n\r\n if (start2 > end2) {\r\n if (\r\n (start1 >= 0 && start1 < end2) ||\r\n (end1 > start2 && end1 <= 24 * 60)\r\n ) {\r\n hasOverlap = true;\r\n break;\r\n }\r\n }\r\n\r\n if (\r\n (start1 < end2 && end1 > start2) ||\r\n (start2 < end1 && end2 > start1) ||\r\n start1 == start2\r\n ) {\r\n hasOverlap = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (hasOverlap) {\r\n break;\r\n }\r\n }\r\n }\r\n return hasOverlap;\r\n };\r\n\r\n const funcOverLapLevel = (timeSheetHeader: any): boolean => {\r\n const checkOverlap = (range1: TimeRange, range2: TimeRange) => {\r\n return (\r\n range1.StartTime < range2.EndTime && range2.StartTime < range1.EndTime\r\n );\r\n };\r\n\r\n const checkTimeOverlap = (\r\n timesheetLines: TimeRange[],\r\n allTimesheetLines: TimeRange[][]\r\n ): boolean => {\r\n const allRanges: TimeRange[] = [];\r\n\r\n timesheetLines.forEach((line) => allRanges.push(line));\r\n allTimesheetLines.forEach((lines) =>\r\n lines.forEach((line) => allRanges.push(line))\r\n );\r\n\r\n allRanges.sort((a, b) => a.StartTime - b.StartTime);\r\n\r\n for (let i = 0; i < allRanges.length - 1; i++) {\r\n if (checkOverlap(allRanges[i], allRanges[i + 1])) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n\r\n const overlapExists = checkTimeOverlap(\r\n timeSheetHeader.value?.TimesheetLines,\r\n allTimesheetLine.value.map((obj: any) => obj.TimesheetLines)\r\n );\r\n\r\n return overlapExists\r\n };\r\n\r\n const calTotalTimeSheet = () => {\r\n let totalMinuets = 0;\r\n timeSheetHeader.value.TimesheetLines?.forEach((item) => {\r\n totalMinuets += item.TimesheetLineMinutes ?? 0;\r\n });\r\n totalHours.value = Math.floor(totalMinuets / 60);\r\n totalMins.value = totalMinuets % 60;\r\n ctx.emit(\"changeMaxTimeMultipleTasks\", totalMinuets);\r\n const shiftCheck: any = funcFindMaxMinTime();\r\n if (shiftCheck.length > 0) {\r\n if (shiftCheck[0].dayShift) {\r\n ctx.emit(\"handleCheckDayShift\", true);\r\n } else {\r\n ctx.emit(\"handleCheckDayShift\", false);\r\n }\r\n if (shiftCheck[0].nightShift) {\r\n ctx.emit(\"handleCheckNightShift\", true);\r\n } else {\r\n ctx.emit(\"handleCheckNightShift\", false);\r\n }\r\n } else {\r\n ctx.emit(\"handleCheckDayShift\", false);\r\n ctx.emit(\"handleCheckNightShift\", false);\r\n }\r\n const isOverlapLevel = funcOverLapLevel(timeSheetHeader);\r\n ctx.emit(\"handlePopupOverLapLevel\", isOverlapLevel);\r\n };\r\n\r\n const handleSubmitTaskTime = (data: any) => {\r\n const task: any = timeSheetHeader.value.TimesheetLines?.find(\r\n (item) => item.TaskUuid === data.taskId\r\n );\r\n if (task) {\r\n const timesheetLineMinutes = data.hours * 60 + data.mins;\r\n task.TimesheetLineMinutes = timesheetLineMinutes;\r\n let startTimeHours = task?.Option?.startTime?.hours ?? 0;\r\n\r\n if (task?.Option?.startTime?.isAm) {\r\n if (task?.Option?.startTime?.hours == 12) {\r\n startTimeHours = 0;\r\n } else {\r\n startTimeHours = task?.Option?.startTime?.hours ?? 0;\r\n }\r\n }\r\n\r\n const startTimeMinutes = task?.Option?.startTime?.minutes ?? 0;\r\n let startTimeInMinutes = startTimeHours * 60 + startTimeMinutes;\r\n const endTimeInMinutes = startTimeInMinutes + timesheetLineMinutes;\r\n let endTimeFinalHour = Math.floor(endTimeInMinutes / 60);\r\n const endTimeFinalMinutes = endTimeInMinutes - endTimeFinalHour * 60;\r\n endTimeFinalHour = endTimeFinalHour == 24 ? 24 : endTimeFinalHour % 24;\r\n\r\n let time = {\r\n hours: Math.abs(endTimeFinalHour) == 24 ? 0 : Math.abs(endTimeFinalHour),\r\n minutes: Math.abs(endTimeFinalMinutes),\r\n isAm: endTimeFinalHour == 24 ? true : endTimeFinalHour < 12,\r\n };\r\n const startInit = task?.Option?.startTime?.isInit;\r\n const endInit = task?.Option?.endTime?.isInit;\r\n\r\n // AA, AB, BA, BB\r\n if (startInit && endInit) {\r\n task.Option.startTime = {\r\n hours: 12,\r\n minutes: 0,\r\n isAm: true,\r\n isInit: false,\r\n };\r\n task.Option.endTime = {\r\n ...time,\r\n isInit: false,\r\n };\r\n } else if (startInit && !endInit) {\r\n let endTimeInMinutes =\r\n (task?.Option?.endTime?.hours ?? 0) * 60 +\r\n (task?.Option?.endTime?.minutes ?? 0);\r\n\r\n if (task?.Option?.endTime?.isAm) {\r\n if (task?.Option?.endTime?.hours == 12) {\r\n endTimeInMinutes = 1440 + (task?.Option?.endTime?.minutes ?? 0);\r\n } else {\r\n endTimeInMinutes =\r\n (task?.Option?.endTime?.hours ?? 0) * 60 +\r\n (task?.Option?.endTime?.minutes ?? 0);\r\n }\r\n }\r\n let startTimeInMinutes =\r\n endTimeInMinutes - (data.hours * 60 + data.mins);\r\n let hours = Math.floor(startTimeInMinutes / 60);\r\n let minutes = startTimeInMinutes % 60;\r\n let isAm = hours < 12;\r\n if (!isAm && hours !== 12) {\r\n hours -= 12;\r\n }\r\n task.Option.startTime = {\r\n hours: hours == 0 ? 12 : hours,\r\n minutes: minutes,\r\n isAm: isAm,\r\n isInit: false,\r\n };\r\n } else if (!startInit && endInit) {\r\n task.Option.endTime = {\r\n ...time,\r\n isInit: false,\r\n };\r\n } else if (!startInit && !endInit) {\r\n task.Option.endTime = {\r\n ...time,\r\n isInit: false,\r\n };\r\n }\r\n task.Option.hours = data.hours;\r\n task.Option.mins = data.mins;\r\n const newOption = standardizeTime(task.Option);\r\n\r\n task.StartTime = newOption.startTime;\r\n task.EndTime = newOption.endTime;\r\n\r\n ctx.emit(\"changeEndTimePM\", time.hours * 60 + time.minutes);\r\n calTotalTimeSheet();\r\n const isOverlap = funcOverLap();\r\n if (isOverlap) {\r\n ctx.emit(\"handlePopupOverLap\", true);\r\n } else {\r\n ctx.emit(\"handlePopupOverLap\", false);\r\n }\r\n }\r\n };\r\n\r\n const updateTaskTime = (\r\n data: any,\r\n additionValues: { TaskUuid: string; isStartTime: boolean }\r\n ) => {\r\n const timesheetLineMinutes = data.hours * 60 + data.minutes;\r\n if (additionValues.isStartTime) {\r\n ctx.emit(\"changeStartTimeAM\", timesheetLineMinutes);\r\n } else {\r\n ctx.emit(\"changeEndTimePM\", timesheetLineMinutes);\r\n }\r\n const task = timeSheetHeader.value.TimesheetLines?.find(\r\n (item) => item.TaskUuid === additionValues.TaskUuid\r\n );\r\n if (task) {\r\n if (additionValues.isStartTime) {\r\n task.Option.startTime = {\r\n ...data,\r\n isInit: false,\r\n };\r\n task.StartTime = timesheetLineMinutes;\r\n } else {\r\n task.Option.endTime = {\r\n ...data,\r\n isInit: false,\r\n };\r\n task.EndTime = timesheetLineMinutes;\r\n }\r\n\r\n if (!task.Option.startTime?.isInit && !task.Option.endTime?.isInit) {\r\n let startTimeHours = task?.Option?.startTime?.hours ?? 0;\r\n let endTimeHours = task?.Option?.endTime?.hours ?? 0;\r\n\r\n if (task?.Option?.startTime?.isAm) {\r\n if (task?.Option?.startTime?.hours == 12) {\r\n startTimeHours = 0;\r\n } else {\r\n startTimeHours = task?.Option?.startTime?.hours ?? 0;\r\n }\r\n }\r\n if (task?.Option?.endTime?.isAm) {\r\n if (task?.Option?.endTime?.hours == 12) {\r\n endTimeHours = 0;\r\n } else {\r\n endTimeHours = task?.Option?.endTime?.hours ?? 0;\r\n }\r\n }\r\n const startTimeMinutes = task?.Option?.startTime?.minutes ?? 0;\r\n const endTimeMinutes = task?.Option?.endTime?.minutes ?? 0;\r\n let totalMins = endTimeMinutes - startTimeMinutes;\r\n let totalHours =\r\n endTimeHours - startTimeHours - (totalMins < 0 ? 1 : 0);\r\n totalMins = totalMins < 0 ? 60 - Math.abs(totalMins) : totalMins;\r\n const totalStartTimeMinutes = startTimeMinutes + startTimeHours * 60;\r\n const totalEndTimeMinutes = endTimeMinutes + endTimeHours * 60;\r\n if (totalHours < 0) {\r\n totalHours += 24;\r\n }\r\n task.Option.hours = totalHours;\r\n task.Option.mins = Math.abs(totalMins);\r\n\r\n task.StartTime = totalStartTimeMinutes;\r\n task.EndTime = totalEndTimeMinutes;\r\n\r\n task.TimesheetLineMinutes = totalHours * 60 + Math.abs(totalMins);\r\n\r\n calTotalTimeSheet();\r\n const isOverlap = funcOverLap();\r\n if (isOverlap) {\r\n ctx.emit(\"handlePopupOverLap\", true);\r\n } else {\r\n ctx.emit(\"handlePopupOverLap\", false);\r\n }\r\n } else {\r\n if (\r\n task?.Option?.startTime?.isAm &&\r\n task?.Option?.startTime?.hours == 12\r\n ) {\r\n if (task?.Option?.startTime?.minutes == 0) {\r\n task.StartTime = 0;\r\n } else {\r\n task.StartTime =\r\n task?.Option?.startTime?.hours * 60 +\r\n task?.Option?.startTime?.minutes -\r\n 720;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const handleTaskSubmit = (data: any) => {\r\n const task = timeSheetHeader.value.TimesheetLines?.find(\r\n (x) => x.TaskUuid === data.taskId\r\n );\r\n\r\n if (task) {\r\n task.Option!.isValid = data.valid;\r\n\r\n if (!data.valid) {\r\n task.Option!.isExpend = true;\r\n return;\r\n }\r\n task.Notes = data.jobDescription;\r\n task.WorkOrderTaskId = undefined;\r\n task.JobCostCodeId = undefined;\r\n task.GlaccountId = undefined;\r\n if (task.Option!.type == TASK_TYPES.Rental.toString()) {\r\n task.TimesheetLineType = getTaskTypId(TASK_TYPES.Rental);\r\n task.TaskCategory = data.taskCategory\r\n task.WorkOrderTaskId = data.workOrderTaskId\r\n ? data.workOrderTaskId\r\n : undefined;\r\n task.WorkOrderId = data.workOrder ? data.workOrder : undefined;\r\n task.EquipmentId = data.fleet ? data.fleet : undefined;\r\n task.SiteId = parseInt(data?.site?.split(\"-\")?.[1] ?? null);\r\n task.SiteId = task.SiteId ? task.SiteId : undefined;\r\n }\r\n if (task.Option!.type == TASK_TYPES.JobCost.toString()) {\r\n task.TaskCategory = data.taskCategory\r\n task.TimesheetLineType = getTaskTypId(TASK_TYPES.JobCost);\r\n task.JobCostCodeId = data.costCode ? data.costCode : undefined;\r\n task.JobId = data.job ? data.job : undefined;\r\n task.EmecoSite = data.isEmecoSite;\r\n if (data.isEmecoSite) {\r\n task.WorkOrderId = data.workOrder ? data.workOrder : undefined;\r\n task.EquipmentId = data.fleet ? data.fleet : undefined;\r\n task.SiteId = parseInt(data?.site?.split(\"-\")?.[1] ?? null);\r\n task.SiteId = task.SiteId ? task.SiteId : undefined;\r\n } else {\r\n task.WorkOrderId = undefined;\r\n task.EquipmentId = undefined;\r\n task.SiteId = undefined;\r\n }\r\n }\r\n if (task.Option!.type == TASK_TYPES.UnBilled.toString()) {\r\n task.TimesheetLineType = getTaskTypId(TASK_TYPES.UnBilled);\r\n task.GlaccountId = data.glEntry;\r\n }\r\n if (data.additionInfo) {\r\n task.TimesheetAdditional = {\r\n TimesheetAdditionalId: data.TimesheetAdditionalId,\r\n Manufacturer: data.isEmecoSite ? \"\" : data.manufacturer,\r\n Model: data.isEmecoSite ? \"\" : data.model,\r\n Smureading: data.SMUHour,\r\n SerialNumber: data.isEmecoSite ? \"\" : data.serialNo,\r\n CustomerName: data.isEmecoSite ? \"Emeco\" : data.clientName,\r\n CustomerEmail: data.customerEmail,\r\n Locations: data.isEmecoSite ? \"\" : data.location,\r\n TravelKms: data.travelKMS,\r\n Rego: data.vehRegNo,\r\n WorkerSignature: data.mechanicalAcceptance,\r\n CustomerSignature: data.customerAcceptance,\r\n AdditionalInfo: data.fieldServiceNote,\r\n CustomerAcceptanceName: data.customerAcceptanceName,\r\n };\r\n } else {\r\n task.TimesheetAdditional = null as any;\r\n }\r\n }\r\n };\r\n\r\n const resetTaskData = (taskId: string) => {\r\n timeSheetHeader.value.TimesheetLines?.map((timesheetLine: any) => {\r\n if (timesheetLine.TaskUuid === taskId) {\r\n timesheetLine.SiteId = undefined;\r\n timesheetLine.EquipmentId = undefined;\r\n timesheetLine.WorkOrderId = undefined;\r\n timesheetLine.WorkOrderTask = {};\r\n timesheetLine.WorkOrderTaskId = undefined;\r\n timesheetLine.WorkOrderDescription = \"\";\r\n timesheetLine.JobCostCodeId = undefined;\r\n timesheetLine.JobId = undefined;\r\n timesheetLine.JobCostCode = {};\r\n timesheetLine.Glaccount = {};\r\n timesheetLine.GlaccountId = undefined;\r\n timesheetLine.TimesheetAdditional = null as any;\r\n timesheetLine.Notes = \"\";\r\n }\r\n return timesheetLine;\r\n });\r\n };\r\n\r\n const createTimeSheet = (timeSheetHeader: any) => {\r\n store.commit(\"SET_LOADING\", true);\r\n if (!timeSheetHeader.value?.TimesheetLines?.length) {\r\n store.commit(\"SET_LOADING\", false);\r\n return;\r\n }\r\n timeSheetHeader.value.StartDate = dayjs(\r\n timeSheetHeader.value.StartDate\r\n ).format(\"YYYY-MM-DD\");\r\n const resultCheckTimeInit = checkTimeInit(timeSheetHeader.value)\r\n timeSheetHeader.value.TimesheetLines = resultCheckTimeInit\r\n store.commit(\"SET_LOADING\", true);\r\n store\r\n .dispatch(\"dashboard/actCreateTimeSheet\", timeSheetHeader.value)\r\n .then(() => {\r\n store.commit(\"auth/SET_IS_VALID\", false);\r\n store.commit(\"dashboard/SET_LIST_TIME_SHEET\", []);\r\n store.dispatch(\"dashboard/actLoadTimeSheet\"),\r\n store.dispatch(\"dashboard/actCountTimeSheetStatus\"),\r\n store.commit(\"SET_LOADING\", false);\r\n\r\n notify(\"success\", MESSAGE_CODES.MSG_SAVE_SUCCESS);\r\n store.commit(\"SET_OPEN_POPUP_ADD_TASK\", false);\r\n timeSheetHeader.value = {\r\n StartDate: dayjs().format(\"YYYY-MM-DD\"),\r\n TimesheetLines: [\r\n {\r\n TaskUuid: uuidv4(),\r\n Option: {\r\n name: `Task 1`,\r\n ...timesheetLineOptionInitData,\r\n },\r\n },\r\n ],\r\n };\r\n totalHours.value = 0;\r\n totalMins.value = 0;\r\n })\r\n .catch(() => {\r\n store.commit(\"SET_LOADING\", false);\r\n notify(\"error\", MESSAGE_CODES.ERR_SERVER);\r\n });\r\n };\r\n\r\n const loadTimeSheetEdit = async (timeSheetHeaderId: number) => {\r\n store.commit(\"SET_LOADING\", true);\r\n const resultTimeSheetHeader = await store.dispatch(\r\n \"dashboard/actGetTimeSheet\",\r\n { id: timeSheetHeaderId }\r\n );\r\n\r\n timeSheetHeader.value = {\r\n ...resultTimeSheetHeader,\r\n StartDate: dayjs(resultTimeSheetHeader.StartDate).format(\"YYYY-MM-DD\"),\r\n TimesheetLines: [],\r\n };\r\n store.dispatch(\"dashboard/loadCountTotalTimesheet\", {\r\n date: dayjs(resultTimeSheetHeader.StartDate).format(\"YYYY-MM-DD\"),\r\n userId: resultTimeSheetHeader.UserId,\r\n timesheetId: resultTimeSheetHeader.TimesheetHeaderId,\r\n });\r\n ctx.emit(\"changeShift\", !!timeSheetHeader.value.Shift);\r\n\r\n timeSheetHeader.value.TimesheetStatusName =\r\n timeSheetStatusName[\r\n timeSheetHeader.value\r\n .TimesheetStatus! as keyof typeof timeSheetStatusName\r\n ];\r\n if ([1, 2, 3, 5].includes(timeSheetHeader.value.TimesheetStatus ?? 0)) {\r\n if (\r\n timeSheetHeader.value.TimesheetStatus == 1 &&\r\n (currentUser.value.userType == USER_TYPE_APPROVER ||\r\n currentUser.value.userType == USER_TYPE_SYSTEM_ADMINISTRATOR) &&\r\n currentUser.value.userId !== timeSheetHeader.value.UserId\r\n ) {\r\n allowUpdate.value = true;\r\n ctx.emit(\"changeAllowEdit\", true);\r\n } else {\r\n allowUpdate.value = false;\r\n ctx.emit(\"changeAllowEdit\", false);\r\n }\r\n } else {\r\n if (currentUser.value.userId !== timeSheetHeader.value.UserId) {\r\n allowUpdate.value = false;\r\n ctx.emit(\"changeAllowEdit\", false);\r\n } else {\r\n allowUpdate.value = true;\r\n ctx.emit(\"changeAllowEdit\", true);\r\n }\r\n }\r\n if (currentUser.value.userType == USER_TYPE_USER_ADMINISTRATOR) {\r\n allowUpdate.value = false;\r\n }\r\n let lineVisibleTypes: number[] = [];\r\n if (resultTimeSheetHeader.TimesheetLines) {\r\n let totalMinEdit = 0;\r\n for (\r\n let index = 0;\r\n index < resultTimeSheetHeader.TimesheetLines.length;\r\n index++\r\n ) {\r\n const line = resultTimeSheetHeader.TimesheetLines[index];\r\n\r\n let hourLine = 0;\r\n let minLine = 0;\r\n if (line.TimesheetLineMinutes) {\r\n minLine = line.TimesheetLineMinutes % 60;\r\n hourLine = Math.floor(line.TimesheetLineMinutes / 60);\r\n totalMinEdit += line.TimesheetLineMinutes;\r\n }\r\n let additionInfo = undefined;\r\n if (line.TimesheetAdditionals && line.TimesheetAdditionals.length > 0) {\r\n additionInfo = { ...line.TimesheetAdditionals[0] };\r\n }\r\n delete line[\"TimesheetAdditionals\"];\r\n const timeSheetLine: TimeSheetLine = {\r\n ...line,\r\n TaskUuid: uuidv4(),\r\n Option: {\r\n isExpend: true,\r\n name: `Task ${index + 1}`,\r\n type: convertTaskIdToType(line.TimesheetLineType!),\r\n hours: hourLine,\r\n mins: minLine,\r\n visiblePopover: false,\r\n startTime: getHoursAndMinutes(\r\n line.StartTime,\r\n line.TimesheetLineMinutes\r\n ),\r\n endTime: getHoursAndMinutes(\r\n line.EndTime,\r\n line.TimesheetLineMinutes\r\n ),\r\n isValid: false,\r\n },\r\n };\r\n timeSheetLine.TimesheetAdditional = additionInfo;\r\n timeSheetHeader.value.TimesheetLines?.push(timeSheetLine);\r\n const lineVisibleType = convertTaskIdToVisbleType(\r\n line.TimesheetLineType!\r\n );\r\n if (lineVisibleType != null) {\r\n lineVisibleTypes = [...lineVisibleTypes, lineVisibleType];\r\n }\r\n }\r\n totalHours.value = Math.floor(totalMinEdit / 60);\r\n totalMins.value = totalMinEdit % 60;\r\n }\r\n\r\n if (\r\n currentUser.value.userType == USER_TYPE_APPROVER ||\r\n currentUser.value.userType == USER_TYPE_SYSTEM_ADMINISTRATOR\r\n ) {\r\n if (timeSheetHeader.value.UserId != currentUser.value.userId) {\r\n displayButtonAddTask.value = false;\r\n } else {\r\n if ([1, 2, 3, 5].includes(timeSheetHeader.value.TimesheetStatus ?? 0)) {\r\n displayButtonAddTask.value = false;\r\n } else {\r\n displayButtonAddTask.value = true;\r\n }\r\n }\r\n } else {\r\n if ([1, 2, 3, 5].includes(timeSheetHeader.value.TimesheetStatus ?? 0)) {\r\n displayButtonAddTask.value = false;\r\n } else {\r\n displayButtonAddTask.value = true;\r\n }\r\n }\r\n\r\n calTotalTimeSheet();\r\n\r\n const taskVisibleType =\r\n lineVisibleTypes.includes(1) && lineVisibleTypes.includes(2)\r\n ? 0\r\n : lineVisibleTypes[0];\r\n currentTaskVisibleType.value =\r\n taskVisibleType !== resultTimeSheetHeader?.User?.TaskType\r\n ? 0\r\n : taskVisibleType;\r\n store.commit(\"SET_LOADING\", false);\r\n oldData.value = {\r\n Id: timeSheetHeader.value.TimesheetHeaderId,\r\n StartDate: dayjs(timeSheetHeader.value.StartDate).format(\"YYYY-MM-DD\"),\r\n TimesheetStatus: timeSheetHeader.value.TimesheetStatus,\r\n Shift: !!timeSheetHeader.value.Shift,\r\n TimesheetLines: [],\r\n };\r\n timeSheetHeader.value.TimesheetLines?.forEach((line: any) => {\r\n const updateLine = {\r\n TimesheetLineId: line.TimesheetLineId,\r\n TimesheetLineMinutes: line.TimesheetLineMinutes,\r\n TimesheetLineType: line.TimesheetLineType,\r\n WorkOrderTaskId: line.WorkOrderTaskId ? line.WorkOrderTaskId : null,\r\n EquipmentId: line.EquipmentId ? line.EquipmentId : null,\r\n SiteId: line.SiteId ? line.SiteId : null,\r\n WorkOrderId: line.WorkOrderId ? line.WorkOrderId : null,\r\n JobId: line.JobId ? line.JobId : null,\r\n GlaccountId: line.GlaccountId ? line.GlaccountId : null,\r\n JobCostCodeId: line.JobCostCodeId ? line.JobCostCodeId : null,\r\n StartTime: line.StartTime ?? 0,\r\n EndTime: line.EndTime ?? 0,\r\n Notes: line.Notes,\r\n TimesheetAdditional: line.TimesheetAdditional\r\n ? line.TimesheetAdditional\r\n : undefined,\r\n Option: line.Option,\r\n };\r\n oldData.value.TimesheetLines.push(updateLine);\r\n });\r\n };\r\n\r\n const updateTimeSheet = async (timeSheetStatus: number) => {\r\n store.commit(\"SET_LOADING\", true);\r\n let result = false;\r\n if (!timeSheetHeader.value.TimesheetLines?.length) {\r\n return false;\r\n }\r\n const dataUpdate: any = {\r\n Id: timeSheetHeader.value.TimesheetHeaderId,\r\n StartDate: dayjs(timeSheetHeader.value.StartDate).format(\"YYYY-MM-DD\"),\r\n TimesheetStatus: timeSheetStatus,\r\n Shift: !!timeSheetHeader.value.Shift,\r\n TimesheetLines: [],\r\n };\r\n\r\n timeSheetHeader.value.TimesheetLines?.forEach((line: any) => {\r\n const updateLine = {\r\n TimesheetLineId: line.TimesheetLineId,\r\n TimesheetLineMinutes: line.TimesheetLineMinutes,\r\n TimesheetLineType: line.TimesheetLineType,\r\n WorkOrderTaskId: line.WorkOrderTaskId ? line.WorkOrderTaskId : null,\r\n EquipmentId: line.EquipmentId ? line.EquipmentId : null,\r\n SiteId: line.SiteId ? line.SiteId : null,\r\n WorkOrderId: line.WorkOrderId ? line.WorkOrderId : null,\r\n JobId: line.JobId ? line.JobId : null,\r\n GlaccountId: line.GlaccountId ? line.GlaccountId : null,\r\n JobCostCodeId: line.JobCostCodeId ? line.JobCostCodeId : null,\r\n StartTime: line.StartTime ?? 0,\r\n EndTime: line.EndTime ?? 0,\r\n Notes: line.Notes,\r\n TimesheetAdditional: line.TimesheetAdditional\r\n ? line.TimesheetAdditional\r\n : undefined,\r\n Option: line.Option,\r\n };\r\n dataUpdate.TimesheetLines.push(updateLine);\r\n });\r\n\r\n const resultCheckTimeInit = checkTimeInit(timeSheetHeader.value)\r\n dataUpdate.TimesheetLines = resultCheckTimeInit\r\n\r\n const objBefore = JSON.stringify(oldData.value);\r\n const objAfter = JSON.stringify(dataUpdate);\r\n\r\n if (objBefore === objAfter) {\r\n store.commit(\"SET_LOADING\", false);\r\n return true;\r\n }\r\n\r\n await store\r\n .dispatch(\"dashboard/actUpdateTimeSheet\", dataUpdate)\r\n .then(() => {\r\n store.commit(\"SET_LOADING\", false);\r\n store.commit(\"auth/SET_IS_VALID\", false);\r\n result = true;\r\n })\r\n .catch((error) => {\r\n console.log(\"error\", error.data.value);\r\n store.commit(\"SET_LOADING\", false);\r\n if (error.data.value !== \"Sequence contains no elements\") {\r\n notify(\"error\", MESSAGE_CODES.ERR_SERVER);\r\n }\r\n result = false;\r\n });\r\n return result;\r\n };\r\n\r\n watch(allTimesheetLine, () => {\r\n const isOverlapLevel = funcOverLapLevel(timeSheetHeader);\r\n ctx.emit(\"handlePopupOverLapLevel\", isOverlapLevel);\r\n })\r\n\r\n\r\n return {\r\n totalHours,\r\n totalMins,\r\n timeSheetHeader,\r\n updateTimeSheet,\r\n loadTimeSheetEdit,\r\n createTimeSheet,\r\n funcOverLap,\r\n funcFindMaxMinTime,\r\n handleSubmitTaskTime,\r\n updateTaskTime,\r\n handleTaskSubmit,\r\n resetTaskData,\r\n initTimesheetLine,\r\n funcOverLapLevel,\r\n allowUpdate,\r\n displayButtonAddTask\r\n };\r\n}\r\n","\r\n \r\n
\r\n \r\n \r\n Start Date\r\n \r\n
\r\n \r\n
\r\n
\r\n Please choose start date\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n Day Shift\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n Night Shift\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n {{ `Task ${index + 1}` }}\r\n
\r\n \r\n \r\n \r\n
1 && (displayButtonAddTask)\"\r\n class=\"flex h-[32px] w-[32px] items-center justify-center cursor-pointer task-icon-trash\"\r\n @click=\"removeTask(item.TaskUuid)\" :disabled=\"!allowUpdate\">\r\n \r\n \r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n Rental\r\n
\r\n
\r\n Job Cost\r\n
\r\n
\r\n UnBilled\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n Start Time\r\n \r\n
\r\n \r\n \r\n \r\n End Time\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n onChangeTouched(value, item.TaskUuid)\">\r\n
\r\n
\r\n onChangeTouched(value, item.TaskUuid)\">\r\n
\r\n
\r\n onChangeTouched(value, item.TaskUuid)\">\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n Add Task\r\n \r\n
\r\n
\r\n
\r\n Total:\r\n {{\r\n `${(\"0\" + totalHours).slice(-2)} hrs ${(\"0\" + totalMins).slice(\r\n -2\r\n )} mins`\r\n }}\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n\r\n\r\n","\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
{{ type }}
\r\n
\r\n {{ message }}\r\n
\r\n
\r\n \r\n \r\n 100 ? 'bg-[#0CAC59]' : ''\"\r\n class=\"justify-self-center btn-cancel w-[83px] ml-[16px]\"\r\n @click=\"handleClose\"\r\n >\r\n 100 ? 'text-[#fff]' : ''\"\r\n >{{ lblBtnCancel }}\r\n \r\n 100 ? 'bg-[#ED1C2D]' : ''\"\r\n class=\"justify-self-center delete mr-0 btn-confirm pl-[32px] ml-[16px] pr-[32px]\"\r\n @click=\"handleSubmit\"\r\n >\r\n \r\n \r\n \r\n {{ lblBtnSubmit }}\r\n \r\n
\r\n \r\n \r\n\r\n\r\n\r\n\r\n\r\n","import { ref, computed } from 'vue'\r\nimport { useStore } from \"vuex\";\r\n\r\ninterface MessageConfirm {\r\n message: string;\r\n textButtonConfirm: string;\r\n textButtonCancel: string;\r\n type: string;\r\n icon: string;\r\n colorIcon: string;\r\n}\r\n\r\nexport default function useTaskPopup() {\r\n const store = useStore();\r\n const dialogVisibleEditTask = ref(false);\r\n const totalHour = computed(() => store.getters[\"dashboard/totalHour\"]);\r\n const shift = ref(false)\r\n const totalHourMultipleTasks = ref(0);\r\n const StartTimeAM = ref(510);\r\n const EndTimePM = ref(-1);\r\n const popupOverlap = ref(false);\r\n const popupOverlapLevel = ref(false);\r\n const nightShift = ref(false)\r\n const dayShift = ref(false)\r\n\r\n const isOpenPopupAddTask = computed(() => store.state.isOpenPopupAddTask);\r\n const totalHourSuper = computed(() => store.getters['timeSheetsApprove/totalHour']);\r\n const isClickSubmit = ref(false);\r\n const dialogCheckCondition = ref(false);\r\n const onClickSave = ref(false);\r\n const passAllTaskIsValid = ref(false);\r\n const isAllowEdit = ref(false);\r\n\r\n const messageConfirm = ref({\r\n message: 'Your timesheet will be submitted.\\nAre you sure?',\r\n textButtonConfirm: 'Yes',\r\n textButtonCancel: 'No',\r\n type: 'Confirm',\r\n icon: 'btn-fix',\r\n colorIcon: 'yellow'\r\n });\r\n\r\n const onChangeEndTimePM = (value: any) => {\r\n EndTimePM.value = value\r\n }\r\n const onChangeStartTimeAM = (value: any) => {\r\n StartTimeAM.value = value\r\n }\r\n const onChangeShift = (value: boolean) => {\r\n shift.value = value\r\n }\r\n\r\n const handleAllowEdit = (value: boolean) => {\r\n isAllowEdit.value = value\r\n }\r\n\r\n const handleMaxTimeMultipleTasks = (value: number) => {\r\n totalHourMultipleTasks.value = value\r\n }\r\n\r\n const handlePopupOverLap = (error: boolean) => {\r\n if (error) {\r\n popupOverlap.value = true\r\n } else {\r\n popupOverlap.value = false\r\n }\r\n }\r\n \r\n const handlePopupOverLapLevel = (error: boolean) => {\r\n if (error) {\r\n popupOverlapLevel.value = true\r\n } else {\r\n popupOverlapLevel.value = false\r\n }\r\n }\r\n\r\n const handleCheckNightShift = (value: boolean) => {\r\n nightShift.value = value\r\n }\r\n\r\n const handleCheckDayShift = (value: boolean) => {\r\n dayShift.value = value\r\n }\r\n\r\n const handleClosePopupConfirm = () => {\r\n dialogCheckCondition.value = false\r\n isClickSubmit.value = false\r\n onClickSave.value = false\r\n }\r\n\r\n const checkNightShiftMismatchWarning = (textType: string, textIcon: string, colorIcon: string) => {\r\n if (nightShift.value) {\r\n return {\r\n message: \"You have entered time for a Day shift that\\n passes midnight. Please change the\\n shift type to 'Night Shift' or correct the\\n task time before saving or submitting.\",\r\n textButtonConfirm: 'None',\r\n textButtonCancel: 'Fix',\r\n type: textType,\r\n icon: textIcon,\r\n colorIcon\r\n }\r\n }\r\n }\r\n const checkDayShiftMismatchWarning = (textType: string, textIcon: string, colorIcon: string) => {\r\n if (dayShift.value) {\r\n return {\r\n message: 'You have entered time for a Night shift \\nthat passes midday.\\n Please confirm this is accurate \\nor go back and correct the timesheet.',\r\n textButtonConfirm: 'Confirm',\r\n textButtonCancel: 'Fix',\r\n type: textType,\r\n icon: textIcon,\r\n colorIcon\r\n }\r\n }\r\n }\r\n const checkCurrentTimesheetTotalHours = (textType: string, textIcon: string, colorIcon: string) => {\r\n if (totalHourMultipleTasks.value > 960) {\r\n return {\r\n message: 'Total hours logged in the timesheet\\n is over 16 hours.\\n Please review and adjust your tasks\\n accordingly.',\r\n textButtonConfirm: 'None',\r\n textButtonCancel: 'Fix',\r\n type: textType,\r\n icon: textIcon,\r\n colorIcon\r\n }\r\n }\r\n }\r\n const checkOverlapWarning = (textType: string, textIcon: string, colorIcon: string) => {\r\n if (popupOverlap.value) {\r\n return {\r\n message: 'Overlapping tasks detected in the\\n timesheet. Ensure there are no conflicts\\n in your specified task times.',\r\n textButtonConfirm: 'None',\r\n textButtonCancel: 'Fix',\r\n type: textType,\r\n icon: textIcon,\r\n colorIcon\r\n }\r\n }\r\n }\r\n\r\n const checkTimesheetTotalHours = (textType: string, textIcon: string, colorIcon: string) => {\r\n if ((totalHourMultipleTasks.value + totalHour.value) > 960) {\r\n return {\r\n message: 'The combined total hours for all\\n timesheets on this day exceed 16 hours.\\n Please review and adjust your\\n timesheets.',\r\n textButtonConfirm: 'None',\r\n textButtonCancel: 'Fix',\r\n type: textType,\r\n icon: textIcon,\r\n colorIcon\r\n }\r\n }\r\n }\r\n \r\n const checkOverlapWarningLevel = (textType: string, textIcon: string, colorIcon: string) => {\r\n if (popupOverlapLevel.value) {\r\n return {\r\n message: \"Overlapping tasks detected with\\n another timesheet. Ensure no conflicts in\\n your specified task times with other\\n timesheet's task times\",\r\n textButtonConfirm: 'None',\r\n textButtonCancel: 'Fix',\r\n type: textType,\r\n icon: textIcon,\r\n colorIcon\r\n }\r\n }\r\n }\r\n\r\n const handleSaveCheckAndPopup = () => {\r\n onClickSave.value = true\r\n const checktotalHour = checkCurrentTimesheetTotalHours('Confirm', 'btn-fix', 'red');\r\n if (checktotalHour) {\r\n messageConfirm.value = checktotalHour\r\n dialogCheckCondition.value = true;\r\n return true\r\n }\r\n\r\n const checkOverlap = checkOverlapWarning('Confirm', 'btn-fix', 'red');\r\n if (checkOverlap) {\r\n messageConfirm.value = checkOverlap\r\n dialogCheckCondition.value = true;\r\n return true\r\n }\r\n\r\n const checkNight = checkNightShiftMismatchWarning('Confirm', 'btn-fix', 'red');\r\n if (checkNight) {\r\n messageConfirm.value = checkNight\r\n dialogCheckCondition.value = true;\r\n return true\r\n } \r\n\r\n const checkDay = checkDayShiftMismatchWarning('Confirm', 'btn-fix', 'yellow');\r\n if (checkDay) {\r\n messageConfirm.value = checkDay;\r\n dialogCheckCondition.value = true;\r\n return true\r\n }\r\n }\r\n\r\n const handleSubmitCheckAndPopup = () => {\r\n const checkCurrentHour = checkCurrentTimesheetTotalHours('Submitting', 'check-mark-circle', 'red');\r\n if (checkCurrentHour) {\r\n messageConfirm.value = checkCurrentHour\r\n dialogCheckCondition.value = true;\r\n return true\r\n }\r\n\r\n const checkTotalHours = checkTimesheetTotalHours('Submitting', 'check-mark-circle', 'red');\r\n if (checkTotalHours) {\r\n messageConfirm.value = checkTotalHours\r\n dialogCheckCondition.value = true;\r\n return true\r\n }\r\n\r\n const checkOverlap = checkOverlapWarning('Submitting', 'check-mark-circle', 'red');\r\n if (checkOverlap) {\r\n messageConfirm.value = checkOverlap\r\n dialogCheckCondition.value = true;\r\n return true\r\n }\r\n\r\n const checkOverlapLevel = checkOverlapWarningLevel('Submitting', 'check-mark-circle', 'red');\r\n if (checkOverlapLevel) {\r\n messageConfirm.value = checkOverlapLevel;\r\n dialogCheckCondition.value = true;\r\n return true\r\n }\r\n\r\n const checkNight = checkNightShiftMismatchWarning('Submitting', 'check-mark-circle', 'red');\r\n if (checkNight) {\r\n messageConfirm.value = checkNight\r\n dialogCheckCondition.value = true;\r\n return true\r\n }\r\n\r\n const checkDay = checkDayShiftMismatchWarning('Submitting', 'check-mark-circle', 'yellow');\r\n if (checkDay) {\r\n messageConfirm.value = checkDay;\r\n dialogCheckCondition.value = true;\r\n return true\r\n }\r\n \r\n }\r\n\r\n return {\r\n dialogVisibleEditTask,\r\n totalHour,\r\n shift,\r\n totalHourMultipleTasks,\r\n StartTimeAM,\r\n EndTimePM,\r\n popupOverlap,\r\n nightShift,\r\n dayShift,\r\n isOpenPopupAddTask,\r\n messageConfirm,\r\n totalHourSuper,\r\n isClickSubmit,\r\n dialogCheckCondition,\r\n onClickSave,\r\n passAllTaskIsValid,\r\n isAllowEdit,\r\n popupOverlapLevel,\r\n onChangeEndTimePM,\r\n onChangeStartTimeAM,\r\n onChangeShift,\r\n handleMaxTimeMultipleTasks,\r\n handlePopupOverLap,\r\n handleCheckNightShift,\r\n handleCheckDayShift,\r\n checkNightShiftMismatchWarning,\r\n checkDayShiftMismatchWarning,\r\n checkCurrentTimesheetTotalHours,\r\n checkOverlapWarning,\r\n checkTimesheetTotalHours,\r\n handleAllowEdit,\r\n handleClosePopupConfirm,\r\n handleSaveCheckAndPopup,\r\n handleSubmitCheckAndPopup,\r\n handlePopupOverLapLevel,\r\n checkOverlapWarningLevel\r\n }\r\n}","\r\n \r\n \r\n \r\n \r\n Close\r\n Save\r\n Submit\r\n
\r\n \r\n\r\n \r\n \r\n
\r\n \r\n
\r\n
{{ messageConfirm.type }}
\r\n
\r\n {{ messageConfirm.message }}\r\n
\r\n
\r\n \r\n \r\n \r\n {{ messageConfirm.textButtonCancel }}\r\n \r\n \r\n \r\n \r\n \r\n {{ messageConfirm.textButtonConfirm }}\r\n \r\n \r\n \r\n \r\n \r\n {{ messageConfirm.textButtonConfirm }}\r\n \r\n
\r\n \r\n \r\n \r\n \r\n\r\n\r\n \r\n\r\n\r\n","\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n\r\n\r\n\r\n ","\r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n\r\n","\r\n \r\n \r\n\r\n\r\n\r\n\r\n","import { USER_TYPE_APPROVER, USER_TYPE_STAFF, USER_TYPE_SYSTEM_ADMINISTRATOR, USER_TYPE_USER_ADMINISTRATOR } from 'core/constants';\r\n\r\nconst LoginView = () => import('modules/auth/views/login.vue');\r\nconst DashboardView = () => import('modules/dashboard/views/dashboard.vue');\r\n\r\nconst DashboardListView = () =>\r\n import('modules/super/dashboard/views/dashboard.vue');\r\n\r\nconst DashboardSuperEditView = () =>\r\n import('modules/super/dashboard/views/edit.vue');\r\n\r\nconst ManualView = () => import('modules/manual/views/manual.vue');\r\nconst ProfileView = () => import('modules/profile/views/profile.vue');\r\nconst NotificationsView = () =>\r\n import('modules/notifications/views/notificationv2.vue');\r\nconst ForgetPasswordView = () =>\r\n import('modules/auth/views/forget-password.vue');\r\nconst ResetPasswordView = () => import('modules/auth/views/reset-password.vue');\r\nconst RegisterView = () => import('modules/auth/views/register.vue');\r\nconst NotificationsSuperView = () =>\r\n import('modules/notifications/views/notificationv2.vue');\r\nconst UsersView = () =>\r\n import('modules/admin/users/views/users.vue');\r\nconst ApprovalGroupsView = () =>\r\n import('modules/admin/groups/views/approval-groups.vue');\r\nconst AccessDeniedView = () =>\r\n import('modules/errors/views/access-denied.vue');\r\nconst TimesheetTrackingListView = () =>\r\n import('modules/super/timesheetTrackings/views/timesheetTracking.vue');\r\nconst UserTrackingsView = () => import('modules/super/userTrackings/views/userTrackings.vue');\r\nconst SettingsView = () =>\r\n import('modules/settings/views/settings.vue');\r\n\r\nconst routes = [\r\n {\r\n path: '/:catchAll(.*)',\r\n redirect: 'dashboard'\r\n },\r\n {\r\n path: '/access-denied',\r\n name: 'Access Denied',\r\n meta: {\r\n requiresAuth: true,\r\n },\r\n component: AccessDeniedView\r\n },\r\n {\r\n path: '/callback',\r\n name: 'Callback',\r\n meta: {\r\n requiresAuth: false,\r\n },\r\n redirect: 'dashboard'\r\n },\r\n {\r\n path: '/login',\r\n name: 'login',\r\n component: LoginView,\r\n meta: {\r\n requiresAuth: false,\r\n },\r\n },\r\n {\r\n path: '/forget-password',\r\n name: 'forget-password',\r\n component: ForgetPasswordView,\r\n meta: {\r\n requiresAuth: false,\r\n },\r\n },\r\n {\r\n path: '/reset-password',\r\n name: 'reset-password',\r\n component: ResetPasswordView,\r\n meta: {\r\n requiresAuth: false,\r\n },\r\n },\r\n {\r\n path: '/register',\r\n name: 'register',\r\n component: RegisterView,\r\n meta: {\r\n requiresAuth: false,\r\n },\r\n },\r\n {\r\n path: '/dashboard',\r\n component: DashboardView,\r\n name: 'Dashboard',\r\n meta: {\r\n // title: 'header.dashboard',\r\n requiresAuth: true,\r\n roles: [USER_TYPE_STAFF]\r\n },\r\n },\r\n {\r\n path: '/super/dashboard',\r\n component: DashboardListView,\r\n name: 'DashboardSuper',\r\n meta: {\r\n // title: 'header.dashboard',\r\n requiresAuth: true,\r\n roles: [USER_TYPE_APPROVER, USER_TYPE_SYSTEM_ADMINISTRATOR, USER_TYPE_USER_ADMINISTRATOR]\r\n },\r\n alias: ['/admin/dashboard']\r\n },\r\n {\r\n path: '/super/user-trackings',\r\n component: UserTrackingsView,\r\n name: 'UserTrackings',\r\n meta: {\r\n requiresAuth: true,\r\n roles: [USER_TYPE_SYSTEM_ADMINISTRATOR]\r\n },\r\n alias: ['/admin/user-trackings']\r\n },\r\n {\r\n path: '/super/timesheet-trackings',\r\n component: TimesheetTrackingListView,\r\n name: 'TimesheetTracking',\r\n meta: {\r\n // title: 'header.dashboard',\r\n requiresAuth: true,\r\n roles: [USER_TYPE_SYSTEM_ADMINISTRATOR, USER_TYPE_USER_ADMINISTRATOR]\r\n },\r\n alias: ['/admin/timesheet-trackings']\r\n },\r\n {\r\n path: '/super/dashboard/edit/:id',\r\n component: DashboardSuperEditView,\r\n name: 'DashboardSuperEdit',\r\n meta: {\r\n // title: 'header.dashboard',\r\n requiresAuth: true,\r\n roles: [USER_TYPE_APPROVER, USER_TYPE_SYSTEM_ADMINISTRATOR]\r\n },\r\n },\r\n {\r\n path: '/manuals',\r\n component: ManualView,\r\n name: 'Manuals',\r\n meta: {\r\n // title: 'header.dashboard',\r\n requiresAuth: true,\r\n roles: [USER_TYPE_APPROVER, USER_TYPE_STAFF, USER_TYPE_SYSTEM_ADMINISTRATOR, USER_TYPE_USER_ADMINISTRATOR]\r\n },\r\n },\r\n {\r\n path: '/profile',\r\n component: ProfileView,\r\n name: 'Profile',\r\n meta: {\r\n // title: 'header.dashboard',\r\n requiresAuth: true,\r\n roles: [USER_TYPE_APPROVER, USER_TYPE_STAFF, USER_TYPE_SYSTEM_ADMINISTRATOR, USER_TYPE_USER_ADMINISTRATOR]\r\n },\r\n },\r\n {\r\n path: '/notifications',\r\n component: NotificationsView,\r\n name: 'Notifications',\r\n meta: {\r\n // title: 'header.dashboard',\r\n requiresAuth: true,\r\n roles: [USER_TYPE_APPROVER, USER_TYPE_STAFF, USER_TYPE_SYSTEM_ADMINISTRATOR]\r\n },\r\n },\r\n {\r\n path: '/super/notifications',\r\n component: NotificationsSuperView,\r\n name: 'NotificationsSuper',\r\n meta: {\r\n // title: 'header.dashboard',\r\n requiresAuth: true,\r\n roles: [USER_TYPE_APPROVER, USER_TYPE_SYSTEM_ADMINISTRATOR]\r\n },\r\n },\r\n // {\r\n // path: '/admin/dashboard',\r\n // component: DashboardListView,\r\n // name: 'DashboardSuper',\r\n // meta: {\r\n // requiresAuth: false,\r\n // roles:[USER_TYPE_SYSTEM_ADMINISTRATOR]\r\n // },\r\n // },\r\n {\r\n path: '/admin/users',\r\n component: UsersView,\r\n name: 'Users',\r\n meta: {\r\n // title: 'header.dashboard',\r\n requiresAuth: true,\r\n roles: [USER_TYPE_SYSTEM_ADMINISTRATOR, USER_TYPE_USER_ADMINISTRATOR]\r\n },\r\n },\r\n {\r\n path: '/admin/approval-groups',\r\n component: ApprovalGroupsView,\r\n name: 'ApprovalGroups',\r\n meta: {\r\n // title: 'header.dashboard',\r\n requiresAuth: true,\r\n roles: [USER_TYPE_SYSTEM_ADMINISTRATOR, USER_TYPE_USER_ADMINISTRATOR]\r\n },\r\n // props: { isAdmin: false },\r\n },\r\n {\r\n path: '/admin/settings',\r\n component: SettingsView,\r\n name: 'Settings',\r\n meta: {\r\n requiresAuth: true,\r\n roles: [USER_TYPE_SYSTEM_ADMINISTRATOR]\r\n },\r\n },\r\n];\r\n\r\nexport default routes;\r\n","import store from \"store\";\r\nimport { computed, nextTick } from \"@vue/runtime-core\";\r\nimport {\r\n createRouter,\r\n createWebHistory,\r\n Router,\r\n RouteLocationNormalized,\r\n} from \"vue-router\";\r\nimport { msalInstance, loginRequest, tokenRequest } from \"../authConfig\";\r\nimport { InteractionType } from \"@azure/msal-browser\";\r\nimport routes from \"./routes\";\r\nimport { isAuthenticated, checkTokenExpire, clearCookie, autoRefreshToken, getCookie, clearAllCookies } from \"../utils\";\r\nimport {\r\n AUTH_TOKEN_KEY,\r\n REFRESH_TOKEN_KEY,\r\n USER_TYPE_APPROVER,\r\n USER_TYPE_SYSTEM_ADMINISTRATOR,\r\n USER_TYPE_USER_ADMINISTRATOR,\r\n} from \"core/constants\";\r\nconst router: Router = createRouter({\r\n history: createWebHistory(),\r\n routes,\r\n});\r\n\r\nrouter.beforeEach(async (to: any, from: RouteLocationNormalized) => {\r\n if (to.meta.requiresAuth) {\r\n try {\r\n const token = localStorage.getItem(AUTH_TOKEN_KEY) || sessionStorage.getItem(AUTH_TOKEN_KEY);\r\n const isTokenExpire = checkTokenExpire(token);\r\n // const request = {\r\n // ...loginRequest,\r\n // redirectStartPage: to.fullPath,\r\n // };\r\n let currentUser = store.getters[\"auth/currentUser\"];\r\n\r\n\r\n if (currentUser.userId === undefined || isTokenExpire) {\r\n currentUser = await store.dispatch(\"auth/actGetMe\");\r\n }\r\n if (currentUser) {\r\n const isDashBoard = to.matched.some(\r\n (p: any) => p.path.indexOf(\"/dashboard\") === 0\r\n );\r\n if (isDashBoard) {\r\n if (currentUser.userType === USER_TYPE_APPROVER) {\r\n return \"/super/dashboard\";\r\n }\r\n if (currentUser.userType === USER_TYPE_SYSTEM_ADMINISTRATOR) {\r\n return \"/admin/dashboard\";\r\n }\r\n if (currentUser.userType === USER_TYPE_USER_ADMINISTRATOR) {\r\n return '/admin/dashboard'\r\n }\r\n }\r\n // Check permission\r\n if (to.meta.roles !== undefined && to.meta.roles !== null) {\r\n if (!to.meta.roles.includes(currentUser.userType)) {\r\n return '/access-denied'\r\n }\r\n }\r\n }\r\n } catch (e: any) {\r\n localStorage.setItem(AUTH_TOKEN_KEY, \"\");\r\n sessionStorage.setItem(AUTH_TOKEN_KEY, \"\")\r\n // msalInstance.logoutRedirect()\r\n }\r\n }\r\n\r\n // let currentUser = store.getters[\"auth/currentUser\"];\r\n // if (currentUser.userId === undefined) {\r\n // currentUser = await store.dispatch(\"auth/actGetMe\");\r\n // if (!currentUser){\r\n // localStorage.setItem(AUTH_TOKEN_KEY, '');\r\n // msalInstance.logoutRedirect()\r\n // }\r\n // }\r\n return true;\r\n});\r\n\r\nexport default router;\r\n","import { NavigationClient, NavigationOptions } from \"@azure/msal-browser\";\r\nimport { Router } from \"vue-router\";\r\n\r\n/**\r\n * This is an example for overriding the default function MSAL uses to navigate to other urls in your webpage\r\n */\r\nexport class CustomNavigationClient extends NavigationClient{\r\n private router: Router;\r\n\r\n constructor(router: Router) {\r\n super();\r\n this.router = router;\r\n }\r\n\r\n /**\r\n * Navigates to other pages within the same web application\r\n * You can use the useHistory hook provided by react-router-dom to take advantage of client-side routing\r\n * @param url \r\n * @param options \r\n */\r\n async navigateInternal(url: string, options: NavigationOptions) {\r\n const relativePath = url.replace(window.location.origin, '');\r\n if (options.noHistory) {\r\n this.router.replace(relativePath);\r\n } else {\r\n this.router.push(relativePath);\r\n }\r\n\r\n return false;\r\n }\r\n}","import 'element-plus/dist/index.css'\r\nimport ElementPlus from 'element-plus'\r\nimport { createApp } from 'vue'\r\nimport App from './App.vue'\r\nimport store from './store'\r\nimport router from './router'\r\nimport './index.css'\r\nimport \"./styles/index.scss\";\r\nimport \"./styles/element/index.scss\";\r\nimport { msalPlugin } from \"./plugins/msalPlugin\";\r\nimport { messaging } from './firebase/firebase';\r\nimport { msalInstance } from \"./authConfig\";\r\nimport { AuthenticationResult, EventType } from \"@azure/msal-browser\";\r\nimport { CustomNavigationClient } from 'router/navigationClient'\r\nimport Vue3Signature from \"vue3-signature\"\r\nimport {NotificationService} from \"modules/notifications/service\";\r\nimport {AuthService} from \"modules/auth/service\";\r\nconst service = new AuthService()\r\n// The next 2 lines are optional. This is how you configure MSAL to take advantage of the router's navigate functions when MSAL redirects between pages in your app\r\nconst navigationClient = new CustomNavigationClient(router);\r\nmsalInstance.setNavigationClient(navigationClient);\r\n\r\n// Account selection logic is app dependent. Adjust as needed for different use cases.\r\nconst accounts = msalInstance.getAllAccounts();\r\nif (accounts.length > 0) {\r\n msalInstance.setActiveAccount(accounts[0]);\r\n}\r\n\r\nmsalInstance.addEventCallback((event) => {\r\n if (event.eventType === EventType.LOGIN_SUCCESS && event.payload) {\r\n const payload = event.payload as AuthenticationResult;\r\n const account = payload.account;\r\n msalInstance.setActiveAccount(account);\r\n }\r\n});\r\n\r\nconst app = createApp(App)\r\napp.use(ElementPlus)\r\napp.use(router)\r\napp.use(store)\r\napp.use(Vue3Signature as any)\r\napp.config.warnHandler = function (msg, vm, trace) {\r\n return null\r\n}\r\n\r\nif ('serviceWorker' in navigator) {\r\n navigator.serviceWorker\r\n .register('/firebase-messaging-sw.js')\r\n .then((registration) => {\r\n console.log('Service Worker registered:', registration);\r\n messaging.useServiceWorker(registration);\r\n })\r\n .catch((error) => {\r\n console.error('Service Worker registration failed:', error);\r\n });\r\n}\r\n\r\n// app.use(msalPlugin, msalInstance);\r\nrouter.isReady().then(() => {\r\n // For develop\r\n // const token ='eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ilg1ZVhrNHh5b2pORnVtMWtsMll0djhkbE5QNC1jNTdkTzZRR1RWQndhTmsifQ.eyJpc3MiOiJodHRwczovL2VtZWNvdGltZXNoZWV0cy5iMmNsb2dpbi5jb20vNDYyYzZiOTItZDhmMi00OWZlLWJkNzUtNmUyYmFkZDg5MDFiL3YyLjAvIiwiZXhwIjoxNjc4MTIwMTIwLCJuYmYiOjE2NzgxMTI5MjAsImF1ZCI6ImI2YzM0MmNiLTE1NmQtNGE5Zi05ODdhLTJmYjk4ODg4ODIyZCIsIm9pZCI6ImJkM2Q4ODVkLTQ4YWQtNDBiNi04YTQ0LWUyYTkwMGE3MmVlYyIsInN1YiI6ImJkM2Q4ODVkLTQ4YWQtNDBiNi04YTQ0LWUyYTkwMGE3MmVlYyIsInRmcCI6IkIyQ18xX1NpZ25JbiIsIm5vbmNlIjoiZDVjZjcwODctY2VmMy00MzM0LWI1MDMtM2RiMDFlODEyMzMxIiwic2NwIjoiU3lzdGVtLkFkbWluIFVzZXIuTWFuYWdlIFRpbWVzaGVldC5SZXZpZXcgVGltZXNoZWV0LkFwcHJvdmUgVGltZXNoZWV0LlN1Ym1pdCIsImF6cCI6IjIyM2FlNTRhLWZhZGUtNGVhYS04N2NiLWI1OTg2NTA5OTBkYSIsInZlciI6IjEuMCIsImlhdCI6MTY3ODExMjkyMH0.HUtFj6BYNo6-pi-D48NV72IozwRF8vPFsTlaNiBxBXm4_ySXcQzJMZAH6PI2M-gyoViqPKJnNzXTIrYsgVF3PyiWnc_50uFY1ryZiuDw65QCnmNVQwc0IAIK_pQaBe1rhNddYbLP6deo1TjqoTSuEfNbgGim7H3x0O_t78IKnmH-HEDKQ59X3oz3_3-3uFg2Aqk4svw2D5DGvta6HViMv8jjLyiAzEI6eWe29f9RygN_0vVXws5wyPys2CIgeKVIVPgexq-bPJGB_VIfqoSbe9pEnmi7mjWmXX_1NzRDAo7x_gzSjc5arG8rK5azHajbMxRbI0uKS-Wkoaa8IpHYZw'\r\n // localStorage.setItem('access-token', token);\r\n\r\n\r\n // Waiting for the router to be ready prevents race conditions when returning from a loginRedirect or acquireTokenRedirect\r\n messaging.requestPermission()\r\n .then(() => {\r\n console.log('Notification permission granted.');\r\n return messaging.getToken();\r\n })\r\n .then(async (token) => {\r\n const notificationSvc = new NotificationService();\r\n\r\n const currentUser = await service.me()\r\n await notificationSvc.registerToken({\r\n \"DeviceId\": currentUser.userId?.toString(),\r\n \"Token\": token,\r\n \"Platform\": \"web\"\r\n })\r\n // Send the token to your server or store it for later use\r\n })\r\n .catch((error) => {\r\n console.error('Error requesting permission:', error);\r\n });\r\n app.mount('#app')\r\n});\r\n"],"file":"assets/index.ca7a8952.js"}