diff --git a/helpers/functions.cache.d.ts b/helpers/functions.cache.d.ts index a7ce270e..bc10e310 100644 --- a/helpers/functions.cache.d.ts +++ b/helpers/functions.cache.d.ts @@ -16,11 +16,11 @@ export declare function getCommittalTypeById(committalTypeId: number): Promise; export declare function getWorkOrderTypeById(workOrderTypeId: number): Promise; export declare function getWorkOrderTypes(): Promise; -type CacheTableNames = 'BurialSiteStatuses' | 'BurialSiteTypeFields' | 'BurialSiteTypes' | 'CommittalTypes' | 'ContractTypeFields' | 'ContractTypePrints' | 'ContractTypes' | 'FeeCategories' | 'Fees' | 'IntermentContainerTypes' | 'WorkOrderMilestoneTypes' | 'WorkOrderTypes'; -export declare function clearCacheByTableName(tableName: CacheTableNames, relayMessage?: boolean): void; -export declare function clearCaches(): void; export declare function getWorkOrderMilestoneTypeById(workOrderMilestoneTypeId: number): Promise; export declare function getWorkOrderMilestoneTypeByWorkOrderMilestoneType(workOrderMilestoneTypeString: string): Promise; export declare function getWorkOrderMilestoneTypes(): Promise; export declare function preloadCaches(): Promise; +type CacheTableNames = 'BurialSiteStatuses' | 'BurialSiteTypeFields' | 'BurialSiteTypes' | 'CommittalTypes' | 'ContractTypeFields' | 'ContractTypePrints' | 'ContractTypes' | 'FeeCategories' | 'Fees' | 'IntermentContainerTypes' | 'WorkOrderMilestoneTypes' | 'WorkOrderTypes'; +export declare function clearCacheByTableName(tableName: CacheTableNames, relayMessage?: boolean): void; +export declare function clearCaches(): void; export {}; diff --git a/helpers/functions.cache.js b/helpers/functions.cache.js index 25013a99..525d3cb0 100644 --- a/helpers/functions.cache.js +++ b/helpers/functions.cache.js @@ -1,3 +1,5 @@ +// eslint-disable-next-line @eslint-community/eslint-comments/disable-enable-pair +/* eslint-disable perfectionist/sort-modules */ import cluster from 'node:cluster'; import Debug from 'debug'; import getBurialSiteStatusesFromDatabase from '../database/getBurialSiteStatuses.js'; @@ -137,6 +139,37 @@ function clearWorkOrderTypesCache() { * Work Order Milestone Types */ let workOrderMilestoneTypes; +export async function getWorkOrderMilestoneTypeById(workOrderMilestoneTypeId) { + const cachedWorkOrderMilestoneTypes = await getWorkOrderMilestoneTypes(); + return cachedWorkOrderMilestoneTypes.find((currentWorkOrderMilestoneType) => currentWorkOrderMilestoneType.workOrderMilestoneTypeId === + workOrderMilestoneTypeId); +} +export async function getWorkOrderMilestoneTypeByWorkOrderMilestoneType(workOrderMilestoneTypeString) { + const cachedWorkOrderMilestoneTypes = await getWorkOrderMilestoneTypes(); + const workOrderMilestoneTypeLowerCase = workOrderMilestoneTypeString.toLowerCase(); + return cachedWorkOrderMilestoneTypes.find((currentWorkOrderMilestoneType) => currentWorkOrderMilestoneType.workOrderMilestoneType.toLowerCase() === + workOrderMilestoneTypeLowerCase); +} +export async function getWorkOrderMilestoneTypes() { + workOrderMilestoneTypes ??= await getWorkOrderMilestoneTypesFromDatabase(); + return workOrderMilestoneTypes; +} +function clearWorkOrderMilestoneTypesCache() { + workOrderMilestoneTypes = undefined; +} +/* + * Cache Management + */ +export async function preloadCaches() { + debug('Preloading caches'); + await getBurialSiteStatuses(); + await getBurialSiteTypes(); + await getContractTypes(); + await getCommittalTypes(); + await getIntermentContainerTypes(); + await getWorkOrderTypes(); + await getWorkOrderMilestoneTypes(); +} export function clearCacheByTableName(tableName, relayMessage = true) { switch (tableName) { case 'BurialSiteStatuses': { @@ -201,34 +234,6 @@ export function clearCaches() { clearWorkOrderTypesCache(); clearWorkOrderMilestoneTypesCache(); } -export async function getWorkOrderMilestoneTypeById(workOrderMilestoneTypeId) { - const cachedWorkOrderMilestoneTypes = await getWorkOrderMilestoneTypes(); - return cachedWorkOrderMilestoneTypes.find((currentWorkOrderMilestoneType) => currentWorkOrderMilestoneType.workOrderMilestoneTypeId === - workOrderMilestoneTypeId); -} -export async function getWorkOrderMilestoneTypeByWorkOrderMilestoneType(workOrderMilestoneTypeString) { - const cachedWorkOrderMilestoneTypes = await getWorkOrderMilestoneTypes(); - const workOrderMilestoneTypeLowerCase = workOrderMilestoneTypeString.toLowerCase(); - return cachedWorkOrderMilestoneTypes.find((currentWorkOrderMilestoneType) => currentWorkOrderMilestoneType.workOrderMilestoneType.toLowerCase() === - workOrderMilestoneTypeLowerCase); -} -export async function getWorkOrderMilestoneTypes() { - workOrderMilestoneTypes ??= await getWorkOrderMilestoneTypesFromDatabase(); - return workOrderMilestoneTypes; -} -export async function preloadCaches() { - debug('Preloading caches'); - await getBurialSiteStatuses(); - await getBurialSiteTypes(); - await getContractTypes(); - await getCommittalTypes(); - await getIntermentContainerTypes(); - await getWorkOrderTypes(); - await getWorkOrderMilestoneTypes(); -} -function clearWorkOrderMilestoneTypesCache() { - workOrderMilestoneTypes = undefined; -} process.on('message', (message) => { if (message.messageType === 'clearCache' && message.pid !== process.pid) { debug(`Clearing cache: ${message.tableName}`); diff --git a/helpers/functions.cache.ts b/helpers/functions.cache.ts index 95e981f6..4c98a06b 100644 --- a/helpers/functions.cache.ts +++ b/helpers/functions.cache.ts @@ -1,3 +1,6 @@ +// eslint-disable-next-line @eslint-community/eslint-comments/disable-enable-pair +/* eslint-disable perfectionist/sort-modules */ + import cluster from 'node:cluster' import Debug from 'debug' @@ -254,6 +257,60 @@ function clearWorkOrderTypesCache(): void { let workOrderMilestoneTypes: WorkOrderMilestoneType[] | undefined +export async function getWorkOrderMilestoneTypeById( + workOrderMilestoneTypeId: number +): Promise { + const cachedWorkOrderMilestoneTypes = await getWorkOrderMilestoneTypes() + + return cachedWorkOrderMilestoneTypes.find( + (currentWorkOrderMilestoneType) => + currentWorkOrderMilestoneType.workOrderMilestoneTypeId === + workOrderMilestoneTypeId + ) +} + +export async function getWorkOrderMilestoneTypeByWorkOrderMilestoneType( + workOrderMilestoneTypeString: string +): Promise { + const cachedWorkOrderMilestoneTypes = await getWorkOrderMilestoneTypes() + + const workOrderMilestoneTypeLowerCase = + workOrderMilestoneTypeString.toLowerCase() + + return cachedWorkOrderMilestoneTypes.find( + (currentWorkOrderMilestoneType) => + currentWorkOrderMilestoneType.workOrderMilestoneType.toLowerCase() === + workOrderMilestoneTypeLowerCase + ) +} + +export async function getWorkOrderMilestoneTypes(): Promise< + WorkOrderMilestoneType[] +> { + workOrderMilestoneTypes ??= await getWorkOrderMilestoneTypesFromDatabase() + return workOrderMilestoneTypes +} + + +function clearWorkOrderMilestoneTypesCache(): void { + workOrderMilestoneTypes = undefined +} + +/* + * Cache Management + */ + +export async function preloadCaches(): Promise { + debug('Preloading caches') + await getBurialSiteStatuses() + await getBurialSiteTypes() + await getContractTypes() + await getCommittalTypes() + await getIntermentContainerTypes() + await getWorkOrderTypes() + await getWorkOrderMilestoneTypes() +} + type CacheTableNames = | 'BurialSiteStatuses' | 'BurialSiteTypeFields' @@ -346,55 +403,6 @@ export function clearCaches(): void { clearWorkOrderMilestoneTypesCache() } -export async function getWorkOrderMilestoneTypeById( - workOrderMilestoneTypeId: number -): Promise { - const cachedWorkOrderMilestoneTypes = await getWorkOrderMilestoneTypes() - - return cachedWorkOrderMilestoneTypes.find( - (currentWorkOrderMilestoneType) => - currentWorkOrderMilestoneType.workOrderMilestoneTypeId === - workOrderMilestoneTypeId - ) -} - -export async function getWorkOrderMilestoneTypeByWorkOrderMilestoneType( - workOrderMilestoneTypeString: string -): Promise { - const cachedWorkOrderMilestoneTypes = await getWorkOrderMilestoneTypes() - - const workOrderMilestoneTypeLowerCase = - workOrderMilestoneTypeString.toLowerCase() - - return cachedWorkOrderMilestoneTypes.find( - (currentWorkOrderMilestoneType) => - currentWorkOrderMilestoneType.workOrderMilestoneType.toLowerCase() === - workOrderMilestoneTypeLowerCase - ) -} - -export async function getWorkOrderMilestoneTypes(): Promise< - WorkOrderMilestoneType[] -> { - workOrderMilestoneTypes ??= await getWorkOrderMilestoneTypesFromDatabase() - return workOrderMilestoneTypes -} - -export async function preloadCaches(): Promise { - debug('Preloading caches') - await getBurialSiteStatuses() - await getBurialSiteTypes() - await getContractTypes() - await getCommittalTypes() - await getIntermentContainerTypes() - await getWorkOrderTypes() - await getWorkOrderMilestoneTypes() -} - -function clearWorkOrderMilestoneTypesCache(): void { - workOrderMilestoneTypes = undefined -} - process.on('message', (message: WorkerMessage) => { if (message.messageType === 'clearCache' && message.pid !== process.pid) { debug(`Clearing cache: ${(message as ClearCacheWorkerMessage).tableName}`) diff --git a/public/javascripts/burialSite.edit.js b/public/javascripts/burialSite.edit.js index 72d7bd76..8da69ea8 100644 --- a/public/javascripts/burialSite.edit.js +++ b/public/javascripts/burialSite.edit.js @@ -192,7 +192,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); latitudeElement: document.querySelector('#burialSite--burialSiteLatitude'), longitudeElement: document.querySelector('#burialSite--burialSiteLongitude'), callbackFunction: () => { - sunrise.setUnsavedChanges(); + setUnsavedChanges(); } }); }); diff --git a/public/javascripts/burialSite.edit.ts b/public/javascripts/burialSite.edit.ts index 5cc828a0..46fb30a4 100644 --- a/public/javascripts/burialSite.edit.ts +++ b/public/javascripts/burialSite.edit.ts @@ -298,7 +298,7 @@ declare const exports: Record ) as HTMLInputElement, callbackFunction: () => { - sunrise.setUnsavedChanges() + setUnsavedChanges() } }) }) diff --git a/public/javascripts/cemetery.edit.js b/public/javascripts/cemetery.edit.js index 07eec6c1..642c6e0c 100644 --- a/public/javascripts/cemetery.edit.js +++ b/public/javascripts/cemetery.edit.js @@ -15,7 +15,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); latitudeElement: document.querySelector('#cemetery--cemeteryLatitude'), longitudeElement: document.querySelector('#cemetery--cemeteryLongitude'), callbackFunction: () => { - sunrise.setUnsavedChanges(); + setUnsavedChanges(); } }); }); diff --git a/public/javascripts/cemetery.edit.ts b/public/javascripts/cemetery.edit.ts index 0fd69ebd..6f4d2c2d 100644 --- a/public/javascripts/cemetery.edit.ts +++ b/public/javascripts/cemetery.edit.ts @@ -34,7 +34,7 @@ declare const exports: Record ) as HTMLInputElement, callbackFunction: () => { - sunrise.setUnsavedChanges() + setUnsavedChanges() } }) }) diff --git a/public/javascripts/fees.admin.js b/public/javascripts/fees.admin.js index 451be117..0315268d 100644 --- a/public/javascripts/fees.admin.js +++ b/public/javascripts/fees.admin.js @@ -5,6 +5,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const sunrise = exports.sunrise; const feeCategoriesContainerElement = document.querySelector('#container--feeCategories'); + const feeCategoryContainerClassName = 'container--feeCategory'; + const feeCategoryContainerSelector = `.${feeCategoryContainerClassName}`; let feeCategories = exports.feeCategories; delete exports.feeCategories; function getFeeCategory(feeCategoryId) { @@ -24,7 +26,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); feeCategoriesContainerElement.innerHTML = ''; for (const feeCategory of feeCategories) { const feeCategoryContainerElement = document.createElement('section'); - feeCategoryContainerElement.className = 'panel container--feeCategory'; + feeCategoryContainerElement.className = `panel ${feeCategoryContainerClassName}`; feeCategoryContainerElement.dataset.feeCategoryId = feeCategory.feeCategoryId.toString(); // eslint-disable-next-line no-unsanitized/property @@ -221,7 +223,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); }); function openEditFeeCategory(clickEvent) { - const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest('.container--feeCategory').dataset.feeCategoryId ?? '', 10); + const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest(feeCategoryContainerSelector).dataset.feeCategoryId ?? '', 10); const feeCategory = getFeeCategory(feeCategoryId); let editCloseModalFunction; function doUpdateFeeCategory(submitEvent) { @@ -266,7 +268,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); } function confirmDeleteFeeCategory(clickEvent) { - const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest('.container--feeCategory').dataset.feeCategoryId ?? '', 10); + const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest(feeCategoryContainerSelector).dataset.feeCategoryId ?? '', 10); function doDelete() { cityssm.postJSON(`${sunrise.urlPrefix}/admin/doDeleteFeeCategory`, { feeCategoryId @@ -297,8 +299,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); } function moveFeeCategory(clickEvent) { const buttonElement = clickEvent.currentTarget; - const feeCategoryId = buttonElement.closest('.container--feeCategory').dataset - .feeCategoryId ?? ''; + const feeCategoryId = buttonElement.closest(feeCategoryContainerSelector) + .dataset.feeCategoryId ?? ''; cityssm.postJSON(`${sunrise.urlPrefix}/admin/${buttonElement.dataset.direction === 'up' ? 'doMoveFeeCategoryUp' : 'doMoveFeeCategoryDown'}`, { @@ -323,7 +325,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); * Fees */ function openAddFee(clickEvent) { - const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest('.container--feeCategory').dataset.feeCategoryId ?? '', 10); + const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest(feeCategoryContainerSelector).dataset.feeCategoryId ?? '', 10); let addCloseModalFunction; function doAddFee(submitEvent) { submitEvent.preventDefault(); @@ -427,7 +429,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); clickEvent.preventDefault(); const feeContainerElement = clickEvent.currentTarget.closest('.container--fee'); const feeId = Number.parseInt(feeContainerElement.dataset.feeId ?? '', 10); - const feeCategoryId = Number.parseInt(feeContainerElement.closest('.container--feeCategory') + const feeCategoryId = Number.parseInt(feeContainerElement.closest(feeCategoryContainerSelector) .dataset.feeCategoryId ?? ''); const feeCategory = getFeeCategory(feeCategoryId); const fee = getFee(feeCategory, feeId); @@ -472,7 +474,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); clickEvent.preventDefault(); const feeContainerElement = clickEvent.currentTarget.closest('.container--fee'); const feeId = Number.parseInt(feeContainerElement.dataset.feeId ?? '', 10); - const feeCategoryId = Number.parseInt(feeContainerElement.closest('.container--feeCategory') + const feeCategoryId = Number.parseInt(feeContainerElement.closest(feeCategoryContainerSelector) .dataset.feeCategoryId ?? ''); const feeCategory = getFeeCategory(feeCategoryId); const fee = getFee(feeCategory, feeId); diff --git a/public/javascripts/fees.admin.ts b/public/javascripts/fees.admin.ts index 59299f1b..4b06ae8a 100644 --- a/public/javascripts/fees.admin.ts +++ b/public/javascripts/fees.admin.ts @@ -24,6 +24,9 @@ declare const exports: Record '#container--feeCategories' ) as HTMLElement + const feeCategoryContainerClassName = 'container--feeCategory' + const feeCategoryContainerSelector = `.${feeCategoryContainerClassName}` + let feeCategories = exports.feeCategories as FeeCategory[] delete exports.feeCategories @@ -66,7 +69,7 @@ declare const exports: Record for (const feeCategory of feeCategories) { const feeCategoryContainerElement = document.createElement('section') - feeCategoryContainerElement.className = 'panel container--feeCategory' + feeCategoryContainerElement.className = `panel ${feeCategoryContainerClassName}` feeCategoryContainerElement.dataset.feeCategoryId = feeCategory.feeCategoryId.toString() @@ -343,7 +346,7 @@ declare const exports: Record const feeCategoryId = Number.parseInt( ( (clickEvent.currentTarget as HTMLElement).closest( - '.container--feeCategory' + feeCategoryContainerSelector ) as HTMLElement ).dataset.feeCategoryId ?? '', 10 @@ -423,7 +426,7 @@ declare const exports: Record const feeCategoryId = Number.parseInt( ( (clickEvent.currentTarget as HTMLElement).closest( - '.container--feeCategory' + feeCategoryContainerSelector ) as HTMLElement ).dataset.feeCategoryId ?? '', 10 @@ -467,8 +470,8 @@ declare const exports: Record const buttonElement = clickEvent.currentTarget as HTMLButtonElement const feeCategoryId = - (buttonElement.closest('.container--feeCategory') as HTMLElement).dataset - .feeCategoryId ?? '' + (buttonElement.closest(feeCategoryContainerSelector) as HTMLElement) + .dataset.feeCategoryId ?? '' cityssm.postJSON( `${sunrise.urlPrefix}/admin/${ @@ -505,7 +508,7 @@ declare const exports: Record const feeCategoryId = Number.parseInt( ( (clickEvent.currentTarget as HTMLElement).closest( - '.container--feeCategory' + feeCategoryContainerSelector ) as HTMLElement ).dataset.feeCategoryId ?? '', 10 @@ -675,7 +678,7 @@ declare const exports: Record const feeId = Number.parseInt(feeContainerElement.dataset.feeId ?? '', 10) const feeCategoryId = Number.parseInt( - (feeContainerElement.closest('.container--feeCategory') as HTMLElement) + (feeContainerElement.closest(feeCategoryContainerSelector) as HTMLElement) .dataset.feeCategoryId ?? '' ) @@ -754,7 +757,7 @@ declare const exports: Record const feeId = Number.parseInt(feeContainerElement.dataset.feeId ?? '', 10) const feeCategoryId = Number.parseInt( - (feeContainerElement.closest('.container--feeCategory') as HTMLElement) + (feeContainerElement.closest(feeCategoryContainerSelector) as HTMLElement) .dataset.feeCategoryId ?? '' ) diff --git a/public/javascripts/main.js b/public/javascripts/main.js index 314a80a1..f0ec6c49 100644 --- a/public/javascripts/main.js +++ b/public/javascripts/main.js @@ -44,6 +44,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); /* * Leaflet Mapping */ + const coordinatePrecision = 8; const leafletConstants = { tileLayerURL: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', defaultZoom: 15, @@ -98,8 +99,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); clickEvent.preventDefault(); if (currentMarker !== undefined) { const mapCoordinates = currentMarker.getLatLng(); - options.latitudeElement.value = mapCoordinates.lat.toFixed(8); - options.longitudeElement.value = mapCoordinates.lng.toFixed(8); + options.latitudeElement.value = mapCoordinates.lat.toFixed(coordinatePrecision); + options.longitudeElement.value = mapCoordinates.lng.toFixed(coordinatePrecision); options.callbackFunction(mapCoordinates.lat, mapCoordinates.lng); } closeModalFunction(); diff --git a/public/javascripts/main.ts b/public/javascripts/main.ts index 381c44ab..44476d79 100644 --- a/public/javascripts/main.ts +++ b/public/javascripts/main.ts @@ -92,6 +92,8 @@ declare const exports: Record & { * Leaflet Mapping */ + const coordinatePrecision = 8 + const leafletConstants = { tileLayerURL: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', @@ -171,8 +173,8 @@ declare const exports: Record & { if (currentMarker !== undefined) { const mapCoordinates = currentMarker.getLatLng() as Leaflet.LatLng - options.latitudeElement.value = mapCoordinates.lat.toFixed(8) - options.longitudeElement.value = mapCoordinates.lng.toFixed(8) + options.latitudeElement.value = mapCoordinates.lat.toFixed(coordinatePrecision) + options.longitudeElement.value = mapCoordinates.lng.toFixed(coordinatePrecision) options.callbackFunction(mapCoordinates.lat, mapCoordinates.lng) } diff --git a/temp/legacyImportFromCsv/index.js b/temp/legacyImportFromCsv/index.js index 542df54e..08bfe57d 100644 --- a/temp/legacyImportFromCsv/index.js +++ b/temp/legacyImportFromCsv/index.js @@ -37,45 +37,6 @@ const user = { apiKey: '' } }; -function purgeTables() { - console.time('purgeTables'); - const tablesToPurge = [ - 'WorkOrderMilestones', - 'WorkOrderComments', - 'WorkOrderBurialSites', - 'WorkOrderContracts', - 'WorkOrders', - 'ContractTransactions', - 'ContractFees', - 'ContractFields', - 'ContractComments', - 'ContractInterments', - 'Contracts', - 'FuneralHomes', - 'BurialSiteFields', - 'BurialSiteComments', - 'BurialSites' - ]; - const database = sqlite(databasePath); - for (const tableName of tablesToPurge) { - database.prepare(`delete from ${tableName}`).run(); - database - .prepare('delete from sqlite_sequence where name = ?') - .run(tableName); - } - database.close(); - console.timeEnd('purgeTables'); -} -function purgeConfigTables() { - console.time('purgeConfigTables'); - const database = sqlite(databasePath); - database.prepare('delete from Cemeteries').run(); - database - .prepare("delete from sqlite_sequence where name in ('Cemeteries')") - .run(); - database.close(); - console.timeEnd('purgeConfigTables'); -} function formatDateString(year, month, day) { const formattedYear = `0000${year}`.slice(-4); const formattedMonth = `00${month}`.slice(-2); @@ -111,8 +72,11 @@ async function importFromMasterCSV() { (masterRow.CM_RANGE2 === '0' ? '' : masterRow.CM_RANGE2); const burialSiteNameSegment3 = (masterRow.CM_LOT1 === '0' ? '' : masterRow.CM_LOT1) + (masterRow.CM_LOT2 === '0' ? '' : masterRow.CM_LOT2); - const burialSiteNameSegment4 = (masterRow.CM_GRAVE1 === '0' ? '' : masterRow.CM_GRAVE1) + + let burialSiteNameSegment4 = (masterRow.CM_GRAVE1 === '0' ? '' : masterRow.CM_GRAVE1) + (masterRow.CM_GRAVE2 === '0' ? '' : masterRow.CM_GRAVE2); + if (burialSiteNameSegment4 === '') { + burialSiteNameSegment4 = '1'; + } const burialSiteName = buildBurialSiteName(masterRow.CM_CEMETERY, { burialSiteNameSegment1, burialSiteNameSegment2, @@ -180,8 +144,8 @@ async function importFromMasterCSV() { purchaserAddress1: masterRow.CM_ADDRESS, purchaserAddress2: '', purchaserCity: masterRow.CM_CITY, - purchaserProvince: masterRow.CM_PROV, purchaserPostalCode, + purchaserProvince: masterRow.CM_PROV, purchaserEmail: '', purchaserPhoneNumber: '', deceasedName: masterRow.CM_DECEASED_NAME === '' @@ -190,8 +154,8 @@ async function importFromMasterCSV() { deceasedAddress1: masterRow.CM_ADDRESS, deceasedAddress2: '', deceasedCity: masterRow.CM_CITY, - deceasedProvince: masterRow.CM_PROV, - deceasedPostalCode: purchaserPostalCode + deceasedPostalCode: purchaserPostalCode, + deceasedProvince: masterRow.CM_PROV }, user); if (masterRow.CM_REMARK1 !== '') { await addContractComment({ @@ -281,16 +245,16 @@ async function importFromMasterCSV() { purchaserAddress1: masterRow.CM_ADDRESS, purchaserAddress2: '', purchaserCity: masterRow.CM_CITY, - purchaserProvince: masterRow.CM_PROV, purchaserPostalCode: deceasedPostalCode, - purchaserPhoneNumber: '', + purchaserProvince: masterRow.CM_PROV, purchaserEmail: '', + purchaserPhoneNumber: '', deceasedName: masterRow.CM_DECEASED_NAME, deceasedAddress1: masterRow.CM_ADDRESS, deceasedAddress2: '', deceasedCity: masterRow.CM_CITY, - deceasedProvince: masterRow.CM_PROV, deceasedPostalCode, + deceasedProvince: masterRow.CM_PROV, birthDateString: '', birthPlace: '', deathDateString, @@ -363,8 +327,11 @@ async function importFromPrepaidCSV() { (prepaidRow.CMPP_RANGE2 === '0' ? '' : prepaidRow.CMPP_RANGE2); const burialSiteNameSegment3 = (prepaidRow.CMPP_LOT1 === '0' ? '' : prepaidRow.CMPP_LOT1) + (prepaidRow.CMPP_LOT2 === '0' ? '' : prepaidRow.CMPP_LOT2); - const burialSiteNameSegment4 = (prepaidRow.CMPP_GRAVE1 === '0' ? '' : prepaidRow.CMPP_GRAVE1) + + let burialSiteNameSegment4 = (prepaidRow.CMPP_GRAVE1 === '0' ? '' : prepaidRow.CMPP_GRAVE1) + (prepaidRow.CMPP_GRAVE2 === '0' ? '' : prepaidRow.CMPP_GRAVE2); + if (burialSiteNameSegment4 === '') { + burialSiteNameSegment4 = '1'; + } const burialSiteName = buildBurialSiteName(cemeteryKey, { burialSiteNameSegment1, burialSiteNameSegment2, @@ -596,8 +563,11 @@ async function importFromWorkOrderCSV() { (workOrderRow.WO_RANGE2 === '0' ? '' : workOrderRow.WO_RANGE2); const burialSiteNameSegment3 = (workOrderRow.WO_LOT1 === '0' ? '' : workOrderRow.WO_LOT1) + (workOrderRow.WO_LOT2 === '0' ? '' : workOrderRow.WO_LOT2); - const burialSiteNameSegment4 = (workOrderRow.WO_GRAVE1 === '0' ? '' : workOrderRow.WO_GRAVE1) + + let burialSiteNameSegment4 = (workOrderRow.WO_GRAVE1 === '0' ? '' : workOrderRow.WO_GRAVE1) + (workOrderRow.WO_GRAVE2 === '0' ? '' : workOrderRow.WO_GRAVE2); + if (burialSiteNameSegment4 === '') { + burialSiteNameSegment4 = '1'; + } const burialSiteName = buildBurialSiteName(workOrderRow.WO_CEMETERY, { burialSiteNameSegment1, burialSiteNameSegment2, @@ -806,6 +776,45 @@ async function importFromWorkOrderCSV() { } console.timeEnd('importFromWorkOrderCSV'); } +function purgeConfigTables() { + console.time('purgeConfigTables'); + const database = sqlite(databasePath); + database.prepare('delete from Cemeteries').run(); + database + .prepare("delete from sqlite_sequence where name in ('Cemeteries')") + .run(); + database.close(); + console.timeEnd('purgeConfigTables'); +} +function purgeTables() { + console.time('purgeTables'); + const tablesToPurge = [ + 'WorkOrderMilestones', + 'WorkOrderComments', + 'WorkOrderBurialSites', + 'WorkOrderContracts', + 'WorkOrders', + 'ContractTransactions', + 'ContractFees', + 'ContractFields', + 'ContractComments', + 'ContractInterments', + 'Contracts', + 'FuneralHomes', + 'BurialSiteFields', + 'BurialSiteComments', + 'BurialSites' + ]; + const database = sqlite(databasePath); + for (const tableName of tablesToPurge) { + database.prepare(`delete from ${tableName}`).run(); + database + .prepare('delete from sqlite_sequence where name = ?') + .run(tableName); + } + database.close(); + console.timeEnd('purgeTables'); +} console.log(`Started ${new Date().toLocaleString()}`); console.time('importFromCsv'); // Purge Tables diff --git a/temp/legacyImportFromCsv/index.ts b/temp/legacyImportFromCsv/index.ts index 47de92f8..e6039ec6 100644 --- a/temp/legacyImportFromCsv/index.ts +++ b/temp/legacyImportFromCsv/index.ts @@ -195,58 +195,11 @@ const user: User = { userProperties: { canUpdate: true, isAdmin: false, + apiKey: '' } } -function purgeTables(): void { - console.time('purgeTables') - - const tablesToPurge = [ - 'WorkOrderMilestones', - 'WorkOrderComments', - 'WorkOrderBurialSites', - 'WorkOrderContracts', - 'WorkOrders', - 'ContractTransactions', - 'ContractFees', - 'ContractFields', - 'ContractComments', - 'ContractInterments', - 'Contracts', - 'FuneralHomes', - 'BurialSiteFields', - 'BurialSiteComments', - 'BurialSites' - ] - - const database = sqlite(databasePath) - - for (const tableName of tablesToPurge) { - database.prepare(`delete from ${tableName}`).run() - database - .prepare('delete from sqlite_sequence where name = ?') - .run(tableName) - } - - database.close() - - console.timeEnd('purgeTables') -} - -function purgeConfigTables(): void { - console.time('purgeConfigTables') - - const database = sqlite(databasePath) - database.prepare('delete from Cemeteries').run() - database - .prepare("delete from sqlite_sequence where name in ('Cemeteries')") - .run() - database.close() - - console.timeEnd('purgeConfigTables') -} - function formatDateString( year: string, month: string, @@ -301,10 +254,15 @@ async function importFromMasterCSV(): Promise { const burialSiteNameSegment3 = (masterRow.CM_LOT1 === '0' ? '' : masterRow.CM_LOT1) + (masterRow.CM_LOT2 === '0' ? '' : masterRow.CM_LOT2) - const burialSiteNameSegment4 = + + let burialSiteNameSegment4 = (masterRow.CM_GRAVE1 === '0' ? '' : masterRow.CM_GRAVE1) + (masterRow.CM_GRAVE2 === '0' ? '' : masterRow.CM_GRAVE2) + if (burialSiteNameSegment4 === '') { + burialSiteNameSegment4 = '1' + } + const burialSiteName = buildBurialSiteName(masterRow.CM_CEMETERY, { burialSiteNameSegment1, burialSiteNameSegment2, @@ -413,11 +371,12 @@ async function importFromMasterCSV(): Promise { contractTypeFieldIds: '', purchaserName: masterRow.CM_PRENEED_OWNER, + purchaserAddress1: masterRow.CM_ADDRESS, purchaserAddress2: '', purchaserCity: masterRow.CM_CITY, - purchaserProvince: masterRow.CM_PROV, purchaserPostalCode, + purchaserProvince: masterRow.CM_PROV, purchaserEmail: '', purchaserPhoneNumber: '', @@ -430,8 +389,8 @@ async function importFromMasterCSV(): Promise { deceasedAddress1: masterRow.CM_ADDRESS, deceasedAddress2: '', deceasedCity: masterRow.CM_CITY, - deceasedProvince: masterRow.CM_PROV, - deceasedPostalCode: purchaserPostalCode + deceasedPostalCode: purchaserPostalCode, + deceasedProvince: masterRow.CM_PROV }, user ) @@ -592,17 +551,19 @@ async function importFromMasterCSV(): Promise { purchaserAddress1: masterRow.CM_ADDRESS, purchaserAddress2: '', purchaserCity: masterRow.CM_CITY, - purchaserProvince: masterRow.CM_PROV, purchaserPostalCode: deceasedPostalCode, - purchaserPhoneNumber: '', + purchaserProvince: masterRow.CM_PROV, + purchaserEmail: '', + purchaserPhoneNumber: '', deceasedName: masterRow.CM_DECEASED_NAME, + deceasedAddress1: masterRow.CM_ADDRESS, deceasedAddress2: '', deceasedCity: masterRow.CM_CITY, - deceasedProvince: masterRow.CM_PROV, deceasedPostalCode, + deceasedProvince: masterRow.CM_PROV, birthDateString: '', birthPlace: '', @@ -712,10 +673,14 @@ async function importFromPrepaidCSV(): Promise { (prepaidRow.CMPP_LOT1 === '0' ? '' : prepaidRow.CMPP_LOT1) + (prepaidRow.CMPP_LOT2 === '0' ? '' : prepaidRow.CMPP_LOT2) - const burialSiteNameSegment4 = + let burialSiteNameSegment4 = (prepaidRow.CMPP_GRAVE1 === '0' ? '' : prepaidRow.CMPP_GRAVE1) + (prepaidRow.CMPP_GRAVE2 === '0' ? '' : prepaidRow.CMPP_GRAVE2) + if (burialSiteNameSegment4 === '') { + burialSiteNameSegment4 = '1' + } + const burialSiteName = buildBurialSiteName(cemeteryKey, { burialSiteNameSegment1, burialSiteNameSegment2, @@ -1058,10 +1023,14 @@ async function importFromWorkOrderCSV(): Promise { const burialSiteNameSegment3 = (workOrderRow.WO_LOT1 === '0' ? '' : workOrderRow.WO_LOT1) + (workOrderRow.WO_LOT2 === '0' ? '' : workOrderRow.WO_LOT2) - const burialSiteNameSegment4 = + let burialSiteNameSegment4 = (workOrderRow.WO_GRAVE1 === '0' ? '' : workOrderRow.WO_GRAVE1) + (workOrderRow.WO_GRAVE2 === '0' ? '' : workOrderRow.WO_GRAVE2) + if (burialSiteNameSegment4 === '') { + burialSiteNameSegment4 = '1' + } + const burialSiteName = buildBurialSiteName(workOrderRow.WO_CEMETERY, { burialSiteNameSegment1, burialSiteNameSegment2, @@ -1407,6 +1376,54 @@ async function importFromWorkOrderCSV(): Promise { console.timeEnd('importFromWorkOrderCSV') } +function purgeConfigTables(): void { + console.time('purgeConfigTables') + + const database = sqlite(databasePath) + database.prepare('delete from Cemeteries').run() + database + .prepare("delete from sqlite_sequence where name in ('Cemeteries')") + .run() + database.close() + + console.timeEnd('purgeConfigTables') +} + +function purgeTables(): void { + console.time('purgeTables') + + const tablesToPurge = [ + 'WorkOrderMilestones', + 'WorkOrderComments', + 'WorkOrderBurialSites', + 'WorkOrderContracts', + 'WorkOrders', + 'ContractTransactions', + 'ContractFees', + 'ContractFields', + 'ContractComments', + 'ContractInterments', + 'Contracts', + 'FuneralHomes', + 'BurialSiteFields', + 'BurialSiteComments', + 'BurialSites' + ] + + const database = sqlite(databasePath) + + for (const tableName of tablesToPurge) { + database.prepare(`delete from ${tableName}`).run() + database + .prepare('delete from sqlite_sequence where name = ?') + .run(tableName) + } + + database.close() + + console.timeEnd('purgeTables') +} + console.log(`Started ${new Date().toLocaleString()}`) console.time('importFromCsv') diff --git a/types/configTypes.d.ts b/types/configTypes.d.ts index 155bbdd2..a9404edc 100644 --- a/types/configTypes.d.ts +++ b/types/configTypes.d.ts @@ -61,9 +61,9 @@ export interface Config { dynamicsGP?: { integrationIsEnabled: boolean; mssqlConfig?: MSSQLConfig; - lookupOrder?: DynamicsGPLookup[]; accountCodes?: string[]; itemNumbers?: string[]; + lookupOrder?: DynamicsGPLookup[]; trialBalanceCodes?: string[]; }; }; diff --git a/types/configTypes.ts b/types/configTypes.ts index 722b0de6..31fe4e9c 100644 --- a/types/configTypes.ts +++ b/types/configTypes.ts @@ -79,9 +79,10 @@ export interface Config { dynamicsGP?: { integrationIsEnabled: boolean mssqlConfig?: MSSQLConfig - lookupOrder?: DynamicsGPLookup[] + accountCodes?: string[] itemNumbers?: string[] + lookupOrder?: DynamicsGPLookup[] trialBalanceCodes?: string[] } } diff --git a/views/login.ejs b/views/login.ejs index c1883c31..909297d8 100644 --- a/views/login.ejs +++ b/views/login.ejs @@ -1,5 +1,6 @@ -')"> +')"> @@ -39,13 +40,16 @@ </span> </div> <div class="control is-expanded"> - <input class="input" id="login--userName" name="userName" type="text" placeholder="User Name" value="<%= userName %>" aria-label="User Name" autofocus required /> + <input class="input" id="login--userName" name="userName" type="text" + placeholder="User Name" value="<%= userName %>" aria-label="User Name" + autofocus required /> </div> </div> <div class="field"> <label class="sr-only" for="login--password">Password</label> <div class="control has-icons-left has-tooltip-right" data-tooltip="Password" > - <input class="input" id="login--password" name="password" type="password" placeholder="Password" required /> + <input class="input" id="login--password" name="password" type="password" + placeholder="Password" required /> <span class="icon is-small is-left"> <i class="fas fa-key" aria-hidden="true"></i> </span> diff --git a/views/workOrder-view.ejs b/views/workOrder-view.ejs index c8899ce6..bac531a1 100644 --- a/views/workOrder-view.ejs +++ b/views/workOrder-view.ejs @@ -85,7 +85,7 @@ <button class="button is-warning" id="button--reopenWorkOrder" data-work-order-id="<%= workOrder.workOrderId %>" type="button"> <span class="icon"><i class="fas fa-undo" aria-hidden="true"></i></span> <span>Reopen Work Order</span> - </button> + </button> <% } else { %> <a class="button is-primary" href="<%= urlPrefix %>/workOrders/<%= workOrder.workOrderId %>/edit" @@ -162,123 +162,123 @@ </ul> </div> <div class="tab-container"> - <div class="<%= (tabToSelect === "contracts" ? "" : "is-hidden") %>" id="relatedTab--contracts"> - <% if (workOrder.workOrderContracts.length === 0) { %> - <div class="message is-info"> - <p class="message-body"> - There are no contracts associated with this work order. - </p> - </div> - <% } else { %> - <% const currentDate = dateTimeFunctions.dateToInteger(new Date()); %> - <table class="table is-fullwidth is-striped is-hoverable"> - <thead> - <tr> - <th class="has-width-1"></th> - <th>Contract Type</th> - <th>Burial Site</th> - <th>Contract Date</th> - <th>End Date</th> - <th>Contacts</th> - </tr> - </thead> - <tbody> - <% for (const contract of workOrder.workOrderContracts) { %> - <% const isActive = !(contract.contractEndDate && contract.contractEndDate < currentDate); %> - <tr> - <td class="has-text-centered"> - <% if (isActive) { %> - <i class="fas fa-play" title="Current Contract"></i> - <% } else { %> - <i class="fas fa-stop" title="Previous Contract"></i> - <% } %> - </td> - <td> - <a class="has-text-weight-bold" - href="<%= urlPrefix %>/contracts/<%= contract.contractId %>"> - <%= contract.contractType %> - </a><br /> - <span class="is-size-7"> - #<%= contract.contractId %> - </span> - </td> - <td> - <% if (contract.burialSiteId) { %> - <%= contract.burialSiteName %> - <% } else { %> - <span class="has-text-grey">(No Burial Site)</span> - <% } %> - </td> - <td><%= contract.contractStartDateString %></td> - <td> - <% if (contract.contractEndDate) { %> - <%= contract.contractEndDateString %> - <% } else { %> - <span class="has-text-grey">(No End Date)</span> - <% } %> - </td> - <td> - <ul class="fa-ul ml-5"> - <% for (const interment of contract.contractInterments) { %> - <li class="has-tooltip-left" data-tooltip="<%= contract.isPreneed ? 'Recipient' : 'Deceased' %>"> - <span class="fa-li"><i class="fas fa-user" aria-label="Recipient"></i></span> - <%= interment.deceasedName %> - </li> - <% } %> - <% if (contract.purchaserName !== '') { %> - <li class="has-tooltip-left" data-tooltip="Purchaser"> - <span class="fa-li"><i class="fas fa-hand-holding-dollar" aria-label="Purchase"></i></span> - <%= contract.purchaserName %> - </li> - <% } %> - <% if (contract.funeralHomeName) { %> - <li class="has-tooltip-left" data-tooltip="Funeral Home"> - <span class="fa-li"><i class="fas fa-place-of-worship" aria-label="Funeral Home"></i></span> - <%= contract.funeralHomeName %> - </li> - <% } %> - </ul> - </td> - </tr> - <% } %> - </tbody> - </table> - <% } %> - </div> - <div class="<%= (tabToSelect === "burialSites" ? "" : "is-hidden") %>" id="relatedTab--burialSites"> - <% if (workOrder.workOrderBurialSites.length === 0) { %> - <div class="message is-info"> - <p class="message-body"> - There are no burial sites associated with this work order. - </p> - </div> - <% } else { %> - <table class="table is-fullwidth is-striped is-hoverable"> - <thead> + <div class="<%= (tabToSelect === "contracts" ? "" : "is-hidden") %>" id="relatedTab--contracts"> + <% if (workOrder.workOrderContracts.length === 0) { %> + <div class="message is-info"> + <p class="message-body"> + There are no contracts associated with this work order. + </p> + </div> + <% } else { %> + <% const currentDate = dateTimeFunctions.dateToInteger(new Date()); %> + <table class="table is-fullwidth is-striped is-hoverable"> + <thead> + <tr> + <th class="has-width-1"></th> + <th>Contract Type</th> + <th>Burial Site</th> + <th>Contract Date</th> + <th>End Date</th> + <th>Contacts</th> + </tr> + </thead> + <tbody> + <% for (const contract of workOrder.workOrderContracts) { %> + <% const isActive = !(contract.contractEndDate && contract.contractEndDate < currentDate); %> <tr> - <th>Burial Site</th> - <th>Cemetery</th> - <th>Burial Site Type</th> - <th>Status</th> + <td class="has-text-centered"> + <% if (isActive) { %> + <i class="fas fa-play" title="Current Contract"></i> + <% } else { %> + <i class="fas fa-stop" title="Previous Contract"></i> + <% } %> + </td> + <td> + <a class="has-text-weight-bold" + href="<%= urlPrefix %>/contracts/<%= contract.contractId %>"> + <%= contract.contractType %> + </a><br /> + <span class="is-size-7"> + #<%= contract.contractId %> + </span> + </td> + <td> + <% if (contract.burialSiteId) { %> + <%= contract.burialSiteName %> + <% } else { %> + <span class="has-text-grey">(No Burial Site)</span> + <% } %> + </td> + <td><%= contract.contractStartDateString %></td> + <td> + <% if (contract.contractEndDate) { %> + <%= contract.contractEndDateString %> + <% } else { %> + <span class="has-text-grey">(No End Date)</span> + <% } %> + </td> + <td> + <ul class="fa-ul ml-5"> + <% for (const interment of contract.contractInterments) { %> + <li class="has-tooltip-left" data-tooltip="<%= contract.isPreneed ? 'Recipient' : 'Deceased' %>"> + <span class="fa-li"><i class="fas fa-user" aria-label="Recipient"></i></span> + <%= interment.deceasedName %> + </li> + <% } %> + <% if (contract.purchaserName !== '') { %> + <li class="has-tooltip-left" data-tooltip="Purchaser"> + <span class="fa-li"><i class="fas fa-hand-holding-dollar" aria-label="Purchase"></i></span> + <%= contract.purchaserName %> + </li> + <% } %> + <% if (contract.funeralHomeName) { %> + <li class="has-tooltip-left" data-tooltip="Funeral Home"> + <span class="fa-li"><i class="fas fa-place-of-worship" aria-label="Funeral Home"></i></span> + <%= contract.funeralHomeName %> + </li> + <% } %> + </ul> + </td> </tr> - </thead> - <tbody> - <% for (const burialSite of workOrder.workOrderBurialSites) { %> - <tr> - <td> - <a class="has-text-weight-bold" href="<%= urlPrefix %>/burialSites/<%= burialSite.burialSiteId %>"> - <%= burialSite.burialSiteName %> - </a> - </td> - <td><%= burialSite.cemeteryName %></td> - <td><%= burialSite.burialSiteType %></td> - <td><%= burialSite.burialSiteStatus %></td> - </tr> - <% } %> - </tbody> - </table> - <% } %> - </div> + <% } %> + </tbody> + </table> + <% } %> + </div> + <div class="<%= (tabToSelect === "burialSites" ? "" : "is-hidden") %>" id="relatedTab--burialSites"> + <% if (workOrder.workOrderBurialSites.length === 0) { %> + <div class="message is-info"> + <p class="message-body"> + There are no burial sites associated with this work order. + </p> + </div> + <% } else { %> + <table class="table is-fullwidth is-striped is-hoverable"> + <thead> + <tr> + <th>Burial Site</th> + <th>Cemetery</th> + <th>Burial Site Type</th> + <th>Status</th> + </tr> + </thead> + <tbody> + <% for (const burialSite of workOrder.workOrderBurialSites) { %> + <tr> + <td> + <a class="has-text-weight-bold" href="<%= urlPrefix %>/burialSites/<%= burialSite.burialSiteId %>"> + <%= burialSite.burialSiteName %> + </a> + </td> + <td><%= burialSite.cemeteryName %></td> + <td><%= burialSite.burialSiteType %></td> + <td><%= burialSite.burialSiteStatus %></td> + </tr> + <% } %> + </tbody> + </table> + <% } %> + </div> </div> </div> </div>