linting and development

pull/11/head
Dan Gowans 2025-04-22 13:51:02 -04:00
parent b8c9fd723d
commit df3f7725d3
17 changed files with 382 additions and 330 deletions

View File

@ -16,11 +16,11 @@ export declare function getCommittalTypeById(committalTypeId: number): Promise<C
export declare function getCommittalTypes(): Promise<CommittalType[]>;
export declare function getWorkOrderTypeById(workOrderTypeId: number): Promise<WorkOrderType | undefined>;
export declare function getWorkOrderTypes(): Promise<WorkOrderType[]>;
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<WorkOrderMilestoneType | undefined>;
export declare function getWorkOrderMilestoneTypeByWorkOrderMilestoneType(workOrderMilestoneTypeString: string): Promise<WorkOrderMilestoneType | undefined>;
export declare function getWorkOrderMilestoneTypes(): Promise<WorkOrderMilestoneType[]>;
export declare function preloadCaches(): Promise<void>;
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 {};

View File

@ -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}`);

View File

@ -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<WorkOrderMilestoneType | undefined> {
const cachedWorkOrderMilestoneTypes = await getWorkOrderMilestoneTypes()
return cachedWorkOrderMilestoneTypes.find(
(currentWorkOrderMilestoneType) =>
currentWorkOrderMilestoneType.workOrderMilestoneTypeId ===
workOrderMilestoneTypeId
)
}
export async function getWorkOrderMilestoneTypeByWorkOrderMilestoneType(
workOrderMilestoneTypeString: string
): Promise<WorkOrderMilestoneType | undefined> {
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<void> {
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<WorkOrderMilestoneType | undefined> {
const cachedWorkOrderMilestoneTypes = await getWorkOrderMilestoneTypes()
return cachedWorkOrderMilestoneTypes.find(
(currentWorkOrderMilestoneType) =>
currentWorkOrderMilestoneType.workOrderMilestoneTypeId ===
workOrderMilestoneTypeId
)
}
export async function getWorkOrderMilestoneTypeByWorkOrderMilestoneType(
workOrderMilestoneTypeString: string
): Promise<WorkOrderMilestoneType | undefined> {
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<void> {
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}`)

View File

@ -192,7 +192,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
latitudeElement: document.querySelector('#burialSite--burialSiteLatitude'),
longitudeElement: document.querySelector('#burialSite--burialSiteLongitude'),
callbackFunction: () => {
sunrise.setUnsavedChanges();
setUnsavedChanges();
}
});
});

View File

@ -298,7 +298,7 @@ declare const exports: Record<string, unknown>
) as HTMLInputElement,
callbackFunction: () => {
sunrise.setUnsavedChanges()
setUnsavedChanges()
}
})
})

View File

@ -15,7 +15,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
latitudeElement: document.querySelector('#cemetery--cemeteryLatitude'),
longitudeElement: document.querySelector('#cemetery--cemeteryLongitude'),
callbackFunction: () => {
sunrise.setUnsavedChanges();
setUnsavedChanges();
}
});
});

View File

@ -34,7 +34,7 @@ declare const exports: Record<string, unknown>
) as HTMLInputElement,
callbackFunction: () => {
sunrise.setUnsavedChanges()
setUnsavedChanges()
}
})
})

View File

@ -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);

View File

@ -24,6 +24,9 @@ declare const exports: Record<string, unknown>
'#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<string, unknown>
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<string, unknown>
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<string, unknown>
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<string, unknown>
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<string, unknown>
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<string, unknown>
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<string, unknown>
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 ?? ''
)

View File

@ -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();

View File

@ -92,6 +92,8 @@ declare const exports: Record<string, unknown> & {
* 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<string, unknown> & {
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)
}

View File

@ -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

View File

@ -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<void> {
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<void> {
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<void> {
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<void> {
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<void> {
(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<void> {
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<void> {
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')

View File

@ -61,9 +61,9 @@ export interface Config {
dynamicsGP?: {
integrationIsEnabled: boolean;
mssqlConfig?: MSSQLConfig;
lookupOrder?: DynamicsGPLookup[];
accountCodes?: string[];
itemNumbers?: string[];
lookupOrder?: DynamicsGPLookup[];
trialBalanceCodes?: string[];
};
};

View File

@ -79,9 +79,10 @@ export interface Config {
dynamicsGP?: {
integrationIsEnabled: boolean
mssqlConfig?: MSSQLConfig
lookupOrder?: DynamicsGPLookup[]
accountCodes?: string[]
itemNumbers?: string[]
lookupOrder?: DynamicsGPLookup[]
trialBalanceCodes?: string[]
}
}

View File

@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="has-background-grey" id="is-login-page" data-theme="light" lang="en" style="background-image:url('<%= urlPrefix + configFunctions.getConfigProperty("application.backgroundURL") %>')">
<html class="has-background-grey" id="is-login-page" data-theme="light" lang="en"
style="background-image:url('<%= urlPrefix + configFunctions.getConfigProperty("application.backgroundURL") %>')">
<head>
<title>
@ -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>

View File

@ -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>