{"version":3,"file":"wasteDisposals-mQCZ7X5f.js","sources":["../../../Nitrogen.Client/src/models/WasteDisposalSiteType.js","../../../Nitrogen.Client/src/models/WasteTypeAccepted.js","../../../Nitrogen.Client/src/models/WasteDisposalSiteSeason.js","../../../Nitrogen.Client/src/models/WasteDisposalSite.js","../../../Nitrogen.Client/src/api/modules/wasteDisposalSites.js","../../../Nitrogen.Client/src/models/PhAdjustmentMeasurement.js","../../../Nitrogen.Client/src/models/WasteDisposal.js","../../../Nitrogen.Client/src/api/modules/wasteDisposals.js"],"sourcesContent":["import { getValueFromDto as getValue } from './_helpers.js';\r\n\r\nexport default class WasteDisposalSiteType {\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 } from './_helpers.js';\r\n\r\nexport default class WasteTypeAccepted {\r\n\tconstructor(dto) {\r\n\t\tthis.wasteTypeId = getValue(dto, 'wasteTypeId', 'number', null);\r\n\t\tthis.wasteType = null;\r\n\t\tthis.disposalFee = getValue(dto, 'disposalFee', 'number', 0);\r\n\t\tthis.disposalFeePerGallon = getValue(dto, 'disposalFeePerGallon', 'boolean', true);\r\n\t\tObject.defineProperty(this, 'wasteType', { enumerable: false });\r\n\t}\r\n}\r\n","import { getDateTimeFromDto as getDate, getValueFromDto as getValue } from './_helpers.js';\r\n\r\nexport default class WasteDisposalSiteSeason {\r\n\tconstructor(dto) {\r\n\t\tthis.id = getValue(dto, 'id', 'number', 0);\r\n\t\tthis.cropCode = getValue(dto, 'cropCode', 'string', '');\r\n\t\tthis.dateOpen = getDate(dto, 'dateOpen', null);\r\n\t\tthis.dateClose = getDate(dto, 'dateClose', null);\r\n\t\tthis.loadingRate = getValue(dto, 'loadingRate', 'number', 0);\r\n\t\tthis.acres = getValue(dto, 'acres', 'number', 0);\r\n\t\tthis.capacityAvailable = getValue(dto, 'capacityAvailable', 'number', 0);\r\n\t\tthis.capacityUsed = getValue(dto, 'capacityUsed', 'number', 0);\r\n\t\tthis.capacityWarningLevel = getValue(dto, 'capacityWarningLevel', 'number', 0);\r\n\t\tthis.siteFull = getValue(dto, 'siteFull', 'boolean', false);\r\n\t}\r\n\r\n\tget capacityRemaining() {\r\n\t\treturn this.capacityAvailable - this.capacityUsed;\r\n\t}\r\n}\r\n","import { getArrayOfObjectsFromDto as getTypedArray, getDateTimeFromDto as getDate, getObjectFromDto as getObject, getValueFromDto as getValue } from './_helpers.js';\r\n\r\nimport Contact from './Contact.js';\r\nimport FileReference from './FileReference.js';\r\nimport WasteDisposalSiteType from './WasteDisposalSiteType.js';\r\nimport WasteTypeAccepted from './WasteTypeAccepted.js';\r\nimport WasteDisposalSiteSeason from './WasteDisposalSiteSeason.js';\r\nimport { DateTime } from 'luxon';\r\n\r\nexport default class WasteDisposalSite {\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.wasteDisposalSiteTypeId = getValue(dto, 'wasteDisposalSiteTypeId', 'number', null);\r\n\t\tthis.wasteDisposalSiteType = getObject(dto, 'wasteDisposalSiteType', WasteDisposalSiteType, null);\r\n\t\tObject.defineProperty(this, 'wasteDisposalSiteType', { enumerable: false });\r\n\t\tthis.permitNumber = getValue(dto, 'permitNumber', 'string', '');\r\n\t\tthis.street1 = getValue(dto, 'street1', 'string', '');\r\n\t\tthis.street2 = getValue(dto, 'street2', 'string', '');\r\n\t\tthis.city = getValue(dto, 'city', 'string', '');\r\n\t\tthis.township = getValue(dto, 'township', 'string', '');\r\n\t\tthis.county = getValue(dto, 'county', 'string', '');\r\n\t\tthis.state = getValue(dto, 'state', 'string', '');\r\n\t\tthis.postalCode = getValue(dto, 'postalCode', 'string', '');\r\n\t\tthis.latitude = getValue(dto, 'latitude', 'number', 0);\r\n\t\tthis.longitude = getValue(dto, 'longitude', 'number', 0);\r\n\t\tthis.requireVehiclePermit = getValue(dto, 'requireVehiclePermit', 'boolean', false);\r\n\t\tthis.landDisposal = getValue(dto, 'landDisposal', 'boolean', false);\r\n\t\tthis.notes = getValue(dto, 'notes', 'string', '');\r\n\t\tthis.seasons = getTypedArray(dto, 'seasons', WasteDisposalSiteSeason, []);\r\n\t\tthis.seasons.sort((a, b) => b.dateOpen - a.dateOpen);\r\n\t\tthis.contacts = getTypedArray(dto, 'contacts', Contact, []);\r\n\t\tthis.attachments = getTypedArray(dto, 'attachments', FileReference, []);\r\n\t\tthis.wasteTypesAccepted = getTypedArray(dto, 'wasteTypesAccepted', WasteTypeAccepted, []);\r\n\r\n\t\tthis._currentSeason = undefined;\r\n\t\tObject.defineProperty(this, '_currentSeason', { enumerable: false });\r\n\t\tthis._nextSeason = undefined;\r\n\t\tObject.defineProperty(this, '_nextSeason', { enumerable: false });\r\n\t}\r\n\r\n\tget currentSeason() {\r\n\t\tif (this._currentSeason === undefined) {\r\n\t\t\tthis._currentSeason = this.getCurrentSeason();\r\n\t\t}\r\n\t\treturn this._currentSeason;\r\n\t}\r\n\r\n\tgetCurrentSeason(timestamp) {\r\n\t\tif (this.landDisposal && Array.isArray(this.seasons) && this.seasons.length > 0) {\r\n\t\t\tif (!(timestamp instanceof DateTime)) {\r\n\t\t\t\ttimestamp = DateTime.now();\r\n\t\t\t}\r\n\t\t\treturn this.seasons.find(x => x.dateOpen <= timestamp && timestamp < x.dateClose) ?? null;\r\n\t\t} else {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\tget nextSeason() {\r\n\t\tif (this._nextSeason === undefined) {\r\n\t\t\tconst now = DateTime.now();\r\n\t\t\tthis._nextSeason = this.seasons.filter(x => x.dateOpen >= now).sort((a, b) => a.dateOpen - b.dateOpen)[0] ?? null;\r\n\t\t}\r\n\t\treturn this._nextSeason;\r\n\t}\r\n\r\n\tget address() {\r\n\t\treturn (this.street1 ? this.street1 + ', ' : '') + (this.street2 ? this.street2 + ', ' : '') + (this.city ? this.city + ', ' : '') + this.state + ' ' + this.postalCode;\r\n\t}\r\n\r\n\tget addressLine1() {\r\n\t\treturn (this.street1 ? this.street1 + ', ' : '') + (this.street2 ? ', ' + this.street2 + ', ' : '')\r\n\t}\r\n\r\n\tget addressLine2() {\r\n\t\treturn (this.city ? this.city + ', ' : '') + this.state + ' ' + this.postalCode;\r\n\t}\r\n}\r\n","import { makeComparator } from '@/helpers/helpers';\r\nimport { getIdb, idbHelpers, localChanges, localChangesInUse } from '@/idb';\r\nimport WasteDisposalSite from '@/models/WasteDisposalSite';\r\nimport { compare as jsonPatchCompare } from 'fast-json-patch';\r\nimport { DateTime } from 'luxon';\r\nimport { fetchAllPages, fetchWrap, idbResponse, isIdbResponse, offlineResponse } from '../_helpers';\r\nimport cache from './cache';\r\n\r\nconst idbStore = 'wasteDisposalSites';\r\n\r\nexport default {\r\n\t/**\r\n\t * Get all waste disposal sites\r\n\t * @param {Object} params request parameters.\r\n\t * @returns (async) Returns an array of WasteDisposalSite objects if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getAll({ active = undefined } = {}) {\r\n\t\tconst filters = {};\r\n\t\tif (typeof active === 'boolean') {\r\n\t\t\tfilters.active = active;\r\n\t\t}\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/WasteDisposalSites', 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\tconst filter = 'active' in filters ? (x => x.active === filters.active) : undefined;\r\n\t\tif (useIdb && idb) {\r\n\t\t\tif (filter) {\r\n\t\t\t\tdata = await idbHelpers.getFiltered(idb, idbStore, filter);\r\n\t\t\t} else {\r\n\t\t\t\tdata = await idb.getAll(idbStore);\r\n\t\t\t}\r\n\t\t\tresponse = idbResponse(200);\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tif (!isIdbResponse(response)) {\r\n\t\t\t\tif (idb) {\r\n\t\t\t\t\tawait idbHelpers.replaceAll(idb, idbStore, data);\r\n\t\t\t\t\tawait cache.setTimestamp(idbStore, timestamp);\r\n\t\t\t\t}\r\n\t\t\t\tif (idb && localChangesInUse.value) {\r\n\t\t\t\t\tawait localChanges.replaceDataIfChanged(idb, idbStore, data, filter);\r\n\t\t\t\t}\r\n\t\t\t\tif (filter) {\r\n\t\t\t\t\tdata = data.filter(filter);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tdata.sort(makeComparator('id'));\r\n\t\t\treturn data.map(x => new WasteDisposalSite(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 disposal site\r\n\t * @param {Number} id WasteDisposalSite ID\r\n\t * @returns (async) Returns a WasteDisposalSite 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) || (idb && localChangesInUse.value && await localChanges.isDataChanged(idb, idbStore, id));\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/WasteDisposalSites/' + 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\t// await filesApi.storeInIdb(data.attachments);\r\n\t\t\t}\r\n\t\t\treturn new WasteDisposalSite(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 disposal site\r\n\t * @param {WasteDisposalSite} model waste disposal site to create.\r\n\t * @returns (async) Returns the new WasteDisposalSite 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/WasteDisposalSites', {\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 WasteDisposalSite(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 disposal site\r\n\t * @param {WasteDisposalSite} model waste disposal site to update.\r\n\t * @returns (async) Returns the updated WasteDisposalSite 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/WasteDisposalSites/' + 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 WasteDisposalSite(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 disposal site\r\n\t * @param {WasteDisposalSite} model waste disposal site to update.\r\n\t * @param {WasteDisposalSite} oldModel old waste disposal site to determine updates to apply.\r\n\t * @returns (async) Returns the updated WasteDisposalSite 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 WasteDisposalSite ? model : new WasteDisposalSite(model);\r\n\t\t}\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/WasteDisposalSites/' + 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 WasteDisposalSite(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 waste disposal site\r\n\t * @param {Number} id WasteDisposalSite ID to delete.\r\n\t * @returns (async) Returns true if the request was successful (or not found), false if the waste disposal site 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/WasteDisposalSites/' + 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 PhAdjustmentMeasurement {\r\n\tconstructor(dto) {\r\n\t\tthis.id = getValue(dto, 'id', 'number', 0);\r\n\t\tthis.alkalineTypeUsed = getValue(dto, 'alkalineTypeUsed', 'string', '');\r\n\t\tthis.initialTimestamp = getDate(dto, 'initialTimestamp', null);\r\n\t\tthis.initialTemperature = getValue(dto, 'initialTemperature', 'number', 0);\r\n\t\tthis.initialPh = getValue(dto, 'initialPh', 'number', 0);\r\n\t\tthis.initialCorrectionFactor = getValue(dto, 'initialCorrectionFactor', 'number', 0);\r\n\t\tthis.initialCorrectedPh = getValue(dto, 'initialCorrectedPh', 'number', 0);\r\n\t\tthis.finalTimestamp = getDate(dto, 'finalTimestamp', null);\r\n\t\tthis.finalTemperature = getValue(dto, 'finalTemperature', 'number', 0);\r\n\t\tthis.finalPh = getValue(dto, 'finalPh', 'number', 0);\r\n\t\tthis.finalCorrectionFactor = getValue(dto, 'finalCorrectionFactor', 'number', 0);\r\n\t\tthis.finalCorrectedPh = getValue(dto, 'finalCorrectedPh', 'number', 0);\r\n\t}\r\n}\r\n","import { getArrayFromDto, getArrayOfObjectsFromDto as getTypedArray, getDateTimeFromDto as getDate, getObjectFromDto as getObject, getValueFromDto as getValue } from './_helpers.js';\r\nimport PhAdjustmentMeasurement from './PhAdjustmentMeasurement.js';\r\nimport User from './User.js';\r\nimport Vehicle from './Vehicle.js';\r\nimport WasteDisposalSite from './WasteDisposalSite.js';\r\nimport WasteType from './WasteType.js';\r\nimport WorkOrder from './WorkOrder.js';\r\n\r\nexport default class WasteDisposal {\r\n\tconstructor(dto) {\r\n\t\tthis.id = getValue(dto, 'id', 'number', 0);\r\n\t\tthis.wasteDisposalSiteId = getValue(dto, 'wasteDisposalSiteId', 'number', null);\r\n\t\tthis.wasteDisposalSite = getObject(dto, 'wasteDisposalSite', WasteDisposalSite, null);\r\n\t\tthis.timestamp = getDate(dto, 'timestamp', null);\r\n\t\tthis.wasteTypeId = getValue(dto, 'wasteTypeId', 'number', null);\r\n\t\tthis.wasteType = getObject(dto, 'wasteType', WasteType, null);\r\n\t\tthis.amountDisposed = getValue(dto, 'amountDisposed', 'number', 0);\r\n\t\tthis.disposalFee = getValue(dto, 'disposalFee', 'number', 0);\r\n\t\tthis.permitNumber = getValue(dto, 'permitNumber', 'string', null);\r\n\t\tthis.vehiclePermitNumber = getValue(dto, 'vehiclePermitNumber', 'string', null);\r\n\t\tthis.operatorInitials = getValue(dto, 'operatorInitials', 'string', null);\r\n\t\tthis.operatorId = getValue(dto, 'operatorId', 'number', null);\r\n\t\tthis.operator = getObject(dto, 'operator', User, null);\r\n\t\tthis.vehicleId = getValue(dto, 'vehicleId', 'number', null);\r\n\t\tthis.vehicle = getObject(dto, 'vehicle', Vehicle, null);\r\n\t\tthis.workOrderIds = getArrayFromDto(dto, 'workOrderIds', []);\r\n\t\tthis.workOrders = getTypedArray(dto, 'workOrders', WorkOrder, []);\r\n\t\tthis.vectorAttractionReductionMethod = getValue(dto, 'vectorAttractionReductionMethod', 'number', null);\r\n\t\tthis.phAdjustmentMeasurements = getObject(dto, 'phAdjustmentMeasurements', PhAdjustmentMeasurement, null);\r\n\t\tthis.vectorAttractionReductionTimestamp = getDate(dto, 'vectorAttractionReductionTimestamp', null);\r\n\t\tthis.vectorAttractionReductionName = getValue(dto, 'vectorAttractionReductionName', 'string', null);\r\n\t\tthis.pathogenReductionMethod = getValue(dto, 'pathogenReductionMethod', 'number', null);\r\n\r\n\t\tObject.defineProperty(this, 'wasteDisposalSite', { enumerable: false });\r\n\t\tObject.defineProperty(this, 'wasteType', { enumerable: false });\r\n\t\t// Object.defineProperty(this, 'disposalFee', { enumerable: false });\r\n\t\t// Object.defineProperty(this, 'permitNumber', { enumerable: false });\r\n\t\t// Object.defineProperty(this, 'vehiclePermitNumber', { enumerable: false });\r\n\t\t// Object.defineProperty(this, 'operatorInitials', { enumerable: false });\r\n\t\tObject.defineProperty(this, 'operator', { enumerable: false });\r\n\t\tObject.defineProperty(this, 'vehicle', { enumerable: false });\r\n\t\tObject.defineProperty(this, 'workOrders', { enumerable: false });\r\n\t}\r\n}\r\n","import { url as urlHelper } from '@/helpers/helpers';\r\nimport { getIdb, idbHelpers, localChanges, localChangesInUse, localIds } from '@/idb';\r\nimport LocalChange from '@/models/LocalChange';\r\nimport LocalChangeState from '@/models/LocalChangeState';\r\nimport PaginatedList from '@/models/PaginatedList';\r\nimport WasteDisposal from '@/models/WasteDisposal';\r\nimport { DateTime } from 'luxon';\r\nimport { fetchAllPages, fetchWrap, idbResponse, isIdbResponse, offlineResponse, setPagination } from '../_helpers';\r\nimport users from './users';\r\nimport vehicles from './vehicles';\r\nimport wasteDisposalSites from './wasteDisposalSites';\r\nimport workOrders from './workOrders';\r\n\r\nconst idbStoreName = 'wasteDisposals';\r\n\r\nasync function getAllFromIdb(idb, query, localOnly) {\r\n\tconst startDate = query.startDate ? DateTime.fromISO(query.startDate) : null;\r\n\tconst endDate = query.endDate ? DateTime.fromISO(query.endDate) : null;\r\n\tlet ids = null;\r\n\tif (query.customerLocationId) {\r\n\t\tids = new Set(await idbHelpers.getFiltered(idb, 'workOrders', x => x.customerLocationId == query.customerLocationId && x.wasteDisposalId, x => x.wasteDisposalId));\r\n\t} else if (query.customerId) {\r\n\t\tids = new Set(await idbHelpers.getFiltered(idb, 'workOrders', x => x.customerId == query.customerId && x.wasteDisposalId, x => x.wasteDisposalId));\r\n\t}\r\n\tconst data = [];\r\n\tawait idbHelpers.iterateCursor(idb, idbStoreName, x => {\r\n\t\tif ((!localOnly || x.id < 0) && (!ids || ids.has(x.id)) && (!query.vehicleId || x.vehicleId === query.vehicleId)) {\r\n\t\t\tx.timestamp = DateTime.fromISO(x.timestamp);\r\n\t\t\tif ((!startDate || x.timestamp >= startDate) && (!endDate || x.timestamp < endDate)) {\r\n\t\t\t\tdata.push(x);\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\treturn data.sort((a, b) => b.timestamp - a.timestamp);\r\n}\r\n\r\nasync function addLocalChanges(idb, query, data) {\r\n\t// prep for sorting\r\n\tfor (const x of data) {\r\n\t\tawait workOrders.idbReplaceLocalChanges(idb, x.workOrders);\r\n\t\tif (typeof x.timestamp === 'string') {\r\n\t\t\tx.timestamp = DateTime.fromISO(x.timestamp);\r\n\t\t}\r\n\t}\r\n\t// load local data\r\n\tconst newData = await getAllFromIdb(idb, query, true);\r\n\tdata.splice(data.length, 0, ...newData);\r\n\tdata.sort((a, b) => b.timestamp - a.timestamp);\r\n}\r\n\r\n/**\r\n * @param {import('idb').IDBPDatabase} idb\r\n * @param {WasteDisposal} model\r\n */\r\nasync function createOrUpdateInIdb(idb, model) {\r\n\tlet response;\r\n\tlet data = null;\r\n\tif (model.id === 0) {\r\n\t\tdata = JSON.parse(JSON.stringify(model));\r\n\t\tdata.id = await localIds.getNewId(idb, idbStoreName);\r\n\t\tawait idb.add(idbStoreName, data);\r\n\t\tawait localChanges.add(idb, new LocalChange({ storeName: idbStoreName, id: data.id, state: LocalChangeState.added }));\r\n\r\n\t\t// update waste disposal site\r\n\t\tconst idbSite = await idb.get('wasteDisposalSites', data.wasteDisposalSiteId);\r\n\t\tif (idbSite && idbSite.landDisposal && Array.isArray(idbSite.seasons)) {\r\n\t\t\tconst timestamp = model.timestamp;\r\n\t\t\tconst idbSeason = idbSite.seasons.find(x => DateTime.fromISO(x.dateOpen) <= timestamp && timestamp < DateTime.fromISO(x.dateClose)) ?? null;\r\n\t\t\tif (idbSeason) {\r\n\t\t\t\tidbSeason.capacityUsed += data.amountDisposed;\r\n\t\t\t\tidbSeason.siteFull = idbSeason.siteFull || idbSeason.capacityUsed >= idbSeason.capacityAvailable;\r\n\t\t\t\tawait idb.put('wasteDisposalSites', idbSite);\r\n\t\t\t\tawait localChanges.add(idb, new LocalChange({ storeName: 'wasteDisposalSites', id: idbSite.id, state: LocalChangeState.modifiedIndirectly }));\r\n\t\t\t}\r\n\t\t}\r\n\t\t// update work orders\r\n\t\tfor (const woId of data.workOrderIds) {\r\n\t\t\tconst idbWorkOrder = await idb.get('workOrders', woId);\r\n\t\t\tif (idbWorkOrder) {\r\n\t\t\t\tidbWorkOrder.wasteDisposalId = data.id;\r\n\t\t\t\tawait idb.put('workOrders', idbWorkOrder);\r\n\t\t\t\tawait localChanges.add(idb, new LocalChange({ storeName: 'workOrders', id: idbWorkOrder.id, state: LocalChangeState.modifiedIndirectly }));\r\n\t\t\t}\r\n\t\t}\r\n\t\tresponse = idbResponse(200);\r\n\t} else {\r\n\t\tconst oldData = await idb.get(idbStoreName, model.id);\r\n\t\tif (!!oldData) {\r\n\t\t\tdata = JSON.parse(JSON.stringify(model));\r\n\t\t\tawait idb.put(idbStoreName, data);\r\n\t\t\tawait localChanges.add(idb, new LocalChange({ storeName: idbStoreName, id: data.id, state: LocalChangeState.modified }));\r\n\r\n\t\t\t// update waste disposal site\r\n\t\t\tconst prevIdbSite = await idb.get('wasteDisposalSites', oldData.wasteDisposalSiteId);\r\n\t\t\tif (prevIdbSite && prevIdbSite.landDisposal && Array.isArray(prevIdbSite.seasons)) {\r\n\t\t\t\tconst timestamp = model.timestamp;\r\n\t\t\t\tconst idbSeason = prevIdbSite.seasons.find(x => DateTime.fromISO(x.dateOpen) <= timestamp && timestamp < DateTime.fromISO(x.dateClose)) ?? null;\r\n\t\t\t\tif (idbSeason) {\r\n\t\t\t\t\tidbSeason.capacityUsed -= oldData.amountDisposed;\r\n\t\t\t\t\tidbSeason.siteFull = idbSeason.capacityUsed >= idbSeason.capacityAvailable;\r\n\t\t\t\t\tawait idb.put('wasteDisposalSites', prevIdbSite);\r\n\t\t\t\t\tawait localChanges.add(idb, new LocalChange({ storeName: 'wasteDisposalSites', id: prevIdbSite.id, state: LocalChangeState.modifiedIndirectly }));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tconst idbSite = data.wasteDisposalSiteId === oldData.wasteDisposalSiteId ? prevIdbSite : await idb.get('wasteDisposalSites', data.wasteDisposalSiteId);\r\n\t\t\tif (idbSite && idbSite.landDisposal && Array.isArray(idbSite.seasons)) {\r\n\t\t\t\tconst timestamp = model.timestamp;\r\n\t\t\t\tconst idbSeason = idbSite.seasons.find(x => DateTime.fromISO(x.dateOpen) <= timestamp && timestamp < DateTime.fromISO(x.dateClose)) ?? null;\r\n\t\t\t\tif (idbSeason) {\r\n\t\t\t\t\tidbSeason.capacityUsed += data.amountDisposed;\r\n\t\t\t\t\tidbSeason.siteFull = idbSeason.siteFull || idbSeason.capacityUsed >= idbSeason.capacityAvailable;\r\n\t\t\t\t\tawait idb.put('wasteDisposalSites', idbSite);\r\n\t\t\t\t\tawait localChanges.add(idb, new LocalChange({ storeName: 'wasteDisposalSites', id: idbSite.id, state: LocalChangeState.modifiedIndirectly }));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// update work orders\r\n\t\t\tconst workOrderIds = new Set([...oldData.workOrderIds, ...data.workOrderIds]);\r\n\t\t\tfor (const woId of workOrderIds) {\r\n\t\t\t\tif (!data.workOrderIds.includes(woId)) {\r\n\t\t\t\t\t// !inNew && inOld, remove\r\n\t\t\t\t\tconst idbWorkOrder = await idb.get('workOrders', woId);\r\n\t\t\t\t\tif (idbWorkOrder) {\r\n\t\t\t\t\t\tidbWorkOrder.wasteDisposalId = null;\r\n\t\t\t\t\t\tawait idb.put('workOrders', idbWorkOrder);\r\n\t\t\t\t\t\tawait localChanges.add(idb, new LocalChange({ storeName: 'workOrders', id: idbWorkOrder.id, state: LocalChangeState.modifiedIndirectly }));\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (!oldData.workOrderIds.includes(woId)) {\r\n\t\t\t\t\t\t// inNew && !inOld, update\r\n\t\t\t\t\t\tconst idbWorkOrder = await idb.get('workOrders', woId);\r\n\t\t\t\t\t\tif (idbWorkOrder) {\r\n\t\t\t\t\t\t\tidbWorkOrder.wasteDisposalId = data.id;\r\n\t\t\t\t\t\t\tawait idb.put('workOrders', idbWorkOrder);\r\n\t\t\t\t\t\t\tawait localChanges.add(idb, new LocalChange({ storeName: 'workOrders', id: idbWorkOrder.id, state: LocalChangeState.modifiedIndirectly }));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// else inNew && inOld, no change needed\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tresponse = idbResponse(200);\r\n\t\t} else {\r\n\t\t\tresponse = idbResponse(404);\r\n\t\t}\r\n\t}\r\n\treturn { data, response };\r\n}\r\n\r\n/**\r\n * @param {import('idb').IDBPDatabase} idb\r\n * @param {number} id\r\n */\r\nasync function deleteInIdb(idb, id) {\r\n\tlet response;\r\n\tconst oldData = await idb.get(idbStoreName, id);\r\n\tif (!!oldData) {\r\n\t\tawait idb.delete(idbStoreName, id);\r\n\t\tawait localChanges.add(idb, new LocalChange({ storeName: idbStoreName, id: id, state: LocalChangeState.deleted }));\r\n\r\n\t\t// update waste disposal site\r\n\t\tconst prevIdbSite = await idb.get('wasteDisposalSites', oldData.wasteDisposalSiteId);\r\n\t\tif (prevIdbSite && prevIdbSite.landDisposal && Array.isArray(prevIdbSite.seasons)) {\r\n\t\t\tconst timestamp = model.timestamp;\r\n\t\t\tconst idbSeason = prevIdbSite.seasons.find(x => DateTime.fromISO(x.dateOpen) <= timestamp && timestamp < DateTime.fromISO(x.dateClose)) ?? null;\r\n\t\t\tif (idbSeason) {\r\n\t\t\t\tidbSeason.capacityUsed -= oldData.amountDisposed;\r\n\t\t\t\tidbSeason.siteFull = idbSeason.capacityUsed >= idbSeason.capacityAvailable;\r\n\t\t\t\tawait idb.put('wasteDisposalSites', prevIdbSite);\r\n\t\t\t\tawait localChanges.add(idb, new LocalChange({ storeName: 'wasteDisposalSites', id: prevIdbSite.id, state: LocalChangeState.modifiedIndirectly }));\r\n\t\t\t}\r\n\t\t}\r\n\t\t// update work orders\r\n\t\tfor (const woId of oldData.workOrderIds) {\r\n\t\t\tconst idbWorkOrder = await idb.get('workOrders', woId);\r\n\t\t\tif (idbWorkOrder) {\r\n\t\t\t\tidbWorkOrder.wasteDisposalId = null;\r\n\t\t\t\tawait idb.put('workOrders', idbWorkOrder);\r\n\t\t\t\tawait localChanges.add(idb, new LocalChange({ storeName: 'workOrders', id: idbWorkOrder.id, state: LocalChangeState.modifiedIndirectly }));\r\n\t\t\t}\r\n\t\t}\r\n\t\tresponse = idbResponse(200);\r\n\t} else {\r\n\t\tresponse = idbResponse(404);\r\n\t}\r\n\treturn response;\r\n}\r\n\r\nexport default {\r\n\t/**\r\n\t * Get paginated waste disposals\r\n\t * @param {Object} params request parameters.\r\n\t * @returns (async) Returns a PaginatedList of WasteDisposal objects if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getPaginated({ customerId = undefined, customerLocationId = undefined, vehicleId = undefined, wasteDisposalSiteId = undefined, userId = undefined, wasteTypeId = 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\t\tif (typeof vehicleId === 'number') {\r\n\t\t\tquery.vehicleId = vehicleId;\r\n\t\t}\r\n\t\tif (typeof wasteDisposalSiteId === 'number') {\r\n\t\t\tquery.wasteDisposalSiteId = wasteDisposalSiteId;\r\n\t\t}\r\n\t\tif (typeof userId === 'number') {\r\n\t\t\tquery.userId = userId;\r\n\t\t}\r\n\t\tif (typeof wasteTypeId === 'number') {\r\n\t\t\tquery.wasteTypeId = wasteTypeId;\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 allowedSorts = ['date-desc', 'date-asc'];\r\n\t\tif (typeof sort === 'string' && allowedSorts.includes(sort)) {\r\n\t\t\tquery.sort = sort;\r\n\t\t} else {\r\n\t\t\tquery.sort = allowedSorts[0];\r\n\t\t}\r\n\t\tconst url = urlHelper('/api/WasteDisposals', query);\r\n\t\tlet response, data = null;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap(url);\r\n\t\t\tif (response.ok) {\r\n\t\t\t\tdata = await response.json();\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 PaginatedList(data, x => new WasteDisposal(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 waste disposals\r\n\t * @param {Object} params request parameters.\r\n\t * @returns (async) Returns a PaginatedList of WasteDisposal objects if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getAll({ customerId = undefined, customerLocationId = undefined, vehicleId = 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 (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/WasteDisposals', query);\r\n\t\tconst idb = localChangesInUse.value ? await getIdb() : null;\r\n\t\tlet response, data = [];\r\n\t\ttry {\r\n\t\t\tresponse = await fetchAllPages(url, x => data.push(x));\r\n\t\t\tif (response.ok && idb) {\r\n\t\t\t\tawait addLocalChanges(idb, query, data);\r\n\t\t\t}\r\n\t\t} catch (e) {\r\n\t\t\tconsole.error(e)\r\n\t\t\tif (idb) {\r\n\t\t\t\tdata = await getAllFromIdb(idb, query);\r\n\t\t\t\tresponse = data ? idbResponse(200) : idbResponse(404);\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\tif (idb && !isIdbResponse(response) && !query.customerId && !query.customerLocationId && !query.vehicleId) {\r\n\t\t\t\tawait idbHelpers.replaceAll(idb, idbStoreName, data);\r\n\t\t\t}\r\n\t\t\treturn data.map(x => new WasteDisposal(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 disposal\r\n\t * @param {Number} id WasteDisposal ID\r\n\t * @returns (async) Returns a WasteDisposal if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getById(id) {\r\n\t\tconst idb = localChangesInUse.value ? await getIdb() : null;\r\n\t\tlet response;\r\n\t\tlet data = null;\r\n\t\ttry {\r\n\t\t\tif (id < 0 && idb) {\r\n\t\t\t\tthrow 'idb';\r\n\t\t\t} else {\r\n\t\t\t\tresponse = await fetchWrap('/api/WasteDisposals/' + id);\r\n\t\t\t\tif (response.ok) { data = await response.json(); }\r\n\t\t\t}\r\n\t\t} catch {\r\n\t\t\tif (idb) {\r\n\t\t\t\tdata = await idb.get(idbStoreName, id);\r\n\t\t\t\tresponse = data ? idbResponse(200) : idbResponse(404);\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\tconst model = new WasteDisposal(data);\r\n\t\t\tif (isIdbResponse(response)) {\r\n\t\t\t\tif (model.workOrderIds.length > 0 && model.workOrderIds.length <= 100) {\r\n\t\t\t\t\tmodel.workOrders = await workOrders.getByIds(model.workOrderIds);\r\n\t\t\t\t}\r\n\t\t\t\tmodel.wasteDisposalSite = await wasteDisposalSites.getById(model.wasteDisposalSiteId);\r\n\t\t\t\tmodel.operator = await users.getById(model.operatorId);\r\n\t\t\t\tmodel.vehicle = await vehicles.getById(model.vehicleId);\r\n\t\t\t}\r\n\t\t\treturn model;\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 disposal\r\n\t * @param {WasteDisposal} model waste disposal to create.\r\n\t * @returns (async) Returns the new WasteDisposal if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync create(model) {\r\n\t\tconst idb = localChangesInUse.value ? await getIdb() : null;\r\n\t\tlet response, data;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/WasteDisposals', {\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\tif (response.ok) { data = await response.json(); }\r\n\t\t} catch {\r\n\t\t\tif (idb) {\r\n\t\t\t\tconst result = await createOrUpdateInIdb(idb, model);\r\n\t\t\t\tdata = result.data;\r\n\t\t\t\tresponse = result.response;\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\tif (!isIdbResponse(response) && idb) {\r\n\t\t\t\tawait localIds.addLocalIdMap(idb, idbStoreName, model.id, data.id);\r\n\t\t\t\tif (model.id < 0) { await idb.delete(idbStoreName, model.id); }\r\n\t\t\t\tawait idb.put(idbStoreName, data);\r\n\t\t\t\tawait localChanges.deleteChange(idb, LocalChange.getKey(idbStoreName, model.id));\r\n\t\t\t}\r\n\t\t\treturn new WasteDisposal(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 * Update a waste disposal\r\n\t * @param {WasteDisposal} model waste disposal to update.\r\n\t * @returns (async) Returns the new WasteDisposal if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync update(model) {\r\n\t\tif (model.id <= 0) return this.create(model);\r\n\t\tconst idb = localChangesInUse.value ? await getIdb() : null;\r\n\t\tlet response, data;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/WasteDisposals/' + 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\tif (response.ok) { data = await response.json(); }\r\n\t\t} catch {\r\n\t\t\tif (idb) {\r\n\t\t\t\tconst result = await createOrUpdateInIdb(idb, model);\r\n\t\t\t\tdata = result.data;\r\n\t\t\t\tresponse = result.response;\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\tif (!isIdbResponse(response) && idb) {\r\n\t\t\t\tif (model.id < 0) { await idb.delete(idbStoreName, model.id); }\r\n\t\t\t\tawait idb.put(idbStoreName, data);\r\n\t\t\t\tawait localChanges.deleteChange(idb, LocalChange.getKey(idbStoreName, model.id));\r\n\t\t\t}\r\n\t\t\treturn new WasteDisposal(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 waste disposal\r\n\t * @param {Number} id WasteDisposal ID to delete.\r\n\t * @returns (async) Returns true if the request was successful (or not found), false if the waste disposal could not be deleted, otherwise a Response.\r\n\t */\r\n\tasync deleteById(id) {\r\n\t\tconst idb = localChangesInUse.value ? await getIdb() : null;\r\n\t\tlet response;\r\n\t\tlet useIdb = false;\r\n\t\ttry {\r\n\t\t\tif (id > 0) {\r\n\t\t\t\tresponse = await fetchWrap('/api/WasteDisposals/' + id, { method: 'DELETE' });\r\n\t\t\t} else {\r\n\t\t\t\tuseIdb = true;\r\n\t\t\t}\r\n\t\t} catch {\r\n\t\t\tuseIdb = true;\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (useIdb && !!idb) {\r\n\t\t\tresponse = await deleteInIdb(idb, id);\r\n\t\t}\r\n\t\tif (response.ok || response.status === 404) {\r\n\t\t\tif (!isIdbResponse(response) && idb) {\r\n\t\t\t\tawait idb.delete(idbStoreName, id);\r\n\t\t\t\tawait localChanges.deleteChange(idb, LocalChange.getKey(idbStoreName, id));\r\n\t\t\t}\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"],"names":["WasteDisposalSiteType","dto","getValue","WasteTypeAccepted","WasteDisposalSiteSeason","getDate","WasteDisposalSite","getObject","getTypedArray","a","b","Contact","FileReference","timestamp","DateTime","x","now","idbStore","wasteDisposalSitesApi","active","filters","idb","getIdb","response","data","useIdb","cache","fetchAllPages","offlineResponse","filter","idbHelpers","idbResponse","isIdbResponse","localChangesInUse","localChanges","makeComparator","id","fetchWrap","model","oldModel","oldData","newData","patch","jsonPatchCompare","PhAdjustmentMeasurement","WasteDisposal","WasteType","User","Vehicle","getArrayFromDto","WorkOrder","idbStoreName","getAllFromIdb","query","localOnly","startDate","endDate","ids","addLocalChanges","workOrders","createOrUpdateInIdb","localIds","LocalChange","LocalChangeState","idbSite","idbSeason","woId","idbWorkOrder","prevIdbSite","workOrderIds","deleteInIdb","wasteDisposalsApi","customerId","customerLocationId","vehicleId","wasteDisposalSiteId","userId","wasteTypeId","limit","start","sort","setPagination","allowedSorts","url","urlHelper","PaginatedList","e","wasteDisposalSites","users","vehicles","result"],"mappings":"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"}