{"version":3,"file":"index-CHF3dJRN.js","sources":["../../../Nitrogen.Client/src/models/UserSelf.js","../../../Nitrogen.Client/src/api/modules/account.js","../../../Nitrogen.Client/src/models/AppModule.js","../../../Nitrogen.Client/src/models/Permission.js","../../../Nitrogen.Client/src/models/PermissionDisplay.js","../../../Nitrogen.Client/src/api/modules/permissions.js","../../../Nitrogen.Client/src/models/TimeClockPunch.js","../../../Nitrogen.Client/src/api/modules/timeClockPunches.js","../../../Nitrogen.Client/src/models/Company.js","../../../Nitrogen.Client/src/api/modules/companies.js","../../../Nitrogen.Client/src/models/WorkOrderReference.js","../../../Nitrogen.Client/src/models/CustomerRentalDetailed.js","../../../Nitrogen.Client/src/models/CustomerRentalMapLocation.js","../../../Nitrogen.Client/src/api/modules/customerRentals.js","../../../Nitrogen.Client/src/api/modules/pdf.js","../../../Nitrogen.Client/src/api/modules/email.js","../../../Nitrogen.Client/src/models/EmailEvent.js","../../../Nitrogen.Client/src/models/Email.js","../../../Nitrogen.Client/src/api/modules/emails.js","../../../Nitrogen.Client/src/api/modules/inventory.js","../../../Nitrogen.Client/src/api/modules/maintenance.js","../../../Nitrogen.Client/src/api/modules/offline.js","../../../Nitrogen.Client/src/api/modules/reports.js","../../../Nitrogen.Client/src/models/Role.js","../../../Nitrogen.Client/src/api/modules/roles.js","../../../Nitrogen.Client/src/models/Service.js","../../../Nitrogen.Client/src/api/modules/services.js","../../../Nitrogen.Client/src/api/modules/states.js","../../../Nitrogen.Client/src/models/SubscriptionBillingFrequency.js","../../../Nitrogen.Client/src/models/SubscriptionModule.js","../../../Nitrogen.Client/src/models/SubscriptionUserTier.js","../../../Nitrogen.Client/src/models/Subscription.js","../../../Nitrogen.Client/src/models/SubscriptionDetails.js","../../../Nitrogen.Client/src/models/SubscriptionDetailsReport.js","../../../Nitrogen.Client/src/api/modules/subscriptions.js","../../../Nitrogen.Client/src/models/TimeZone.js","../../../Nitrogen.Client/src/api/modules/timeZones.js","../../../Nitrogen.Client/src/models/UserAbsence.js","../../../Nitrogen.Client/src/api/modules/userAbsence.js","../../../Nitrogen.Client/src/models/VehicleMaintenance.js","../../../Nitrogen.Client/src/api/modules/vehicleMaintenance.js","../../../Nitrogen.Client/src/models/VehicleMaintenanceIntervalType.js","../../../Nitrogen.Client/src/models/VehicleMaintenanceType.js","../../../Nitrogen.Client/src/models/VehicleMaintenanceSchedule.js","../../../Nitrogen.Client/src/api/modules/vehicleMaintenanceSchedule.js","../../../Nitrogen.Client/src/api/modules/vehicleMaintenanceTypes.js","../../../Nitrogen.Client/src/api/modules/vehicleTypes.js","../../../Nitrogen.Client/src/api/modules/workOrderSchedules.js","../../../Nitrogen.Client/src/models/WorkOrderType.js","../../../Nitrogen.Client/src/api/modules/workOrderTypes.js","../../../Nitrogen.Client/src/api/index.js"],"sourcesContent":["import { getArrayFromDto as getArray, getValueFromDto as getValue } from './_helpers.js';\r\n\r\nexport default class UserSelf {\r\n\tconstructor(dto) {\r\n\t\tthis.id = getValue(dto, 'id', 'number', 0);\r\n\t\tthis.emailAddress = getValue(dto, 'emailAddress', 'string', '');\r\n\t\tthis.emailConfirmed = getValue(dto, 'emailConfirmed', 'boolean', false);\r\n\t\tthis.roles = getArray(dto, 'roles', []);\r\n\t\tthis.permissions = getArray(dto, 'permissions', []);\r\n\t\tthis.modules = getArray(dto, 'modules', []);\r\n\t\tthis.firstName = getValue(dto, 'firstName', 'string', '');\r\n\t\tthis.middleInitial = getValue(dto, 'middleInitial', 'string', '');\r\n\t\tthis.lastName = getValue(dto, 'lastName', 'string', '');\r\n\t\tthis.phoneNumber = getValue(dto, 'phoneNumber', 'string', '');\r\n\t\tthis.operator = getValue(dto, 'operator', 'boolean', false);\r\n\t\tthis.isPunchedIn = getValue(dto, 'isPunchedIn', 'boolean', false);\r\n\t\tthis.companyId = getValue(dto, 'companyId', 'number', null);\r\n\t\tthis.isAdmin = getValue(dto, 'isAdmin', 'boolean', false);\r\n\t\tthis.isImpersonating = getValue(dto, 'isImpersonating', 'boolean', false);\r\n\t\tthis.isInternal = getValue(dto, 'isInternal', 'boolean', false);\r\n\t\tthis.canSwitchCompanies = getValue(dto, 'canSwitchCompanies', 'boolean', false);\r\n\t}\r\n\r\n\tget name() {\r\n\t\treturn (this.firstName + ' ' + this.lastName).trim();\r\n\t}\r\n\r\n\tget initials() {\r\n\t\treturn (this.firstName ? this.firstName.substr(0, 1) : '') + (this.middleInitial || '') + (this.lastName ? this.lastName.substr(0, 1) : '');\r\n\t}\r\n\r\n\ttoString() {\r\n\t\treturn `${this.firstName} ${this.lastName} (${this.initials})`;\r\n\t}\r\n}\r\n","import { broadcast } from '@/helpers/broadcast';\r\nimport { clearDatabase } from '@/idb';\r\nimport UserSelf from '@/models/UserSelf';\r\nimport { API_CACHE_NAME, addCompanyIdToUrl, fetchWrap, offlineResponse } from '../_helpers';\r\n\r\nexport default {\r\n\tasync getSelf() {\r\n\t\tlet response, data;\r\n\t\tconst request = new Request(addCompanyIdToUrl('/api/users/self'));\r\n\t\ttry {\r\n\t\t\tresponse = await fetch(request);\r\n\t\t\tif (response.ok) {\r\n\t\t\t\tdata = await response.json();\r\n\t\t\t\tif (!(data.id > 0) || !(data.companyId > 0)) {\r\n\t\t\t\t\tawait clearDatabase();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} catch {\r\n\t\t\t// directly check the cache so this API call works when called from the service worker while offline\r\n\t\t\ttry {\r\n\t\t\t\tconst cache = await caches.open(API_CACHE_NAME);\r\n\t\t\t\tresponse = await cache.match(request, { ignoreMethod: true });\r\n\t\t\t\tif (!response) { response = offlineResponse(); }\r\n\t\t\t\tif (response.ok) { data = await response.json(); }\r\n\t\t\t} catch (e) {\r\n\t\t\t\tconsole.error(e);\r\n\t\t\t\tresponse = offlineResponse();\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn data ? new UserSelf(data) : null;\r\n\t},\r\n\tasync login(model) {\r\n\t\tawait clearDatabase();\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Users/login', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\treturn response;\r\n\t},\r\n\tasync loginWith2faCode(model) {\r\n\t\tawait clearDatabase();\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Users/LoginWith2faCode', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\treturn response;\r\n\t},\r\n\tasync loginWithRecoveryCode(model) {\r\n\t\tawait clearDatabase();\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Users/LoginWithRecoveryCode', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\treturn response;\r\n\t},\r\n\tasync logout() {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Users/logout', { method: 'POST' });\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tawait clearDatabase();\r\n\t\t\tbroadcast.postMessage({ action: 'reload', });\r\n\t\t}\r\n\t\treturn response;\r\n\t},\r\n\tasync requestPasswordReset(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Users/forgotpassword', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\treturn response;\r\n\t},\r\n\tasync resetPassword(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Users/resetpassword', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\treturn response;\r\n\t},\r\n\tasync updateSelf(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/users/self', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\treturn response;\r\n\t},\r\n\tasync changePassword(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Users/changepassword', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\treturn response;\r\n\t},\r\n\tasync confirmEmailChange(userId, email, code) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Users/ConfirmEmailChange', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify({ userId, email, code }),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\treturn response;\r\n\t},\r\n\tasync setup(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Users/setup', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\treturn response;\r\n\t},\r\n\tasync get2faInfo() {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Users/Get2faInfo');\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn await response.json();\r\n\t\t}\r\n\t\treturn response;\r\n\t},\r\n\tasync previewEnable2fa() {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Users/PreviewEnable2fa', { method: 'POST' });\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn await response.json();\r\n\t\t}\r\n\t\treturn response;\r\n\t},\r\n\tasync enable2fa(code) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Users/Enable2fa', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify({ code }),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn await response.json();\r\n\t\t}\r\n\t\treturn response;\r\n\t},\r\n\tasync generate2faRecoverCodes() {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Users/Generate2faRecoverCodes', { method: 'POST' });\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn await response.json();\r\n\t\t}\r\n\t\treturn response;\r\n\t},\r\n\tasync reset2fa() {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Users/Reset2fa', { method: 'POST' });\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\treturn response;\r\n\t},\r\n\tasync disable2fa() {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Users/Disable2fa', { method: 'POST' });\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\treturn response;\r\n\t},\r\n\tasync forgetThisMachine2fa() {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Users/ForgetThisMachine2fa', { method: 'POST' });\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\treturn response;\r\n\t},\r\n};\r\n","export default class AppModule {\r\n\tstatic none = 0;\r\n\tstatic rentals = 1;\r\n\r\n\tstatic options = [{\r\n\t\tid: this.rentals,\r\n\t\tname: 'Rentals',\r\n\t\tdescription: 'Rental item management system',\r\n\t}];\r\n}\r\n","export default class Permission {\r\n\tstatic notSet = 0;\r\n\t// admin\r\n\tstatic adminAccessAll = 32767;\r\n\tstatic admin = 1;\r\n\tstatic adminUsers = 2;\r\n\tstatic adminRoles = 3;\r\n\tstatic adminHangfire = 4;\r\n\tstatic adminImpersonate = 70;\r\n\t// company\r\n\tstatic companyAccessAll = 32766;\r\n\tstatic companyOperator = 9;\r\n\tstatic companyOffice = 10;\r\n\tstatic companySettings = 12;\r\n\tstatic companyUsers = 11;\r\n\tstatic companyTimeSheets = 13;\r\n\tstatic companyReports = 14;\r\n\tstatic companyBypassIpRestrictions = 15;\r\n\tstatic companyRentals = 16;\r\n}\r\n","import { getValueFromDto as getValue } from './_helpers.js';\r\nimport Permission from './Permission.js';\r\n\r\nexport default class PermissionDisplay {\r\n\tconstructor(dto) {\r\n\t\tthis.id = getValue(dto, 'id', 'number', 0);\r\n\t\tthis.key = getValue(dto, 'key', 'string', null);\r\n\t\tthis.group = getValue(dto, 'group', 'string', null);\r\n\t\tthis.name = getValue(dto, 'name', 'string', null);\r\n\t\tthis.description = getValue(dto, 'description', 'string', null);\r\n\t\tthis.sortOrder = getValue(dto, 'sortOrder', 'number', 0);\r\n\t\tthis.module = getValue(dto, 'module', 'number', null);\r\n\t}\r\n\r\n\ttoJSON() {\r\n\t\treturn this.id;\r\n\t}\r\n\r\n\tstatic isValid(value) {\r\n\t\treturn Object.values(Permission).includes(value);\r\n\t}\r\n}\r\n","import AppModule from '@/models/AppModule';\r\nimport Permission from '@/models/Permission';\r\nimport PermissionDisplay from '@/models/PermissionDisplay';\r\n\r\nconst adminPermissions = [\r\n\tnew PermissionDisplay({\r\n\t\tid: Permission.adminAccessAll,\r\n\t\tkey: 'adminAccessAll',\r\n\t\tgroup: 'Admin',\r\n\t\tname: 'Super Admin',\r\n\t\tdescription: 'This allows the user to access every feature',\r\n\t\tsortOrder: 1,\r\n\t}),\r\n\tnew PermissionDisplay({\r\n\t\tid: Permission.admin,\r\n\t\tkey: 'admin',\r\n\t\tgroup: 'Admin',\r\n\t\tname: 'Admin',\r\n\t\tdescription: 'Access Administration Area',\r\n\t\tsortOrder: 2,\r\n\t}),\r\n\tnew PermissionDisplay({\r\n\t\tid: Permission.adminUsers,\r\n\t\tkey: 'adminUsers',\r\n\t\tgroup: 'Admin',\r\n\t\tname: 'Manage Admin Users',\r\n\t\tdescription: 'Manage all admin users',\r\n\t\tsortOrder: 3,\r\n\t}),\r\n\tnew PermissionDisplay({\r\n\t\tid: Permission.adminRoles,\r\n\t\tkey: 'adminRoles',\r\n\t\tgroup: 'Admin',\r\n\t\tname: 'Manage Admin Roles',\r\n\t\tdescription: 'Manage all admin roles and permissions',\r\n\t\tsortOrder: 4,\r\n\t}),\r\n\tnew PermissionDisplay({\r\n\t\tid: Permission.adminHangfire,\r\n\t\tkey: 'adminHangfire',\r\n\t\tgroup: 'Admin',\r\n\t\tname: 'Hangfire',\r\n\t\tdescription: 'View Hangfire dashboard',\r\n\t\tsortOrder: 5,\r\n\t}),\r\n\tnew PermissionDisplay({\r\n\t\tid: Permission.adminImpersonate,\r\n\t\tkey: 'adminImpersonate',\r\n\t\tgroup: 'Admin',\r\n\t\tname: 'Company Impersonation',\r\n\t\tdescription: 'Temporarily join a company using your own permissions',\r\n\t\tsortOrder: 6,\r\n\t}),\r\n];\r\n\r\nconst adminPermissionIds = new Set([\r\n\tPermission.adminAccessAll,\r\n\tPermission.admin,\r\n\tPermission.adminUsers,\r\n\tPermission.adminRoles,\r\n\tPermission.adminHangfire,\r\n\tPermission.adminImpersonate,\r\n]);\r\n\r\nconst companyPermissions = [\r\n\tnew PermissionDisplay({\r\n\t\tid: Permission.companyAccessAll,\r\n\t\tkey: 'companyAccessAll',\r\n\t\tgroup: 'Company',\r\n\t\tname: 'All Access',\r\n\t\tdescription: 'This allows the user to access every feature',\r\n\t\tsortOrder: 11,\r\n\t}),\r\n\tnew PermissionDisplay({\r\n\t\tid: Permission.companyOperator,\r\n\t\tkey: 'companyOperator',\r\n\t\tgroup: 'Company',\r\n\t\tname: 'Operator Interface',\r\n\t\tdescription: '',\r\n\t\tsortOrder: 12,\r\n\t}),\r\n\tnew PermissionDisplay({\r\n\t\tid: Permission.companyOffice,\r\n\t\tkey: 'companyOffice',\r\n\t\tgroup: 'Company',\r\n\t\tname: 'Office Interface',\r\n\t\tdescription: '',\r\n\t\tsortOrder: 13,\r\n\t}),\r\n\tnew PermissionDisplay({\r\n\t\tid: Permission.companySettings,\r\n\t\tkey: 'companySettings',\r\n\t\tgroup: 'Company',\r\n\t\tname: 'Portal Settings',\r\n\t\tdescription: 'Including company name, payment settings and terms, selection lists, etc.',\r\n\t\tsortOrder: 14,\r\n\t}),\r\n\tnew PermissionDisplay({\r\n\t\tid: Permission.companyUsers,\r\n\t\tkey: 'companyUsers',\r\n\t\tgroup: 'Company',\r\n\t\tname: 'Manage Employees',\r\n\t\tdescription: 'Including absences, wages, education credits, etc.',\r\n\t\tsortOrder: 15,\r\n\t}),\r\n\tnew PermissionDisplay({\r\n\t\tid: Permission.companyTimeSheets,\r\n\t\tkey: 'companyTimeSheets',\r\n\t\tgroup: 'Company',\r\n\t\tname: 'Manage Timesheets',\r\n\t\tdescription: 'See and manage all employee\\'s timesheets.',\r\n\t\tsortOrder: 16,\r\n\t}),\r\n\tnew PermissionDisplay({\r\n\t\tid: Permission.companyReports,\r\n\t\tkey: 'companyReports',\r\n\t\tgroup: 'Company',\r\n\t\tname: 'Reports',\r\n\t\tdescription: '',\r\n\t\tsortOrder: 17,\r\n\t}),\r\n\tnew PermissionDisplay({\r\n\t\tid: Permission.companyBypassIpRestrictions,\r\n\t\tkey: 'companyBypassIpRestrictions',\r\n\t\tgroup: 'Company',\r\n\t\tname: 'Bypass Timeclock Restrictions',\r\n\t\tdescription: 'This allows the user to punch in/out on any network.',\r\n\t\tsortOrder: 18,\r\n\t}),\r\n\tnew PermissionDisplay({\r\n\t\tid: Permission.companyRentals,\r\n\t\tkey: 'companyRentals',\r\n\t\tgroup: 'Company',\r\n\t\tname: 'Rentals',\r\n\t\tdescription: 'This allows the user to manage customer rentals and rental items.',\r\n\t\tsortOrder: 18,\r\n\t\tmodule: AppModule.rentals\r\n\t}),\r\n];\r\n\r\nconst companyPermissionIds = new Set([\r\n\tPermission.companyAccessAll,\r\n\tPermission.companyOperator,\r\n\tPermission.companyOffice,\r\n\tPermission.companySettings,\r\n\tPermission.companyUsers,\r\n\tPermission.companyTimeSheets,\r\n\tPermission.companyReports,\r\n\tPermission.companyBypassIpRestrictions,\r\n\tPermission.companyRentals,\r\n]);\r\n\r\nexport default {\r\n\tisAdminPermission(permission) {\r\n\t\treturn permission === Permission.adminAccessAll ||\r\n\t\t\tpermission === Permission.admin ||\r\n\t\t\tpermission === Permission.adminUsers ||\r\n\t\t\tpermission === Permission.adminRoles ||\r\n\t\t\tpermission === Permission.adminHangfire ||\r\n\t\t\tpermission === Permission.adminImpersonate\r\n\t},\r\n\ttogglePermission(array, isAdmin, id) {\r\n\t\tconst allowed = isAdmin ? adminPermissionIds : companyPermissionIds;\r\n\t\tconst index = array.indexOf(id);\r\n\t\tconst toRemove = new Set();\r\n\t\tconst toAdd = new Set();\r\n\t\tif (index >= 0) {\r\n\t\t\t// remove permission\r\n\t\t\ttoRemove.add(id);\r\n\t\t\tif (id !== Permission.adminAccessAll) {\r\n\t\t\t\t// make sure all access is not checked\r\n\t\t\t\ttoRemove.add(Permission.adminAccessAll);\r\n\t\t\t}\r\n\t\t\tif (id !== Permission.companyAccessAll) {\r\n\t\t\t\t// make sure all access is not checked\r\n\t\t\t\ttoRemove.add(Permission.companyAccessAll);\r\n\t\t\t}\r\n\t\t\tif (id === Permission.admin) {\r\n\t\t\t\t// admin permissions\r\n\t\t\t\ttoRemove.add(Permission.adminUsers);\r\n\t\t\t\ttoRemove.add(Permission.adminRoles);\r\n\t\t\t\ttoRemove.add(Permission.adminHangfire);\r\n\t\t\t\ttoRemove.add(Permission.adminImpersonate);\r\n\t\t\t}\r\n\t\t\tif (id === Permission.companyOffice) {\r\n\t\t\t\t// office permissions\r\n\t\t\t\ttoRemove.add(Permission.companySettings);\r\n\t\t\t\ttoRemove.add(Permission.companyUsers);\r\n\t\t\t\ttoRemove.add(Permission.companyTimeSheets);\r\n\t\t\t\ttoRemove.add(Permission.companyReports);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// add permission\r\n\t\t\ttoAdd.add(id);\r\n\t\t\tif (id === Permission.adminAccessAll) {\r\n\t\t\t\t// check all\r\n\t\t\t\tfor (const x of adminPermissionIds) {\r\n\t\t\t\t\ttoAdd.add(x);\r\n\t\t\t\t}\r\n\t\t\t} else if (id === Permission.companyAccessAll) {\r\n\t\t\t\t// check all\r\n\t\t\t\tfor (const x of companyPermissionIds) {\r\n\t\t\t\t\ttoAdd.add(x);\r\n\t\t\t\t}\r\n\t\t\t} else if (id === Permission.adminUsers || id === Permission.adminRoles || id === Permission.adminHangfire || id === Permission.adminImpersonate) {\r\n\t\t\t\t// admin permissions\r\n\t\t\t\ttoAdd.add(Permission.admin);\r\n\t\t\t} else if (id === Permission.companySettings || id === Permission.companyUsers || id === Permission.companyTimeSheets || id === Permission.companyReports || id === Permission.companyRentals) {\r\n\t\t\t\t// office permissions\r\n\t\t\t\ttoAdd.add(Permission.companyOffice);\r\n\t\t\t}\r\n\t\t}\r\n\t\t// add new permissions\r\n\t\tfor (const x of toAdd) {\r\n\t\t\tif (allowed.has(x) && !toRemove.has(x) && !array.includes(x)) {\r\n\t\t\t\tarray.push(x);\r\n\t\t\t}\r\n\t\t}\r\n\t\t// remove permissions\r\n\t\tfor (let i = 0; i < array.length; i++) {\r\n\t\t\tconst x = array[i];\r\n\t\t\tif (toRemove.has(x) || !allowed.has(x)) {\r\n\t\t\t\tarray.splice(i, 1);\r\n\t\t\t\ti--;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\tgetAllForAdmin() {\r\n\t\treturn [...adminPermissions];\r\n\t},\r\n\tgetAllForCompany(modules) {\r\n\t\treturn companyPermissions.filter(x => !x.module || modules.includes(x.module));\r\n\t},\r\n};\r\n","import { getValueFromDto as getValue, getDateTimeFromDto as getDate } from './_helpers.js';\r\n\r\nexport default class TimeClockPunch {\r\n\tconstructor(dto) {\r\n\t\tthis.id = getValue(dto, 'id', 'number', 0);\r\n\t\tthis.userId = getValue(dto, 'userId', 'number', null);\r\n\t\tthis.punchInTime = getDate(dto, 'punchInTime', null);\r\n\t\tthis.punchOutTime = getDate(dto, 'punchOutTime', null);\r\n\t\tObject.defineProperty(this, 'isSplitOnPunchInTime', { enumerable: false, value: false, writable: true });\r\n\t\tObject.defineProperty(this, 'isSplitOnPunchOutTime', { enumerable: false, value: false, writable: true });\r\n\t}\r\n}\r\n","import { url as urlHelper } from '@/helpers/helpers';\r\nimport TimeClockPunch from '@/models/TimeClockPunch';\r\nimport { DateTime } from 'luxon';\r\nimport { fetchAllPages, fetchWrap, offlineResponse } from '../_helpers';\r\n\r\nexport default {\r\n\t/**\r\n\t * Get all time clock punches\r\n\t * @param {Object} params request parameters.\r\n\t * @returns (async) Returns an array of TimeClockPunch objects if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getAll({ userId = undefined, startDate = undefined, endDate = undefined } = {}) {\r\n\t\tconst query = {};\r\n\t\tif (typeof userId === 'number') {\r\n\t\t\tquery.userId = userId;\r\n\t\t}\r\n\t\tif (startDate instanceof DateTime) {\r\n\t\t\tquery.startDate = startDate.toISO();\r\n\t\t}\r\n\t\tif (endDate instanceof DateTime) {\r\n\t\t\tquery.endDate = endDate.toISO();\r\n\t\t}\r\n\t\tconst url = urlHelper('/api/TimeClockPunches', query);\r\n\t\tlet response, data = [];\r\n\t\ttry {\r\n\t\t\tresponse = await fetchAllPages(url, x => data.push(new TimeClockPunch(x)));\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn data;\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get all time clock punches\r\n\t * @param {Object} params request parameters.\r\n\t * @returns (async) Returns an array of TimeClockPunch objects if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getAllMyPunches({ startDate = undefined, endDate = undefined } = {}) {\r\n\t\tconst query = {};\r\n\t\tif (startDate instanceof DateTime) {\r\n\t\t\tquery.startDate = startDate.toISO();\r\n\t\t}\r\n\t\tif (endDate instanceof DateTime) {\r\n\t\t\tquery.endDate = endDate.toISO();\r\n\t\t}\r\n\t\tconst url = urlHelper('/api/TimeClockPunches/My', query);\r\n\t\tlet response, data = [];\r\n\t\ttry {\r\n\t\t\tresponse = await fetchAllPages(url, x => data.push(new TimeClockPunch(x)));\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn data;\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Check if the user can punch\r\n\t * @returns (async) Returns true if the user can punch in or out, otherwise false.\r\n\t */\r\n\tasync canPunch() {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/TimeClockPunches/CanPunch');\r\n\t\t} catch {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn await response.json();\r\n\t\t} else {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get a time clock punch\r\n\t * @param {Number} id TimeClockPunch ID\r\n\t * @returns (async) Returns a TimeClockPunch if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getById(id) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/TimeClockPunches/' + id);\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new TimeClockPunch(await response.json());\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get the current user's most recent time clock punch.\r\n\t * @returns (async) Returns a TimeClockPunch if the request was successful, null if 404, otherwise a Response.\r\n\t */\r\n\tasync getMyLastPunch() {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/TimeClockPunches/MyLastPunch');\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.status === 200) {\r\n\t\t\treturn new TimeClockPunch(await response.json());\r\n\t\t} else if (response.ok || response.status === 404) {\r\n\t\t\treturn null;\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Create a time clock punch\r\n\t * @param {TimeClockPunch} model time clock punch to create.\r\n\t * @returns (async) Returns the new TimeClockPunch if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync create(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/TimeClockPunches', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new TimeClockPunch(await response.json());\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Create a time clock punch for the current user at the current time.\r\n\t * @param {Boolean} punchIn specify if the user is intending to punch in.\r\n\t * @returns (async) Returns the new TimeClockPunch if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync punch(punchIn) {\r\n\t\tconst url = urlHelper('/api/TimeClockPunches/Punch', { punchIn });\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap(url, { method: 'POST' });\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new TimeClockPunch(await response.json());\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Update a time clock punch\r\n\t * @param {TimeClockPunch} model time clock punch to update.\r\n\t * @returns (async) Returns the updated TimeClockPunch if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync update(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/TimeClockPunches/' + model.id, {\r\n\t\t\t\tmethod: 'PUT',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new TimeClockPunch(model);\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Delete a time clock punch\r\n\t * @param {Number} id TimeClockPunch ID to delete.\r\n\t * @returns (async) Returns true if the request was successful (or not found), false if the time clock punch could not be deleted, otherwise a Response.\r\n\t */\r\n\tasync deleteById(id) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/TimeClockPunches/' + id, { method: 'DELETE' });\r\n\t\t} catch {\r\n\t\t\treturn offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok || response.status === 404) {\r\n\t\t\treturn true;\r\n\t\t} else if (response.status === 409) {\r\n\t\t\treturn false;\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t}\r\n};\r\n","import { getArrayFromDto as getArray, getValueFromDto as getValue } from './_helpers.js';\r\n\r\nexport default class Company {\r\n\tconstructor(dto) {\r\n\t\tthis.id = getValue(dto, 'id', 'number', 0);\r\n\t\tthis.name = getValue(dto, 'name', 'string', '');\r\n\t\tthis.active = getValue(dto, 'active', 'boolean', true);\r\n\t\tthis.subscriptionId = getValue(dto, 'subscriptionId', 'number', 0);\r\n\t\tthis.modules = getArray(dto, 'modules', []);\r\n\t\tObject.defineProperty(this, 'subscription', { enumerable: false, value: null, writable: true });\r\n\t}\r\n}\r\n","import { url as urlHelper } from '@/helpers/helpers';\r\nimport Company from '@/models/Company';\r\nimport { fetchWrap, offlineResponse } from '../_helpers';\r\n\r\nexport default {\r\n\t/**\r\n\t * Get all companies\r\n\t * @param {Object} params request parameters.\r\n\t * @param {Boolean} params.active if specified, only return either active or inactive companies.\r\n\t * @returns {Promise} (async) Returns an array of Companies if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getAll({ active = undefined } = {}) {\r\n\t\tconst query = {};\r\n\t\tif (typeof active === 'boolean') {\r\n\t\t\tquery.active = active;\r\n\t\t}\r\n\t\tconst url = urlHelper('/api/Companies', query);\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap(url);\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn (await response.json()).map(x => new Company(x));\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get all companies that are available to the user\r\n\t * @returns {Promise} (async) Returns an array of Companies if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getAvailable() {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Companies/Available');\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn (await response.json()).map(x => new Company(x));\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get a company\r\n\t * @param {Number} id Company ID\r\n\t * @returns (async) Returns a Company if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getById(id) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Companies/' + id);\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new Company(await response.json());\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Create a company\r\n\t * @param {Company} model company to create.\r\n\t * @returns (async) Returns the new Company if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync create(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Companies', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new Company(await response.json());\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Update a company\r\n\t * @param {Company} model company to update.\r\n\t * @returns (async) Returns the updated Company if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync update(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Companies/' + model.id, {\r\n\t\t\t\tmethod: 'PUT',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new Company(model);\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Delete a company\r\n\t * @param {Number} id Company ID to delete.\r\n\t * @returns (async) Returns true if the request was successful (or not found), false if the company could not be deleted, otherwise a Response.\r\n\t */\r\n\tasync deleteById(id) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Companies/' + id, { method: 'DELETE' });\r\n\t\t} catch {\r\n\t\t\treturn offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok || response.status === 404) {\r\n\t\t\treturn true;\r\n\t\t} else if (response.status === 409) {\r\n\t\t\treturn false;\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t}\r\n};\r\n","import WorkOrderStatus from './WorkOrderStatus.js';\r\nimport { getValueFromDto as getValue } from './_helpers.js';\r\n\r\nexport default class WorkOrderReference {\r\n\tconstructor(dto) {\r\n\t\tthis.id = getValue(dto, 'id', 'number', 0);\r\n\t\tthis.number = getValue(dto, 'number', 'number', null);\r\n\t\tthis.status = getValue(dto, 'status', 'number', WorkOrderStatus.estimate);\r\n\t}\r\n}\r\n","import WorkOrderReference from './WorkOrderReference.js';\r\nimport { getDateTimeFromDto as getDate, getArrayOfObjectsFromDto as getTypedArray, getValueFromDto as getValue } from './_helpers.js';\r\n\r\nexport class CustomerRentalDetailedItemStatus {\r\n\tstatic noChange = 0;\r\n\tstatic deliver = 1;\r\n\tstatic pickUp = 2;\r\n}\r\n\r\nexport class CustomerRentalDetailedNeed {\r\n\tconstructor(dto) {\r\n\t\tthis.id = getValue(dto, 'id', 'number', 0);\r\n\t\tthis.customerRentalId = getValue(dto, 'customerRentalId', 'number', null);\r\n\t\tthis.rentalItemTypeId = getValue(dto, 'rentalItemTypeId', 'number', null);\r\n\t\tthis.quantity = getValue(dto, 'quantity', 'number', 1);\r\n\t\tthis.items = getTypedArray(dto, 'items', CustomerRentalDetailedItem, []);\r\n\t}\r\n}\r\n\r\nexport class CustomerRentalDetailedItem {\r\n\tconstructor(dto) {\r\n\t\tthis.rentalItemTypeId = getValue(dto, 'rentalItemTypeId', 'number', 0);\r\n\t\t// this.rentalItemNumber = getValue(dto, 'rentalItemNumber', 'number', null);\r\n\t\tthis.rentalItemName = getValue(dto, 'rentalItemName', 'string', '');\r\n\t\tthis.status = getValue(dto, 'status', 'number', 0);\r\n\t}\r\n}\r\n\r\nexport class CustomerRentalDetailed {\r\n\tconstructor(dto) {\r\n\t\tthis.id = getValue(dto, 'id', 'number', 0);\r\n\t\tthis.startDate = getDate(dto, 'startDate', null);\r\n\t\tthis.endDate = getDate(dto, 'endDate', null);\r\n\t\tthis.isStarted = getValue(dto, 'isStarted', 'boolean', false);\r\n\t\tthis.isEnded = getValue(dto, 'isEnded', 'boolean', false);\r\n\t\tthis.workOrders = getTypedArray(dto, 'workOrders', WorkOrderReference, []);\r\n\t\tthis.needs = getTypedArray(dto, 'needs', CustomerRentalDetailedNeed, []);\r\n\t}\r\n}\r\n","import { getValueFromDto as getValue, getArrayFromDto as getArray } from './_helpers.js';\r\n\r\nexport default class CustomerRentalMapLocation {\r\n\tconstructor(dto) {\r\n\t\tthis.customerLocationId = getValue(dto, 'customerLocationId', 'number', null);\r\n\t\tthis.latitude = getValue(dto, 'latitude', 'number', null);\r\n\t\tthis.longitude = getValue(dto, 'longitude', 'number', null);\r\n\t\tthis.workOrderCount = getValue(dto, 'workOrderCount', 'number', null);\r\n\t\tthis.rentalItemTypes = getArray(dto, 'rentalItemTypes', []);\r\n\t}\r\n}\r\n","import { url as urlHelper } from '@/helpers/helpers';\r\nimport CustomerRental from '@/models/CustomerRental';\r\nimport { CustomerRentalDetailed } from '@/models/CustomerRentalDetailed';\r\nimport CustomerRentalMapLocation from '@/models/CustomerRentalMapLocation';\r\nimport PaginatedList from '@/models/PaginatedList';\r\nimport RentalItemSchedule from '@/models/RentalItemSchedule';\r\nimport { DateTime } from 'luxon';\r\nimport { fetchAllPages, fetchWrap, isAborted, offlineResponse, setPagination } from '../_helpers';\r\n\r\nexport default {\r\n\t/**\r\n\t * Get paginated work orders for the specified customer (and optionally location) in the specified date range.\r\n\t * @param {Object} params request parameters.\r\n\t * @returns {Promise>} (async) Returns a PaginatedList of WorkOrder objects if the request was successful.\r\n\t * @throws {Response} Will throw the response if the request was not successful.\r\n\t */\r\n\tasync getForCustomer({ customerId, customerLocationId = undefined, startDate = undefined, endDate = undefined, limit = undefined, start = undefined, sort = undefined } = {}) {\r\n\t\tconst query = setPagination(limit, start);\r\n\t\tif (typeof customerId === 'number') {\r\n\t\t\tquery.customerId = customerId;\r\n\t\t}\r\n\t\tif (typeof customerLocationId === 'number') {\r\n\t\t\tquery.customerLocationId = customerLocationId;\r\n\t\t}\r\n\r\n\t\tif (startDate instanceof DateTime) {\r\n\t\t\tquery.startDate = startDate.toISO();\r\n\t\t}\r\n\t\tif (endDate instanceof DateTime) {\r\n\t\t\tquery.endDate = endDate.toISO();\r\n\t\t}\r\n\r\n\t\tif (typeof sort === 'string') {\r\n\t\t\tquery.sort = sort;\r\n\t\t}\r\n\t\tconst url = urlHelper('/api/CustomerRentals/ForCustomer', query);\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap(url);\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new PaginatedList(await response.json(), x => new CustomerRental(x));\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get customre rentals that need attention, paginated.\r\n\t * @param {Object} params request parameters.\r\n\t * @returns (async) Returns a PaginatedList of CustomerRental objects if the request was successful.\r\n\t * @throws {Response} Will throw the response if the request was not successful.\r\n\t */\r\n\tasync getForAttention({ limit = undefined, start = undefined } = {}) {\r\n\t\tconst url = urlHelper('/api/CustomerRentals/ForAttention', setPagination(limit, start));\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap(url);\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new PaginatedList(await response.json(), x => new CustomerRental(x));\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get rental item schedules for the specified rental item in the specified date range.\r\n\t * @returns {Promise} (async) Returns a paginated list of RentalItemSchedule objects if the request was successful.\r\n\t * @throws {Response} Will throw the response if the request was not successful.\r\n\t */\r\n\tasync getRentalItemHistory({ rentalItemId, startDate = undefined, endDate = undefined, limit = undefined, start = undefined, sort = undefined } = {}) {\r\n\t\tconst query = setPagination(limit, start);\r\n\t\tif (typeof rentalItemId === 'number') {\r\n\t\t\tquery.rentalItemId = rentalItemId;\r\n\t\t}\r\n\t\tif (startDate instanceof DateTime) {\r\n\t\t\tquery.startDate = startDate.toISO();\r\n\t\t}\r\n\t\tif (endDate instanceof DateTime) {\r\n\t\t\tquery.endDate = endDate.toISO();\r\n\t\t}\r\n\t\tif (typeof sort === 'string') {\r\n\t\t\tquery.sort = sort;\r\n\t\t}\r\n\t\tconst url = urlHelper('/api/CustomerRentals/ForItem', query);\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap(url);\r\n\t\t} catch (e) {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new PaginatedList(await response.json(), x => new RentalItemSchedule(x));\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get all customer rentals scheduled in the specified date range.\r\n\t * @param {Object} params request parameters.\r\n\t * @returns {Promise} (async) Returns an array of customerRental objects if the request was successful.\r\n\t * @throws {Response} Will throw the response if the request was not successful.\r\n\t */\r\n\tasync getAllForDispatch({ startDate = undefined, endDate = undefined } = {}) {\r\n\t\tconst query = {};\r\n\t\tif (startDate instanceof DateTime) {\r\n\t\t\tquery.startDate = startDate.toISO();\r\n\t\t}\r\n\t\tif (endDate instanceof DateTime) {\r\n\t\t\tquery.endDate = endDate.toISO();\r\n\t\t}\r\n\t\tconst url = urlHelper('/api/CustomerRentals/ForDispatch', query);\r\n\t\tlet response, data = [];\r\n\t\ttry {\r\n\t\t\tresponse = await fetchAllPages(url, x => data.push(new CustomerRental(x)));\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn data;\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t* Get a list of data for single customer location\r\n\t* @param {Object} params request parameters.\r\n\t* @returns {Promise} (async) Returns an array of objects if the request was successful.\r\n\t* @throws {Response} Will throw the response if the request was not successful.\r\n\t*/\r\n\tasync getForMapDetails({ customerLocationId, startDate, endDate }, abortSignal) {\r\n\t\tconst query = {};\r\n\t\tif (typeof customerLocationId === 'number') {\r\n\t\t\tquery.customerLocationId = customerLocationId;\r\n\t\t}\r\n\t\tif (startDate instanceof DateTime) {\r\n\t\t\tquery.startDate = startDate.toISO();\r\n\t\t}\r\n\t\tif (endDate instanceof DateTime) {\r\n\t\t\tquery.endDate = endDate.toISO();\r\n\t\t}\r\n\t\tconst url = urlHelper('/api/CustomerRentals/ForMapDetails', query);\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tconst init = {};\r\n\t\t\tif (abortSignal instanceof AbortSignal) {\r\n\t\t\t\tinit.signal = abortSignal;\r\n\t\t\t}\r\n\t\t\tresponse = await fetchWrap(url, init);\r\n\t\t} catch (e) {\r\n\t\t\tif (isAborted(e)) {\r\n\t\t\t\tthrow e;\r\n\t\t\t} else {\r\n\t\t\t\tresponse = offlineResponse();\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn (await response.json()).map(x => new CustomerRentalDetailed(x));\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get a list of inital location data for google map\r\n\t * @param {Object} params request parameters.\r\n\t * @returns {Promise} (async) Returns an array of objects if the request was successful.\r\n\t * @throws {Response} Will throw the response if the request was not successful.\r\n\t */\r\n\tasync getForMapBasic({ startDate = undefined, endDate = undefined } = {}, abortSignal) {\r\n\t\tconst query = {};\r\n\t\tif (startDate instanceof DateTime) {\r\n\t\t\tquery.startDate = startDate.toISO();\r\n\t\t}\r\n\t\tif (endDate instanceof DateTime) {\r\n\t\t\tquery.endDate = endDate.toISO();\r\n\t\t}\r\n\t\tconst url = urlHelper('/api/CustomerRentals/ForMapBasic', query);\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tconst init = {};\r\n\t\t\tif (abortSignal instanceof AbortSignal) {\r\n\t\t\t\tinit.signal = abortSignal;\r\n\t\t\t}\r\n\t\t\tresponse = await fetchWrap(url, init);\r\n\t\t} catch (e) {\r\n\t\t\tif (isAborted(e)) {\r\n\t\t\t\tthrow e;\r\n\t\t\t} else {\r\n\t\t\t\tresponse = offlineResponse();\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn (await response.json()).map(x => new CustomerRentalMapLocation(x));\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get a customer rental\r\n\t * @param {Number} id customer rental ID\r\n\t * @returns (async) Returns a customer rental if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getById(id) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/CustomerRentals/' + id);\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new CustomerRental(await response.json());\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n};\r\n","import { url as urlHelper } from '@/helpers/helpers';\r\nimport { addCompanyIdToUrl } from '../_helpers';\r\n\r\nexport default {\r\n\tgetLandDisposalSiteListPdfUrl() {\r\n\t\treturn addCompanyIdToUrl('/api/pdf/LandDisposalSiteList').toString()\r\n\t},\r\n\tgetLandDisposalFormPdfUrl() {\r\n\t\treturn addCompanyIdToUrl('/api/pdf/LandDisposalForm').toString()\r\n\t},\r\n\tgetEstimatePdfUrl(id) {\r\n\t\treturn addCompanyIdToUrl(urlHelper('/api/pdf/Estimate', { id })).toString()\r\n\t},\r\n\tgetWorkOrderPdfUrl(id) {\r\n\t\treturn addCompanyIdToUrl(urlHelper('/api/pdf/WorkOrder', { id })).toString()\r\n\t},\r\n\tgetInvoicePdfUrl(id) {\r\n\t\treturn addCompanyIdToUrl(urlHelper('/api/pdf/Invoice', { id })).toString()\r\n\t},\r\n\tgetStatementPdfUrl(customerId, startDate, endDate) {\r\n\t\treturn addCompanyIdToUrl(urlHelper('/api/pdf/Statement', {\r\n\t\t\tcustomerId: customerId,\r\n\t\t\tstartDate: startDate.toISO(),\r\n\t\t\tendDate: endDate.toISO(),\r\n\t\t})).toString()\r\n\t},\r\n\tgetVehicleLogPdfUrl(vehicleId, startDate, endDate) {\r\n\t\treturn addCompanyIdToUrl(urlHelper('/api/pdf/VehicleLog', {\r\n\t\t\tvehicleId: vehicleId,\r\n\t\t\tstartDate: startDate.toISO(),\r\n\t\t\tendDate: endDate.toISO(),\r\n\t\t})).toString();\r\n\t}\r\n};\r\n","import Customer from '@/models/Customer';\r\nimport WorkOrder from '@/models/WorkOrder';\r\nimport { DateTime } from 'luxon';\r\nimport { fetchWrap, offlineResponse } from '../_helpers';\r\nimport pdf from './pdf';\r\n\r\nfunction getContactEmailAddresses(contact) {\r\n\treturn contact.emailAddresses.map(x => ({\r\n\t\tname: contact.fullName + (contact.emailAddresses.length > 1 ? ` (${x.label})` : ''),\r\n\t\temail: x.value\r\n\t}));\r\n}\r\n\r\nexport default {\r\n\t/**\r\n\t *\r\n\t * @param {WorkOrder} estimate\r\n\t * @returns\r\n\t */\r\n\tbuildEstimateEmail(estimate) {\r\n\t\tconst billing = estimate.customer.billingContact;\r\n\r\n\t\tconst email = {\r\n\t\t\ttos: getContactEmailAddresses(billing),\r\n\t\t\t// subject: 'Estimate #' + estimate.number + ' from ' + settings.companyName,\r\n\t\t\tmessage: '',\r\n\t\t\tattachments: [{ url: pdf.getEstimatePdfUrl(estimate.id), text: `Estimate-${estimate.number}.pdf` }]\r\n\t\t};\r\n\r\n\t\temail.message =\r\n\t\t\t`To: ${estimate.customer.name}\r\nAttn: ${billing.prefix} ${billing.firstName} ${billing.middleInitial} ${billing.lastName} ${billing.suffix}\r\n\r\nPlease find billing estimate #${estimate.number} attached.\r\nPlease contact us with any questions.`.replaceAll(/[ \\t]+/g, ' ').replaceAll(' \\n', '\\n');\r\n\r\n\t\treturn email;\r\n\t},\r\n\t/**\r\n\t *\r\n\t * @param {WorkOrder} invoice\r\n\t * @returns\r\n\t */\r\n\tbuildInvoiceEmail(invoice) {\r\n\t\tconst billing = invoice.customer.billingContact;\r\n\r\n\t\tconst email = {\r\n\t\t\ttos: getContactEmailAddresses(billing),\r\n\t\t\t// subject: 'Invoice #' + invoice.number + ' from ' + settings.companyName,\r\n\t\t\tmessage: '',\r\n\t\t\tattachments: [{ url: pdf.getInvoicePdfUrl(invoice.id), text: `Invoice-${invoice.number}.pdf` }]\r\n\t\t};\r\n\r\n\t\temail.message =\r\n\t\t\t`To: ${invoice.customer.name}\r\nAttn: ${billing.prefix} ${billing.firstName} ${billing.middleInitial} ${billing.lastName} ${billing.suffix}\r\n\r\nPlease find billing invoice #${invoice.number} from ${invoice.workStartTime.toLocaleString()} attached.\r\nPlease contact us with any questions.`.replaceAll(/[ \\t]+/g, ' ').replaceAll(' \\n', '\\n');\r\n\r\n\t\treturn email;\r\n\t},\r\n\t/**\r\n\t *\r\n\t * @param {Customer} customer\r\n\t * @param {DateTime} startDate\r\n\t * @param {DateTime} endDate\r\n\t * @returns\r\n\t */\r\n\tbuildStatementEmail(customer, startDate, endDate) {\r\n\t\tconst billing = customer.billingContact;\r\n\t\tconst email = {\r\n\t\t\ttos: getContactEmailAddresses(billing),\r\n\t\t\t// subject: `Billing statement from ${settings.companyName} for ${startDate.toLocaleString()} - ${endDate.toLocaleString()}`,\r\n\t\t\tmessage: '',\r\n\t\t\tattachments: [{\r\n\t\t\t\turl: pdf.getStatementPdfUrl(customer.id, startDate, endDate),\r\n\t\t\t\ttext: `Statement for ${startDate.toLocaleString({ month: 'short', day: 'numeric', year: 'numeric' })} - ${endDate.toLocaleString({ month: 'short', day: 'numeric', year: 'numeric' })}.pdf`\r\n\t\t\t}]\r\n\t\t};\r\n\r\n\t\temail.message =\r\n\t\t\t`To: ${customer.name}\r\nAttn: ${billing.prefix} ${billing.firstName} ${billing.middleInitial} ${billing.lastName} ${billing.suffix}\r\n\r\nPlease find your billing statement for ${startDate.toLocaleString({ month: 'long', day: 'numeric', year: 'numeric' })} through ${endDate.toLocaleString({ month: 'long', day: 'numeric', year: 'numeric' })} attached.\r\nPlease contact us with any questions.`.replaceAll(/[ \\t]+/g, ' ').replaceAll(' \\n', '\\n');\r\n\r\n\t\treturn email;\r\n\t},\r\n\t/**\r\n\t * Create a customer estimate PDF to the customer's billing email address.\r\n\t * @param {Number} id Work order ID\r\n\t * @param {string} message The email message\r\n\t * @returns (async) Returns the Response.\r\n\t */\r\n\tasync sendEstimate(tos, id, message) {\r\n\t\tconst model = { tos, id, message };\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Email/Estimate', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\treturn response;\r\n\t},\r\n\t/**\r\n\t * Create a customer invoice PDF to the customer's billing email address.\r\n\t * @param {Number} id Work order ID\r\n\t * @param {string} message The email message\r\n\t * @returns (async) Returns the Response.\r\n\t */\r\n\tasync sendInvoice(tos, id, message) {\r\n\t\tconst model = { tos, id, message };\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Email/Invoice', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\treturn response;\r\n\t},\r\n\t/**\r\n\t * Create a new customer statement PDF with the specified parameters and send it to the customer's billing email address.\r\n\t * @param {Number} customerId Customer ID\r\n\t * @param {DateTime} startDate Statement start date\r\n\t * @param {DateTime} endDate Statement end date\r\n\t * @param {string} message The email message\r\n\t * @returns (async) Returns the Response.\r\n\t */\r\n\tasync sendStatement(tos, customerId, startDate, endDate, message) {\r\n\t\tconst model = { tos, customerId, startDate, endDate, message };\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Email/Statement', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\treturn response;\r\n\t},\r\n\t/**\r\n\t * Create a email preview for estimate\r\n\t * @param {string} message The email message\r\n\t * @param {number} id work order id\r\n\t */\r\n\tasync previewEstimate(id, message) {\r\n\t\tconst model = { id, message };\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Email/Estimate/Preview', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn response.json();\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Create a email preview for invoice\r\n\t * @param {string} message The email message\r\n\t * @param {number} id work order id\r\n\t */\r\n\tasync previewInvoice(id, message) {\r\n\t\tconst model = { id, message };\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Email/Invoice/Preview', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn response.json();\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Create a email preview for statement\r\n\t * @param {string} message The email message\r\n\t * @param {number} customerId customer id\r\n\t * @param {DateTime} startDate start date\r\n\t * @param {DateTime} endDate end date\r\n\t */\r\n\tasync previewStatement(customerId, startDate, endDate, message) {\r\n\t\tconst model = { customerId, startDate, endDate, message };\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Email/Statement/Preview', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn response.json();\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t}\r\n};\r\n","import { getDateTimeFromDto as getDate, getValueFromDto as getValue } from './_helpers.js';\r\n\r\nexport default class EmailEvent {\r\n\tconstructor(dto) {\r\n\t\t// this.emailId = getValue(dto, 'emailId', 'number', 0);\r\n\t\tthis.timestamp = getDate(dto, 'timestamp', null);\r\n\t\tthis.emailAddress = getValue(dto, 'emailAddress', 'string', '');\r\n\t\tthis.eventType = getValue(dto, 'eventType', 'string', '');\r\n\t\tthis.attempt = getValue(dto, 'attempt', 'number', 0);\r\n\t\tthis.reason = getValue(dto, 'reason', 'string', '');\r\n\t\tthis.bounceType = getValue(dto, 'bounceType', 'string', '');\r\n\t\tthis.bounceClassification = getValue(dto, 'bounceClassification', 'string', '');\r\n\t\tthis.icon = '';\r\n\t\tthis.description = '';\r\n\t\tif (this.eventType === 'processed') {\r\n\t\t\tthis.icon = 'status-wait';\r\n\t\t\tthis.description = 'Processed';\r\n\t\t} else if (this.eventType === 'delivered') {\r\n\t\t\tthis.icon = 'status-success';\r\n\t\t\tthis.description = 'Delivered successfully';\r\n\t\t} else if (this.eventType === 'open') {\r\n\t\t\tthis.icon = 'status-success';\r\n\t\t\tthis.description = 'Delivered and opened';\r\n\t\t} else if (this.eventType === 'deferred') {\r\n\t\t\tthis.icon = 'status-warn';\r\n\t\t\tthis.description = `Attempt ${this.attempt} was unsuccessful. Re-attempting.`;\r\n\t\t\tif (this.reason) {\r\n\t\t\t\tthis.description += ` Reason: ${this.reason}`\r\n\t\t\t}\r\n\t\t} else if (this.eventType === 'bounce') {\r\n\t\t\tthis.icon = 'status-error';\r\n\t\t\tthis.description = bounceClassifications[this.bounceClassification] ?? 'Bounced: ' + this.bounceClassification;\r\n\t\t\tif (this.reason) {\r\n\t\t\t\tthis.description += ` Reason: ${this.reason}`\r\n\t\t\t}\r\n\t\t} else if (this.eventType === 'dropped') {\r\n\t\t\tthis.icon = 'status-error';\r\n\t\t\tthis.description = bounceClassifications[this.bounceClassification] ?? 'Dropped: ' + this.bounceClassification;\r\n\t\t\tif (this.reason) {\r\n\t\t\t\tthis.description += ` Reason: ${this.reason}`\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tget isSuppressed() {\r\n\t\treturn this.eventType === 'bounce' || this.eventType === 'dropped';\r\n\t}\r\n}\r\n\r\nconst bounceClassifications = {\r\n\t'Invalid Address': 'Invalid address, not delivered',\r\n\t'Technical Failure': 'Technical failure, not delivered',\r\n\t'Content': 'Content issue, not delivered',\r\n\t'Reputation': 'Not delivered due to bad email reputation',\r\n\t'Frequency or Volume Too High': 'Not delivered due to high email frequency or volume',\r\n\t'Mailbox Unavailable': 'Not delivered due to an unavailable mailbox',\r\n\t'Unclassified': 'Not delivered due to unknown issue',\r\n}\r\n","import { toDictionary } from '@/helpers/helpers.js';\r\nimport EmailEvent from './EmailEvent.js';\r\nimport { getArrayOfObjectsFromDto, getDateTimeFromDto as getDate, getValueFromDto as getValue } from './_helpers.js';\r\n\r\nfunction parseAddressLineToAddresses(addressLine, eventLookup) {\r\n\tif (!addressLine) { return []; };\r\n\treturn addressLine.split(';').map(x => {\r\n\t\tconst split = x.indexOf('<');\r\n\t\tconst end = x.indexOf('>');\r\n\t\tconst y = { name: '', email: '', event: null };\r\n\t\tif (split >= 0 && end > split) {\r\n\t\t\ty.name = x.substring(0, split).trim();\r\n\t\t\ty.email = x.substring(split + 1, end).trim();\r\n\t\t} else {\r\n\t\t\ty.email = x;\r\n\t\t}\r\n\t\ty.event = eventLookup[y.email.toLowerCase()] ?? null;\r\n\t\treturn y;\r\n\t});\r\n}\r\n\r\nexport default class Email {\r\n\tconstructor(dto) {\r\n\t\tthis.id = getValue(dto, 'id', 'number', 0);\r\n\t\tthis.timeQueued = getDate(dto, 'timeQueued', null);\r\n\t\tthis.timeSent = getDate(dto, 'timeSent', null);\r\n\t\tthis.status = getValue(dto, 'status', 'number', 0);\r\n\t\tthis.fromLine = getValue(dto, 'fromLine', 'string', '');\r\n\t\tthis.replyToLine = getValue(dto, 'replyToLine', 'string', '');\r\n\t\tthis.toLine = getValue(dto, 'toLine', 'string', '');\r\n\t\tthis.ccLine = getValue(dto, 'ccLine', 'string', '');\r\n\t\tthis.bccLine = getValue(dto, 'bccLine', 'string', '');\r\n\t\tthis.subject = getValue(dto, 'subject', 'string', '');\r\n\t\tthis.events = getArrayOfObjectsFromDto(dto, 'events', EmailEvent);\r\n\t\tconst eventLookup = toDictionary(this.events, x => x.emailAddress);\r\n\t\tthis.tos = parseAddressLineToAddresses(this.toLine, eventLookup);\r\n\t\tthis.ccs = parseAddressLineToAddresses(this.ccLine, eventLookup);\r\n\t\tthis.bccs = parseAddressLineToAddresses(this.bccLine, eventLookup);\r\n\t}\r\n}\r\n","import { url as urlHelper } from '@/helpers/helpers';\r\nimport Email from '@/models/Email';\r\nimport PaginatedList from '@/models/PaginatedList';\r\nimport { fetchWrap, isAborted, offlineResponse, setPagination } from '../_helpers';\r\n\r\nexport default {\r\n\t/**\r\n\t * Get paginated emails\r\n\t * @param {Object} params request parameters.\r\n\t * @returns (async) Returns a PaginatedList of Email objects if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getPaginated({ customerId = undefined, workOrderId = undefined, limit = undefined, start = undefined } = {}, abortSignal) {\r\n\t\tconst path = workOrderId > 0 ? '/api/Emails/WorkOrder/' + workOrderId : (customerId > 0 ? '/api/Emails/CustomerStatements/' + customerId : '/api/Emails');\r\n\t\tconst url = urlHelper(path, setPagination(limit, start));\r\n\t\tlet response, data;\r\n\t\ttry {\r\n\t\t\tconst init = {};\r\n\t\t\tif (abortSignal instanceof AbortSignal) {\r\n\t\t\t\tinit.signal = abortSignal;\r\n\t\t\t}\r\n\t\t\tresponse = await fetchWrap(url, init);\r\n\t\t\tif (response.ok) { data = await response.json(); }\r\n\t\t} catch (e) {\r\n\t\t\tif (isAborted(e)) {\r\n\t\t\t\tthrow e;\r\n\t\t\t} else {\r\n\t\t\t\tresponse = offlineResponse();\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new PaginatedList(data, x => new Email(x));\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Unsuppress an email address that has bounced or been blocked.\r\n\t * @param {string} address The email address\r\n\t * @returns (async) Returns the Response.\r\n\t */\r\n\tasync unsuppressAddress(address) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap(urlHelper('/api/Emails/UnsuppressAddress', { address }), { method: 'POST' });\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\treturn response;\r\n\t},\r\n};\r\n","import { url as urlHelper } from '@/helpers/helpers';\r\nimport { getIdb, idbHelpers } from '@/idb';\r\nimport Inventory from '@/models/Inventory';\r\nimport PaginatedList from '@/models/PaginatedList';\r\nimport { DateTime } from 'luxon';\r\nimport { fetchAllPages, fetchWrap, idbResponse, isIdbResponse, offlineResponse, setPagination } from '../_helpers';\r\nimport cache from './cache';\r\n\r\nconst idbStore = 'inventory';\r\n\r\nexport default {\r\n\t/**\r\n\t * Get all inventory\r\n\t * @returns (async) Returns an array of Inventory objects if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getAll() {\r\n\t\tconst idb = await getIdb();\r\n\t\tlet response, data = [], timestamp;\r\n\t\tlet useIdb = await cache.isCacheHit(idbStore);\r\n\t\tif (!useIdb) {\r\n\t\t\ttry {\r\n\t\t\t\ttimestamp = DateTime.now();\r\n\t\t\t\tresponse = await fetchAllPages('/api/Inventory', x => data.push(x));\r\n\t\t\t} catch {\r\n\t\t\t\tuseIdb = true;\r\n\t\t\t\tresponse = offlineResponse();\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (useIdb && idb) {\r\n\t\t\tdata = await idb.getAll(idbStore);\r\n\t\t\tresponse = idbResponse(200);\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tif (idb && !isIdbResponse(response)) {\r\n\t\t\t\tawait idbHelpers.replaceAll(idb, idbStore, data);\r\n\t\t\t\tawait cache.setTimestamp(idbStore, timestamp);\r\n\t\t\t}\r\n\t\t\treturn data.map(x => new Inventory(x));\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\tlowStockFilter(x) {\r\n\t\treturn x.lowStockWarning > 0 && (x.quantityOnHand - x.quantityReserved) <= x.lowStockWarning;\r\n\t},\r\n\tlowStockSort(a, b) {\r\n\t\treturn (a.quantityOnHand - a.quantityReserved) - (b.quantityOnHand - b.quantityReserved);\r\n\t},\r\n\t/**\r\n\t * Get one page of inventory with low stock.\r\n\t * @param {Object} params request parameters.\r\n\t * @returns (async) Returns a PaginatedList of Inventory objects if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getLowStock({ limit = undefined, start = undefined } = {}) {\r\n\t\tconst query = setPagination(limit, start);\r\n\t\tlet response, data = null;\r\n\t\tlet useIdb = await cache.isCacheHit(idbStore);\r\n\t\tif (!useIdb && await cache.canCache()) {\r\n\t\t\t// cache all for future re-use\r\n\t\t\tconst filteredData = (await this.getAll()).filter(this.lowStockFilter);\r\n\t\t\tdata = {\r\n\t\t\t\tstart: query.start,\r\n\t\t\t\tlimit: query.limit,\r\n\t\t\t\ttotalCount: filteredData.length,\r\n\t\t\t\tdata: filteredData,\r\n\t\t\t};\r\n\t\t\tuseIdb = true;\r\n\t\t}\r\n\t\tif (!useIdb) {\r\n\t\t\tconst url = urlHelper('/api/Inventory/LowStock', query);\r\n\t\t\ttry {\r\n\t\t\t\tresponse = await fetchWrap(url);\r\n\t\t\t\tif (response.ok) { data = await response.json(); }\r\n\t\t\t} catch {\r\n\t\t\t\tuseIdb = true;\r\n\t\t\t\tresponse = offlineResponse();\r\n\t\t\t}\r\n\t\t}\r\n\t\tconst idb = await getIdb();\r\n\t\tif (useIdb && idb) {\r\n\t\t\tif (!data) {\r\n\t\t\t\tconst filteredData = await idbHelpers.getFiltered(idb, idbStore, this.lowStockFilter);\r\n\t\t\t\tdata = {\r\n\t\t\t\t\tstart: query.start,\r\n\t\t\t\t\tlimit: query.limit,\r\n\t\t\t\t\ttotalCount: filteredData.length,\r\n\t\t\t\t\tdata: filteredData,\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t\tdata.data = data.data.sort(this.lowStockSort).slice(query.start, query.start + query.limit);\r\n\t\t\tresponse = idbResponse(200);\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new PaginatedList(data, x => new Inventory(x));\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get a inventory\r\n\t * @param {Number} id Inventory ID\r\n\t * @returns (async) Returns a Inventory if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getById(id) {\r\n\t\tlet response, data = null;\r\n\t\tlet useIdb = await cache.isCacheHit(idbStore);\r\n\t\tif (!useIdb && await cache.canCache()) {\r\n\t\t\t// cache all for future re-use\r\n\t\t\tif ((data = (await this.getAll()).find(x => x.id === id) ?? null)) {\r\n\t\t\t\treturn data;\r\n\t\t\t} else {\r\n\t\t\t\tthrow idbResponse(404);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!useIdb) {\r\n\t\t\ttry {\r\n\t\t\t\tresponse = await fetchWrap('/api/Inventory/' + id);\r\n\t\t\t\tif (response.ok) { data = await response.json(); }\r\n\t\t\t} catch {\r\n\t\t\t\tuseIdb = true;\r\n\t\t\t\tresponse = offlineResponse();\r\n\t\t\t}\r\n\t\t}\r\n\t\tconst idb = await getIdb();\r\n\t\tif (useIdb && idb) {\r\n\t\t\tdata = await idb.get(idbStore, id);\r\n\t\t\tresponse = data ? idbResponse(200) : idbResponse(404);\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tif (idb && !isIdbResponse(response)) {\r\n\t\t\t\tawait idb.put(idbStore, data);\r\n\t\t\t}\r\n\t\t\treturn new Inventory(data);\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Create a inventory\r\n\t * @param {Inventory} model inventory to create.\r\n\t * @returns (async) Returns the new Inventory if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync create(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Inventory', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tawait cache.clearTimestamp(idbStore);\r\n\t\t\treturn new Inventory(await response.json());\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Update a inventory\r\n\t * @param {Inventory} model inventory to update.\r\n\t * @returns (async) Returns the updated Inventory if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync update(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Inventory/' + model.id, {\r\n\t\t\t\tmethod: 'PUT',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tawait cache.clearTimestamp(idbStore);\r\n\t\t\treturn new Inventory(model);\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Delete a inventory\r\n\t * @param {Number} id Inventory ID to delete.\r\n\t * @returns (async) Returns true if the request was successful (or not found), false if the inventory could not be deleted, otherwise a Response.\r\n\t */\r\n\tasync deleteById(id) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Inventory/' + id, { method: 'DELETE' });\r\n\t\t} catch {\r\n\t\t\treturn offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tawait cache.clearTimestamp(idbStore);\r\n\t\t\treturn true;\r\n\t\t} else if (response.status === 404) {\r\n\t\t\treturn true;\r\n\t\t} else if (response.status === 409) {\r\n\t\t\treturn false;\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t}\r\n};\r\n","import { fetchWrap, offlineResponse } from '../_helpers';\r\n\r\nexport default {\r\n\t/**\r\n\t * Start re-indexing customers for search for all companies. Happens in the background with Hangfire.\r\n\t */\r\n\tasync reIndexCustomerSearchAll() {\r\n\t\ttry {\r\n\t\t\treturn await fetchWrap('/api/Maintenance/ReIndexCustomerSearch', { method: 'POST' });\r\n\t\t} catch {\r\n\t\t\treturn offlineResponse();\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Start re-indexing customers for search for a specific company. Happens in the background with Hangfire.\r\n\t * @param {number} companyId company to target\r\n\t */\r\n\tasync reIndexCustomerSearch(companyId) {\r\n\t\ttry {\r\n\t\t\treturn await fetchWrap('/api/Maintenance/ReIndexCustomerSearch/' + companyId, { method: 'POST' });\r\n\t\t} catch {\r\n\t\t\treturn offlineResponse();\r\n\t\t}\r\n\t},\r\n};\r\n","import { getIdb, idbHelpers } from '@/idb';\r\nimport { fetchWrap, idbResponse, offlineResponse } from '../_helpers';\r\nimport files from './files';\r\n\r\nexport default {\r\n\t/**\r\n\t * Update IDB work orders, customers, and waste disposals\r\n\t */\r\n\tasync download() {\r\n\t\tconst idb = await getIdb();\r\n\t\tif (!idb) return idbResponse(500);\r\n\t\tlet response, data;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/sync-download');\r\n\t\t\tif (response.ok) { data = await response.json(); }\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tawait idbHelpers.replaceAll(idb, 'workOrders', data.workOrders);\r\n\t\t\tawait idbHelpers.replaceAll(idb, 'customers', data.customers);\r\n\t\t\tawait idbHelpers.replaceAll(idb, 'wasteDisposals', data.wasteDisposals);\r\n\t\t\t// data.vehicleIds\r\n\t\t\tconst fileMap = {};\r\n\t\t\tdata.workOrders.forEach(x => x.attachments.forEach(y => fileMap[y.id] = y));\r\n\t\t\tdata.customers.forEach(x => x.locations.forEach(y => y.attachments.forEach(z => fileMap[z.id] = z)));\r\n\t\t\tfiles.storeInIdb(Object.values(fileMap), true);\r\n\t\t}\r\n\t\treturn response;\r\n\t},\r\n};\r\n","import { addCompanyIdToUrl, fetchWrap, offlineResponse } from '../_helpers';\r\n\r\nexport default {\r\n\tgetWasteDisposalsUrl() { return addCompanyIdToUrl('/api/Reports/WasteDisposals').toString(); },\r\n\tgetWasteDisposalsByLandSiteUrl() { return addCompanyIdToUrl('/api/Reports/WasteDisposalsByLandSite').toString() },\r\n\tgetWasteCollectionsDisposalsUrl() { return addCompanyIdToUrl('/api/Reports/WasteCollectionsDisposals').toString(); },\r\n\tgetWasteCollectionsUrl() { return addCompanyIdToUrl('/api/Reports/WasteCollections').toString(); },\r\n\tgetVehicleMaintenanceHistoryUrl() { return addCompanyIdToUrl('/api/Reports/VehicleMaintenanceHistory').toString(); },\r\n\tgetPaymentsUrl() { return addCompanyIdToUrl('/api/Reports/Payments').toString(); },\r\n\tgetInvoiceItemReportUrl() { return addCompanyIdToUrl('/api/Reports/InvoiceItemReport').toString(); },\r\n\tgetTimesheetReportUrl() { return addCompanyIdToUrl('/api/Reports/TimesheetReport').toString(); },\r\n\tgetTimesheetByUserReportUrl() { return addCompanyIdToUrl('/api/Reports/TimesheetByUserReport').toString(); },\r\n\tasync getCustomerCountiesByState() {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Reports/CustomerCountiesByState');\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn await response.json();\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n};\r\n","import { getValueFromDto as getValue, getArrayFromDto as getArray } from './_helpers.js';\r\n\r\nexport default class Role {\r\n\tconstructor(dto) {\r\n\t\tthis.id = getValue(dto, 'id', 'number', 0);\r\n\t\tthis.name = getValue(dto, 'name', 'string', '');\r\n\t\tthis.description = getValue(dto, 'description', 'string', '');\r\n\t\tthis.permissionsInRole = getArray(dto, 'permissionsInRole', []);\r\n\t}\r\n}\r\n","import { makeComparator } from '@/helpers/helpers';\r\nimport { getIdb, idbHelpers } from '@/idb';\r\nimport Role from '@/models/Role';\r\nimport { DateTime } from 'luxon';\r\nimport { fetchWrap, idbResponse, isIdbResponse, offlineResponse } from '../_helpers';\r\nimport cache from './cache';\r\n\r\nconst idbStore = 'roles';\r\n\r\nexport default {\r\n\t/**\r\n\t * Get all roles\r\n\t * @returns (async) Returns an array of Role objects if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getAll() {\r\n\t\tconst idb = await getIdb();\r\n\t\tlet response, data = [], timestamp;\r\n\t\tlet useIdb = await cache.isCacheHit(idbStore);\r\n\t\tif (!useIdb) {\r\n\t\t\ttry {\r\n\t\t\t\ttimestamp = DateTime.now();\r\n\t\t\t\tresponse = await fetchWrap('/api/Roles');\r\n\t\t\t\tif (response.ok) { data = await response.json(); }\r\n\t\t\t} catch {\r\n\t\t\t\tuseIdb = true;\r\n\t\t\t\tresponse = offlineResponse();\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (useIdb && idb) {\r\n\t\t\tdata = await idb.getAll(idbStore);\r\n\t\t\tresponse = idbResponse(200);\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tif (idb && !isIdbResponse(response)) {\r\n\t\t\t\tawait idbHelpers.replaceAll(idb, idbStore, data);\r\n\t\t\t\tawait cache.setTimestamp(idbStore, timestamp);\r\n\t\t\t}\r\n\t\t\tdata.sort(makeComparator('id'));\r\n\t\t\treturn data.map(x => new Role(x));\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get a role\r\n\t * @param {Number} id Role ID\r\n\t * @returns (async) Returns a Role if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getById(id) {\r\n\t\tconst idb = await getIdb();\r\n\t\tlet response, data = null;\r\n\t\tlet useIdb = await cache.isCacheHit(idbStore);\r\n\t\tif (!useIdb && await cache.canCache()) {\r\n\t\t\t// cache all for future re-use\r\n\t\t\tif ((data = (await this.getAll()).find(x => x.id === id) ?? null)) {\r\n\t\t\t\treturn data;\r\n\t\t\t} else {\r\n\t\t\t\tthrow idbResponse(404);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!useIdb) {\r\n\t\t\ttry {\r\n\t\t\t\tresponse = await fetchWrap('/api/Roles/' + id);\r\n\t\t\t\tif (response.ok) { data = await response.json(); }\r\n\t\t\t} catch {\r\n\t\t\t\tuseIdb = true;\r\n\t\t\t\tresponse = offlineResponse();\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (useIdb && idb) {\r\n\t\t\tdata = await idb.get(idbStore, id);\r\n\t\t\tresponse = data ? idbResponse(200) : idbResponse(404);\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tif (idb && !isIdbResponse(response)) {\r\n\t\t\t\tawait idb.put(idbStore, data);\r\n\t\t\t}\r\n\t\t\treturn new Role(data);\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Create a role\r\n\t * @param {Role} model role to create.\r\n\t * @returns (async) Returns the new Role if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync create(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Roles', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tawait cache.clearTimestamp(idbStore);\r\n\t\t\treturn new Role(await response.json());\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Update a role\r\n\t * @param {Role} model role to update.\r\n\t * @returns (async) Returns the updated Role if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync update(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Roles/' + model.id, {\r\n\t\t\t\tmethod: 'PUT',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tawait cache.clearTimestamp(idbStore);\r\n\t\t\tconst data = JSON.parse(JSON.stringify(model));\r\n\t\t\treturn new Role(data);\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Delete a role\r\n\t * @param {Number} id Role ID to delete.\r\n\t * @returns (async) Returns true if the request was successful (or not found), false if the role could not be deleted, otherwise a Response.\r\n\t */\r\n\tasync deleteById(id) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Roles/' + id, { method: 'DELETE' });\r\n\t\t} catch {\r\n\t\t\treturn offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tawait cache.clearTimestamp(idbStore);\r\n\t\t\treturn true;\r\n\t\t} else if (response.status === 404) {\r\n\t\t\treturn true;\r\n\t\t} else if (response.status === 409) {\r\n\t\t\treturn false;\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t}\r\n};\r\n","import { getValueFromDto as getValue } from './_helpers.js';\r\n\r\nexport default class Service {\r\n\tconstructor(dto) {\r\n\t\tthis.id = getValue(dto, 'id', 'number', 0);\r\n\t\tthis.name = getValue(dto, 'name', 'string', '');\r\n\t\tthis.description = getValue(dto, 'description', 'string', '');\r\n\t\tthis.price = getValue(dto, 'price', 'number', 0);\r\n\t\t// this.taxable = getValue(dto, 'taxable', 'boolean', false);\r\n\t\tthis.wasteTypeId = getValue(dto, 'wasteTypeId', 'number', null);\r\n\t\tObject.defineProperty(this, 'wasteType', { enumerable: false, value: null, writable: true });\r\n\t\tthis.requireInspection = getValue(dto, 'requireInspection', 'boolean', false);\r\n\t\tthis.active = getValue(dto, 'active', 'boolean', true);\r\n\t}\r\n}\r\n","import { makeComparator } from '@/helpers/helpers';\r\nimport { getIdb, idbHelpers } from '@/idb';\r\nimport Service from '@/models/Service';\r\nimport { DateTime } from 'luxon';\r\nimport { fetchAllPages, fetchWrap, idbResponse, isIdbResponse, offlineResponse } from '../_helpers';\r\nimport cache from './cache';\r\n\r\nconst idbStore = 'services';\r\n\r\nexport default {\r\n\t/**\r\n\t * Get all services\r\n\t * @returns (async) Returns an array of Service objects if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getAll() {\r\n\t\tconst idb = await getIdb();\r\n\t\tlet response, data = [], timestamp;\r\n\t\tlet useIdb = await cache.isCacheHit(idbStore);\r\n\t\tif (!useIdb) {\r\n\t\t\ttry {\r\n\t\t\t\ttimestamp = DateTime.now();\r\n\t\t\t\tresponse = await fetchAllPages('/api/Services', x => data.push(x), {}, 1000);\r\n\t\t\t} catch {\r\n\t\t\t\tuseIdb = true;\r\n\t\t\t\tresponse = offlineResponse();\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (useIdb && idb) {\r\n\t\t\tdata = await idb.getAll(idbStore);\r\n\t\t\tresponse = idbResponse(200);\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tif (idb && !isIdbResponse(response)) {\r\n\t\t\t\tawait idbHelpers.replaceAll(idb, idbStore, data);\r\n\t\t\t\tawait cache.setTimestamp(idbStore, timestamp);\r\n\t\t\t}\r\n\t\t\tdata.sort(makeComparator('name'));\r\n\t\t\treturn data.map(x => new Service(x));\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get a service\r\n\t * @param {Number} id Service ID\r\n\t * @returns (async) Returns a Service if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getById(id) {\r\n\t\tconst idb = await getIdb();\r\n\t\tlet response, data = null;\r\n\t\tlet useIdb = await cache.isCacheHit(idbStore);\r\n\t\tif (!useIdb && await cache.canCache()) {\r\n\t\t\t// cache all for future re-use\r\n\t\t\tif ((data = (await this.getAll()).find(x => x.id === id) ?? null)) {\r\n\t\t\t\treturn data;\r\n\t\t\t} else {\r\n\t\t\t\tthrow idbResponse(404);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!useIdb) {\r\n\t\t\ttry {\r\n\t\t\t\tresponse = await fetchWrap('/api/Services/' + id);\r\n\t\t\t\tif (response.ok) { data = await response.json(); }\r\n\t\t\t} catch {\r\n\t\t\t\tuseIdb = true;\r\n\t\t\t\tresponse = offlineResponse();\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (useIdb && idb) {\r\n\t\t\tdata = await idb.get(idbStore, id);\r\n\t\t\tresponse = data ? idbResponse(200) : idbResponse(404);\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tif (idb && !isIdbResponse(response)) {\r\n\t\t\t\tawait idb.put(idbStore, data);\r\n\t\t\t}\r\n\t\t\treturn new Service(data);\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Create a service\r\n\t * @param {Service} model service to create.\r\n\t * @returns (async) Returns the new Service if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync create(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Services', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tawait cache.clearTimestamp(idbStore);\r\n\t\t\treturn new Service(await response.json());\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Update a service\r\n\t * @param {Service} model service to update.\r\n\t * @returns (async) Returns the updated Service if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync update(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Services/' + model.id, {\r\n\t\t\t\tmethod: 'PUT',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tawait cache.clearTimestamp(idbStore);\r\n\t\t\treturn new Service(model);\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Delete a service\r\n\t * @param {Number} id Service ID to delete.\r\n\t * @returns (async) Returns true if the request was successful (or not found), false if the service could not be deleted, otherwise a Response.\r\n\t */\r\n\tasync deleteById(id) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Services/' + id, { method: 'DELETE' });\r\n\t\t} catch {\r\n\t\t\treturn offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tawait cache.clearTimestamp(idbStore);\r\n\t\t\treturn true;\r\n\t\t} else if (response.status === 404) {\r\n\t\t\treturn true;\r\n\t\t} else if (response.status === 409) {\r\n\t\t\treturn false;\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t}\r\n};\r\n","export default {\r\n\tgetAll() {\r\n\t\treturn [\r\n\t\t\t{ abbreviation: 'AK', name: 'Alaska' },\r\n\t\t\t{ abbreviation: 'AL', name: 'Alabama' },\r\n\t\t\t{ abbreviation: 'AR', name: 'Arkansas' },\r\n\t\t\t{ abbreviation: 'AZ', name: 'Arizona' },\r\n\t\t\t{ abbreviation: 'CA', name: 'California' },\r\n\t\t\t{ abbreviation: 'CO', name: 'Colorado' },\r\n\t\t\t{ abbreviation: 'CT', name: 'Connecticut' },\r\n\t\t\t{ abbreviation: 'DC', name: 'District of Columbia' },\r\n\t\t\t{ abbreviation: 'DE', name: 'Delaware' },\r\n\t\t\t{ abbreviation: 'FL', name: 'Florida' },\r\n\t\t\t{ abbreviation: 'GA', name: 'Georgia' },\r\n\t\t\t{ abbreviation: 'HI', name: 'Hawaii' },\r\n\t\t\t{ abbreviation: 'IA', name: 'Iowa' },\r\n\t\t\t{ abbreviation: 'ID', name: 'Idaho' },\r\n\t\t\t{ abbreviation: 'IL', name: 'Illinois' },\r\n\t\t\t{ abbreviation: 'IN', name: 'Indiana' },\r\n\t\t\t{ abbreviation: 'KS', name: 'Kansas' },\r\n\t\t\t{ abbreviation: 'KY', name: 'Kentucky' },\r\n\t\t\t{ abbreviation: 'LA', name: 'Louisiana' },\r\n\t\t\t{ abbreviation: 'MA', name: 'Massachusetts' },\r\n\t\t\t{ abbreviation: 'MD', name: 'Maryland' },\r\n\t\t\t{ abbreviation: 'ME', name: 'Maine' },\r\n\t\t\t{ abbreviation: 'MI', name: 'Michigan' },\r\n\t\t\t{ abbreviation: 'MN', name: 'Minnesota' },\r\n\t\t\t{ abbreviation: 'MO', name: 'Missouri' },\r\n\t\t\t{ abbreviation: 'MS', name: 'Mississippi' },\r\n\t\t\t{ abbreviation: 'MT', name: 'Montana' },\r\n\t\t\t{ abbreviation: 'NC', name: 'North Carolina' },\r\n\t\t\t{ abbreviation: 'ND', name: 'North Dakota' },\r\n\t\t\t{ abbreviation: 'NE', name: 'Nebraska' },\r\n\t\t\t{ abbreviation: 'NH', name: 'New Hampshire' },\r\n\t\t\t{ abbreviation: 'NJ', name: 'New Jersey' },\r\n\t\t\t{ abbreviation: 'NM', name: 'New Mexico' },\r\n\t\t\t{ abbreviation: 'NV', name: 'Nevada' },\r\n\t\t\t{ abbreviation: 'NY', name: 'New York' },\r\n\t\t\t{ abbreviation: 'OH', name: 'Ohio' },\r\n\t\t\t{ abbreviation: 'OK', name: 'Oklahoma' },\r\n\t\t\t{ abbreviation: 'OR', name: 'Oregon' },\r\n\t\t\t{ abbreviation: 'PA', name: 'Pennsylvania' },\r\n\t\t\t{ abbreviation: 'RI', name: 'Rhode Island' },\r\n\t\t\t{ abbreviation: 'SC', name: 'South Carolina' },\r\n\t\t\t{ abbreviation: 'SD', name: 'South Dakota' },\r\n\t\t\t{ abbreviation: 'TN', name: 'Tennessee' },\r\n\t\t\t{ abbreviation: 'TX', name: 'Texas' },\r\n\t\t\t{ abbreviation: 'UT', name: 'Utah' },\r\n\t\t\t{ abbreviation: 'VA', name: 'Virginia' },\r\n\t\t\t{ abbreviation: 'VT', name: 'Vermont' },\r\n\t\t\t{ abbreviation: 'WA', name: 'Washington' },\r\n\t\t\t{ abbreviation: 'WI', name: 'Wisconsin' },\r\n\t\t\t{ abbreviation: 'WV', name: 'West Virginia' },\r\n\t\t\t{ abbreviation: 'WY', name: 'Wyoming' },\r\n\t\t];\r\n\t},\r\n};\r\n","export default {\r\n\tnever: 0,\r\n\tmonth: 1,\r\n\r\n\tget options() {\r\n\t\treturn [\r\n\t\t\t{ id: this.never, name: 'Never' },\r\n\t\t\t{ id: this.month, name: 'Month' },\r\n\t\t]\r\n\t},\r\n}\r\n","import AppModule from './AppModule.js';\r\nimport { getValueFromDto as getValue } from './_helpers.js';\r\n\r\nexport default class SubscriptionModule {\r\n\tconstructor(dto) {\r\n\t\tthis.module = getValue(dto, 'module', 'number', AppModule.none);\r\n\t\tthis.price = getValue(dto, 'price', 'number', 0);\r\n\t}\r\n}\r\n","import { getValueFromDto as getValue } from './_helpers.js';\r\n\r\nexport default class SubscriptionUserTier {\r\n\tconstructor(dto) {\r\n\t\tthis.minUsers = getValue(dto, 'minUsers', 'number', 0);\r\n\t\tthis.maxUsers = getValue(dto, 'maxUsers', 'number', 0);\r\n\t\tthis.pricePerUser = getValue(dto, 'pricePerUser', 'number', 0);\r\n\t}\r\n}\r\n","import SubscriptionBillingFrequency from './SubscriptionBillingFrequency.js';\r\nimport SubscriptionModule from './SubscriptionModule.js';\r\nimport SubscriptionUserTier from './SubscriptionUserTier.js';\r\nimport { getArrayOfObjectsFromDto as getArray, getValueFromDto as getValue } from './_helpers.js';\r\n\r\nexport default class Subscription {\r\n\tconstructor(dto) {\r\n\t\tthis.id = getValue(dto, 'id', 'number', 0);\r\n\t\tthis.name = getValue(dto, 'name', 'string', '');\r\n\t\tthis.active = getValue(dto, 'active', 'boolean', true);\r\n\t\tthis.billingFrequency = getValue(dto, 'billingFrequency', 'number', SubscriptionBillingFrequency.month);\r\n\t\tthis.userTiers = getArray(dto, 'userTiers', SubscriptionUserTier);\r\n\t\tthis.modules = getArray(dto, 'modules', SubscriptionModule);\r\n\t\tthis.minBilledUsers = getValue(dto, 'minBilledUsers', 'number', 0);\r\n\t}\r\n}\r\n","import { BILLING_TIME_ZONE } from '@/helpers/helpers.js';\r\nimport { DateTime } from 'luxon';\r\nimport Subscription from './Subscription.js';\r\nimport { getArrayFromDto as getArray, getDateTimeFromDto as getDateTime, getObjectFromDto as getObject, getValueFromDto as getValue } from './_helpers.js';\r\n\r\nexport default class SubscriptionDetails {\r\n\tconstructor(dto) {\r\n\t\tthis.startDate = getDateTime(dto, 'startDate', null);\r\n\t\tif (this.startDate instanceof DateTime && this.startDate.zoneName !== BILLING_TIME_ZONE) { this.startDate = this.startDate.setZone(BILLING_TIME_ZONE)}\r\n\t\tthis.endDate = getDateTime(dto, 'endDate', null);\r\n\t\tif (this.endDate instanceof DateTime && this.endDate.zoneName !== BILLING_TIME_ZONE) { this.endDate = this.endDate.setZone(BILLING_TIME_ZONE)}\r\n\t\tthis.activeUsers = getValue(dto, 'activeUsers', 'number', 0);\r\n\t\tthis.enabledModules = getArray(dto, 'enabledModules');\r\n\t\tthis.totalPrice = getValue(dto, 'totalPrice', 'number', 0);\r\n\t\tthis.explanation = getArray(dto, 'explanation');\r\n\t\tthis.subscription = getObject(dto, 'subscription', Subscription, null);\r\n\t}\r\n}\r\n","import { getValueFromDto as getValue } from './_helpers.js';\r\n\r\nexport default class SubscriptionDetailsReport {\r\n\tconstructor(dto) {\r\n\t\tthis.company = getValue(dto, 'company', 'string', '');\r\n\t\tthis.subscription = getValue(dto, 'subscription', 'string', '');\r\n\t\tthis.activeUsers = getValue(dto, 'activeUsers', 'number', 0);\r\n\t\tthis.totalPrice = getValue(dto, 'totalPrice', 'number', 0);\r\n\t\tthis.explanation = getValue(dto, 'explanation', 'string', '');\r\n\t}\r\n}\r\n","import { url as urlHelper } from '@/helpers/helpers';\r\nimport Subscription from '@/models/Subscription';\r\nimport SubscriptionDetails from '@/models/SubscriptionDetails';\r\nimport SubscriptionDetailsReport from '@/models/SubscriptionDetailsReport';\r\nimport { DateTime } from 'luxon';\r\nimport { fetchWrap, offlineResponse } from '../_helpers';\r\n\r\nexport default {\r\n\t/**\r\n\t * Get all subscriptions\r\n\t * @param {Object} params request parameters.\r\n\t * @param {Boolean} params.active if specified, only return either active or inactive subscriptions.\r\n\t * @returns {Promise} (async) Returns an array of Subscriptions if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getAll({ active = undefined } = {}) {\r\n\t\tconst query = {};\r\n\t\tif (typeof active === 'boolean') {\r\n\t\t\tquery.active = active;\r\n\t\t}\r\n\t\tconst url = urlHelper('/api/Subscriptions', query);\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap(url);\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn (await response.json()).map(x => new Subscription(x));\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get a subscription\r\n\t * @param {Number} id Subscription ID\r\n\t * @returns (async) Returns a Subscription if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getById(id) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Subscriptions/' + id);\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new Subscription(await response.json());\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get current company subscription\r\n\t * @returns (async) Returns a SubscriptionDetails if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getCurrent() {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Subscriptions/Current');\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new SubscriptionDetails(await response.json());\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get company subscription report for all active companies\r\n\t * @param {DateTime} month Report month. Must be the first day of the month.\r\n\t * @returns (async) Returns a SubscriptionDetailsReport if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getReport(month) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap(urlHelper('/api/Subscriptions/Report', { month: month.toISODate() }));\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn (await response.json()).map(x => new SubscriptionDetailsReport(x));\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Create a subscription\r\n\t * @param {Subscription} model subscription to create.\r\n\t * @returns (async) Returns the new Subscription if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync create(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Subscriptions', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new Subscription(await response.json());\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Update a subscription\r\n\t * @param {Subscription} model subscription to update.\r\n\t * @returns (async) Returns the updated Subscription if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync update(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Subscriptions/' + model.id, {\r\n\t\t\t\tmethod: 'PUT',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new Subscription(model);\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Delete a subscription\r\n\t * @param {Number} id Subscription ID to delete.\r\n\t * @returns (async) Returns true if the request was successful (or not found), false if the subscription could not be deleted, otherwise a Response.\r\n\t */\r\n\tasync deleteById(id) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Subscriptions/' + id, { method: 'DELETE' });\r\n\t\t} catch {\r\n\t\t\treturn offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok || response.status === 404) {\r\n\t\t\treturn true;\r\n\t\t} else if (response.status === 409) {\r\n\t\t\treturn false;\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t}\r\n};\r\n","export default class TimeZone {\r\n\tconstructor(dto) {\r\n\t\tthis.ianaZoneId = '';\r\n\t\tthis.displayName = '';\r\n\t\tthis.sortOrder = 0;\r\n\r\n\t\tif (typeof dto === 'object' && dto !== null) {\r\n\t\t\tif (typeof dto.ianaZoneId === 'string') {\r\n\t\t\t\tthis.ianaZoneId = dto.ianaZoneId;\r\n\t\t\t}\r\n\t\t\tif (typeof dto.displayName === 'string') {\r\n\t\t\t\tthis.displayName = dto.displayName;\r\n\t\t\t}\r\n\t\t\tif (typeof dto.sortOrder === 'number') {\r\n\t\t\t\tthis.sortOrder = dto.sortOrder;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n","import TimeZone from '@/models/TimeZone';\r\n\r\nexport default {\r\n\tgetAll() {\r\n\t\treturn [\r\n\t\t\tnew TimeZone({ ianaZoneId: 'America/New_York', displayName: 'Eastern Time (EST/EDT)', sortOrder: 1, }),\r\n\t\t\tnew TimeZone({ ianaZoneId: 'America/Chicago', displayName: 'Central Time (CST/CDT)', sortOrder: 2, }),\r\n\t\t\tnew TimeZone({ ianaZoneId: 'America/Denver', displayName: 'Mountain Time (MST/MDT)', sortOrder: 3, }),\r\n\t\t\tnew TimeZone({ ianaZoneId: 'America/Phoenix', displayName: 'Mountain Time (MST)', sortOrder: 4, }),\r\n\t\t\tnew TimeZone({ ianaZoneId: 'America/Los_Angeles', displayName: 'Pacific Time (PST/PDT)', sortOrder: 5, }),\r\n\t\t];\r\n\t},\r\n};\r\n","import { getValueFromDto as getValue, getDateTimeFromDto as getDate } from './_helpers.js';\r\n\r\nexport default class UserAbsence {\r\n\tconstructor(dto) {\r\n\t\tthis.id = getValue(dto, 'id', 'number', 0);\r\n\t\tthis.userId = getValue(dto, 'userId', 'number', null);\r\n\t\tthis.startOfAbsence = getDate(dto, 'startOfAbsence', null);\r\n\t\tthis.endOfAbsence = getDate(dto, 'endOfAbsence', null);\r\n\t}\r\n}\r\n","import { url as urlHelper } from '@/helpers/helpers';\r\nimport PaginatedList from '@/models/PaginatedList';\r\nimport UserAbsence from '@/models/UserAbsence';\r\nimport { DateTime } from 'luxon';\r\nimport { fetchAllPages, fetchWrap, offlineResponse, setPagination } from '../_helpers';\r\n\r\nexport default {\r\n\t/**\r\n\t * Get all user absences\r\n\t * @param {Object} params request parameters.\r\n\t * @returns (async) Returns an array of UserAbsence objects if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getAll({ userId = undefined, startDate = undefined, endDate = undefined } = {}) {\r\n\t\tconst query = {};\r\n\t\tif (typeof userId === 'number') {\r\n\t\t\tquery.userId = userId;\r\n\t\t}\r\n\t\tif (startDate instanceof DateTime) {\r\n\t\t\tquery.startDate = startDate.toISO();\r\n\t\t}\r\n\t\tif (endDate instanceof DateTime) {\r\n\t\t\tquery.endDate = endDate.toISO();\r\n\t\t}\r\n\t\tconst url = urlHelper('/api/UserAbsence', query);\r\n\t\tlet response, data = [];\r\n\t\ttry {\r\n\t\t\tresponse = await fetchAllPages(url, x => data.push(new UserAbsence(x)));\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn data;\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get paginated user absences\r\n\t * @param {Object} params request parameters.\r\n\t * @returns (async) Returns a PaginatedList of UserAbsence objects if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getPaginated({ userId = undefined, startDate = undefined, endDate = undefined, limit = undefined, start = undefined } = {}) {\r\n\t\tconst query = setPagination(limit, start);\r\n\t\tif (typeof userId === 'number') {\r\n\t\t\tquery.userId = userId;\r\n\t\t}\r\n\t\tif (startDate instanceof DateTime) {\r\n\t\t\tquery.startDate = startDate.toISO();\r\n\t\t}\r\n\t\tif (endDate instanceof DateTime) {\r\n\t\t\tquery.endDate = endDate.toISO();\r\n\t\t}\r\n\t\tconst url = urlHelper('/api/UserAbsence', query);\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap(url);\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new PaginatedList(await response.json(), x => new UserAbsence(x));\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get a user absence\r\n\t * @param {Number} id UserAbsence ID\r\n\t * @returns (async) Returns a UserAbsence if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getById(id) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/UserAbsence/' + id);\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new UserAbsence(await response.json());\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Create a user absence\r\n\t * @param {UserAbsence} model user absence to create.\r\n\t * @returns (async) Returns the new UserAbsence if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync create(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/UserAbsence', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new UserAbsence(await response.json());\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Update a user absence\r\n\t * @param {UserAbsence} model user absence to update.\r\n\t * @returns (async) Returns the updated UserAbsence if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync update(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/UserAbsence/' + model.id, {\r\n\t\t\t\tmethod: 'PUT',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new UserAbsence(model);\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Delete a user absence\r\n\t * @param {Number} id UserAbsence ID to delete.\r\n\t * @returns (async) Returns true if the request was successful (or not found), false if the user absence could not be deleted, otherwise a Response.\r\n\t */\r\n\tasync deleteById(id) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/UserAbsence/' + id, { method: 'DELETE' });\r\n\t\t} catch {\r\n\t\t\treturn offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok || response.status === 404) {\r\n\t\t\treturn true;\r\n\t\t} else if (response.status === 409) {\r\n\t\t\treturn false;\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t}\r\n};\r\n","import { getValueFromDto as getValue, getDateTimeFromDto as getDate } from './_helpers.js';\r\n\r\nexport default class VehicleMaintenance {\r\n\tconstructor(dto, maintenanceTypes) {\r\n\t\tthis.id = getValue(dto, 'id', 'number', 0);\r\n\t\tthis.vehicleId = getValue(dto, 'vehicleId', 'number', null);\r\n\t\tthis.maintenanceTypeId = getValue(dto, 'maintenanceTypeId', 'number', null);\r\n\t\tthis.maintenanceType = null;\r\n\t\tObject.defineProperty(this, 'maintenanceType', { enumerable: false });\r\n\t\tthis.timestamp = getDate(dto, 'timestamp', null);\r\n\t\tthis.mileage = getValue(dto, 'mileage', 'number', 0);\r\n\t\tthis.hours = getValue(dto, 'hours', 'number', 0);\r\n\t\tthis.notes = getValue(dto, 'notes', 'string', '');\r\n\r\n\t\tif (typeof dto === 'object' && dto !== null) {\r\n\t\t\tif (typeof dto.maintenanceType === 'object' && dto.maintenanceType !== null) {\r\n\t\t\t\tthis.maintenanceType = dto.maintenanceType;\r\n\t\t\t} else if (typeof maintenanceTypes === 'object' && Array.isArray(maintenanceTypes)) {\r\n\t\t\t\tthis.maintenanceType = maintenanceTypes.find(x => x.id === this.maintenanceTypeId) || null;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n","import { url as urlHelper } from '@/helpers/helpers';\r\nimport PaginatedList from '@/models/PaginatedList';\r\nimport VehicleMaintenance from '@/models/VehicleMaintenance';\r\nimport { DateTime } from 'luxon';\r\nimport { fetchAllPages, fetchWrap, offlineResponse, setPagination } from '../_helpers';\r\n\r\nexport default {\r\n\t/**\r\n\t * Get all vehicle maintenance records\r\n\t * @param {Object} params request parameters.\r\n\t * @returns (async) Returns an array of VehicleMaintenance objects if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getAll({ vehicleId = undefined, startDate = undefined, endDate = undefined } = {}, maintenanceTypes) {\r\n\t\tconst query = {};\r\n\t\tif (typeof vehicleId === 'number') {\r\n\t\t\tquery.vehicleId = vehicleId;\r\n\t\t}\r\n\t\tif (startDate instanceof DateTime) {\r\n\t\t\tquery.startDate = startDate.toISO();\r\n\t\t}\r\n\t\tif (endDate instanceof DateTime) {\r\n\t\t\tquery.endDate = endDate.toISO();\r\n\t\t}\r\n\t\tconst url = urlHelper('/api/VehicleMaintenance', query);\r\n\t\tlet response, data = [];\r\n\t\ttry {\r\n\t\t\tresponse = await fetchAllPages(url, x => data.push(new VehicleMaintenance(x, maintenanceTypes)));\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn data;\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get paginated vehicle maintenance records\r\n\t * @param {Object} params request parameters.\r\n\t * @returns (async) Returns a PaginatedList of VehicleMaintenance objects if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getPaginated({ vehicleId = undefined, startDate = undefined, endDate = undefined, limit = undefined, start = undefined } = {}, maintenanceTypes) {\r\n\t\tconst query = setPagination(limit, start);\r\n\t\tif (typeof vehicleId === 'number') {\r\n\t\t\tquery.vehicleId = vehicleId;\r\n\t\t}\r\n\t\tif (startDate instanceof DateTime) {\r\n\t\t\tquery.startDate = startDate.toISO();\r\n\t\t}\r\n\t\tif (endDate instanceof DateTime) {\r\n\t\t\tquery.endDate = endDate.toISO();\r\n\t\t}\r\n\t\tconst url = urlHelper('/api/VehicleMaintenance', query);\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap(url);\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new PaginatedList(await response.json(), x => new VehicleMaintenance(x, maintenanceTypes));\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get a vehicle maintenance\r\n\t * @param {Number} id VehicleMaintenance ID\r\n\t * @returns (async) Returns a VehicleMaintenance if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getById(id, maintenanceTypes) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/VehicleMaintenance/' + id);\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new VehicleMaintenance(await response.json(), maintenanceTypes);\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Create a vehicle maintenance\r\n\t * @param {VehicleMaintenance} model vehicle maintenance to create.\r\n\t * @returns (async) Returns the new VehicleMaintenance if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync create(model, maintenanceTypes) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/VehicleMaintenance', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new VehicleMaintenance(await response.json(), maintenanceTypes);\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Update a vehicle maintenance\r\n\t * @param {VehicleMaintenance} model vehicle maintenance to update.\r\n\t * @returns (async) Returns the updated VehicleMaintenance if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync update(model, maintenanceTypes) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/VehicleMaintenance/' + model.id, {\r\n\t\t\t\tmethod: 'PUT',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new VehicleMaintenance(model, maintenanceTypes);\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Delete a vehicle maintenance\r\n\t * @param {Number} id VehicleMaintenance ID to delete.\r\n\t * @returns (async) Returns true if the request was successful (or not found), false if the vehicle maintenance could not be deleted, otherwise a Response.\r\n\t */\r\n\tasync deleteById(id) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/VehicleMaintenance/' + id, { method: 'DELETE' });\r\n\t\t} catch {\r\n\t\t\treturn offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok || response.status === 404) {\r\n\t\t\treturn true;\r\n\t\t} else if (response.status === 409) {\r\n\t\t\treturn false;\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t}\r\n};\r\n","export default class VehicleMaintenanceIntervalType {\r\n\tstatic days = 0;\r\n\tstatic weeks = 1;\r\n\tstatic months = 2;\r\n\tstatic miles = 3;\r\n\tstatic hours = 4;\r\n\r\n\tstatic options = [\r\n\t\t{ id: this.days, name: 'Day' },\r\n\t\t{ id: this.weeks, name: 'Week' },\r\n\t\t{ id: this.months, name: 'Month' },\r\n\t\t{ id: this.miles, name: 'Mile' },\r\n\t\t{ id: this.hours, name: 'Hour' },\r\n\t];\r\n\r\n\tstatic display(value, number) {\r\n\t\tconst item = this.options.find(x => x.id === value);\r\n\t\treturn item ? (item.name + (number === 1 ? '' : 's')) : '';\r\n\t}\r\n\r\n\tstatic isValid(value) {\r\n\t\treturn value === this.days || value === this.weeks || value === this.months || value === this.miles || value === this.hours;\r\n\t}\r\n}\r\n","import { getValueFromDto as getValue } from './_helpers.js';\r\n\r\nexport default class VehicleMaintenanceType {\r\n\tconstructor(dto) {\r\n\t\tthis.id = getValue(dto, 'id', 'number', 0);\r\n\t\tthis.name = getValue(dto, 'name', 'string', '');\r\n\t\tthis.sortOrder = getValue(dto, 'sortOrder', 'number', 0);\r\n\t\tthis.active = getValue(dto, 'active', 'boolean', true);\r\n\t}\r\n}\r\n","import { getValueFromDto as getValue, getDateTimeFromDto as getDate } from './_helpers.js';\r\nimport VehicleMaintenanceIntervalType from './VehicleMaintenanceIntervalType.js';\r\nimport VehicleMaintenanceType from './VehicleMaintenanceType.js';\r\n\r\nexport default class VehicleMaintenanceSchedule {\r\n\tconstructor(dto, maintenanceTypes) {\r\n\t\tthis.id = getValue(dto, 'id', 'number', 0);\r\n\t\tthis.vehicleId = getValue(dto, 'vehicleId', 'number', null);\r\n\t\tthis.vehicle = null;\r\n\t\tObject.defineProperty(this, 'vehicle', { enumerable: false });\r\n\t\tthis.maintenanceTypeId = getValue(dto, 'maintenanceTypeId', 'number', null);\r\n\t\tthis.maintenanceType = null;\r\n\t\tObject.defineProperty(this, 'maintenanceType', { enumerable: false });\r\n\t\tthis.intervalUnits = getValue(dto, 'intervalUnits', 'number', VehicleMaintenanceIntervalType.months);\r\n\t\tthis.intervalLength = getValue(dto, 'intervalLength', 'number', 0);\r\n\t\tthis.intervalWarningUnits = getValue(dto, 'intervalWarningUnits', 'number', VehicleMaintenanceIntervalType.months);\r\n\t\tthis.intervalWarningLength = getValue(dto, 'intervalWarningLength', 'number', 0);\r\n\t\tthis.notes = getValue(dto, 'notes', 'string', '');\r\n\t\t// server-side calculated properties\r\n\t\tthis.lastTimestamp = getDate(dto, 'lastTimestamp', null);\r\n\t\tObject.defineProperty(this, 'lastTimestamp', { enumerable: false });\r\n\t\tthis.lastMileage = getValue(dto, 'lastMileage', 'number', 0);\r\n\t\tObject.defineProperty(this, 'lastMileage', { enumerable: false });\r\n\t\tthis.lastHours = getValue(dto, 'lastHours', 'number', 0);\r\n\t\tObject.defineProperty(this, 'lastHours', { enumerable: false });\r\n\t\tthis.isPastWarning = getValue(dto, 'isPastWarning', 'boolean', false);\r\n\t\tObject.defineProperty(this, 'isPastWarning', { enumerable: false });\r\n\t\tthis.nextTimestamp = getDate(dto, 'nextTimestamp', null);\r\n\t\tObject.defineProperty(this, 'nextTimestamp', { enumerable: false });\r\n\t\tthis.nextMileage = getValue(dto, 'nextMileage', 'number', 0);\r\n\t\tObject.defineProperty(this, 'nextMileage', { enumerable: false });\r\n\t\tthis.nextHours = getValue(dto, 'nextHours', 'number', 0);\r\n\t\tObject.defineProperty(this, 'nextHours', { enumerable: false });\r\n\t\tthis.isPastDue = getValue(dto, 'isPastDue', 'boolean', false);\r\n\t\tObject.defineProperty(this, 'isPastDue', { enumerable: false });\r\n\r\n\t\tif (typeof dto === 'object' && dto !== null) {\r\n\t\t\tif (typeof dto.maintenanceType === 'object' && dto.maintenanceType !== null) {\r\n\t\t\t\tthis.maintenanceType = new VehicleMaintenanceType(dto.maintenanceType);\r\n\t\t\t} else if (typeof maintenanceTypes === 'object' && Array.isArray(maintenanceTypes)) {\r\n\t\t\t\tthis.maintenanceType = maintenanceTypes.find(x => x.id === this.maintenanceTypeId) || null;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n","import { url as urlHelper } from '@/helpers/helpers';\r\nimport PaginatedList from '@/models/PaginatedList';\r\nimport VehicleMaintenanceSchedule from '@/models/VehicleMaintenanceSchedule';\r\nimport { fetchAllPages, fetchWrap, offlineResponse, setPagination } from '../_helpers';\r\n\r\nexport default {\r\n\t/**\r\n\t * Get all vehicle maintenance schedules\r\n\t * @param {Object} params request parameters.\r\n\t * @returns (async) Returns an array of VehicleMaintenanceSchedule objects if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getAll({ vehicleId = undefined, pastDueWarning = undefined } = {}, maintenanceTypes) {\r\n\t\tconst query = {};\r\n\t\tif (typeof vehicleId === 'number') {\r\n\t\t\tquery.vehicleId = vehicleId;\r\n\t\t}\r\n\t\tif (typeof pastDueWarning === 'boolean') {\r\n\t\t\tquery.pastDueWarning = pastDueWarning;\r\n\t\t}\r\n\t\tconst url = urlHelper('/api/VehicleMaintenanceSchedule', query);\r\n\t\tlet response, data = [];\r\n\t\ttry {\r\n\t\t\tresponse = await fetchAllPages(url, x => data.push(new VehicleMaintenanceSchedule(x, maintenanceTypes)));\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn data;\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get paginated vehicle maintenance schedules\r\n\t * @param {Object} params request parameters.\r\n\t * @returns (async) Returns a PaginatedList of VehicleMaintenanceSchedule objects if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getPaginated({ vehicleId = undefined, pastDueWarning = undefined, limit = undefined, start = undefined } = {}, maintenanceTypes) {\r\n\t\tconst query = setPagination(limit, start);\r\n\t\tif (typeof vehicleId === 'number') {\r\n\t\t\tquery.vehicleId = vehicleId;\r\n\t\t}\r\n\t\tif (typeof pastDueWarning === 'boolean') {\r\n\t\t\tquery.pastDueWarning = pastDueWarning;\r\n\t\t}\r\n\t\tconst url = urlHelper('/api/VehicleMaintenanceSchedule', query);\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap(url);\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new PaginatedList(await response.json(), x => new VehicleMaintenanceSchedule(x, maintenanceTypes));\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get a vehicle maintenance schedule\r\n\t * @param {Number} id VehicleMaintenanceSchedule ID\r\n\t * @returns (async) Returns a VehicleMaintenanceSchedule if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getById(id, maintenanceTypes) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/VehicleMaintenanceSchedule/' + id);\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new VehicleMaintenanceSchedule(await response.json(), maintenanceTypes);\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Create a vehicle maintenance schedule\r\n\t * @param {VehicleMaintenanceSchedule} model vehicle maintenance schedule to create.\r\n\t * @returns (async) Returns the new VehicleMaintenanceSchedule if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync create(model, maintenanceTypes) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/VehicleMaintenanceSchedule', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new VehicleMaintenanceSchedule(await response.json(), maintenanceTypes);\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Update a vehicle maintenance schedule\r\n\t * @param {VehicleMaintenanceSchedule} model vehicle maintenance schedule to update.\r\n\t * @returns (async) Returns the updated VehicleMaintenanceSchedule if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync update(model, maintenanceTypes) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/VehicleMaintenanceSchedule/' + model.id, {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new VehicleMaintenanceSchedule(await response.json(), maintenanceTypes);\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Delete a vehicle maintenance schedule\r\n\t * @param {Number} id VehicleMaintenanceSchedule ID to delete.\r\n\t * @returns (async) Returns true if the request was successful (or not found), false if the vehicle maintenance schedule could not be deleted, otherwise a Response.\r\n\t */\r\n\tasync deleteById(id) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/VehicleMaintenanceSchedule/' + id, { method: 'DELETE' });\r\n\t\t} catch {\r\n\t\t\treturn offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok || response.status === 404) {\r\n\t\t\treturn true;\r\n\t\t} else if (response.status === 409) {\r\n\t\t\treturn false;\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t}\r\n};\r\n","import { makeComparator } from '@/helpers/helpers';\r\nimport { getIdb, idbHelpers } from '@/idb';\r\nimport VehicleMaintenanceType from '@/models/VehicleMaintenanceType';\r\nimport { DateTime } from 'luxon';\r\nimport { fetchAllPages, fetchWrap, idbResponse, isIdbResponse, offlineResponse } from '../_helpers';\r\nimport cache from './cache';\r\n\r\nconst idbStore = 'vehicleMaintenanceTypes';\r\n\r\nexport default {\r\n\t/**\r\n\t * Get all vehicle maintenance types\r\n\t * @returns (async) Returns an array of VehicleMaintenanceType objects if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getAll() {\r\n\t\tconst idb = await getIdb();\r\n\t\tlet response, data = [], timestamp;\r\n\t\tlet useIdb = await cache.isCacheHit(idbStore);\r\n\t\tif (!useIdb) {\r\n\t\t\ttry {\r\n\t\t\t\ttimestamp = DateTime.now();\r\n\t\t\t\tresponse = await fetchAllPages('/api/VehicleMaintenanceTypes', x => data.push(x), {}, 1000);\r\n\t\t\t} catch {\r\n\t\t\t\tuseIdb = true;\r\n\t\t\t\tresponse = offlineResponse();\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (useIdb && idb) {\r\n\t\t\tdata = await idb.getAll(idbStore);\r\n\t\t\tresponse = idbResponse(200);\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tif (idb && !isIdbResponse(response)) {\r\n\t\t\t\tawait idbHelpers.replaceAll(idb, idbStore, data);\r\n\t\t\t\tawait cache.setTimestamp(idbStore, timestamp);\r\n\t\t\t}\r\n\t\t\tdata.sort(makeComparator('sortOrder', 'id'));\r\n\t\t\treturn data.map(x => new VehicleMaintenanceType(x));\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get a vehicle maintenance type\r\n\t * @param {Number} id VehicleMaintenanceType ID\r\n\t * @returns (async) Returns a VehicleMaintenanceType if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getById(id) {\r\n\t\tconst idb = await getIdb();\r\n\t\tlet response, data = null;\r\n\t\tlet useIdb = await cache.isCacheHit(idbStore);\r\n\t\tif (!useIdb && await cache.canCache()) {\r\n\t\t\t// cache all for future re-use\r\n\t\t\tif ((data = (await this.getAll()).find(x => x.id === id) ?? null)) {\r\n\t\t\t\treturn data;\r\n\t\t\t} else {\r\n\t\t\t\tthrow idbResponse(404);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!useIdb) {\r\n\t\t\ttry {\r\n\t\t\t\tresponse = await fetchWrap('/api/VehicleMaintenanceTypes/' + id);\r\n\t\t\t\tif (response.ok) { data = await response.json(); }\r\n\t\t\t} catch {\r\n\t\t\t\tuseIdb = true;\r\n\t\t\t\tresponse = offlineResponse();\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (useIdb && idb) {\r\n\t\t\tdata = await idb.get(idbStore, id);\r\n\t\t\tresponse = data ? idbResponse(200) : idbResponse(404);\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tif (idb && !isIdbResponse(response)) {\r\n\t\t\t\tawait idb.put(idbStore, data);\r\n\t\t\t}\r\n\t\t\treturn new VehicleMaintenanceType(data);\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Create a vehicle maintenance type\r\n\t * @param {VehicleMaintenanceType} model vehicle maintenance type to create.\r\n\t * @returns (async) Returns the new VehicleMaintenanceType if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync create(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/VehicleMaintenanceTypes', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tawait cache.clearTimestamp(idbStore);\r\n\t\t\treturn new VehicleMaintenanceType(await response.json());\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Update a vehicle maintenance type\r\n\t * @param {VehicleMaintenanceType} model vehicle maintenance type to update.\r\n\t * @returns (async) Returns the updated VehicleMaintenanceType if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync update(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/VehicleMaintenanceTypes/' + model.id, {\r\n\t\t\t\tmethod: 'PUT',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tawait cache.clearTimestamp(idbStore);\r\n\t\t\treturn new VehicleMaintenanceType(model);\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Delete a vehicle maintenance type\r\n\t * @param {Number} id VehicleMaintenanceType ID to delete.\r\n\t * @returns (async) Returns true if the request was successful (or not found), false if the vehicle maintenance type could not be deleted, otherwise a Response.\r\n\t */\r\n\tasync deleteById(id) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/VehicleMaintenanceTypes/' + id, { method: 'DELETE' });\r\n\t\t} catch {\r\n\t\t\treturn offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tawait cache.clearTimestamp(idbStore);\r\n\t\t\treturn true;\r\n\t\t} else if (response.status === 404) {\r\n\t\t\treturn true;\r\n\t\t} else if (response.status === 409) {\r\n\t\t\treturn false;\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t}\r\n};\r\n","import { makeComparator } from '@/helpers/helpers';\r\nimport { getIdb, idbHelpers } from '@/idb';\r\nimport VehicleType from '@/models/VehicleType';\r\nimport { DateTime } from 'luxon';\r\nimport { fetchAllPages, fetchWrap, idbResponse, isIdbResponse, offlineResponse } from '../_helpers';\r\nimport cache from './cache';\r\n\r\nconst idbStore = 'vehicleTypes';\r\n\r\nexport default {\r\n\t/**\r\n\t * Get all vehicle types\r\n\t * @returns (async) Returns an array of VehicleType objects if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getAll() {\r\n\t\tconst idb = await getIdb();\r\n\t\tlet response, data = [], timestamp;\r\n\t\tlet useIdb = await cache.isCacheHit(idbStore);\r\n\t\tif (!useIdb) {\r\n\t\t\ttry {\r\n\t\t\t\ttimestamp = DateTime.now();\r\n\t\t\t\tresponse = await fetchAllPages('/api/VehicleTypes', x => data.push(x), {}, 1000);\r\n\t\t\t} catch {\r\n\t\t\t\tuseIdb = true;\r\n\t\t\t\tresponse = offlineResponse();\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (useIdb && idb) {\r\n\t\t\tdata = await idb.getAll(idbStore);\r\n\t\t\tresponse = idbResponse(200);\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tif (idb && !isIdbResponse(response)) {\r\n\t\t\t\tawait idbHelpers.replaceAll(idb, idbStore, data);\r\n\t\t\t\tawait cache.setTimestamp(idbStore, timestamp);\r\n\t\t\t}\r\n\t\t\tdata.sort(makeComparator('sortOrder', 'id'));\r\n\t\t\treturn data.map(x => new VehicleType(x));\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get a vehicle type\r\n\t * @param {Number} id VehicleType ID\r\n\t * @returns (async) Returns a VehicleType if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getById(id) {\r\n\t\tconst idb = await getIdb();\r\n\t\tlet response, data = null;\r\n\t\tlet useIdb = await cache.isCacheHit(idbStore);\r\n\t\tif (!useIdb && await cache.canCache()) {\r\n\t\t\t// cache all for future re-use\r\n\t\t\tif ((data = (await this.getAll()).find(x => x.id === id) ?? null)) {\r\n\t\t\t\treturn data;\r\n\t\t\t} else {\r\n\t\t\t\tthrow idbResponse(404);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!useIdb) {\r\n\t\t\ttry {\r\n\t\t\t\tresponse = await fetchWrap('/api/VehicleTypes/' + id);\r\n\t\t\t\tif (response.ok) { data = await response.json(); }\r\n\t\t\t} catch {\r\n\t\t\t\tuseIdb = true;\r\n\t\t\t\tresponse = offlineResponse();\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (useIdb && idb) {\r\n\t\t\tdata = await idb.get(idbStore, id);\r\n\t\t\tresponse = data ? idbResponse(200) : idbResponse(404);\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tif (idb && !isIdbResponse(response)) {\r\n\t\t\t\tawait idb.put(idbStore, data);\r\n\t\t\t}\r\n\t\t\treturn new VehicleType(data);\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Create a vehicle type\r\n\t * @param {VehicleType} model vehicle type to create.\r\n\t * @returns (async) Returns the new VehicleType if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync create(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/VehicleTypes', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tawait cache.clearTimestamp(idbStore);\r\n\t\t\treturn new VehicleType(await response.json());\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Update a vehicle type\r\n\t * @param {VehicleType} model vehicle type to update.\r\n\t * @returns (async) Returns the updated VehicleType if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync update(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/VehicleTypes/' + model.id, {\r\n\t\t\t\tmethod: 'PUT',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tawait cache.clearTimestamp(idbStore);\r\n\t\t\treturn new VehicleType(model);\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Delete a vehicle type\r\n\t * @param {Number} id VehicleType ID to delete.\r\n\t * @returns (async) Returns true if the request was successful (or not found), false if the vehicle type could not be deleted, otherwise a Response.\r\n\t */\r\n\tasync deleteById(id) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/VehicleTypes/' + id, { method: 'DELETE' });\r\n\t\t} catch {\r\n\t\t\treturn offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tawait cache.clearTimestamp(idbStore);\r\n\t\t\treturn true;\r\n\t\t} else if (response.status === 404) {\r\n\t\t\treturn true;\r\n\t\t} else if (response.status === 409) {\r\n\t\t\treturn false;\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t}\r\n};\r\n","import { url as urlHelper } from '@/helpers/helpers';\r\nimport PaginatedList from '@/models/PaginatedList';\r\nimport WorkOrderSchedule from '@/models/WorkOrderSchedule';\r\nimport { compare as jsonPatchCompare } from 'fast-json-patch';\r\nimport { DateTime } from 'luxon';\r\nimport { fetchAllPages, fetchWrap, offlineResponse, setPagination } from '../_helpers';\r\n\r\nexport default {\r\n\t/**\r\n\t * Get all work order schedules\r\n\t * @param {Object} params request parameters.\r\n\t * @returns (async) Returns an array of WorkOrderSchedule objects if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getAll({ customerId = undefined, customerLocationId = undefined, startDate = undefined, endDate = undefined } = {}) {\r\n\t\tconst query = {};\r\n\t\tif (typeof customerId === 'number') {\r\n\t\t\tquery.customerId = customerId;\r\n\t\t}\r\n\t\tif (typeof customerLocationId === 'number') {\r\n\t\t\tquery.customerLocationId = customerLocationId;\r\n\t\t}\r\n\t\tif (startDate instanceof DateTime) {\r\n\t\t\tquery.startDate = startDate.toISO();\r\n\t\t}\r\n\t\tif (endDate instanceof DateTime) {\r\n\t\t\tquery.endDate = endDate.toISO();\r\n\t\t}\r\n\t\tconst url = urlHelper('/api/WorkOrderSchedules', query);\r\n\t\tlet response, data = [];\r\n\t\ttry {\r\n\t\t\tresponse = await fetchAllPages(url, x => data.push(new WorkOrderSchedule(x)));\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn data;\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get paginated work order schedules\r\n\t * @param {Object} params request parameters.\r\n\t * @returns (async) Returns a PaginatedList of WorkOrderSchedule objects if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getPaginated({ customerId = undefined, customerLocationId = undefined, active = undefined, startDate = undefined, endDate = undefined, limit = undefined, start = undefined } = {}) {\r\n\t\tconst query = setPagination(limit, start);\r\n\t\tif (typeof customerId === 'number') {\r\n\t\t\tquery.customerId = customerId;\r\n\t\t}\r\n\t\tif (typeof customerLocationId === 'number') {\r\n\t\t\tquery.customerLocationId = customerLocationId;\r\n\t\t}\r\n\t\tif (startDate instanceof DateTime) {\r\n\t\t\tquery.startDate = startDate.toISO();\r\n\t\t}\r\n\t\tif (endDate instanceof DateTime) {\r\n\t\t\tquery.endDate = endDate.toISO();\r\n\t\t}\r\n\t\tif(typeof active === 'boolean') {\r\n\t\t\tquery.active = active;\r\n\t\t}\r\n\t\tconst url = urlHelper('/api/WorkOrderSchedules', query);\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap(url);\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new PaginatedList(await response.json(), x => new WorkOrderSchedule(x));\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get paginated work order schedules which have an error\r\n\t * @param {Object} params request parameters.\r\n\t * @returns (async) Returns a PaginatedList of WorkOrderSchedule objects if the request was successful, otherwise throws a Response.\r\n\t */\r\n\tasync getPaginatedWithErrors({ limit = undefined, start = undefined } = {}) {\r\n\t\tconst query = setPagination(limit, start);\r\n\t\tconst url = urlHelper('/api/WorkOrderSchedules/WithErrors', query);\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap(url);\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new PaginatedList(await response.json(), x => new WorkOrderSchedule(x));\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get a work order schedule\r\n\t * @param {Number} id WorkOrderSchedule ID\r\n\t * @returns (async) Returns a WorkOrderSchedule if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getById(id) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/WorkOrderSchedules/' + id);\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn new WorkOrderSchedule(await response.json());\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Update a work order schedule\r\n\t * @param {WorkOrderSchedule} model work order schedule to update.\r\n\t * @param {WorkOrderSchedule} oldModel old work order schedule to determine updates to apply.\r\n\t * @returns (async) Returns the updated WorkOrderSchedule if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync patch(model, oldModel) {\r\n\t\tconst oldData = JSON.parse(JSON.stringify(oldModel));\r\n\t\tconst newData = JSON.parse(JSON.stringify(model));\r\n\t\tconst patch = jsonPatchCompare(oldData, newData);\r\n\t\tif (patch.length === 0) {\r\n\t\t\treturn model instanceof WorkOrderSchedule ? model : new WorkOrderSchedule(model);\r\n\t\t}\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/WorkOrderSchedules/' + model.id, {\r\n\t\t\t\tmethod: 'PATCH',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(patch),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tconst data = await response.json();\r\n\t\t\treturn new WorkOrderSchedule(data);\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Delete a work order schedule\r\n\t * @param {Number} id WorkOrderSchedule ID to delete.\r\n\t * @returns (async) Returns true if the request was successful (or not found), false if the work order schedule could not be deleted, otherwise a Response.\r\n\t */\r\n\tasync deleteById(id) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/WorkOrderSchedules/' + id, { method: 'DELETE' });\r\n\t\t} catch {\r\n\t\t\treturn offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok || response.status === 404) {\r\n\t\t\treturn true;\r\n\t\t} else if (response.status === 409) {\r\n\t\t\treturn false;\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t}\r\n};\r\n","import { getValueFromDto as getValue } from './_helpers.js';\r\n\r\nexport default class WorkOrderType {\r\n\tconstructor(dto) {\r\n\t\tthis.id = getValue(dto, 'id', 'number', 0);\r\n\t\tthis.name = getValue(dto, 'name', 'string', '');\r\n\t\tthis.color = getValue(dto, 'color', 'string', '');\r\n\t\tthis.sortOrder = getValue(dto, 'sortOrder', 'number', 0);\r\n\t\tthis.active = getValue(dto, 'active', 'boolean', true);\r\n\t}\r\n}\r\n","import { makeComparator } from '@/helpers/helpers';\r\nimport { getIdb, idbHelpers } from '@/idb';\r\nimport WorkOrderType from '@/models/WorkOrderType';\r\nimport { DateTime } from 'luxon';\r\nimport { fetchAllPages, fetchWrap, idbResponse, isIdbResponse, offlineResponse } from '../_helpers';\r\nimport cache from './cache';\r\n\r\nconst idbStore = 'workOrderTypes';\r\n\r\nexport default {\r\n\t/**\r\n\t * Get all waste types\r\n\t * @returns (async) Returns an array of WorkOrderType objects if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getAll() {\r\n\t\tconst idb = await getIdb();\r\n\t\tlet response, data = [], timestamp;\r\n\t\tlet useIdb = await cache.isCacheHit(idbStore);\r\n\t\tif (!useIdb) {\r\n\t\t\ttry {\r\n\t\t\t\ttimestamp = DateTime.now();\r\n\t\t\t\tresponse = await fetchAllPages('/api/WorkOrderTypes', x => data.push(x), {}, 1000);\r\n\t\t\t} catch {\r\n\t\t\t\tuseIdb = true;\r\n\t\t\t\tresponse = offlineResponse();\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (useIdb && idb) {\r\n\t\t\tdata = await idb.getAll(idbStore);\r\n\t\t\tresponse = idbResponse(200);\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tif (idb && !isIdbResponse(response)) {\r\n\t\t\t\tawait idbHelpers.replaceAll(idb, idbStore, data);\r\n\t\t\t\tawait cache.setTimestamp(idbStore, timestamp);\r\n\t\t\t}\r\n\t\t\tdata.sort(makeComparator('sortOrder', 'id'));\r\n\t\t\treturn data.map(x => new WorkOrderType(x));\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get a waste type\r\n\t * @param {Number} id WorkOrderType ID\r\n\t * @returns (async) Returns a WorkOrderType if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getById(id) {\r\n\t\tconst idb = await getIdb();\r\n\t\tlet response, data = null;\r\n\t\tlet useIdb = await cache.isCacheHit(idbStore);\r\n\t\tif (!useIdb && await cache.canCache()) {\r\n\t\t\t// cache all for future re-use\r\n\t\t\tif ((data = (await this.getAll()).find(x => x.id === id) ?? null)) {\r\n\t\t\t\treturn data;\r\n\t\t\t} else {\r\n\t\t\t\tthrow idbResponse(404);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!useIdb) {\r\n\t\t\ttry {\r\n\t\t\t\tresponse = await fetchWrap('/api/WorkOrderTypes/' + id);\r\n\t\t\t\tif (response.ok) { data = await response.json(); }\r\n\t\t\t} catch {\r\n\t\t\t\tuseIdb = true;\r\n\t\t\t\tresponse = offlineResponse();\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (useIdb && idb) {\r\n\t\t\tdata = await idb.get(idbStore, id);\r\n\t\t\tresponse = data ? idbResponse(200) : idbResponse(404);\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tif (idb && !isIdbResponse(response)) {\r\n\t\t\t\tawait idb.put(idbStore, data);\r\n\t\t\t}\r\n\t\t\treturn new WorkOrderType(data);\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Create a waste type\r\n\t * @param {WorkOrderType} model waste type to create.\r\n\t * @returns (async) Returns the new WorkOrderType if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync create(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/WorkOrderTypes', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tawait cache.clearTimestamp(idbStore);\r\n\t\t\treturn new WorkOrderType(await response.json());\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Update a waste type\r\n\t * @param {WorkOrderType} model waste type to update.\r\n\t * @returns (async) Returns the updated WorkOrderType if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync update(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/WorkOrderTypes/' + model.id, {\r\n\t\t\t\tmethod: 'PUT',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tawait cache.clearTimestamp(idbStore);\r\n\t\t\treturn new WorkOrderType(model);\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Delete a waste type\r\n\t * @param {Number} id WorkOrderType ID to delete.\r\n\t * @returns (async) Returns true if the request was successful (or not found), false if the waste type could not be deleted, otherwise a Response.\r\n\t */\r\n\tasync deleteById(id) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/WorkOrderTypes/' + id, { method: 'DELETE' });\r\n\t\t} catch {\r\n\t\t\treturn offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tawait cache.clearTimestamp(idbStore);\r\n\t\t\treturn true;\r\n\t\t} else if (response.status === 404) {\r\n\t\t\treturn true;\r\n\t\t} else if (response.status === 409) {\r\n\t\t\treturn false;\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t}\r\n};\r\n","import account from './modules/account';\r\nimport auth from './modules/auth';\r\nimport cache from './modules/cache';\r\nimport companies from './modules/companies';\r\nimport companyLocations from './modules/companyLocations';\r\nimport customerPayments from './modules/customerPayments';\r\nimport customerRentals from './modules/customerRentals';\r\nimport customers from './modules/customers';\r\nimport email from './modules/email';\r\nimport emails from './modules/emails';\r\nimport files from './modules/files';\r\nimport inspectionItems from './modules/inspectionItems';\r\nimport inventory from './modules/inventory';\r\nimport maintenance from './modules/maintenance';\r\nimport offline from './modules/offline';\r\nimport paymentTerms from './modules/paymentTerms';\r\nimport pdf from './modules/pdf';\r\nimport permissions from './modules/permissions';\r\nimport rentalItemTypes from './modules/rentalItemTypes';\r\nimport rentalItems from './modules/rentalItems';\r\nimport reports from './modules/reports';\r\nimport roles from './modules/roles';\r\nimport services from './modules/services';\r\nimport settings from './modules/settings';\r\nimport states from './modules/states';\r\nimport subscriptions from './modules/subscriptions';\r\nimport tankTypes from './modules/tankTypes';\r\nimport timeClockPunches from './modules/timeClockPunches';\r\nimport timeZones from './modules/timeZones';\r\nimport token from './modules/token';\r\nimport userAbsence from './modules/userAbsence';\r\nimport users from './modules/users';\r\nimport vehicleMaintenance from './modules/vehicleMaintenance';\r\nimport vehicleMaintenanceSchedule from './modules/vehicleMaintenanceSchedule';\r\nimport vehicleMaintenanceTypes from './modules/vehicleMaintenanceTypes';\r\nimport vehicleTypes from './modules/vehicleTypes';\r\nimport vehicles from './modules/vehicles';\r\nimport wasteDisposalSiteTypes from './modules/wasteDisposalSiteTypes';\r\nimport wasteDisposalSites from './modules/wasteDisposalSites';\r\nimport wasteDisposals from './modules/wasteDisposals';\r\nimport wasteTypes from './modules/wasteTypes';\r\nimport workOrderSchedules from './modules/workOrderSchedules';\r\nimport workOrders from './modules/workOrders';\r\nimport workOrderTypes from './modules/workOrderTypes';\r\n\r\nexport default {\r\n\taccount,\r\n\tauth,\r\n\tcache,\r\n\tcompanies,\r\n\tcompanyLocations,\r\n\tcustomerPayments,\r\n\tcustomerRentals,\r\n\tcustomers,\r\n\temail,\r\n\temails,\r\n\tfiles,\r\n\tinspectionItems,\r\n\tinventory,\r\n\tmaintenance,\r\n\toffline,\r\n\tpaymentTerms,\r\n\tpdf,\r\n\tpermissions,\r\n\trentalItems,\r\n\trentalItemTypes,\r\n\treports,\r\n\troles,\r\n\tservices,\r\n\tsettings,\r\n\tstates,\r\n\tsubscriptions,\r\n\ttankTypes,\r\n\ttimeClockPunches,\r\n\ttimeZones,\r\n\ttoken,\r\n\tuserAbsence,\r\n\tusers,\r\n\tvehicleMaintenance,\r\n\tvehicleMaintenanceSchedule,\r\n\tvehicleMaintenanceTypes,\r\n\tvehicles,\r\n\tvehicleTypes,\r\n\twasteDisposals,\r\n\twasteDisposalSites,\r\n\twasteDisposalSiteTypes,\r\n\twasteTypes,\r\n\tworkOrders,\r\n\tworkOrderSchedules,\r\n\tworkOrderTypes,\r\n};\r\n"],"names":["UserSelf","dto","getValue","getArray","account","response","data","request","addCompanyIdToUrl","clearDatabase","API_CACHE_NAME","offlineResponse","e","model","fetchWrap","broadcast","userId","email","code","_AppModule","__publicField","AppModule","Permission","PermissionDisplay","value","adminPermissions","adminPermissionIds","companyPermissions","companyPermissionIds","permissions","permission","array","isAdmin","id","allowed","index","toRemove","toAdd","x","i","modules","TimeClockPunch","getDate","timeClockPunches","startDate","endDate","query","DateTime","url","urlHelper","fetchAllPages","punchIn","Company","companies","active","WorkOrderReference","WorkOrderStatus","CustomerRentalDetailedItemStatus","CustomerRentalDetailedNeed","getTypedArray","CustomerRentalDetailedItem","CustomerRentalDetailed","CustomerRentalMapLocation","customerRentals","customerId","customerLocationId","limit","start","sort","setPagination","PaginatedList","CustomerRental","rentalItemId","RentalItemSchedule","abortSignal","init","isAborted","pdf","vehicleId","getContactEmailAddresses","contact","estimate","billing","invoice","customer","tos","message","EmailEvent","bounceClassifications","parseAddressLineToAddresses","addressLine","eventLookup","split","end","y","Email","getArrayOfObjectsFromDto","toDictionary","emailsApi","workOrderId","path","address","idbStore","inventory","idb","getIdb","timestamp","useIdb","cache","idbResponse","isIdbResponse","idbHelpers","Inventory","a","b","filteredData","maintenance","companyId","offline","fileMap","z","files","reports","Role","roles","makeComparator","Service","services","states","SubscriptionBillingFrequency","SubscriptionModule","SubscriptionUserTier","Subscription","SubscriptionDetails","getDateTime","BILLING_TIME_ZONE","getObject","SubscriptionDetailsReport","subscriptions","month","TimeZone","timeZones","UserAbsence","userAbsence","VehicleMaintenance","maintenanceTypes","vehicleMaintenance","_VehicleMaintenanceIntervalType","number","item","VehicleMaintenanceIntervalType","VehicleMaintenanceType","VehicleMaintenanceSchedule","vehicleMaintenanceSchedule","pastDueWarning","vehicleMaintenanceTypes","vehicleTypes","VehicleType","workOrderSchedules","WorkOrderSchedule","oldModel","oldData","newData","patch","jsonPatchCompare","WorkOrderType","workOrderTypes","api","auth","companyLocations","customerPayments","customers","emails","inspectionItems","paymentTerms","rentalItems","rentalItemTypes","settings","tankTypes","token","users","vehicles","wasteDisposals","wasteDisposalSites","wasteDisposalSiteTypes","wasteTypes","workOrders"],"mappings":"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"}