From 062892ac3f2ad8cd131379fe9ffe38bd6c4e5424 Mon Sep 17 00:00:00 2001 From: Dan Gowans Date: Thu, 12 Jan 2023 11:10:29 -0500 Subject: [PATCH] linting --- helpers/functions.authentication.js | 61 +- helpers/functions.authentication.ts | 121 ++-- helpers/functions.config.d.ts | 96 ++-- helpers/functions.config.js | 100 ++-- helpers/functions.config.ts | 313 ++++++----- helpers/functions.fee.d.ts | 2 +- helpers/functions.fee.js | 6 +- helpers/functions.fee.ts | 18 +- helpers/functions.lotOccupancy.d.ts | 2 +- helpers/functions.lotOccupancy.js | 18 +- helpers/functions.lotOccupancy.ts | 90 +-- helpers/functions.map.js | 6 +- helpers/functions.map.ts | 26 +- helpers/functions.print.d.ts | 8 +- helpers/functions.print.js | 58 +- helpers/functions.print.ts | 150 ++--- helpers/functions.user.d.ts | 2 +- helpers/functions.user.js | 12 +- helpers/functions.user.ts | 64 +-- helpers/initializer.database.cemetery.js | 140 ++--- helpers/initializer.database.cemetery.ts | 525 +++++++++--------- helpers/initializer.database.js | 36 +- helpers/initializer.database.ts | 132 ++--- .../addWorkOrderLotOccupancy.js | 30 +- .../addWorkOrderLotOccupancy.ts | 30 +- helpers/lotOccupancyDB/deleteLotField.js | 8 +- helpers/lotOccupancyDB/deleteLotField.ts | 8 +- helpers/lotOccupancyDB/getOccupancyTypes.d.ts | 2 +- helpers/lotOccupancyDB/getOccupancyTypes.js | 18 +- helpers/lotOccupancyDB/getOccupancyTypes.ts | 74 +-- helpers/lotOccupancyDB/getPreviousLotId.js | 16 +- helpers/lotOccupancyDB/getPreviousLotId.ts | 54 +- helpers/lotOccupancyDB/getWorkOrder.d.ts | 4 +- helpers/lotOccupancyDB/getWorkOrder.js | 44 +- helpers/lotOccupancyDB/getWorkOrder.ts | 196 +++---- .../lotOccupancyDB/getWorkOrderComments.d.ts | 4 +- .../lotOccupancyDB/getWorkOrderComments.js | 12 +- .../lotOccupancyDB/getWorkOrderComments.ts | 50 +- .../getWorkOrderMilestoneTypes.d.ts | 2 +- .../getWorkOrderMilestoneTypes.js | 8 +- .../getWorkOrderMilestoneTypes.ts | 52 +- .../getWorkOrderMilestones.d.ts | 8 +- .../lotOccupancyDB/getWorkOrderMilestones.js | 108 ++-- .../lotOccupancyDB/getWorkOrderMilestones.ts | 337 +++++------ helpers/lotOccupancyDB/getWorkOrders.d.ts | 6 +- helpers/lotOccupancyDB/getWorkOrders.js | 102 ++-- helpers/lotOccupancyDB/getWorkOrders.ts | 187 ++++--- helpers/lotOccupancyDB/moveLotTypeField.js | 62 +-- helpers/lotOccupancyDB/moveLotTypeField.ts | 222 ++++---- .../moveOccupancyTypePrintDown.js | 38 +- .../moveOccupancyTypePrintDown.ts | 128 ++--- .../moveOccupancyTypePrintUp.js | 24 +- .../moveOccupancyTypePrintUp.ts | 112 ++-- helpers/lotOccupancyDB/moveRecord.d.ts | 2 +- helpers/lotOccupancyDB/moveRecord.js | 50 +- helpers/lotOccupancyDB/moveRecord.ts | 262 +++++---- 56 files changed, 2235 insertions(+), 2011 deletions(-) diff --git a/helpers/functions.authentication.js b/helpers/functions.authentication.js index 385bed67..7203338a 100644 --- a/helpers/functions.authentication.js +++ b/helpers/functions.authentication.js @@ -1,16 +1,17 @@ -import * as configFunctions from "./functions.config.js"; -import ActiveDirectory from "activedirectory2"; -const userDomain = configFunctions.getProperty("application.userDomain"); -const activeDirectoryConfig = configFunctions.getProperty("activeDirectory"); +import * as configFunctions from './functions.config.js'; +import ActiveDirectory from 'activedirectory2'; +const userDomain = configFunctions.getProperty('application.userDomain'); +const activeDirectoryConfig = configFunctions.getProperty('activeDirectory'); async function authenticateViaActiveDirectory(userName, password) { - return new Promise((resolve) => { + return await new Promise((resolve) => { try { const ad = new ActiveDirectory(activeDirectoryConfig); - ad.authenticate(userDomain + "\\" + userName, password, async (error, auth) => { - if (error) { - resolve(false); + ad.authenticate(userDomain + '\\' + userName, password, (error, auth) => { + let authenticated = false; + if (!error) { + authenticated = auth; } - resolve(auth); + resolve(authenticated); }); } catch { @@ -19,32 +20,32 @@ async function authenticateViaActiveDirectory(userName, password) { }); } export async function authenticate(userName, password) { - if (!userName || userName === "" || !password || password === "") { + if (!userName || userName === '' || !password || password === '') { return false; } return await authenticateViaActiveDirectory(userName, password); } const safeRedirects = new Set([ - "/admin/cleanup", - "/admin/fees", - "/admin/lottypes", - "/admin/occupancytypes", - "/admin/tables", - "/lotoccupancies", - "/lotoccupancies/new", - "/lots", - "/lots/new", - "/maps", - "/maps/new", - "/workorders", - "/workorders/new", - "/workorders/milestonecalendar", - "/workorders/outlook", - "/reports" + '/admin/cleanup', + '/admin/fees', + '/admin/lottypes', + '/admin/occupancytypes', + '/admin/tables', + '/lotoccupancies', + '/lotoccupancies/new', + '/lots', + '/lots/new', + '/maps', + '/maps/new', + '/workorders', + '/workorders/new', + '/workorders/milestonecalendar', + '/workorders/outlook', + '/reports' ]); -export function getSafeRedirectURL(possibleRedirectURL = "") { - const urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix"); - if (typeof possibleRedirectURL === "string") { +export function getSafeRedirectURL(possibleRedirectURL = '') { + const urlPrefix = configFunctions.getProperty('reverseProxy.urlPrefix'); + if (typeof possibleRedirectURL === 'string') { const urlToCheck = possibleRedirectURL.startsWith(urlPrefix) ? possibleRedirectURL.slice(urlPrefix.length) : possibleRedirectURL; @@ -58,5 +59,5 @@ export function getSafeRedirectURL(possibleRedirectURL = "") { return urlPrefix + urlToCheck; } } - return urlPrefix + "/dashboard"; + return urlPrefix + '/dashboard'; } diff --git a/helpers/functions.authentication.ts b/helpers/functions.authentication.ts index 811fbc23..83fa21a5 100644 --- a/helpers/functions.authentication.ts +++ b/helpers/functions.authentication.ts @@ -1,80 +1,85 @@ -import * as configFunctions from "./functions.config.js"; +import * as configFunctions from './functions.config.js' -import ActiveDirectory from "activedirectory2"; +import ActiveDirectory from 'activedirectory2' -const userDomain = configFunctions.getProperty("application.userDomain"); +const userDomain = configFunctions.getProperty('application.userDomain') -const activeDirectoryConfig = configFunctions.getProperty("activeDirectory"); +const activeDirectoryConfig = configFunctions.getProperty('activeDirectory') async function authenticateViaActiveDirectory( - userName: string, - password: string + userName: string, + password: string ): Promise { - return new Promise((resolve) => { - try { - const ad = new ActiveDirectory(activeDirectoryConfig); + return await new Promise((resolve) => { + try { + const ad = new ActiveDirectory(activeDirectoryConfig) - ad.authenticate(userDomain + "\\" + userName, password, async (error, auth) => { - if (error) { - resolve(false); - } + ad.authenticate(userDomain + '\\' + userName, password, (error, auth) => { + let authenticated = false - resolve(auth); - }); - } catch { - resolve(false); + if (!error) { + authenticated = auth } - }); + + resolve(authenticated) + }) + } catch { + resolve(false) + } + }) } -export async function authenticate(userName: string, password: string): Promise { - if (!userName || userName === "" || !password || password === "") { - return false; - } +export async function authenticate( + userName: string, + password: string +): Promise { + if (!userName || userName === '' || !password || password === '') { + return false + } - return await authenticateViaActiveDirectory(userName, password); + return await authenticateViaActiveDirectory(userName, password) } const safeRedirects = new Set([ - "/admin/cleanup", - "/admin/fees", - "/admin/lottypes", - "/admin/occupancytypes", - "/admin/tables", - "/lotoccupancies", - "/lotoccupancies/new", - "/lots", - "/lots/new", - "/maps", - "/maps/new", - "/workorders", - "/workorders/new", - "/workorders/milestonecalendar", - "/workorders/outlook", - "/reports" -]); + '/admin/cleanup', + '/admin/fees', + '/admin/lottypes', + '/admin/occupancytypes', + '/admin/tables', + '/lotoccupancies', + '/lotoccupancies/new', + '/lots', + '/lots/new', + '/maps', + '/maps/new', + '/workorders', + '/workorders/new', + '/workorders/milestonecalendar', + '/workorders/outlook', + '/reports' +]) -export function getSafeRedirectURL(possibleRedirectURL = "") { - const urlPrefix = configFunctions.getProperty("reverseProxy.urlPrefix"); +export function getSafeRedirectURL(possibleRedirectURL = ''): string { + const urlPrefix = configFunctions.getProperty('reverseProxy.urlPrefix') - if (typeof possibleRedirectURL === "string") { - const urlToCheck = possibleRedirectURL.startsWith(urlPrefix) - ? possibleRedirectURL.slice(urlPrefix.length) - : possibleRedirectURL; + if (typeof possibleRedirectURL === 'string') { + const urlToCheck = possibleRedirectURL.startsWith(urlPrefix) + ? possibleRedirectURL.slice(urlPrefix.length) + : possibleRedirectURL - const urlToCheckLowerCase = urlToCheck.toLowerCase(); + const urlToCheckLowerCase = urlToCheck.toLowerCase() - if ( - safeRedirects.has(urlToCheckLowerCase) || - /^(\/maps\/)\d+(\/edit)?$/.test(urlToCheckLowerCase) || - /^(\/lots\/)\d+(\/edit)?$/.test(urlToCheckLowerCase) || - /^(\/lotoccupancies\/)\d+(\/edit)?$/.test(urlToCheckLowerCase) || - /^(\/workorders\/)\d+(\/edit)?$/.test(urlToCheckLowerCase) || - /^\/print\/(pdf|screen)\/[\d/=?A-Za-z-]+$/.test(urlToCheck) - ) { - return urlPrefix + urlToCheck; - } + if ( + safeRedirects.has(urlToCheckLowerCase) || + /^(\/maps\/)\d+(\/edit)?$/.test(urlToCheckLowerCase) || + /^(\/lots\/)\d+(\/edit)?$/.test(urlToCheckLowerCase) || + /^(\/lotoccupancies\/)\d+(\/edit)?$/.test(urlToCheckLowerCase) || + /^(\/workorders\/)\d+(\/edit)?$/.test(urlToCheckLowerCase) || + /^\/print\/(pdf|screen)\/[\d/=?A-Za-z-]+$/.test(urlToCheck) + ) { + return urlPrefix + urlToCheck } + } - return urlPrefix + "/dashboard"; + return urlPrefix + '/dashboard' } diff --git a/helpers/functions.config.d.ts b/helpers/functions.config.d.ts index cc101382..2e9f0ab7 100644 --- a/helpers/functions.config.d.ts +++ b/helpers/functions.config.d.ts @@ -1,49 +1,49 @@ -import type * as configTypes from "../types/configTypes"; -export declare function getProperty(propertyName: "application.applicationName"): string; -export declare function getProperty(propertyName: "application.logoURL"): string; -export declare function getProperty(propertyName: "application.httpPort"): number; -export declare function getProperty(propertyName: "application.userDomain"): string; -export declare function getProperty(propertyName: "application.useTestDatabases"): boolean; -export declare function getProperty(propertyName: "application.ntfyStartup"): configTypes.ConfigNtfyStartup; -export declare function getProperty(propertyName: "activeDirectory"): configTypes.ConfigActiveDirectory; -export declare function getProperty(propertyName: "users.testing"): string[]; -export declare function getProperty(propertyName: "users.canLogin"): string[]; -export declare function getProperty(propertyName: "users.canUpdate"): string[]; -export declare function getProperty(propertyName: "users.isAdmin"): string[]; -export declare function getProperty(propertyName: "reverseProxy.disableCompression"): boolean; -export declare function getProperty(propertyName: "reverseProxy.disableEtag"): boolean; -export declare function getProperty(propertyName: "reverseProxy.urlPrefix"): string; -export declare function getProperty(propertyName: "session.cookieName"): string; -export declare function getProperty(propertyName: "session.doKeepAlive"): boolean; -export declare function getProperty(propertyName: "session.maxAgeMillis"): number; -export declare function getProperty(propertyName: "session.secret"): string; -export declare function getProperty(propertyName: "aliases.lot"): string; -export declare function getProperty(propertyName: "aliases.lots"): string; -export declare function getProperty(propertyName: "aliases.map"): string; -export declare function getProperty(propertyName: "aliases.maps"): string; -export declare function getProperty(propertyName: "aliases.occupancy"): string; -export declare function getProperty(propertyName: "aliases.occupancies"): string; -export declare function getProperty(propertyName: "aliases.occupancyStartDate"): string; -export declare function getProperty(propertyName: "aliases.occupant"): string; -export declare function getProperty(propertyName: "aliases.occupants"): string; -export declare function getProperty(propertyName: "aliases.workOrderOpenDate"): string; -export declare function getProperty(propertyName: "aliases.workOrderCloseDate"): string; -export declare function getProperty(propertyName: "aliases.externalReceiptNumber"): string; -export declare function getProperty(propertyName: "settings.map.mapCityDefault"): string; -export declare function getProperty(propertyName: "settings.map.mapProvinceDefault"): string; -export declare function getProperty(propertyName: "settings.lot.lotNamePattern"): RegExp; -export declare function getProperty(propertyName: "settings.lot.lotNameHelpText"): string; -export declare function getProperty(propertyName: "settings.lot.lotNameSortNameFunction"): (lotName: string) => string; -export declare function getProperty(propertyName: "settings.lotOccupancy.occupancyEndDateIsRequired"): boolean; -export declare function getProperty(propertyName: "settings.lotOccupancy.occupantCityDefault"): string; -export declare function getProperty(propertyName: "settings.lotOccupancy.occupantProvinceDefault"): string; -export declare function getProperty(propertyName: "settings.lotOccupancy.prints"): string[]; -export declare function getProperty(propertyName: "settings.fees.taxPercentageDefault"): number; -export declare function getProperty(propertyName: "settings.workOrders.workOrderNumberLength"): number; -export declare function getProperty(propertyName: "settings.workOrders.workOrderMilestoneDateRecentBeforeDays"): number; -export declare function getProperty(propertyName: "settings.workOrders.workOrderMilestoneDateRecentAfterDays"): number; -export declare function getProperty(propertyName: "settings.workOrders.calendarEmailAddress"): string; -export declare function getProperty(propertyName: "settings.workOrders.prints"): string[]; -export declare function getProperty(propertyName: "settings.adminCleanup.recordDeleteAgeDays"): number; -export declare function getProperty(propertyName: "settings.printPdf.contentDisposition"): "attachment" | "inline"; +import type * as configTypes from '../types/configTypes'; +export declare function getProperty(propertyName: 'application.applicationName'): string; +export declare function getProperty(propertyName: 'application.logoURL'): string; +export declare function getProperty(propertyName: 'application.httpPort'): number; +export declare function getProperty(propertyName: 'application.userDomain'): string; +export declare function getProperty(propertyName: 'application.useTestDatabases'): boolean; +export declare function getProperty(propertyName: 'application.ntfyStartup'): configTypes.ConfigNtfyStartup; +export declare function getProperty(propertyName: 'activeDirectory'): configTypes.ConfigActiveDirectory; +export declare function getProperty(propertyName: 'users.testing'): string[]; +export declare function getProperty(propertyName: 'users.canLogin'): string[]; +export declare function getProperty(propertyName: 'users.canUpdate'): string[]; +export declare function getProperty(propertyName: 'users.isAdmin'): string[]; +export declare function getProperty(propertyName: 'reverseProxy.disableCompression'): boolean; +export declare function getProperty(propertyName: 'reverseProxy.disableEtag'): boolean; +export declare function getProperty(propertyName: 'reverseProxy.urlPrefix'): string; +export declare function getProperty(propertyName: 'session.cookieName'): string; +export declare function getProperty(propertyName: 'session.doKeepAlive'): boolean; +export declare function getProperty(propertyName: 'session.maxAgeMillis'): number; +export declare function getProperty(propertyName: 'session.secret'): string; +export declare function getProperty(propertyName: 'aliases.lot'): string; +export declare function getProperty(propertyName: 'aliases.lots'): string; +export declare function getProperty(propertyName: 'aliases.map'): string; +export declare function getProperty(propertyName: 'aliases.maps'): string; +export declare function getProperty(propertyName: 'aliases.occupancy'): string; +export declare function getProperty(propertyName: 'aliases.occupancies'): string; +export declare function getProperty(propertyName: 'aliases.occupancyStartDate'): string; +export declare function getProperty(propertyName: 'aliases.occupant'): string; +export declare function getProperty(propertyName: 'aliases.occupants'): string; +export declare function getProperty(propertyName: 'aliases.workOrderOpenDate'): string; +export declare function getProperty(propertyName: 'aliases.workOrderCloseDate'): string; +export declare function getProperty(propertyName: 'aliases.externalReceiptNumber'): string; +export declare function getProperty(propertyName: 'settings.map.mapCityDefault'): string; +export declare function getProperty(propertyName: 'settings.map.mapProvinceDefault'): string; +export declare function getProperty(propertyName: 'settings.lot.lotNamePattern'): RegExp; +export declare function getProperty(propertyName: 'settings.lot.lotNameHelpText'): string; +export declare function getProperty(propertyName: 'settings.lot.lotNameSortNameFunction'): (lotName: string) => string; +export declare function getProperty(propertyName: 'settings.lotOccupancy.occupancyEndDateIsRequired'): boolean; +export declare function getProperty(propertyName: 'settings.lotOccupancy.occupantCityDefault'): string; +export declare function getProperty(propertyName: 'settings.lotOccupancy.occupantProvinceDefault'): string; +export declare function getProperty(propertyName: 'settings.lotOccupancy.prints'): string[]; +export declare function getProperty(propertyName: 'settings.fees.taxPercentageDefault'): number; +export declare function getProperty(propertyName: 'settings.workOrders.workOrderNumberLength'): number; +export declare function getProperty(propertyName: 'settings.workOrders.workOrderMilestoneDateRecentBeforeDays'): number; +export declare function getProperty(propertyName: 'settings.workOrders.workOrderMilestoneDateRecentAfterDays'): number; +export declare function getProperty(propertyName: 'settings.workOrders.calendarEmailAddress'): string; +export declare function getProperty(propertyName: 'settings.workOrders.prints'): string[]; +export declare function getProperty(propertyName: 'settings.adminCleanup.recordDeleteAgeDays'): number; +export declare function getProperty(propertyName: 'settings.printPdf.contentDisposition'): 'attachment' | 'inline'; export declare const keepAliveMillis: number; diff --git a/helpers/functions.config.js b/helpers/functions.config.js index ba961d75..d5afada1 100644 --- a/helpers/functions.config.js +++ b/helpers/functions.config.js @@ -1,53 +1,55 @@ -import { config } from "../data/config.js"; +import { config } from '../data/config.js'; const configFallbackValues = new Map(); -configFallbackValues.set("application.applicationName", "Lot Occupancy System"); -configFallbackValues.set("application.backgroundURL", "/images/cemetery-background.jpg"); -configFallbackValues.set("application.logoURL", "/images/cemetery-logo.png"); -configFallbackValues.set("application.httpPort", 7000); -configFallbackValues.set("application.useTestDatabases", false); -configFallbackValues.set("reverseProxy.disableCompression", false); -configFallbackValues.set("reverseProxy.disableEtag", false); -configFallbackValues.set("reverseProxy.urlPrefix", ""); -configFallbackValues.set("session.cookieName", "lot-occupancy-system-user-sid"); -configFallbackValues.set("session.secret", "cityssm/lot-occupancy-system"); -configFallbackValues.set("session.maxAgeMillis", 60 * 60 * 1000); -configFallbackValues.set("session.doKeepAlive", false); -configFallbackValues.set("users.testing", []); -configFallbackValues.set("users.canLogin", ["administrator"]); -configFallbackValues.set("users.canUpdate", []); -configFallbackValues.set("users.isAdmin", ["administrator"]); -configFallbackValues.set("aliases.lot", "Lot"); -configFallbackValues.set("aliases.lots", "Lots"); -configFallbackValues.set("aliases.map", "Map"); -configFallbackValues.set("aliases.maps", "Maps"); -configFallbackValues.set("aliases.occupancy", "Occupancy"); -configFallbackValues.set("aliases.occupancies", "Occupancies"); -configFallbackValues.set("aliases.occupancyStartDate", "Start Date"); -configFallbackValues.set("aliases.occupant", "Occupant"); -configFallbackValues.set("aliases.occupants", "Occupants"); -configFallbackValues.set("aliases.externalReceiptNumber", "External Receipt Number"); -configFallbackValues.set("aliases.workOrderOpenDate", "Open Date"); -configFallbackValues.set("aliases.workOrderCloseDate", "Close Date"); -configFallbackValues.set("settings.map.mapCityDefault", ""); -configFallbackValues.set("settings.map.mapProvinceDefault", ""); -configFallbackValues.set("settings.lot.lotNameSortNameFunction", (lotName) => lotName); -configFallbackValues.set("settings.lotOccupancy.occupancyEndDateIsRequired", true); -configFallbackValues.set("settings.lotOccupancy.occupantCityDefault", ""); -configFallbackValues.set("settings.lotOccupancy.occupantProvinceDefault", ""); -configFallbackValues.set("settings.lotOccupancy.prints", ["screen/lotOccupancy"]); -configFallbackValues.set("settings.fees.taxPercentageDefault", 0); -configFallbackValues.set("settings.workOrders.workOrderNumberLength", 6); -configFallbackValues.set("settings.workOrders.workOrderMilestoneDateRecentBeforeDays", 5); -configFallbackValues.set("settings.workOrders.workOrderMilestoneDateRecentAfterDays", 60); -configFallbackValues.set("settings.workOrders.calendarEmailAddress", "no-reply@127.0.0.1"); -configFallbackValues.set("settings.workOrders.prints", [ - "pdf/workOrder", - "pdf/workOrder-commentLog" +configFallbackValues.set('application.applicationName', 'Lot Occupancy System'); +configFallbackValues.set('application.backgroundURL', '/images/cemetery-background.jpg'); +configFallbackValues.set('application.logoURL', '/images/cemetery-logo.png'); +configFallbackValues.set('application.httpPort', 7000); +configFallbackValues.set('application.useTestDatabases', false); +configFallbackValues.set('reverseProxy.disableCompression', false); +configFallbackValues.set('reverseProxy.disableEtag', false); +configFallbackValues.set('reverseProxy.urlPrefix', ''); +configFallbackValues.set('session.cookieName', 'lot-occupancy-system-user-sid'); +configFallbackValues.set('session.secret', 'cityssm/lot-occupancy-system'); +configFallbackValues.set('session.maxAgeMillis', 60 * 60 * 1000); +configFallbackValues.set('session.doKeepAlive', false); +configFallbackValues.set('users.testing', []); +configFallbackValues.set('users.canLogin', ['administrator']); +configFallbackValues.set('users.canUpdate', []); +configFallbackValues.set('users.isAdmin', ['administrator']); +configFallbackValues.set('aliases.lot', 'Lot'); +configFallbackValues.set('aliases.lots', 'Lots'); +configFallbackValues.set('aliases.map', 'Map'); +configFallbackValues.set('aliases.maps', 'Maps'); +configFallbackValues.set('aliases.occupancy', 'Occupancy'); +configFallbackValues.set('aliases.occupancies', 'Occupancies'); +configFallbackValues.set('aliases.occupancyStartDate', 'Start Date'); +configFallbackValues.set('aliases.occupant', 'Occupant'); +configFallbackValues.set('aliases.occupants', 'Occupants'); +configFallbackValues.set('aliases.externalReceiptNumber', 'External Receipt Number'); +configFallbackValues.set('aliases.workOrderOpenDate', 'Open Date'); +configFallbackValues.set('aliases.workOrderCloseDate', 'Close Date'); +configFallbackValues.set('settings.map.mapCityDefault', ''); +configFallbackValues.set('settings.map.mapProvinceDefault', ''); +configFallbackValues.set('settings.lot.lotNameSortNameFunction', (lotName) => lotName); +configFallbackValues.set('settings.lotOccupancy.occupancyEndDateIsRequired', true); +configFallbackValues.set('settings.lotOccupancy.occupantCityDefault', ''); +configFallbackValues.set('settings.lotOccupancy.occupantProvinceDefault', ''); +configFallbackValues.set('settings.lotOccupancy.prints', [ + 'screen/lotOccupancy' ]); -configFallbackValues.set("settings.adminCleanup.recordDeleteAgeDays", 60); -configFallbackValues.set("settings.printPdf.contentDisposition", "attachment"); +configFallbackValues.set('settings.fees.taxPercentageDefault', 0); +configFallbackValues.set('settings.workOrders.workOrderNumberLength', 6); +configFallbackValues.set('settings.workOrders.workOrderMilestoneDateRecentBeforeDays', 5); +configFallbackValues.set('settings.workOrders.workOrderMilestoneDateRecentAfterDays', 60); +configFallbackValues.set('settings.workOrders.calendarEmailAddress', 'no-reply@127.0.0.1'); +configFallbackValues.set('settings.workOrders.prints', [ + 'pdf/workOrder', + 'pdf/workOrder-commentLog' +]); +configFallbackValues.set('settings.adminCleanup.recordDeleteAgeDays', 60); +configFallbackValues.set('settings.printPdf.contentDisposition', 'attachment'); export function getProperty(propertyName) { - const propertyNameSplit = propertyName.split("."); + const propertyNameSplit = propertyName.split('.'); let currentObject = config; for (const propertyNamePiece of propertyNameSplit) { if (Object.prototype.hasOwnProperty.call(currentObject, propertyNamePiece)) { @@ -58,6 +60,6 @@ export function getProperty(propertyName) { } return currentObject; } -export const keepAliveMillis = getProperty("session.doKeepAlive") - ? Math.max(getProperty("session.maxAgeMillis") / 2, getProperty("session.maxAgeMillis") - 10 * 60 * 1000) +export const keepAliveMillis = getProperty('session.doKeepAlive') + ? Math.max(getProperty('session.maxAgeMillis') / 2, getProperty('session.maxAgeMillis') - 10 * 60 * 1000) : 0; diff --git a/helpers/functions.config.ts b/helpers/functions.config.ts index d224bb7d..f226fea6 100644 --- a/helpers/functions.config.ts +++ b/helpers/functions.config.ts @@ -1,176 +1,231 @@ -/* eslint-disable node/no-unpublished-import */ +/* eslint-disable @typescript-eslint/indent, node/no-unpublished-import */ -import { config } from "../data/config.js"; +import { config } from '../data/config.js' -import type * as configTypes from "../types/configTypes"; +import type * as configTypes from '../types/configTypes' /* * SET UP FALLBACK VALUES */ -const configFallbackValues = new Map(); +const configFallbackValues = new Map() -configFallbackValues.set("application.applicationName", "Lot Occupancy System"); -configFallbackValues.set("application.backgroundURL", "/images/cemetery-background.jpg"); -configFallbackValues.set("application.logoURL", "/images/cemetery-logo.png"); -configFallbackValues.set("application.httpPort", 7000); -configFallbackValues.set("application.useTestDatabases", false); +configFallbackValues.set('application.applicationName', 'Lot Occupancy System') +configFallbackValues.set( + 'application.backgroundURL', + '/images/cemetery-background.jpg' +) +configFallbackValues.set('application.logoURL', '/images/cemetery-logo.png') +configFallbackValues.set('application.httpPort', 7000) +configFallbackValues.set('application.useTestDatabases', false) -configFallbackValues.set("reverseProxy.disableCompression", false); -configFallbackValues.set("reverseProxy.disableEtag", false); -configFallbackValues.set("reverseProxy.urlPrefix", ""); +configFallbackValues.set('reverseProxy.disableCompression', false) +configFallbackValues.set('reverseProxy.disableEtag', false) +configFallbackValues.set('reverseProxy.urlPrefix', '') -configFallbackValues.set("session.cookieName", "lot-occupancy-system-user-sid"); -configFallbackValues.set("session.secret", "cityssm/lot-occupancy-system"); -configFallbackValues.set("session.maxAgeMillis", 60 * 60 * 1000); -configFallbackValues.set("session.doKeepAlive", false); +configFallbackValues.set('session.cookieName', 'lot-occupancy-system-user-sid') +configFallbackValues.set('session.secret', 'cityssm/lot-occupancy-system') +configFallbackValues.set('session.maxAgeMillis', 60 * 60 * 1000) +configFallbackValues.set('session.doKeepAlive', false) -configFallbackValues.set("users.testing", []); -configFallbackValues.set("users.canLogin", ["administrator"]); -configFallbackValues.set("users.canUpdate", []); -configFallbackValues.set("users.isAdmin", ["administrator"]); +configFallbackValues.set('users.testing', []) +configFallbackValues.set('users.canLogin', ['administrator']) +configFallbackValues.set('users.canUpdate', []) +configFallbackValues.set('users.isAdmin', ['administrator']) -configFallbackValues.set("aliases.lot", "Lot"); -configFallbackValues.set("aliases.lots", "Lots"); -configFallbackValues.set("aliases.map", "Map"); -configFallbackValues.set("aliases.maps", "Maps"); -configFallbackValues.set("aliases.occupancy", "Occupancy"); -configFallbackValues.set("aliases.occupancies", "Occupancies"); -configFallbackValues.set("aliases.occupancyStartDate", "Start Date"); -configFallbackValues.set("aliases.occupant", "Occupant"); -configFallbackValues.set("aliases.occupants", "Occupants"); -configFallbackValues.set("aliases.externalReceiptNumber", "External Receipt Number"); -configFallbackValues.set("aliases.workOrderOpenDate", "Open Date"); -configFallbackValues.set("aliases.workOrderCloseDate", "Close Date"); +configFallbackValues.set('aliases.lot', 'Lot') +configFallbackValues.set('aliases.lots', 'Lots') +configFallbackValues.set('aliases.map', 'Map') +configFallbackValues.set('aliases.maps', 'Maps') +configFallbackValues.set('aliases.occupancy', 'Occupancy') +configFallbackValues.set('aliases.occupancies', 'Occupancies') +configFallbackValues.set('aliases.occupancyStartDate', 'Start Date') +configFallbackValues.set('aliases.occupant', 'Occupant') +configFallbackValues.set('aliases.occupants', 'Occupants') +configFallbackValues.set( + 'aliases.externalReceiptNumber', + 'External Receipt Number' +) +configFallbackValues.set('aliases.workOrderOpenDate', 'Open Date') +configFallbackValues.set('aliases.workOrderCloseDate', 'Close Date') -configFallbackValues.set("settings.map.mapCityDefault", ""); -configFallbackValues.set("settings.map.mapProvinceDefault", ""); +configFallbackValues.set('settings.map.mapCityDefault', '') +configFallbackValues.set('settings.map.mapProvinceDefault', '') -configFallbackValues.set("settings.lot.lotNameSortNameFunction", (lotName: string) => lotName); +configFallbackValues.set( + 'settings.lot.lotNameSortNameFunction', + (lotName: string) => lotName +) -configFallbackValues.set("settings.lotOccupancy.occupancyEndDateIsRequired", true); -configFallbackValues.set("settings.lotOccupancy.occupantCityDefault", ""); -configFallbackValues.set("settings.lotOccupancy.occupantProvinceDefault", ""); -configFallbackValues.set("settings.lotOccupancy.prints", ["screen/lotOccupancy"]); +configFallbackValues.set( + 'settings.lotOccupancy.occupancyEndDateIsRequired', + true +) +configFallbackValues.set('settings.lotOccupancy.occupantCityDefault', '') +configFallbackValues.set('settings.lotOccupancy.occupantProvinceDefault', '') +configFallbackValues.set('settings.lotOccupancy.prints', [ + 'screen/lotOccupancy' +]) -configFallbackValues.set("settings.fees.taxPercentageDefault", 0); +configFallbackValues.set('settings.fees.taxPercentageDefault', 0) -configFallbackValues.set("settings.workOrders.workOrderNumberLength", 6); -configFallbackValues.set("settings.workOrders.workOrderMilestoneDateRecentBeforeDays", 5); -configFallbackValues.set("settings.workOrders.workOrderMilestoneDateRecentAfterDays", 60); -configFallbackValues.set("settings.workOrders.calendarEmailAddress", "no-reply@127.0.0.1"); -configFallbackValues.set("settings.workOrders.prints", [ - "pdf/workOrder", - "pdf/workOrder-commentLog" -]); +configFallbackValues.set('settings.workOrders.workOrderNumberLength', 6) +configFallbackValues.set( + 'settings.workOrders.workOrderMilestoneDateRecentBeforeDays', + 5 +) +configFallbackValues.set( + 'settings.workOrders.workOrderMilestoneDateRecentAfterDays', + 60 +) +configFallbackValues.set( + 'settings.workOrders.calendarEmailAddress', + 'no-reply@127.0.0.1' +) +configFallbackValues.set('settings.workOrders.prints', [ + 'pdf/workOrder', + 'pdf/workOrder-commentLog' +]) -configFallbackValues.set("settings.adminCleanup.recordDeleteAgeDays", 60); +configFallbackValues.set('settings.adminCleanup.recordDeleteAgeDays', 60) -configFallbackValues.set("settings.printPdf.contentDisposition", "attachment"); +configFallbackValues.set('settings.printPdf.contentDisposition', 'attachment') /* * Set up function overloads */ -export function getProperty(propertyName: "application.applicationName"): string; +export function getProperty(propertyName: 'application.applicationName'): string -export function getProperty(propertyName: "application.logoURL"): string; -export function getProperty(propertyName: "application.httpPort"): number; -export function getProperty(propertyName: "application.userDomain"): string; -export function getProperty(propertyName: "application.useTestDatabases"): boolean; -export function getProperty(propertyName: "application.ntfyStartup"): configTypes.ConfigNtfyStartup; - -export function getProperty(propertyName: "activeDirectory"): configTypes.ConfigActiveDirectory; - -export function getProperty(propertyName: "users.testing"): string[]; -export function getProperty(propertyName: "users.canLogin"): string[]; -export function getProperty(propertyName: "users.canUpdate"): string[]; -export function getProperty(propertyName: "users.isAdmin"): string[]; - -export function getProperty(propertyName: "reverseProxy.disableCompression"): boolean; - -export function getProperty(propertyName: "reverseProxy.disableEtag"): boolean; -export function getProperty(propertyName: "reverseProxy.urlPrefix"): string; - -export function getProperty(propertyName: "session.cookieName"): string; -export function getProperty(propertyName: "session.doKeepAlive"): boolean; -export function getProperty(propertyName: "session.maxAgeMillis"): number; -export function getProperty(propertyName: "session.secret"): string; - -export function getProperty(propertyName: "aliases.lot"): string; -export function getProperty(propertyName: "aliases.lots"): string; -export function getProperty(propertyName: "aliases.map"): string; -export function getProperty(propertyName: "aliases.maps"): string; -export function getProperty(propertyName: "aliases.occupancy"): string; -export function getProperty(propertyName: "aliases.occupancies"): string; -export function getProperty(propertyName: "aliases.occupancyStartDate"): string; -export function getProperty(propertyName: "aliases.occupant"): string; -export function getProperty(propertyName: "aliases.occupants"): string; -export function getProperty(propertyName: "aliases.workOrderOpenDate"): string; -export function getProperty(propertyName: "aliases.workOrderCloseDate"): string; - -export function getProperty(propertyName: "aliases.externalReceiptNumber"): string; - -export function getProperty(propertyName: "settings.map.mapCityDefault"): string; - -export function getProperty(propertyName: "settings.map.mapProvinceDefault"): string; - -export function getProperty(propertyName: "settings.lot.lotNamePattern"): RegExp; -export function getProperty(propertyName: "settings.lot.lotNameHelpText"): string; +export function getProperty(propertyName: 'application.logoURL'): string +export function getProperty(propertyName: 'application.httpPort'): number +export function getProperty(propertyName: 'application.userDomain'): string +export function getProperty( + propertyName: 'application.useTestDatabases' +): boolean +export function getProperty( + propertyName: 'application.ntfyStartup' +): configTypes.ConfigNtfyStartup export function getProperty( - propertyName: "settings.lot.lotNameSortNameFunction" -): (lotName: string) => string; + propertyName: 'activeDirectory' +): configTypes.ConfigActiveDirectory + +export function getProperty(propertyName: 'users.testing'): string[] +export function getProperty(propertyName: 'users.canLogin'): string[] +export function getProperty(propertyName: 'users.canUpdate'): string[] +export function getProperty(propertyName: 'users.isAdmin'): string[] export function getProperty( - propertyName: "settings.lotOccupancy.occupancyEndDateIsRequired" -): boolean; + propertyName: 'reverseProxy.disableCompression' +): boolean -export function getProperty(propertyName: "settings.lotOccupancy.occupantCityDefault"): string; -export function getProperty(propertyName: "settings.lotOccupancy.occupantProvinceDefault"): string; -export function getProperty(propertyName: "settings.lotOccupancy.prints"): string[]; +export function getProperty(propertyName: 'reverseProxy.disableEtag'): boolean +export function getProperty(propertyName: 'reverseProxy.urlPrefix'): string -export function getProperty(propertyName: "settings.fees.taxPercentageDefault"): number; +export function getProperty(propertyName: 'session.cookieName'): string +export function getProperty(propertyName: 'session.doKeepAlive'): boolean +export function getProperty(propertyName: 'session.maxAgeMillis'): number +export function getProperty(propertyName: 'session.secret'): string -export function getProperty(propertyName: "settings.workOrders.workOrderNumberLength"): number; +export function getProperty(propertyName: 'aliases.lot'): string +export function getProperty(propertyName: 'aliases.lots'): string +export function getProperty(propertyName: 'aliases.map'): string +export function getProperty(propertyName: 'aliases.maps'): string +export function getProperty(propertyName: 'aliases.occupancy'): string +export function getProperty(propertyName: 'aliases.occupancies'): string +export function getProperty(propertyName: 'aliases.occupancyStartDate'): string +export function getProperty(propertyName: 'aliases.occupant'): string +export function getProperty(propertyName: 'aliases.occupants'): string +export function getProperty(propertyName: 'aliases.workOrderOpenDate'): string +export function getProperty(propertyName: 'aliases.workOrderCloseDate'): string export function getProperty( - propertyName: "settings.workOrders.workOrderMilestoneDateRecentBeforeDays" -): number; + propertyName: 'aliases.externalReceiptNumber' +): string + +export function getProperty(propertyName: 'settings.map.mapCityDefault'): string export function getProperty( - propertyName: "settings.workOrders.workOrderMilestoneDateRecentAfterDays" -): number; + propertyName: 'settings.map.mapProvinceDefault' +): string -export function getProperty(propertyName: "settings.workOrders.calendarEmailAddress"): string; -export function getProperty(propertyName: "settings.workOrders.prints"): string[]; - -export function getProperty(propertyName: "settings.adminCleanup.recordDeleteAgeDays"): number; +export function getProperty(propertyName: 'settings.lot.lotNamePattern'): RegExp +export function getProperty( + propertyName: 'settings.lot.lotNameHelpText' +): string export function getProperty( - propertyName: "settings.printPdf.contentDisposition" -): "attachment" | "inline"; + propertyName: 'settings.lot.lotNameSortNameFunction' +): (lotName: string) => string + +export function getProperty( + propertyName: 'settings.lotOccupancy.occupancyEndDateIsRequired' +): boolean + +export function getProperty( + propertyName: 'settings.lotOccupancy.occupantCityDefault' +): string +export function getProperty( + propertyName: 'settings.lotOccupancy.occupantProvinceDefault' +): string +export function getProperty( + propertyName: 'settings.lotOccupancy.prints' +): string[] + +export function getProperty( + propertyName: 'settings.fees.taxPercentageDefault' +): number + +export function getProperty( + propertyName: 'settings.workOrders.workOrderNumberLength' +): number + +export function getProperty( + propertyName: 'settings.workOrders.workOrderMilestoneDateRecentBeforeDays' +): number + +export function getProperty( + propertyName: 'settings.workOrders.workOrderMilestoneDateRecentAfterDays' +): number + +export function getProperty( + propertyName: 'settings.workOrders.calendarEmailAddress' +): string +export function getProperty( + propertyName: 'settings.workOrders.prints' +): string[] + +export function getProperty( + propertyName: 'settings.adminCleanup.recordDeleteAgeDays' +): number + +export function getProperty( + propertyName: 'settings.printPdf.contentDisposition' +): 'attachment' | 'inline' export function getProperty(propertyName: string): unknown { - const propertyNameSplit = propertyName.split("."); + const propertyNameSplit = propertyName.split('.') - let currentObject = config; + let currentObject = config - for (const propertyNamePiece of propertyNameSplit) { - if (Object.prototype.hasOwnProperty.call(currentObject, propertyNamePiece)) { - currentObject = currentObject[propertyNamePiece]; - continue; - } - - return configFallbackValues.get(propertyName); + for (const propertyNamePiece of propertyNameSplit) { + if ( + Object.prototype.hasOwnProperty.call(currentObject, propertyNamePiece) + ) { + currentObject = currentObject[propertyNamePiece] + continue } - return currentObject; + return configFallbackValues.get(propertyName) + } + + return currentObject } -export const keepAliveMillis = getProperty("session.doKeepAlive") - ? Math.max( - getProperty("session.maxAgeMillis") / 2, - getProperty("session.maxAgeMillis") - 10 * 60 * 1000 - ) - : 0; +export const keepAliveMillis = getProperty('session.doKeepAlive') + ? Math.max( + getProperty('session.maxAgeMillis') / 2, + getProperty('session.maxAgeMillis') - 10 * 60 * 1000 + ) + : 0 diff --git a/helpers/functions.fee.d.ts b/helpers/functions.fee.d.ts index a44409da..6151b2ae 100644 --- a/helpers/functions.fee.d.ts +++ b/helpers/functions.fee.d.ts @@ -1,3 +1,3 @@ -import * as recordTypes from "../types/recordTypes"; +import * as recordTypes from '../types/recordTypes'; export declare const calculateFeeAmount: (fee: recordTypes.Fee, lotOccupancy: recordTypes.LotOccupancy) => number; export declare function calculateTaxAmount(fee: recordTypes.Fee, feeAmount: number): number; diff --git a/helpers/functions.fee.js b/helpers/functions.fee.js index 88f6426d..4d577b92 100644 --- a/helpers/functions.fee.js +++ b/helpers/functions.fee.js @@ -1,6 +1,8 @@ export const calculateFeeAmount = (fee, lotOccupancy) => { - return fee.feeFunction ? 0 : fee.feeAmount || 0; + return fee.feeFunction ? 0 : fee.feeAmount ?? 0; }; export function calculateTaxAmount(fee, feeAmount) { - return fee.taxPercentage ? feeAmount * (fee.taxPercentage / 100) : fee.taxAmount || 0; + return fee.taxPercentage + ? feeAmount * (fee.taxPercentage / 100) + : fee.taxAmount ?? 0; } diff --git a/helpers/functions.fee.ts b/helpers/functions.fee.ts index c866521d..c2731752 100644 --- a/helpers/functions.fee.ts +++ b/helpers/functions.fee.ts @@ -1,12 +1,14 @@ -import * as recordTypes from "../types/recordTypes"; +import * as recordTypes from '../types/recordTypes' export const calculateFeeAmount = ( - fee: recordTypes.Fee, - lotOccupancy: recordTypes.LotOccupancy + fee: recordTypes.Fee, + lotOccupancy: recordTypes.LotOccupancy ): number => { - return fee.feeFunction ? 0 : fee.feeAmount || 0; -}; - -export function calculateTaxAmount(fee: recordTypes.Fee, feeAmount: number) { - return fee.taxPercentage ? feeAmount * (fee.taxPercentage / 100) : fee.taxAmount || 0; + return fee.feeFunction ? 0 : fee.feeAmount ?? 0 +} + +export function calculateTaxAmount(fee: recordTypes.Fee, feeAmount: number): number { + return fee.taxPercentage + ? feeAmount * (fee.taxPercentage / 100) + : fee.taxAmount ?? 0 } diff --git a/helpers/functions.lotOccupancy.d.ts b/helpers/functions.lotOccupancy.d.ts index bc1ee5e7..e1eb4b03 100644 --- a/helpers/functions.lotOccupancy.d.ts +++ b/helpers/functions.lotOccupancy.d.ts @@ -1,4 +1,4 @@ -import type * as recordTypes from "../types/recordTypes"; +import type * as recordTypes from '../types/recordTypes'; export declare function filterOccupantsByLotOccupantType(lotOccupancy: recordTypes.LotOccupancy, lotOccupantType: string): recordTypes.LotOccupancyOccupant[]; export declare function getFieldValueByOccupancyTypeField(lotOccupancy: recordTypes.LotOccupancy, occupancyTypeField: string): string | undefined; export declare function getFeesByFeeCategory(lotOccupancy: recordTypes.LotOccupancy, feeCategory: string, feeCategoryContains?: boolean): recordTypes.LotOccupancyFee[]; diff --git a/helpers/functions.lotOccupancy.js b/helpers/functions.lotOccupancy.js index 1ad93e17..8ae0db53 100644 --- a/helpers/functions.lotOccupancy.js +++ b/helpers/functions.lotOccupancy.js @@ -1,13 +1,14 @@ export function filterOccupantsByLotOccupantType(lotOccupancy, lotOccupantType) { const lotOccupantTypeLowerCase = lotOccupantType.toLowerCase(); - const occupants = (lotOccupancy.lotOccupancyOccupants || []).filter((possibleOccupant) => { - return (possibleOccupant.lotOccupantType.toLowerCase() === lotOccupantTypeLowerCase); + const occupants = (lotOccupancy.lotOccupancyOccupants ?? []).filter((possibleOccupant) => { + return (possibleOccupant.lotOccupantType.toLowerCase() === + lotOccupantTypeLowerCase); }); return occupants; } export function getFieldValueByOccupancyTypeField(lotOccupancy, occupancyTypeField) { const occupancyTypeFieldLowerCase = occupancyTypeField.toLowerCase(); - const field = (lotOccupancy.lotOccupancyFields || []).find((possibleField) => { + const field = (lotOccupancy.lotOccupancyFields ?? []).find((possibleField) => { return (possibleField.occupancyTypeField.toLowerCase() === occupancyTypeFieldLowerCase); }); @@ -18,16 +19,19 @@ export function getFieldValueByOccupancyTypeField(lotOccupancy, occupancyTypeFie } export function getFeesByFeeCategory(lotOccupancy, feeCategory, feeCategoryContains = false) { const feeCategoryLowerCase = feeCategory.toLowerCase(); - const fees = (lotOccupancy.lotOccupancyFees || []).filter((possibleFee) => { + const fees = (lotOccupancy.lotOccupancyFees ?? []).filter((possibleFee) => { return feeCategoryContains - ? possibleFee.feeCategory.toLowerCase().includes(feeCategoryLowerCase) - : possibleFee.feeCategory.toLowerCase() === feeCategoryLowerCase; + ? possibleFee.feeCategory + .toLowerCase() + .includes(feeCategoryLowerCase) + : possibleFee.feeCategory.toLowerCase() === + feeCategoryLowerCase; }); return fees; } export function getTransactionTotal(lotOccupancy) { let transactionTotal = 0; - for (const transaction of lotOccupancy.lotOccupancyTransactions || []) { + for (const transaction of lotOccupancy.lotOccupancyTransactions ?? []) { transactionTotal += transaction.transactionAmount; } return transactionTotal; diff --git a/helpers/functions.lotOccupancy.ts b/helpers/functions.lotOccupancy.ts index ecc34a81..826c8214 100644 --- a/helpers/functions.lotOccupancy.ts +++ b/helpers/functions.lotOccupancy.ts @@ -1,62 +1,72 @@ -import type * as recordTypes from "../types/recordTypes"; +import type * as recordTypes from '../types/recordTypes' export function filterOccupantsByLotOccupantType( - lotOccupancy: recordTypes.LotOccupancy, - lotOccupantType: string + lotOccupancy: recordTypes.LotOccupancy, + lotOccupantType: string ): recordTypes.LotOccupancyOccupant[] { - const lotOccupantTypeLowerCase = lotOccupantType.toLowerCase(); + const lotOccupantTypeLowerCase = lotOccupantType.toLowerCase() - const occupants = (lotOccupancy.lotOccupancyOccupants || []).filter((possibleOccupant) => { - return ( - (possibleOccupant.lotOccupantType as string).toLowerCase() === lotOccupantTypeLowerCase - ); - }); + const occupants = (lotOccupancy.lotOccupancyOccupants ?? []).filter( + (possibleOccupant) => { + return ( + (possibleOccupant.lotOccupantType as string).toLowerCase() === + lotOccupantTypeLowerCase + ) + } + ) - return occupants; + return occupants } export function getFieldValueByOccupancyTypeField( - lotOccupancy: recordTypes.LotOccupancy, - occupancyTypeField: string + lotOccupancy: recordTypes.LotOccupancy, + occupancyTypeField: string ): string | undefined { - const occupancyTypeFieldLowerCase = occupancyTypeField.toLowerCase(); + const occupancyTypeFieldLowerCase = occupancyTypeField.toLowerCase() - const field = (lotOccupancy.lotOccupancyFields || []).find((possibleField) => { - return ( - (possibleField.occupancyTypeField as string).toLowerCase() === - occupancyTypeFieldLowerCase - ); - }); - - if (field) { - return field.lotOccupancyFieldValue; + const field = (lotOccupancy.lotOccupancyFields ?? []).find( + (possibleField) => { + return ( + (possibleField.occupancyTypeField as string).toLowerCase() === + occupancyTypeFieldLowerCase + ) } + ) - return undefined; + if (field) { + return field.lotOccupancyFieldValue + } + + return undefined } export function getFeesByFeeCategory( - lotOccupancy: recordTypes.LotOccupancy, - feeCategory: string, - feeCategoryContains = false -) { - const feeCategoryLowerCase = feeCategory.toLowerCase(); + lotOccupancy: recordTypes.LotOccupancy, + feeCategory: string, + feeCategoryContains = false +): recordTypes.LotOccupancyFee[] { + const feeCategoryLowerCase = feeCategory.toLowerCase() - const fees = (lotOccupancy.lotOccupancyFees || []).filter((possibleFee) => { - return feeCategoryContains - ? (possibleFee.feeCategory as string).toLowerCase().includes(feeCategoryLowerCase) - : (possibleFee.feeCategory as string).toLowerCase() === feeCategoryLowerCase; - }); + const fees = (lotOccupancy.lotOccupancyFees ?? []).filter((possibleFee) => { + return feeCategoryContains + ? (possibleFee.feeCategory as string) + .toLowerCase() + .includes(feeCategoryLowerCase) + : (possibleFee.feeCategory as string).toLowerCase() === + feeCategoryLowerCase + }) - return fees; + return fees } -export function getTransactionTotal(lotOccupancy: recordTypes.LotOccupancy) { - let transactionTotal = 0; +export function getTransactionTotal( + lotOccupancy: recordTypes.LotOccupancy +): number { + let transactionTotal = 0 - for (const transaction of lotOccupancy.lotOccupancyTransactions || []) { - transactionTotal += transaction.transactionAmount; - } + for (const transaction of lotOccupancy.lotOccupancyTransactions ?? []) { + transactionTotal += transaction.transactionAmount + } - return transactionTotal; + return transactionTotal } diff --git a/helpers/functions.map.js b/helpers/functions.map.js index b2b6a684..fa8cd0d8 100644 --- a/helpers/functions.map.js +++ b/helpers/functions.map.js @@ -1,11 +1,11 @@ -import fs from "node:fs/promises"; +import fs from 'node:fs/promises'; let mapSVGs; export async function getMapSVGs() { if (!mapSVGs) { - const files = await fs.readdir("./public/images/maps/"); + const files = await fs.readdir('./public/images/maps/'); const SVGs = []; for (const file of files) { - if (file.toLowerCase().endsWith(".svg")) { + if (file.toLowerCase().endsWith('.svg')) { SVGs.push(file); } } diff --git a/helpers/functions.map.ts b/helpers/functions.map.ts index da93b56b..ddde8d71 100644 --- a/helpers/functions.map.ts +++ b/helpers/functions.map.ts @@ -1,21 +1,21 @@ -import fs from "node:fs/promises"; +import fs from 'node:fs/promises' -let mapSVGs: string[]; +let mapSVGs: string[] export async function getMapSVGs(): Promise { - if (!mapSVGs) { - const files = await fs.readdir("./public/images/maps/"); + if (!mapSVGs) { + const files = await fs.readdir('./public/images/maps/') - const SVGs: string[] = []; + const SVGs: string[] = [] - for (const file of files) { - if (file.toLowerCase().endsWith(".svg")) { - SVGs.push(file); - } - } - - mapSVGs = SVGs; + for (const file of files) { + if (file.toLowerCase().endsWith('.svg')) { + SVGs.push(file) + } } - return mapSVGs; + mapSVGs = SVGs + } + + return mapSVGs } diff --git a/helpers/functions.print.d.ts b/helpers/functions.print.d.ts index 0825d394..b535ea44 100644 --- a/helpers/functions.print.d.ts +++ b/helpers/functions.print.d.ts @@ -4,10 +4,6 @@ interface PrintConfig { } export declare function getScreenPrintConfig(printName: string): PrintConfig; export declare function getPdfPrintConfig(printName: string): PrintConfig; -export declare function getPrintConfig(screenOrPdf_printName: string): PrintConfig | undefined; -export declare function getReportData(printConfig: PrintConfig, requestQuery: { - [paramName: string]: unknown; -}): { - [dataName: string]: unknown; -}; +export declare function getPrintConfig(screenOrPdfPrintName: string): PrintConfig | undefined; +export declare function getReportData(printConfig: PrintConfig, requestQuery: Record): Record; export {}; diff --git a/helpers/functions.print.js b/helpers/functions.print.js index 30032eff..7bc4f95f 100644 --- a/helpers/functions.print.js +++ b/helpers/functions.print.js @@ -1,14 +1,14 @@ -import * as configFunctions from "./functions.config.js"; -import { getLot } from "./lotOccupancyDB/getLot.js"; -import { getLotOccupancy } from "./lotOccupancyDB/getLotOccupancy.js"; -import { getWorkOrder } from "./lotOccupancyDB/getWorkOrder.js"; +import * as configFunctions from './functions.config.js'; +import { getLot } from './lotOccupancyDB/getLot.js'; +import { getLotOccupancy } from './lotOccupancyDB/getLotOccupancy.js'; +import { getWorkOrder } from './lotOccupancyDB/getWorkOrder.js'; const screenPrintConfigs = { lotOccupancy: { - title: configFunctions.getProperty("aliases.lot") + - " " + - configFunctions.getProperty("aliases.occupancy") + - " Print", - params: ["lotOccupancyId"] + title: configFunctions.getProperty('aliases.lot') + + ' ' + + configFunctions.getProperty('aliases.occupancy') + + ' Print', + params: ['lotOccupancyId'] } }; export function getScreenPrintConfig(printName) { @@ -16,32 +16,32 @@ export function getScreenPrintConfig(printName) { } const pdfPrintConfigs = { workOrder: { - title: "Work Order Field Sheet", - params: ["workOrderId"] + title: 'Work Order Field Sheet', + params: ['workOrderId'] }, - "workOrder-commentLog": { - title: "Work Order Field Sheet - Comment Log", - params: ["workOrderId"] + 'workOrder-commentLog': { + title: 'Work Order Field Sheet - Comment Log', + params: ['workOrderId'] }, - "ssm.cemetery.burialPermit": { - title: "Burial Permit", - params: ["lotOccupancyId"] + 'ssm.cemetery.burialPermit': { + title: 'Burial Permit', + params: ['lotOccupancyId'] }, - "ssm.cemetery.contract": { - title: "Contract for Purchase of Interment Rights", - params: ["lotOccupancyId"] + 'ssm.cemetery.contract': { + title: 'Contract for Purchase of Interment Rights', + params: ['lotOccupancyId'] } }; export function getPdfPrintConfig(printName) { return pdfPrintConfigs[printName]; } -export function getPrintConfig(screenOrPdf_printName) { - const printNameSplit = screenOrPdf_printName.split("/"); +export function getPrintConfig(screenOrPdfPrintName) { + const printNameSplit = screenOrPdfPrintName.split('/'); switch (printNameSplit[0]) { - case "screen": { + case 'screen': { return getScreenPrintConfig(printNameSplit[1]); } - case "pdf": { + case 'pdf': { return getPdfPrintConfig(printNameSplit[1]); } } @@ -51,16 +51,16 @@ export function getReportData(printConfig, requestQuery) { const reportData = { headTitle: printConfig.title }; - if (printConfig.params.includes("lotOccupancyId") && - typeof requestQuery.lotOccupancyId === "string") { + if (printConfig.params.includes('lotOccupancyId') && + typeof requestQuery.lotOccupancyId === 'string') { const lotOccupancy = getLotOccupancy(requestQuery.lotOccupancyId); - if (lotOccupancy && lotOccupancy.lotId) { + if (lotOccupancy?.lotId) { reportData.lot = getLot(lotOccupancy.lotId); } reportData.lotOccupancy = lotOccupancy; } - if (printConfig.params.includes("workOrderId") && - typeof requestQuery.workOrderId === "string") { + if (printConfig.params.includes('workOrderId') && + typeof requestQuery.workOrderId === 'string') { reportData.workOrder = getWorkOrder(requestQuery.workOrderId, { includeLotsAndLotOccupancies: true, includeComments: true, diff --git a/helpers/functions.print.ts b/helpers/functions.print.ts index 79169315..d946a419 100644 --- a/helpers/functions.print.ts +++ b/helpers/functions.print.ts @@ -1,100 +1,102 @@ -import * as configFunctions from "./functions.config.js"; +import * as configFunctions from './functions.config.js' -import { getLot } from "./lotOccupancyDB/getLot.js"; -import { getLotOccupancy } from "./lotOccupancyDB/getLotOccupancy.js"; -import { getWorkOrder } from "./lotOccupancyDB/getWorkOrder.js"; +import { getLot } from './lotOccupancyDB/getLot.js' +import { getLotOccupancy } from './lotOccupancyDB/getLotOccupancy.js' +import { getWorkOrder } from './lotOccupancyDB/getWorkOrder.js' interface PrintConfig { - title: string; - params: string[]; + title: string + params: string[] } -const screenPrintConfigs: { [printName: string]: PrintConfig } = { - lotOccupancy: { - title: - configFunctions.getProperty("aliases.lot") + - " " + - configFunctions.getProperty("aliases.occupancy") + - " Print", - params: ["lotOccupancyId"] - } -}; +const screenPrintConfigs: Record = { + lotOccupancy: { + title: + configFunctions.getProperty('aliases.lot') + + ' ' + + configFunctions.getProperty('aliases.occupancy') + + ' Print', + params: ['lotOccupancyId'] + } +} export function getScreenPrintConfig(printName: string): PrintConfig { - return screenPrintConfigs[printName]; + return screenPrintConfigs[printName] } -const pdfPrintConfigs: { [printName: string]: PrintConfig } = { - workOrder: { - title: "Work Order Field Sheet", - params: ["workOrderId"] - }, - "workOrder-commentLog": { - title: "Work Order Field Sheet - Comment Log", - params: ["workOrderId"] - }, +const pdfPrintConfigs: Record = { + workOrder: { + title: 'Work Order Field Sheet', + params: ['workOrderId'] + }, + 'workOrder-commentLog': { + title: 'Work Order Field Sheet - Comment Log', + params: ['workOrderId'] + }, - // Occupancy - "ssm.cemetery.burialPermit": { - title: "Burial Permit", - params: ["lotOccupancyId"] - }, - "ssm.cemetery.contract": { - title: "Contract for Purchase of Interment Rights", - params: ["lotOccupancyId"] - } -}; + // Occupancy + 'ssm.cemetery.burialPermit': { + title: 'Burial Permit', + params: ['lotOccupancyId'] + }, + 'ssm.cemetery.contract': { + title: 'Contract for Purchase of Interment Rights', + params: ['lotOccupancyId'] + } +} export function getPdfPrintConfig(printName: string): PrintConfig { - return pdfPrintConfigs[printName]; + return pdfPrintConfigs[printName] } -export function getPrintConfig(screenOrPdf_printName: string): PrintConfig | undefined { - const printNameSplit = screenOrPdf_printName.split("/"); +export function getPrintConfig( + screenOrPdfPrintName: string +): PrintConfig | undefined { + const printNameSplit = screenOrPdfPrintName.split('/') - switch (printNameSplit[0]) { - case "screen": { - return getScreenPrintConfig(printNameSplit[1]); - } - case "pdf": { - return getPdfPrintConfig(printNameSplit[1]); - } + switch (printNameSplit[0]) { + case 'screen': { + return getScreenPrintConfig(printNameSplit[1]) } + case 'pdf': { + return getPdfPrintConfig(printNameSplit[1]) + } + } - return undefined; + return undefined } export function getReportData( - printConfig: PrintConfig, - requestQuery: { [paramName: string]: unknown } -) { - const reportData: { [dataName: string]: unknown } = { - headTitle: printConfig.title - }; + printConfig: PrintConfig, + requestQuery: Record +): Record { + const reportData: Record = { + headTitle: printConfig.title + } - if ( - printConfig.params.includes("lotOccupancyId") && - typeof requestQuery.lotOccupancyId === "string" - ) { - const lotOccupancy = getLotOccupancy(requestQuery.lotOccupancyId); + if ( + printConfig.params.includes('lotOccupancyId') && + typeof requestQuery.lotOccupancyId === 'string' + ) { + const lotOccupancy = getLotOccupancy(requestQuery.lotOccupancyId) - if (lotOccupancy && lotOccupancy.lotId) { - reportData.lot = getLot(lotOccupancy.lotId); - } - - reportData.lotOccupancy = lotOccupancy; + if (lotOccupancy?.lotId) { + reportData.lot = getLot(lotOccupancy.lotId) } - if ( - printConfig.params.includes("workOrderId") && - typeof requestQuery.workOrderId === "string" - ) { - reportData.workOrder = getWorkOrder(requestQuery.workOrderId, { - includeLotsAndLotOccupancies: true, - includeComments: true, - includeMilestones: true - }); - } + reportData.lotOccupancy = lotOccupancy + } - return reportData; + if ( + printConfig.params.includes('workOrderId') && + typeof requestQuery.workOrderId === 'string' + ) { + reportData.workOrder = getWorkOrder(requestQuery.workOrderId, { + includeLotsAndLotOccupancies: true, + includeComments: true, + includeMilestones: true + }) + } + + return reportData } diff --git a/helpers/functions.user.d.ts b/helpers/functions.user.d.ts index 5c246853..830f43e8 100644 --- a/helpers/functions.user.d.ts +++ b/helpers/functions.user.d.ts @@ -1,4 +1,4 @@ -import type { User } from "../types/recordTypes"; +import type { User } from '../types/recordTypes'; export interface UserRequest { session?: { user?: User; diff --git a/helpers/functions.user.js b/helpers/functions.user.js index ef36653b..aa3b39c9 100644 --- a/helpers/functions.user.js +++ b/helpers/functions.user.js @@ -1,15 +1,15 @@ -import { getUserNameFromApiKey } from "./functions.api.js"; -import * as configFunctions from "./functions.config.js"; +import { getUserNameFromApiKey } from './functions.api.js'; +import * as configFunctions from './functions.config.js'; export function userIsAdmin(request) { const user = request.session?.user; - if (!user || !user.userProperties) { + if (!user?.userProperties) { return false; } return user.userProperties.isAdmin; } export function userCanUpdate(request) { const user = request.session?.user; - if (!user || !user.userProperties) { + if (!user?.userProperties) { return false; } return user.userProperties.canUpdate; @@ -23,7 +23,9 @@ export async function apiKeyIsValid(request) { if (!userName) { return false; } - const canLogin = configFunctions.getProperty("users.canLogin").some((currentUserName) => { + const canLogin = configFunctions + .getProperty('users.canLogin') + .some((currentUserName) => { return userName === currentUserName.toLowerCase(); }); return canLogin; diff --git a/helpers/functions.user.ts b/helpers/functions.user.ts index aaf7d7dd..70b650c4 100644 --- a/helpers/functions.user.ts +++ b/helpers/functions.user.ts @@ -1,56 +1,58 @@ -import { getUserNameFromApiKey } from "./functions.api.js"; -import * as configFunctions from "./functions.config.js"; +import { getUserNameFromApiKey } from './functions.api.js' +import * as configFunctions from './functions.config.js' -import type { User } from "../types/recordTypes"; +import type { User } from '../types/recordTypes' export interface UserRequest { - session?: { - user?: User; - }; + session?: { + user?: User + } } export interface APIRequest { - params?: { - apiKey?: string; - }; + params?: { + apiKey?: string + } } export function userIsAdmin(request: UserRequest): boolean { - const user = request.session?.user; + const user = request.session?.user - if (!user || !user.userProperties) { - return false; - } + if (!user?.userProperties) { + return false + } - return user.userProperties.isAdmin; + return user.userProperties.isAdmin } export function userCanUpdate(request: UserRequest): boolean { - const user = request.session?.user; + const user = request.session?.user - if (!user || !user.userProperties) { - return false; - } + if (!user?.userProperties) { + return false + } - return user.userProperties.canUpdate; + return user.userProperties.canUpdate } export async function apiKeyIsValid(request: APIRequest): Promise { - const apiKey = request.params?.apiKey; + const apiKey = request.params?.apiKey - if (!apiKey) { - return false; - } + if (!apiKey) { + return false + } - const userName = await getUserNameFromApiKey(apiKey); + const userName = await getUserNameFromApiKey(apiKey) - if (!userName) { - return false; - } + if (!userName) { + return false + } - const canLogin = configFunctions.getProperty("users.canLogin").some((currentUserName) => { - return userName === currentUserName.toLowerCase(); - }); + const canLogin = configFunctions + .getProperty('users.canLogin') + .some((currentUserName) => { + return userName === currentUserName.toLowerCase() + }) - return canLogin; + return canLogin } diff --git a/helpers/initializer.database.cemetery.js b/helpers/initializer.database.cemetery.js index d9c28d88..c2a70dac 100644 --- a/helpers/initializer.database.cemetery.js +++ b/helpers/initializer.database.cemetery.js @@ -1,75 +1,77 @@ -import { lotOccupancyDB as databasePath } from "../data/databasePaths.js"; -import { initializeDatabase } from "./initializer.database.js"; -import { addOccupancyTypeField } from "./lotOccupancyDB/addOccupancyTypeField.js"; -import { addLotOccupantType } from "./lotOccupancyDB/addLotOccupantType.js"; -import Debug from "debug"; -import { addRecord } from "./lotOccupancyDB/addRecord.js"; -const debug = Debug("lot-occupancy-system:initialize"); +import { lotOccupancyDB as databasePath } from '../data/databasePaths.js'; +import { initializeDatabase } from './initializer.database.js'; +import { addOccupancyTypeField } from './lotOccupancyDB/addOccupancyTypeField.js'; +import { addLotOccupantType } from './lotOccupancyDB/addLotOccupantType.js'; +import Debug from 'debug'; +import { addRecord } from './lotOccupancyDB/addRecord.js'; +const debug = Debug('lot-occupancy-system:initialize'); const session = { user: { - userName: "init.cemetery", + userName: 'init.cemetery', userProperties: { canUpdate: true, isAdmin: true, - apiKey: "" + apiKey: '' } } }; function initializeCemeteryDatabase() { - debug("Checking for " + databasePath + "..."); + debug('Checking for ' + databasePath + '...'); const databaseInitialized = initializeDatabase(); if (!databaseInitialized) { - debug("Database already created.\n" + - "To initialize this database with cemetery types, delete the database file first, then rerun this script."); + debug('Database already created.\n' + + 'To initialize this database with cemetery types, delete the database file first, then rerun this script.'); return; } - debug("New database file created. Proceeding with initialization."); - addRecord("LotTypes", "Casket Grave", 1, session); - addRecord("LotTypes", "Columbarium", 2, session); - addRecord("LotTypes", "Mausoleum", 2, session); - addRecord("LotTypes", "Niche Wall", 2, session); - addRecord("LotTypes", "Urn Garden", 2, session); - addRecord("LotTypes", "Crematorium", 2, session); - addRecord("LotStatuses", "Available", 1, session); - addRecord("LotStatuses", "Reserved", 2, session); - addRecord("LotStatuses", "Taken", 3, session); + debug('New database file created. Proceeding with initialization.'); + addRecord('LotTypes', 'Casket Grave', 1, session); + addRecord('LotTypes', 'Columbarium', 2, session); + addRecord('LotTypes', 'Mausoleum', 2, session); + addRecord('LotTypes', 'Niche Wall', 2, session); + addRecord('LotTypes', 'Urn Garden', 2, session); + addRecord('LotTypes', 'Crematorium', 2, session); + addRecord('LotStatuses', 'Available', 1, session); + addRecord('LotStatuses', 'Reserved', 2, session); + addRecord('LotStatuses', 'Taken', 3, session); addLotOccupantType({ - lotOccupantType: "Deceased", + lotOccupantType: 'Deceased', orderNumber: 1 }, session); addLotOccupantType({ - lotOccupantType: "Funeral Director", + lotOccupantType: 'Funeral Director', orderNumber: 2 }, session); addLotOccupantType({ - lotOccupantType: "Preneed Owner", + lotOccupantType: 'Preneed Owner', orderNumber: 3 }, session); addLotOccupantType({ - lotOccupantType: "Purchaser", + lotOccupantType: 'Purchaser', orderNumber: 4 }, session); - addRecord("OccupancyTypes", "Preneed", 1, session); - const intermentOccupancyTypeId = addRecord("OccupancyTypes", "Interment", 2, session); - const cremationOccupancyTypeId = addRecord("OccupancyTypes", "Cremation", 3, session); + addRecord('OccupancyTypes', 'Preneed', 1, session); + const intermentOccupancyTypeId = addRecord('OccupancyTypes', 'Interment', 2, session); + const cremationOccupancyTypeId = addRecord('OccupancyTypes', 'Cremation', 3, session); const deathDateField = { occupancyTypeId: intermentOccupancyTypeId, - occupancyTypeField: "Death Date", - occupancyTypeFieldValues: "", - pattern: "\\d{4}([\\/-]\\d{2}){2}", - isRequired: "", + occupancyTypeField: 'Death Date', + occupancyTypeFieldValues: '', + pattern: '\\d{4}([\\/-]\\d{2}){2}', + isRequired: '', minimumLength: 10, maximumLength: 10, orderNumber: 1 }; addOccupancyTypeField(deathDateField, session); - addOccupancyTypeField(Object.assign(deathDateField, { occupancyTypeId: cremationOccupancyTypeId }), session); + addOccupancyTypeField(Object.assign(deathDateField, { + occupancyTypeId: cremationOccupancyTypeId + }), session); const deathAgeField = { occupancyTypeId: intermentOccupancyTypeId, - occupancyTypeField: "Death Age", - occupancyTypeFieldValues: "", - pattern: "\\d+", - isRequired: "", + occupancyTypeField: 'Death Age', + occupancyTypeFieldValues: '', + pattern: '\\d+', + isRequired: '', minimumLength: 1, maximumLength: 3, orderNumber: 2 @@ -78,22 +80,24 @@ function initializeCemeteryDatabase() { addOccupancyTypeField(Object.assign(deathAgeField, { occupancyTypeId: cremationOccupancyTypeId }), session); const deathAgePeriod = { occupancyTypeId: intermentOccupancyTypeId, - occupancyTypeField: "Death Age Period", - occupancyTypeFieldValues: "Years\nMonths\nDays\nStillborn", - pattern: "", - isRequired: "", + occupancyTypeField: 'Death Age Period', + occupancyTypeFieldValues: 'Years\nMonths\nDays\nStillborn', + pattern: '', + isRequired: '', minimumLength: 1, maximumLength: 10, orderNumber: 3 }; addOccupancyTypeField(deathAgePeriod, session); - addOccupancyTypeField(Object.assign(deathAgePeriod, { occupancyTypeId: cremationOccupancyTypeId }), session); + addOccupancyTypeField(Object.assign(deathAgePeriod, { + occupancyTypeId: cremationOccupancyTypeId + }), session); const deathPlace = { occupancyTypeId: intermentOccupancyTypeId, - occupancyTypeField: "Death Place", - occupancyTypeFieldValues: "", - pattern: "", - isRequired: "", + occupancyTypeField: 'Death Place', + occupancyTypeFieldValues: '', + pattern: '', + isRequired: '', minimumLength: 1, maximumLength: 100, orderNumber: 4 @@ -102,10 +106,10 @@ function initializeCemeteryDatabase() { addOccupancyTypeField(Object.assign(deathPlace, { occupancyTypeId: cremationOccupancyTypeId }), session); const funeralHome = { occupancyTypeId: intermentOccupancyTypeId, - occupancyTypeField: "Funeral Home", - occupancyTypeFieldValues: "", - pattern: "", - isRequired: "", + occupancyTypeField: 'Funeral Home', + occupancyTypeFieldValues: '', + pattern: '', + isRequired: '', minimumLength: 1, maximumLength: 100, orderNumber: 10 @@ -114,10 +118,10 @@ function initializeCemeteryDatabase() { addOccupancyTypeField(Object.assign(funeralHome, { occupancyTypeId: cremationOccupancyTypeId }), session); const funeralDate = { occupancyTypeId: intermentOccupancyTypeId, - occupancyTypeField: "Funeral Date", - occupancyTypeFieldValues: "", - pattern: "\\d{4}([\\/-]\\d{2}){2}", - isRequired: "", + occupancyTypeField: 'Funeral Date', + occupancyTypeFieldValues: '', + pattern: '\\d{4}([\\/-]\\d{2}){2}', + isRequired: '', minimumLength: 10, maximumLength: 10, orderNumber: 11 @@ -126,10 +130,10 @@ function initializeCemeteryDatabase() { addOccupancyTypeField(Object.assign(funeralDate, { occupancyTypeId: cremationOccupancyTypeId }), session); const containerType = { occupancyTypeId: intermentOccupancyTypeId, - occupancyTypeField: "Container Type", - occupancyTypeFieldValues: "", - pattern: "", - isRequired: "", + occupancyTypeField: 'Container Type', + occupancyTypeFieldValues: '', + pattern: '', + isRequired: '', minimumLength: 1, maximumLength: 100, orderNumber: 20 @@ -138,20 +142,20 @@ function initializeCemeteryDatabase() { addOccupancyTypeField(Object.assign(containerType, { occupancyTypeId: cremationOccupancyTypeId }), session); const committalType = { occupancyTypeId: intermentOccupancyTypeId, - occupancyTypeField: "Committal Type", - occupancyTypeFieldValues: "", - pattern: "", - isRequired: "", + occupancyTypeField: 'Committal Type', + occupancyTypeFieldValues: '', + pattern: '', + isRequired: '', minimumLength: 1, maximumLength: 100, orderNumber: 21 }; addOccupancyTypeField(committalType, session); addOccupancyTypeField(Object.assign(committalType, { occupancyTypeId: cremationOccupancyTypeId }), session); - addRecord("FeeCategories", "Interment Rights", 1, session); - addRecord("FeeCategories", "Cremation Services", 2, session); - addRecord("FeeCategories", "Burial Charges", 3, session); - addRecord("FeeCategories", "Disinterment of Human Remains", 4, session); - addRecord("FeeCategories", "Additional Services", 4, session); + addRecord('FeeCategories', 'Interment Rights', 1, session); + addRecord('FeeCategories', 'Cremation Services', 2, session); + addRecord('FeeCategories', 'Burial Charges', 3, session); + addRecord('FeeCategories', 'Disinterment of Human Remains', 4, session); + addRecord('FeeCategories', 'Additional Services', 4, session); } initializeCemeteryDatabase(); diff --git a/helpers/initializer.database.cemetery.ts b/helpers/initializer.database.cemetery.ts index 0b49ba5e..cf59d252 100644 --- a/helpers/initializer.database.cemetery.ts +++ b/helpers/initializer.database.cemetery.ts @@ -1,261 +1,284 @@ -import { lotOccupancyDB as databasePath } from "../data/databasePaths.js"; +import { lotOccupancyDB as databasePath } from '../data/databasePaths.js' -import { initializeDatabase } from "./initializer.database.js"; +import { initializeDatabase } from './initializer.database.js' -import { addOccupancyTypeField } from "./lotOccupancyDB/addOccupancyTypeField.js"; +import { addOccupancyTypeField } from './lotOccupancyDB/addOccupancyTypeField.js' -import { addLotOccupantType } from "./lotOccupancyDB/addLotOccupantType.js"; +import { addLotOccupantType } from './lotOccupancyDB/addLotOccupantType.js' -import type { PartialSession } from "../types/recordTypes.js"; +import type { PartialSession } from '../types/recordTypes.js' -import Debug from "debug"; -import { addRecord } from "./lotOccupancyDB/addRecord.js"; -const debug = Debug("lot-occupancy-system:initialize"); +import Debug from 'debug' +import { addRecord } from './lotOccupancyDB/addRecord.js' +const debug = Debug('lot-occupancy-system:initialize') const session: PartialSession = { - user: { - userName: "init.cemetery", - userProperties: { - canUpdate: true, - isAdmin: true, - apiKey: "" - } + user: { + userName: 'init.cemetery', + userProperties: { + canUpdate: true, + isAdmin: true, + apiKey: '' } -}; - -function initializeCemeteryDatabase() { - /* - * Ensure database does not already exist - */ - debug("Checking for " + databasePath + "..."); - - const databaseInitialized = initializeDatabase(); - - if (!databaseInitialized) { - debug( - "Database already created.\n" + - "To initialize this database with cemetery types, delete the database file first, then rerun this script." - ); - return; - } - - debug("New database file created. Proceeding with initialization."); - - /* - * Lot Types - */ - - addRecord("LotTypes", "Casket Grave", 1, session); - addRecord("LotTypes", "Columbarium", 2, session); - addRecord("LotTypes", "Mausoleum", 2, session); - addRecord("LotTypes", "Niche Wall", 2, session); - addRecord("LotTypes", "Urn Garden", 2, session); - addRecord("LotTypes", "Crematorium", 2, session); - - /* - * Lot Statuses - */ - - addRecord("LotStatuses", "Available", 1, session); - addRecord("LotStatuses", "Reserved", 2, session); - addRecord("LotStatuses", "Taken", 3, session); - - /* - * Lot Occupant Types - */ - - addLotOccupantType( - { - lotOccupantType: "Deceased", - orderNumber: 1 - }, - session - ); - - addLotOccupantType( - { - lotOccupantType: "Funeral Director", - orderNumber: 2 - }, - session - ); - - addLotOccupantType( - { - lotOccupantType: "Preneed Owner", - orderNumber: 3 - }, - session - ); - - addLotOccupantType( - { - lotOccupantType: "Purchaser", - orderNumber: 4 - }, - session - ); - - /* - * Occupancy Types - */ - - addRecord("OccupancyTypes", "Preneed", 1, session); - const intermentOccupancyTypeId = addRecord("OccupancyTypes", "Interment", 2, session); - const cremationOccupancyTypeId = addRecord("OccupancyTypes", "Cremation", 3, session); - - // Death Date - const deathDateField = { - occupancyTypeId: intermentOccupancyTypeId, - occupancyTypeField: "Death Date", - occupancyTypeFieldValues: "", - pattern: "\\d{4}([\\/-]\\d{2}){2}", - isRequired: "", - minimumLength: 10, - maximumLength: 10, - orderNumber: 1 - }; - - addOccupancyTypeField(deathDateField, session); - - addOccupancyTypeField( - Object.assign(deathDateField, { occupancyTypeId: cremationOccupancyTypeId }), - session - ); - - // Death Age - const deathAgeField = { - occupancyTypeId: intermentOccupancyTypeId, - occupancyTypeField: "Death Age", - occupancyTypeFieldValues: "", - pattern: "\\d+", - isRequired: "", - minimumLength: 1, - maximumLength: 3, - orderNumber: 2 - }; - - addOccupancyTypeField(deathAgeField, session); - - addOccupancyTypeField( - Object.assign(deathAgeField, { occupancyTypeId: cremationOccupancyTypeId }), - session - ); - - // Death Age Period - const deathAgePeriod = { - occupancyTypeId: intermentOccupancyTypeId, - occupancyTypeField: "Death Age Period", - occupancyTypeFieldValues: "Years\nMonths\nDays\nStillborn", - pattern: "", - isRequired: "", - minimumLength: 1, - maximumLength: 10, - orderNumber: 3 - }; - - addOccupancyTypeField(deathAgePeriod, session); - - addOccupancyTypeField( - Object.assign(deathAgePeriod, { occupancyTypeId: cremationOccupancyTypeId }), - session - ); - - // Death Place - const deathPlace = { - occupancyTypeId: intermentOccupancyTypeId, - occupancyTypeField: "Death Place", - occupancyTypeFieldValues: "", - pattern: "", - isRequired: "", - minimumLength: 1, - maximumLength: 100, - orderNumber: 4 - }; - - addOccupancyTypeField(deathPlace, session); - - addOccupancyTypeField(Object.assign(deathPlace, { occupancyTypeId: cremationOccupancyTypeId }), session); - - // Funeral Home - const funeralHome = { - occupancyTypeId: intermentOccupancyTypeId, - occupancyTypeField: "Funeral Home", - occupancyTypeFieldValues: "", - pattern: "", - isRequired: "", - minimumLength: 1, - maximumLength: 100, - orderNumber: 10 - }; - - addOccupancyTypeField(funeralHome, session); - - addOccupancyTypeField(Object.assign(funeralHome, { occupancyTypeId: cremationOccupancyTypeId }), session); - - // Funeral Date - const funeralDate = { - occupancyTypeId: intermentOccupancyTypeId, - occupancyTypeField: "Funeral Date", - occupancyTypeFieldValues: "", - pattern: "\\d{4}([\\/-]\\d{2}){2}", - isRequired: "", - minimumLength: 10, - maximumLength: 10, - orderNumber: 11 - }; - - addOccupancyTypeField(funeralDate, session); - - addOccupancyTypeField(Object.assign(funeralDate, { occupancyTypeId: cremationOccupancyTypeId }), session); - - // Container Type - const containerType = { - occupancyTypeId: intermentOccupancyTypeId, - occupancyTypeField: "Container Type", - occupancyTypeFieldValues: "", - pattern: "", - isRequired: "", - minimumLength: 1, - maximumLength: 100, - orderNumber: 20 - }; - - addOccupancyTypeField(containerType, session); - - addOccupancyTypeField( - Object.assign(containerType, { occupancyTypeId: cremationOccupancyTypeId }), - session - ); - - // Committal Type - const committalType = { - occupancyTypeId: intermentOccupancyTypeId, - occupancyTypeField: "Committal Type", - occupancyTypeFieldValues: "", - pattern: "", - isRequired: "", - minimumLength: 1, - maximumLength: 100, - orderNumber: 21 - }; - - addOccupancyTypeField(committalType, session); - - addOccupancyTypeField( - Object.assign(committalType, { occupancyTypeId: cremationOccupancyTypeId }), - session - ); - - /* - * Fee Categories - */ - - addRecord("FeeCategories", "Interment Rights", 1, session); - addRecord("FeeCategories", "Cremation Services", 2, session); - addRecord("FeeCategories", "Burial Charges", 3, session); - addRecord("FeeCategories", "Disinterment of Human Remains", 4, session); - addRecord("FeeCategories", "Additional Services", 4, session); + } } -initializeCemeteryDatabase(); +function initializeCemeteryDatabase(): void { + /* + * Ensure database does not already exist + */ + debug('Checking for ' + databasePath + '...') + + const databaseInitialized = initializeDatabase() + + if (!databaseInitialized) { + debug( + 'Database already created.\n' + + 'To initialize this database with cemetery types, delete the database file first, then rerun this script.' + ) + return + } + + debug('New database file created. Proceeding with initialization.') + + /* + * Lot Types + */ + + addRecord('LotTypes', 'Casket Grave', 1, session) + addRecord('LotTypes', 'Columbarium', 2, session) + addRecord('LotTypes', 'Mausoleum', 2, session) + addRecord('LotTypes', 'Niche Wall', 2, session) + addRecord('LotTypes', 'Urn Garden', 2, session) + addRecord('LotTypes', 'Crematorium', 2, session) + + /* + * Lot Statuses + */ + + addRecord('LotStatuses', 'Available', 1, session) + addRecord('LotStatuses', 'Reserved', 2, session) + addRecord('LotStatuses', 'Taken', 3, session) + + /* + * Lot Occupant Types + */ + + addLotOccupantType( + { + lotOccupantType: 'Deceased', + orderNumber: 1 + }, + session + ) + + addLotOccupantType( + { + lotOccupantType: 'Funeral Director', + orderNumber: 2 + }, + session + ) + + addLotOccupantType( + { + lotOccupantType: 'Preneed Owner', + orderNumber: 3 + }, + session + ) + + addLotOccupantType( + { + lotOccupantType: 'Purchaser', + orderNumber: 4 + }, + session + ) + + /* + * Occupancy Types + */ + + addRecord('OccupancyTypes', 'Preneed', 1, session) + const intermentOccupancyTypeId = addRecord( + 'OccupancyTypes', + 'Interment', + 2, + session + ) + const cremationOccupancyTypeId = addRecord( + 'OccupancyTypes', + 'Cremation', + 3, + session + ) + + // Death Date + const deathDateField = { + occupancyTypeId: intermentOccupancyTypeId, + occupancyTypeField: 'Death Date', + occupancyTypeFieldValues: '', + pattern: '\\d{4}([\\/-]\\d{2}){2}', + isRequired: '', + minimumLength: 10, + maximumLength: 10, + orderNumber: 1 + } + + addOccupancyTypeField(deathDateField, session) + + addOccupancyTypeField( + Object.assign(deathDateField, { + occupancyTypeId: cremationOccupancyTypeId + }), + session + ) + + // Death Age + const deathAgeField = { + occupancyTypeId: intermentOccupancyTypeId, + occupancyTypeField: 'Death Age', + occupancyTypeFieldValues: '', + pattern: '\\d+', + isRequired: '', + minimumLength: 1, + maximumLength: 3, + orderNumber: 2 + } + + addOccupancyTypeField(deathAgeField, session) + + addOccupancyTypeField( + Object.assign(deathAgeField, { occupancyTypeId: cremationOccupancyTypeId }), + session + ) + + // Death Age Period + const deathAgePeriod = { + occupancyTypeId: intermentOccupancyTypeId, + occupancyTypeField: 'Death Age Period', + occupancyTypeFieldValues: 'Years\nMonths\nDays\nStillborn', + pattern: '', + isRequired: '', + minimumLength: 1, + maximumLength: 10, + orderNumber: 3 + } + + addOccupancyTypeField(deathAgePeriod, session) + + addOccupancyTypeField( + Object.assign(deathAgePeriod, { + occupancyTypeId: cremationOccupancyTypeId + }), + session + ) + + // Death Place + const deathPlace = { + occupancyTypeId: intermentOccupancyTypeId, + occupancyTypeField: 'Death Place', + occupancyTypeFieldValues: '', + pattern: '', + isRequired: '', + minimumLength: 1, + maximumLength: 100, + orderNumber: 4 + } + + addOccupancyTypeField(deathPlace, session) + + addOccupancyTypeField( + Object.assign(deathPlace, { occupancyTypeId: cremationOccupancyTypeId }), + session + ) + + // Funeral Home + const funeralHome = { + occupancyTypeId: intermentOccupancyTypeId, + occupancyTypeField: 'Funeral Home', + occupancyTypeFieldValues: '', + pattern: '', + isRequired: '', + minimumLength: 1, + maximumLength: 100, + orderNumber: 10 + } + + addOccupancyTypeField(funeralHome, session) + + addOccupancyTypeField( + Object.assign(funeralHome, { occupancyTypeId: cremationOccupancyTypeId }), + session + ) + + // Funeral Date + const funeralDate = { + occupancyTypeId: intermentOccupancyTypeId, + occupancyTypeField: 'Funeral Date', + occupancyTypeFieldValues: '', + pattern: '\\d{4}([\\/-]\\d{2}){2}', + isRequired: '', + minimumLength: 10, + maximumLength: 10, + orderNumber: 11 + } + + addOccupancyTypeField(funeralDate, session) + + addOccupancyTypeField( + Object.assign(funeralDate, { occupancyTypeId: cremationOccupancyTypeId }), + session + ) + + // Container Type + const containerType = { + occupancyTypeId: intermentOccupancyTypeId, + occupancyTypeField: 'Container Type', + occupancyTypeFieldValues: '', + pattern: '', + isRequired: '', + minimumLength: 1, + maximumLength: 100, + orderNumber: 20 + } + + addOccupancyTypeField(containerType, session) + + addOccupancyTypeField( + Object.assign(containerType, { occupancyTypeId: cremationOccupancyTypeId }), + session + ) + + // Committal Type + const committalType = { + occupancyTypeId: intermentOccupancyTypeId, + occupancyTypeField: 'Committal Type', + occupancyTypeFieldValues: '', + pattern: '', + isRequired: '', + minimumLength: 1, + maximumLength: 100, + orderNumber: 21 + } + + addOccupancyTypeField(committalType, session) + + addOccupancyTypeField( + Object.assign(committalType, { occupancyTypeId: cremationOccupancyTypeId }), + session + ) + + /* + * Fee Categories + */ + + addRecord('FeeCategories', 'Interment Rights', 1, session) + addRecord('FeeCategories', 'Cremation Services', 2, session) + addRecord('FeeCategories', 'Burial Charges', 3, session) + addRecord('FeeCategories', 'Disinterment of Human Remains', 4, session) + addRecord('FeeCategories', 'Additional Services', 4, session) +} + +initializeCemeteryDatabase() diff --git a/helpers/initializer.database.js b/helpers/initializer.database.js index 2634a1c9..68bf2fc8 100644 --- a/helpers/initializer.database.js +++ b/helpers/initializer.database.js @@ -1,7 +1,7 @@ -import sqlite from "better-sqlite3"; -import { lotOccupancyDB as databasePath } from "../data/databasePaths.js"; -import debug from "debug"; -const debugSQL = debug("lot-occupancy-system:databaseInitializer"); +import sqlite from 'better-sqlite3'; +import { lotOccupancyDB as databasePath } from '../data/databasePaths.js'; +import debug from 'debug'; +const debugSQL = debug('lot-occupancy-system:databaseInitializer'); const recordColumns = `recordCreate_userName varchar(30) not null, recordCreate_timeMillis integer not null, recordUpdate_userName varchar(30) not null, @@ -10,42 +10,42 @@ const recordColumns = `recordCreate_userName varchar(30) not null, recordDelete_timeMillis integer`; const createStatements = [ `create table if not exists LotTypes (lotTypeId integer not null primary key autoincrement, lotType varchar(100) not null, orderNumber smallint not null default 0, ${recordColumns})`, - `create index if not exists idx_lottypes_ordernumber on LotTypes (orderNumber, lotType)`, + 'create index if not exists idx_lottypes_ordernumber on LotTypes (orderNumber, lotType)', `create table if not exists LotTypeFields (lotTypeFieldId integer not null primary key autoincrement, lotTypeId integer not null, lotTypeField varchar(100) not null, lotTypeFieldValues text, isRequired bit not null default 0, pattern varchar(100), minimumLength smallint not null default 1 check (minimumLength >= 0), maximumLength smallint not null default 100 check (maximumLength >= 0), orderNumber smallint not null default 0, ${recordColumns}, foreign key (lotTypeId) references LotTypes (lotTypeId))`, - `create index if not exists idx_lottypefields_ordernumber on LotTypeFields (lotTypeId, orderNumber, lotTypeField)`, + 'create index if not exists idx_lottypefields_ordernumber on LotTypeFields (lotTypeId, orderNumber, lotTypeField)', `create table if not exists LotStatuses (lotStatusId integer not null primary key autoincrement, lotStatus varchar(100) not null, orderNumber smallint not null default 0, ${recordColumns})`, - `create index if not exists idx_lotstatuses_ordernumber on LotStatuses (orderNumber, lotStatus)`, + 'create index if not exists idx_lotstatuses_ordernumber on LotStatuses (orderNumber, lotStatus)', `create table if not exists Maps (mapId integer not null primary key autoincrement, mapName varchar(200) not null, mapDescription text, mapLatitude decimal(10, 8) check (mapLatitude between -90 and 90), mapLongitude decimal(11, 8) check (mapLongitude between -180 and 180), mapSVG varchar(50), mapAddress1 varchar(50), mapAddress2 varchar(50), mapCity varchar(20), mapProvince varchar(2), mapPostalCode varchar(7), mapPhoneNumber varchar(30), ${recordColumns})`, `create table if not exists Lots (lotId integer not null primary key autoincrement, lotTypeId integer not null, lotName varchar(100), mapId integer, mapKey varchar(100), lotLatitude decimal(10, 8) check (lotLatitude between -90 and 90), lotLongitude decimal(11, 8) check (lotLongitude between -180 and 180), lotStatusId integer, ${recordColumns}, foreign key (lotTypeId) references LotTypes (lotTypeId), foreign key (mapId) references Maps (mapId), foreign key (lotStatusId) references LotStatuses (lotStatusId))`, `create table if not exists LotFields (lotId integer not null, lotTypeFieldId integer not null, lotFieldValue text not null, ${recordColumns}, primary key (lotId, lotTypeFieldId), foreign key (lotId) references Lots (lotId), foreign key (lotTypeFieldId) references LotTypeFields (lotTypeFieldId)) without rowid`, `create table if not exists LotComments (lotCommentId integer not null primary key autoincrement, lotId integer not null, lotCommentDate integer not null check (lotCommentDate > 0), lotCommentTime integer not null check (lotCommentTime >= 0), lotComment text not null, ${recordColumns}, foreign key (lotId) references Lots (lotId))`, - `create index if not exists idx_lotcomments_datetime on LotComments (lotId, lotCommentDate, lotCommentTime)`, + 'create index if not exists idx_lotcomments_datetime on LotComments (lotId, lotCommentDate, lotCommentTime)', `create table if not exists OccupancyTypes (occupancyTypeId integer not null primary key autoincrement, occupancyType varchar(100) not null, orderNumber smallint not null default 0, ${recordColumns})`, - `create index if not exists idx_occupancytypes_ordernumber on OccupancyTypes (orderNumber, occupancyType)`, + 'create index if not exists idx_occupancytypes_ordernumber on OccupancyTypes (orderNumber, occupancyType)', `create table if not exists OccupancyTypeFields (occupancyTypeFieldId integer not null primary key autoincrement, occupancyTypeId integer, occupancyTypeField varchar(100) not null, occupancyTypeFieldValues text, isRequired bit not null default 0, pattern varchar(100), minimumLength smallint not null default 1 check (minimumLength >= 0), maximumLength smallint not null default 100 check (maximumLength >= 0), orderNumber smallint not null default 0, ${recordColumns}, foreign key (occupancyTypeId) references OccupancyTypes (occupancyTypeId))`, - `create index if not exists idx_occupancytypefields_ordernumber on OccupancyTypeFields (occupancyTypeId, orderNumber, occupancyTypeField)`, + 'create index if not exists idx_occupancytypefields_ordernumber on OccupancyTypeFields (occupancyTypeId, orderNumber, occupancyTypeField)', `create table if not exists OccupancyTypePrints (occupancyTypeId integer not null, printEJS varchar(100) not null, orderNumber smallint not null default 0, ${recordColumns}, primary key (occupancyTypeId, printEJS), foreign key (occupancyTypeId) references OccupancyTypes (occupancyTypeId))`, - `create index if not exists idx_occupancytypeprints_ordernumber on OccupancyTypePrints (occupancyTypeId, orderNumber, printEJS)`, + 'create index if not exists idx_occupancytypeprints_ordernumber on OccupancyTypePrints (occupancyTypeId, orderNumber, printEJS)', `create table if not exists LotOccupantTypes (lotOccupantTypeId integer not null primary key autoincrement, lotOccupantType varchar(100) not null, fontAwesomeIconClass varchar(50) not null default '', orderNumber smallint not null default 0, ${recordColumns})`, - `create index if not exists idx_lotoccupanttypes_ordernumber on LotOccupantTypes (orderNumber, lotOccupantType)`, + 'create index if not exists idx_lotoccupanttypes_ordernumber on LotOccupantTypes (orderNumber, lotOccupantType)', `create table if not exists LotOccupancies (lotOccupancyId integer not null primary key autoincrement, occupancyTypeId integer not null, lotId integer, occupancyStartDate integer not null check (occupancyStartDate > 0), occupancyEndDate integer check (occupancyEndDate > 0), ${recordColumns}, foreign key (lotId) references Lots (lotId), foreign key (occupancyTypeId) references OccupancyTypes (occupancyTypeId))`, `create table if not exists LotOccupancyOccupants (lotOccupancyId integer not null, lotOccupantIndex integer not null, occupantName varchar(200) not null, occupantAddress1 varchar(50), occupantAddress2 varchar(50), occupantCity varchar(20), occupantProvince varchar(2), occupantPostalCode varchar(7), occupantPhoneNumber varchar(30), occupantEmailAddress varchar(200), lotOccupantTypeId integer not null, occupantComment text not null default '', ${recordColumns}, primary key (lotOccupancyId, lotOccupantIndex), foreign key (lotOccupancyId) references LotOccupancies (lotOccupancyId), foreign key (lotOccupantTypeId) references LotOccupantTypes (lotOccupantTypeId)) without rowid`, `create table if not exists LotOccupancyFields (lotOccupancyId integer not null, occupancyTypeFieldId integer not null, lotOccupancyFieldValue text not null, ${recordColumns}, primary key (lotOccupancyId, occupancyTypeFieldId), foreign key (lotOccupancyId) references LotOccupancies (lotOccupancyId), foreign key (occupancyTypeFieldId) references OccupancyTypeFields (occupancyTypeFieldId)) without rowid`, `create table if not exists LotOccupancyComments (lotOccupancyCommentId integer not null primary key autoincrement, lotOccupancyId integer not null, lotOccupancyCommentDate integer not null check (lotOccupancyCommentDate > 0), lotOccupancyCommentTime integer not null check (lotOccupancyCommentTime >= 0), lotOccupancyComment text not null, ${recordColumns}, foreign key (lotOccupancyId) references LotOccupancies (lotOccupancyId))`, - `create index if not exists idx_lotoccupancycomments_datetime on LotOccupancyComments (lotOccupancyId, lotOccupancyCommentDate, lotOccupancyCommentTime)`, + 'create index if not exists idx_lotoccupancycomments_datetime on LotOccupancyComments (lotOccupancyId, lotOccupancyCommentDate, lotOccupancyCommentTime)', `create table if not exists FeeCategories (feeCategoryId integer not null primary key autoincrement, feeCategory varchar(100) not null, orderNumber smallint not null default 0, ${recordColumns})`, `create table if not exists Fees (feeId integer not null primary key autoincrement, feeCategoryId integer not null, feeName varchar(100) not null, feeDescription text, occupancyTypeId integer, lotTypeId integer, includeQuantity boolean not null default 0, quantityUnit varchar(30), feeAmount decimal(8, 2), feeFunction varchar(100), taxAmount decimal(6, 2), taxPercentage decimal(5, 2), isRequired bit not null default 0, orderNumber smallint not null default 0, ${recordColumns}, foreign key (feeCategoryId) references FeeCategories (feeCategoryId), foreign key (occupancyTypeId) references OccupancyTypes (occupancyTypeId), foreign key (lotTypeId) references LotTypes (lotTypeId))`, - `create index if not exists idx_fees_ordernumber on Fees (orderNumber, feeName)`, + 'create index if not exists idx_fees_ordernumber on Fees (orderNumber, feeName)', `create table if not exists LotOccupancyFees (lotOccupancyId integer not null, feeId integer not null, quantity decimal(4, 1) not null default 1, feeAmount decimal(8, 2) not null, taxAmount decmial(8, 2) not null, ${recordColumns}, primary key (lotOccupancyId, feeId), foreign key (lotOccupancyId) references LotOccupancies (lotOccupancyId), foreign key (feeId) references Fees (feeId)) without rowid`, `create table if not exists LotOccupancyTransactions (lotOccupancyId integer not null, transactionIndex integer not null, transactionDate integer not null check (transactionDate > 0), transactionTime integer not null check (transactionTime >= 0), transactionAmount decimal(8, 2) not null, externalReceiptNumber varchar(100), transactionNote text, ${recordColumns}, primary key (lotOccupancyId, transactionIndex), foreign key (lotOccupancyId) references LotOccupancies (lotOccupancyId)) without rowid`, - `create index if not exists idx_lotoccupancytransactions_ordernumber on LotOccupancyTransactions (lotOccupancyId, transactionDate, transactionTime)`, + 'create index if not exists idx_lotoccupancytransactions_ordernumber on LotOccupancyTransactions (lotOccupancyId, transactionDate, transactionTime)', `create table if not exists WorkOrderTypes (workOrderTypeId integer not null primary key autoincrement, workOrderType varchar(100) not null, orderNumber smallint not null default 0, ${recordColumns})`, - `create index if not exists idx_workordertypes_ordernumber on WorkOrderTypes (orderNumber, workOrderType)`, + 'create index if not exists idx_workordertypes_ordernumber on WorkOrderTypes (orderNumber, workOrderType)', `create table if not exists WorkOrders (workOrderId integer not null primary key autoincrement, workOrderTypeId integer not null, workOrderNumber varchar(50) not null, workOrderDescription text, workOrderOpenDate integer check (workOrderOpenDate > 0), workOrderCloseDate integer check (workOrderCloseDate > 0), ${recordColumns}, foreign key (workOrderTypeId) references WorkOrderTypes (workOrderTypeId))`, `create table if not exists WorkOrderLots (workOrderId integer not null, lotId integer not null, ${recordColumns}, primary key (workOrderId, lotId), foreign key (workOrderId) references WorkOrders (workOrderId), foreign key (lotId) references Lots (lotId)) without rowid`, `create table if not exists WorkOrderLotOccupancies (workOrderId integer not null, lotOccupancyId integer not null, ${recordColumns}, primary key (workOrderId, lotOccupancyId), foreign key (workOrderId) references WorkOrders (workOrderId), foreign key (lotOccupancyId) references LotOccupancies (lotOccupancyId)) without rowid`, `create table if not exists WorkOrderComments (workOrderCommentId integer not null primary key autoincrement, workOrderId integer not null, workOrderCommentDate integer not null check (workOrderCommentDate > 0), workOrderCommentTime integer not null check (workOrderCommentTime >= 0), workOrderComment text not null, ${recordColumns}, foreign key (workOrderId) references WorkOrders (workOrderId))`, - `create index if not exists idx_workordercomments_datetime on WorkOrderComments (workOrderId, workOrderCommentDate, workOrderCommentTime)`, + 'create index if not exists idx_workordercomments_datetime on WorkOrderComments (workOrderId, workOrderCommentDate, workOrderCommentTime)', `create table if not exists WorkOrderMilestoneTypes (workOrderMilestoneTypeId integer not null primary key autoincrement, workOrderMilestoneType varchar(100) not null, orderNumber smallint not null default 0, ${recordColumns})`, `create table if not exists WorkOrderMilestones (workOrderMilestoneId integer not null primary key autoincrement, workOrderId integer not null, workOrderMilestoneTypeId integer, workOrderMilestoneDate integer not null check (workOrderMilestoneDate > 0), workOrderMilestoneTime integer not null check (workOrderMilestoneTime >= 0), workOrderMilestoneDescription text not null, workOrderMilestoneCompletionDate integer check (workOrderMilestoneCompletionDate > 0), workOrderMilestoneCompletionTime integer check (workOrderMilestoneCompletionTime >= 0), ${recordColumns}, foreign key (workOrderId) references WorkOrders (workOrderId), foreign key (workOrderMilestoneTypeId) references WorkOrderMilestoneTypes (workOrderMilestoneTypeId))` ]; @@ -55,7 +55,7 @@ export function initializeDatabase() { .prepare("select name from sqlite_master where type = 'table' and name = 'WorkOrderMilestones'") .get(); if (!row) { - debugSQL("Creating " + databasePath); + debugSQL('Creating ' + databasePath); for (const sql of createStatements) { lotOccupancyDB.prepare(sql).run(); } diff --git a/helpers/initializer.database.ts b/helpers/initializer.database.ts index f9dcdbf4..ef745a4b 100644 --- a/helpers/initializer.database.ts +++ b/helpers/initializer.database.ts @@ -1,88 +1,90 @@ -import sqlite from "better-sqlite3"; +import sqlite from 'better-sqlite3' -import { lotOccupancyDB as databasePath } from "../data/databasePaths.js"; +import { lotOccupancyDB as databasePath } from '../data/databasePaths.js' -import debug from "debug"; -const debugSQL = debug("lot-occupancy-system:databaseInitializer"); +import debug from 'debug' +const debugSQL = debug('lot-occupancy-system:databaseInitializer') const recordColumns = `recordCreate_userName varchar(30) not null, recordCreate_timeMillis integer not null, recordUpdate_userName varchar(30) not null, recordUpdate_timeMillis integer not null, recordDelete_userName varchar(30), - recordDelete_timeMillis integer`; + recordDelete_timeMillis integer` const createStatements = [ - // Lot Types - `create table if not exists LotTypes (lotTypeId integer not null primary key autoincrement, lotType varchar(100) not null, orderNumber smallint not null default 0, ${recordColumns})`, - `create index if not exists idx_lottypes_ordernumber on LotTypes (orderNumber, lotType)`, - `create table if not exists LotTypeFields (lotTypeFieldId integer not null primary key autoincrement, lotTypeId integer not null, lotTypeField varchar(100) not null, lotTypeFieldValues text, isRequired bit not null default 0, pattern varchar(100), minimumLength smallint not null default 1 check (minimumLength >= 0), maximumLength smallint not null default 100 check (maximumLength >= 0), orderNumber smallint not null default 0, ${recordColumns}, foreign key (lotTypeId) references LotTypes (lotTypeId))`, - `create index if not exists idx_lottypefields_ordernumber on LotTypeFields (lotTypeId, orderNumber, lotTypeField)`, + // Lot Types + `create table if not exists LotTypes (lotTypeId integer not null primary key autoincrement, lotType varchar(100) not null, orderNumber smallint not null default 0, ${recordColumns})`, + 'create index if not exists idx_lottypes_ordernumber on LotTypes (orderNumber, lotType)', + `create table if not exists LotTypeFields (lotTypeFieldId integer not null primary key autoincrement, lotTypeId integer not null, lotTypeField varchar(100) not null, lotTypeFieldValues text, isRequired bit not null default 0, pattern varchar(100), minimumLength smallint not null default 1 check (minimumLength >= 0), maximumLength smallint not null default 100 check (maximumLength >= 0), orderNumber smallint not null default 0, ${recordColumns}, foreign key (lotTypeId) references LotTypes (lotTypeId))`, + 'create index if not exists idx_lottypefields_ordernumber on LotTypeFields (lotTypeId, orderNumber, lotTypeField)', - // Lot Statuses - `create table if not exists LotStatuses (lotStatusId integer not null primary key autoincrement, lotStatus varchar(100) not null, orderNumber smallint not null default 0, ${recordColumns})`, - `create index if not exists idx_lotstatuses_ordernumber on LotStatuses (orderNumber, lotStatus)`, + // Lot Statuses + `create table if not exists LotStatuses (lotStatusId integer not null primary key autoincrement, lotStatus varchar(100) not null, orderNumber smallint not null default 0, ${recordColumns})`, + 'create index if not exists idx_lotstatuses_ordernumber on LotStatuses (orderNumber, lotStatus)', - // Maps and Lots - `create table if not exists Maps (mapId integer not null primary key autoincrement, mapName varchar(200) not null, mapDescription text, mapLatitude decimal(10, 8) check (mapLatitude between -90 and 90), mapLongitude decimal(11, 8) check (mapLongitude between -180 and 180), mapSVG varchar(50), mapAddress1 varchar(50), mapAddress2 varchar(50), mapCity varchar(20), mapProvince varchar(2), mapPostalCode varchar(7), mapPhoneNumber varchar(30), ${recordColumns})`, - `create table if not exists Lots (lotId integer not null primary key autoincrement, lotTypeId integer not null, lotName varchar(100), mapId integer, mapKey varchar(100), lotLatitude decimal(10, 8) check (lotLatitude between -90 and 90), lotLongitude decimal(11, 8) check (lotLongitude between -180 and 180), lotStatusId integer, ${recordColumns}, foreign key (lotTypeId) references LotTypes (lotTypeId), foreign key (mapId) references Maps (mapId), foreign key (lotStatusId) references LotStatuses (lotStatusId))`, - `create table if not exists LotFields (lotId integer not null, lotTypeFieldId integer not null, lotFieldValue text not null, ${recordColumns}, primary key (lotId, lotTypeFieldId), foreign key (lotId) references Lots (lotId), foreign key (lotTypeFieldId) references LotTypeFields (lotTypeFieldId)) without rowid`, - `create table if not exists LotComments (lotCommentId integer not null primary key autoincrement, lotId integer not null, lotCommentDate integer not null check (lotCommentDate > 0), lotCommentTime integer not null check (lotCommentTime >= 0), lotComment text not null, ${recordColumns}, foreign key (lotId) references Lots (lotId))`, - `create index if not exists idx_lotcomments_datetime on LotComments (lotId, lotCommentDate, lotCommentTime)`, + // Maps and Lots + `create table if not exists Maps (mapId integer not null primary key autoincrement, mapName varchar(200) not null, mapDescription text, mapLatitude decimal(10, 8) check (mapLatitude between -90 and 90), mapLongitude decimal(11, 8) check (mapLongitude between -180 and 180), mapSVG varchar(50), mapAddress1 varchar(50), mapAddress2 varchar(50), mapCity varchar(20), mapProvince varchar(2), mapPostalCode varchar(7), mapPhoneNumber varchar(30), ${recordColumns})`, + `create table if not exists Lots (lotId integer not null primary key autoincrement, lotTypeId integer not null, lotName varchar(100), mapId integer, mapKey varchar(100), lotLatitude decimal(10, 8) check (lotLatitude between -90 and 90), lotLongitude decimal(11, 8) check (lotLongitude between -180 and 180), lotStatusId integer, ${recordColumns}, foreign key (lotTypeId) references LotTypes (lotTypeId), foreign key (mapId) references Maps (mapId), foreign key (lotStatusId) references LotStatuses (lotStatusId))`, + `create table if not exists LotFields (lotId integer not null, lotTypeFieldId integer not null, lotFieldValue text not null, ${recordColumns}, primary key (lotId, lotTypeFieldId), foreign key (lotId) references Lots (lotId), foreign key (lotTypeFieldId) references LotTypeFields (lotTypeFieldId)) without rowid`, + `create table if not exists LotComments (lotCommentId integer not null primary key autoincrement, lotId integer not null, lotCommentDate integer not null check (lotCommentDate > 0), lotCommentTime integer not null check (lotCommentTime >= 0), lotComment text not null, ${recordColumns}, foreign key (lotId) references Lots (lotId))`, + 'create index if not exists idx_lotcomments_datetime on LotComments (lotId, lotCommentDate, lotCommentTime)', - // Occupancies - `create table if not exists OccupancyTypes (occupancyTypeId integer not null primary key autoincrement, occupancyType varchar(100) not null, orderNumber smallint not null default 0, ${recordColumns})`, - `create index if not exists idx_occupancytypes_ordernumber on OccupancyTypes (orderNumber, occupancyType)`, - `create table if not exists OccupancyTypeFields (occupancyTypeFieldId integer not null primary key autoincrement, occupancyTypeId integer, occupancyTypeField varchar(100) not null, occupancyTypeFieldValues text, isRequired bit not null default 0, pattern varchar(100), minimumLength smallint not null default 1 check (minimumLength >= 0), maximumLength smallint not null default 100 check (maximumLength >= 0), orderNumber smallint not null default 0, ${recordColumns}, foreign key (occupancyTypeId) references OccupancyTypes (occupancyTypeId))`, - `create index if not exists idx_occupancytypefields_ordernumber on OccupancyTypeFields (occupancyTypeId, orderNumber, occupancyTypeField)`, - `create table if not exists OccupancyTypePrints (occupancyTypeId integer not null, printEJS varchar(100) not null, orderNumber smallint not null default 0, ${recordColumns}, primary key (occupancyTypeId, printEJS), foreign key (occupancyTypeId) references OccupancyTypes (occupancyTypeId))`, - `create index if not exists idx_occupancytypeprints_ordernumber on OccupancyTypePrints (occupancyTypeId, orderNumber, printEJS)`, - `create table if not exists LotOccupantTypes (lotOccupantTypeId integer not null primary key autoincrement, lotOccupantType varchar(100) not null, fontAwesomeIconClass varchar(50) not null default '', orderNumber smallint not null default 0, ${recordColumns})`, - `create index if not exists idx_lotoccupanttypes_ordernumber on LotOccupantTypes (orderNumber, lotOccupantType)`, - `create table if not exists LotOccupancies (lotOccupancyId integer not null primary key autoincrement, occupancyTypeId integer not null, lotId integer, occupancyStartDate integer not null check (occupancyStartDate > 0), occupancyEndDate integer check (occupancyEndDate > 0), ${recordColumns}, foreign key (lotId) references Lots (lotId), foreign key (occupancyTypeId) references OccupancyTypes (occupancyTypeId))`, - `create table if not exists LotOccupancyOccupants (lotOccupancyId integer not null, lotOccupantIndex integer not null, occupantName varchar(200) not null, occupantAddress1 varchar(50), occupantAddress2 varchar(50), occupantCity varchar(20), occupantProvince varchar(2), occupantPostalCode varchar(7), occupantPhoneNumber varchar(30), occupantEmailAddress varchar(200), lotOccupantTypeId integer not null, occupantComment text not null default '', ${recordColumns}, primary key (lotOccupancyId, lotOccupantIndex), foreign key (lotOccupancyId) references LotOccupancies (lotOccupancyId), foreign key (lotOccupantTypeId) references LotOccupantTypes (lotOccupantTypeId)) without rowid`, - `create table if not exists LotOccupancyFields (lotOccupancyId integer not null, occupancyTypeFieldId integer not null, lotOccupancyFieldValue text not null, ${recordColumns}, primary key (lotOccupancyId, occupancyTypeFieldId), foreign key (lotOccupancyId) references LotOccupancies (lotOccupancyId), foreign key (occupancyTypeFieldId) references OccupancyTypeFields (occupancyTypeFieldId)) without rowid`, - `create table if not exists LotOccupancyComments (lotOccupancyCommentId integer not null primary key autoincrement, lotOccupancyId integer not null, lotOccupancyCommentDate integer not null check (lotOccupancyCommentDate > 0), lotOccupancyCommentTime integer not null check (lotOccupancyCommentTime >= 0), lotOccupancyComment text not null, ${recordColumns}, foreign key (lotOccupancyId) references LotOccupancies (lotOccupancyId))`, - `create index if not exists idx_lotoccupancycomments_datetime on LotOccupancyComments (lotOccupancyId, lotOccupancyCommentDate, lotOccupancyCommentTime)`, + // Occupancies + `create table if not exists OccupancyTypes (occupancyTypeId integer not null primary key autoincrement, occupancyType varchar(100) not null, orderNumber smallint not null default 0, ${recordColumns})`, + 'create index if not exists idx_occupancytypes_ordernumber on OccupancyTypes (orderNumber, occupancyType)', + `create table if not exists OccupancyTypeFields (occupancyTypeFieldId integer not null primary key autoincrement, occupancyTypeId integer, occupancyTypeField varchar(100) not null, occupancyTypeFieldValues text, isRequired bit not null default 0, pattern varchar(100), minimumLength smallint not null default 1 check (minimumLength >= 0), maximumLength smallint not null default 100 check (maximumLength >= 0), orderNumber smallint not null default 0, ${recordColumns}, foreign key (occupancyTypeId) references OccupancyTypes (occupancyTypeId))`, + 'create index if not exists idx_occupancytypefields_ordernumber on OccupancyTypeFields (occupancyTypeId, orderNumber, occupancyTypeField)', + `create table if not exists OccupancyTypePrints (occupancyTypeId integer not null, printEJS varchar(100) not null, orderNumber smallint not null default 0, ${recordColumns}, primary key (occupancyTypeId, printEJS), foreign key (occupancyTypeId) references OccupancyTypes (occupancyTypeId))`, + 'create index if not exists idx_occupancytypeprints_ordernumber on OccupancyTypePrints (occupancyTypeId, orderNumber, printEJS)', + `create table if not exists LotOccupantTypes (lotOccupantTypeId integer not null primary key autoincrement, lotOccupantType varchar(100) not null, fontAwesomeIconClass varchar(50) not null default '', orderNumber smallint not null default 0, ${recordColumns})`, + 'create index if not exists idx_lotoccupanttypes_ordernumber on LotOccupantTypes (orderNumber, lotOccupantType)', + `create table if not exists LotOccupancies (lotOccupancyId integer not null primary key autoincrement, occupancyTypeId integer not null, lotId integer, occupancyStartDate integer not null check (occupancyStartDate > 0), occupancyEndDate integer check (occupancyEndDate > 0), ${recordColumns}, foreign key (lotId) references Lots (lotId), foreign key (occupancyTypeId) references OccupancyTypes (occupancyTypeId))`, + `create table if not exists LotOccupancyOccupants (lotOccupancyId integer not null, lotOccupantIndex integer not null, occupantName varchar(200) not null, occupantAddress1 varchar(50), occupantAddress2 varchar(50), occupantCity varchar(20), occupantProvince varchar(2), occupantPostalCode varchar(7), occupantPhoneNumber varchar(30), occupantEmailAddress varchar(200), lotOccupantTypeId integer not null, occupantComment text not null default '', ${recordColumns}, primary key (lotOccupancyId, lotOccupantIndex), foreign key (lotOccupancyId) references LotOccupancies (lotOccupancyId), foreign key (lotOccupantTypeId) references LotOccupantTypes (lotOccupantTypeId)) without rowid`, + `create table if not exists LotOccupancyFields (lotOccupancyId integer not null, occupancyTypeFieldId integer not null, lotOccupancyFieldValue text not null, ${recordColumns}, primary key (lotOccupancyId, occupancyTypeFieldId), foreign key (lotOccupancyId) references LotOccupancies (lotOccupancyId), foreign key (occupancyTypeFieldId) references OccupancyTypeFields (occupancyTypeFieldId)) without rowid`, + `create table if not exists LotOccupancyComments (lotOccupancyCommentId integer not null primary key autoincrement, lotOccupancyId integer not null, lotOccupancyCommentDate integer not null check (lotOccupancyCommentDate > 0), lotOccupancyCommentTime integer not null check (lotOccupancyCommentTime >= 0), lotOccupancyComment text not null, ${recordColumns}, foreign key (lotOccupancyId) references LotOccupancies (lotOccupancyId))`, + 'create index if not exists idx_lotoccupancycomments_datetime on LotOccupancyComments (lotOccupancyId, lotOccupancyCommentDate, lotOccupancyCommentTime)', - // Fees and Transactions - `create table if not exists FeeCategories (feeCategoryId integer not null primary key autoincrement, feeCategory varchar(100) not null, orderNumber smallint not null default 0, ${recordColumns})`, - `create table if not exists Fees (feeId integer not null primary key autoincrement, feeCategoryId integer not null, feeName varchar(100) not null, feeDescription text, occupancyTypeId integer, lotTypeId integer, includeQuantity boolean not null default 0, quantityUnit varchar(30), feeAmount decimal(8, 2), feeFunction varchar(100), taxAmount decimal(6, 2), taxPercentage decimal(5, 2), isRequired bit not null default 0, orderNumber smallint not null default 0, ${recordColumns}, foreign key (feeCategoryId) references FeeCategories (feeCategoryId), foreign key (occupancyTypeId) references OccupancyTypes (occupancyTypeId), foreign key (lotTypeId) references LotTypes (lotTypeId))`, - `create index if not exists idx_fees_ordernumber on Fees (orderNumber, feeName)`, - `create table if not exists LotOccupancyFees (lotOccupancyId integer not null, feeId integer not null, quantity decimal(4, 1) not null default 1, feeAmount decimal(8, 2) not null, taxAmount decmial(8, 2) not null, ${recordColumns}, primary key (lotOccupancyId, feeId), foreign key (lotOccupancyId) references LotOccupancies (lotOccupancyId), foreign key (feeId) references Fees (feeId)) without rowid`, - `create table if not exists LotOccupancyTransactions (lotOccupancyId integer not null, transactionIndex integer not null, transactionDate integer not null check (transactionDate > 0), transactionTime integer not null check (transactionTime >= 0), transactionAmount decimal(8, 2) not null, externalReceiptNumber varchar(100), transactionNote text, ${recordColumns}, primary key (lotOccupancyId, transactionIndex), foreign key (lotOccupancyId) references LotOccupancies (lotOccupancyId)) without rowid`, - `create index if not exists idx_lotoccupancytransactions_ordernumber on LotOccupancyTransactions (lotOccupancyId, transactionDate, transactionTime)`, + // Fees and Transactions + `create table if not exists FeeCategories (feeCategoryId integer not null primary key autoincrement, feeCategory varchar(100) not null, orderNumber smallint not null default 0, ${recordColumns})`, + `create table if not exists Fees (feeId integer not null primary key autoincrement, feeCategoryId integer not null, feeName varchar(100) not null, feeDescription text, occupancyTypeId integer, lotTypeId integer, includeQuantity boolean not null default 0, quantityUnit varchar(30), feeAmount decimal(8, 2), feeFunction varchar(100), taxAmount decimal(6, 2), taxPercentage decimal(5, 2), isRequired bit not null default 0, orderNumber smallint not null default 0, ${recordColumns}, foreign key (feeCategoryId) references FeeCategories (feeCategoryId), foreign key (occupancyTypeId) references OccupancyTypes (occupancyTypeId), foreign key (lotTypeId) references LotTypes (lotTypeId))`, + 'create index if not exists idx_fees_ordernumber on Fees (orderNumber, feeName)', + `create table if not exists LotOccupancyFees (lotOccupancyId integer not null, feeId integer not null, quantity decimal(4, 1) not null default 1, feeAmount decimal(8, 2) not null, taxAmount decmial(8, 2) not null, ${recordColumns}, primary key (lotOccupancyId, feeId), foreign key (lotOccupancyId) references LotOccupancies (lotOccupancyId), foreign key (feeId) references Fees (feeId)) without rowid`, + `create table if not exists LotOccupancyTransactions (lotOccupancyId integer not null, transactionIndex integer not null, transactionDate integer not null check (transactionDate > 0), transactionTime integer not null check (transactionTime >= 0), transactionAmount decimal(8, 2) not null, externalReceiptNumber varchar(100), transactionNote text, ${recordColumns}, primary key (lotOccupancyId, transactionIndex), foreign key (lotOccupancyId) references LotOccupancies (lotOccupancyId)) without rowid`, + 'create index if not exists idx_lotoccupancytransactions_ordernumber on LotOccupancyTransactions (lotOccupancyId, transactionDate, transactionTime)', - // Work Orders - `create table if not exists WorkOrderTypes (workOrderTypeId integer not null primary key autoincrement, workOrderType varchar(100) not null, orderNumber smallint not null default 0, ${recordColumns})`, - `create index if not exists idx_workordertypes_ordernumber on WorkOrderTypes (orderNumber, workOrderType)`, - `create table if not exists WorkOrders (workOrderId integer not null primary key autoincrement, workOrderTypeId integer not null, workOrderNumber varchar(50) not null, workOrderDescription text, workOrderOpenDate integer check (workOrderOpenDate > 0), workOrderCloseDate integer check (workOrderCloseDate > 0), ${recordColumns}, foreign key (workOrderTypeId) references WorkOrderTypes (workOrderTypeId))`, - `create table if not exists WorkOrderLots (workOrderId integer not null, lotId integer not null, ${recordColumns}, primary key (workOrderId, lotId), foreign key (workOrderId) references WorkOrders (workOrderId), foreign key (lotId) references Lots (lotId)) without rowid`, - `create table if not exists WorkOrderLotOccupancies (workOrderId integer not null, lotOccupancyId integer not null, ${recordColumns}, primary key (workOrderId, lotOccupancyId), foreign key (workOrderId) references WorkOrders (workOrderId), foreign key (lotOccupancyId) references LotOccupancies (lotOccupancyId)) without rowid`, - `create table if not exists WorkOrderComments (workOrderCommentId integer not null primary key autoincrement, workOrderId integer not null, workOrderCommentDate integer not null check (workOrderCommentDate > 0), workOrderCommentTime integer not null check (workOrderCommentTime >= 0), workOrderComment text not null, ${recordColumns}, foreign key (workOrderId) references WorkOrders (workOrderId))`, - `create index if not exists idx_workordercomments_datetime on WorkOrderComments (workOrderId, workOrderCommentDate, workOrderCommentTime)`, - `create table if not exists WorkOrderMilestoneTypes (workOrderMilestoneTypeId integer not null primary key autoincrement, workOrderMilestoneType varchar(100) not null, orderNumber smallint not null default 0, ${recordColumns})`, - `create table if not exists WorkOrderMilestones (workOrderMilestoneId integer not null primary key autoincrement, workOrderId integer not null, workOrderMilestoneTypeId integer, workOrderMilestoneDate integer not null check (workOrderMilestoneDate > 0), workOrderMilestoneTime integer not null check (workOrderMilestoneTime >= 0), workOrderMilestoneDescription text not null, workOrderMilestoneCompletionDate integer check (workOrderMilestoneCompletionDate > 0), workOrderMilestoneCompletionTime integer check (workOrderMilestoneCompletionTime >= 0), ${recordColumns}, foreign key (workOrderId) references WorkOrders (workOrderId), foreign key (workOrderMilestoneTypeId) references WorkOrderMilestoneTypes (workOrderMilestoneTypeId))` -]; + // Work Orders + `create table if not exists WorkOrderTypes (workOrderTypeId integer not null primary key autoincrement, workOrderType varchar(100) not null, orderNumber smallint not null default 0, ${recordColumns})`, + 'create index if not exists idx_workordertypes_ordernumber on WorkOrderTypes (orderNumber, workOrderType)', + `create table if not exists WorkOrders (workOrderId integer not null primary key autoincrement, workOrderTypeId integer not null, workOrderNumber varchar(50) not null, workOrderDescription text, workOrderOpenDate integer check (workOrderOpenDate > 0), workOrderCloseDate integer check (workOrderCloseDate > 0), ${recordColumns}, foreign key (workOrderTypeId) references WorkOrderTypes (workOrderTypeId))`, + `create table if not exists WorkOrderLots (workOrderId integer not null, lotId integer not null, ${recordColumns}, primary key (workOrderId, lotId), foreign key (workOrderId) references WorkOrders (workOrderId), foreign key (lotId) references Lots (lotId)) without rowid`, + `create table if not exists WorkOrderLotOccupancies (workOrderId integer not null, lotOccupancyId integer not null, ${recordColumns}, primary key (workOrderId, lotOccupancyId), foreign key (workOrderId) references WorkOrders (workOrderId), foreign key (lotOccupancyId) references LotOccupancies (lotOccupancyId)) without rowid`, + `create table if not exists WorkOrderComments (workOrderCommentId integer not null primary key autoincrement, workOrderId integer not null, workOrderCommentDate integer not null check (workOrderCommentDate > 0), workOrderCommentTime integer not null check (workOrderCommentTime >= 0), workOrderComment text not null, ${recordColumns}, foreign key (workOrderId) references WorkOrders (workOrderId))`, + 'create index if not exists idx_workordercomments_datetime on WorkOrderComments (workOrderId, workOrderCommentDate, workOrderCommentTime)', + `create table if not exists WorkOrderMilestoneTypes (workOrderMilestoneTypeId integer not null primary key autoincrement, workOrderMilestoneType varchar(100) not null, orderNumber smallint not null default 0, ${recordColumns})`, + `create table if not exists WorkOrderMilestones (workOrderMilestoneId integer not null primary key autoincrement, workOrderId integer not null, workOrderMilestoneTypeId integer, workOrderMilestoneDate integer not null check (workOrderMilestoneDate > 0), workOrderMilestoneTime integer not null check (workOrderMilestoneTime >= 0), workOrderMilestoneDescription text not null, workOrderMilestoneCompletionDate integer check (workOrderMilestoneCompletionDate > 0), workOrderMilestoneCompletionTime integer check (workOrderMilestoneCompletionTime >= 0), ${recordColumns}, foreign key (workOrderId) references WorkOrders (workOrderId), foreign key (workOrderMilestoneTypeId) references WorkOrderMilestoneTypes (workOrderMilestoneTypeId))` +] export function initializeDatabase(): boolean { - const lotOccupancyDB = sqlite(databasePath); + const lotOccupancyDB = sqlite(databasePath) - const row = lotOccupancyDB - .prepare("select name from sqlite_master where type = 'table' and name = 'WorkOrderMilestones'") - .get(); + const row = lotOccupancyDB + .prepare( + "select name from sqlite_master where type = 'table' and name = 'WorkOrderMilestones'" + ) + .get() - if (!row) { - debugSQL("Creating " + databasePath); + if (!row) { + debugSQL('Creating ' + databasePath) - for (const sql of createStatements) { - lotOccupancyDB.prepare(sql).run(); - } - - lotOccupancyDB.close(); - - return true; + for (const sql of createStatements) { + lotOccupancyDB.prepare(sql).run() } - return false; + lotOccupancyDB.close() + + return true + } + + return false } diff --git a/helpers/lotOccupancyDB/addWorkOrderLotOccupancy.js b/helpers/lotOccupancyDB/addWorkOrderLotOccupancy.js index e7f5a28d..e4387d14 100644 --- a/helpers/lotOccupancyDB/addWorkOrderLotOccupancy.js +++ b/helpers/lotOccupancyDB/addWorkOrderLotOccupancy.js @@ -5,32 +5,32 @@ export function addWorkOrderLotOccupancy(workOrderLotOccupancyForm, requestSessi const rightNowMillis = Date.now(); const row = database .prepare(`select recordDelete_timeMillis - from WorkOrderLotOccupancies - where workOrderId = ? - and lotOccupancyId = ?`) + from WorkOrderLotOccupancies + where workOrderId = ? + and lotOccupancyId = ?`) .get(workOrderLotOccupancyForm.workOrderId, workOrderLotOccupancyForm.lotOccupancyId); if (row) { if (row.recordDelete_timeMillis) { database .prepare(`update WorkOrderLotOccupancies - set recordCreate_userName = ?, - recordCreate_timeMillis = ?, - recordUpdate_userName = ?, - recordUpdate_timeMillis = ?, - recordDelete_userName = null, - recordDelete_timeMillis = null - where workOrderId = ? - and lotOccupancyId = ?`) + set recordCreate_userName = ?, + recordCreate_timeMillis = ?, + recordUpdate_userName = ?, + recordUpdate_timeMillis = ?, + recordDelete_userName = null, + recordDelete_timeMillis = null + where workOrderId = ? + and lotOccupancyId = ?`) .run(requestSession.user.userName, rightNowMillis, requestSession.user.userName, rightNowMillis, workOrderLotOccupancyForm.workOrderId, workOrderLotOccupancyForm.lotOccupancyId); } } else { database .prepare(`insert into WorkOrderLotOccupancies ( - workOrderId, lotOccupancyId, - recordCreate_userName, recordCreate_timeMillis, - recordUpdate_userName, recordUpdate_timeMillis) - values (?, ?, ?, ?, ?, ?)`) + workOrderId, lotOccupancyId, + recordCreate_userName, recordCreate_timeMillis, + recordUpdate_userName, recordUpdate_timeMillis) + values (?, ?, ?, ?, ?, ?)`) .run(workOrderLotOccupancyForm.workOrderId, workOrderLotOccupancyForm.lotOccupancyId, requestSession.user.userName, rightNowMillis, requestSession.user.userName, rightNowMillis); } if (!connectedDatabase) { diff --git a/helpers/lotOccupancyDB/addWorkOrderLotOccupancy.ts b/helpers/lotOccupancyDB/addWorkOrderLotOccupancy.ts index 2596bb66..de086a83 100644 --- a/helpers/lotOccupancyDB/addWorkOrderLotOccupancy.ts +++ b/helpers/lotOccupancyDB/addWorkOrderLotOccupancy.ts @@ -21,9 +21,9 @@ export function addWorkOrderLotOccupancy( const row: { recordDelete_timeMillis?: number } = database .prepare( `select recordDelete_timeMillis - from WorkOrderLotOccupancies - where workOrderId = ? - and lotOccupancyId = ?` + from WorkOrderLotOccupancies + where workOrderId = ? + and lotOccupancyId = ?` ) .get( workOrderLotOccupancyForm.workOrderId, @@ -35,14 +35,14 @@ export function addWorkOrderLotOccupancy( database .prepare( `update WorkOrderLotOccupancies - set recordCreate_userName = ?, - recordCreate_timeMillis = ?, - recordUpdate_userName = ?, - recordUpdate_timeMillis = ?, - recordDelete_userName = null, - recordDelete_timeMillis = null - where workOrderId = ? - and lotOccupancyId = ?` + set recordCreate_userName = ?, + recordCreate_timeMillis = ?, + recordUpdate_userName = ?, + recordUpdate_timeMillis = ?, + recordDelete_userName = null, + recordDelete_timeMillis = null + where workOrderId = ? + and lotOccupancyId = ?` ) .run( requestSession.user!.userName, @@ -57,10 +57,10 @@ export function addWorkOrderLotOccupancy( database .prepare( `insert into WorkOrderLotOccupancies ( - workOrderId, lotOccupancyId, - recordCreate_userName, recordCreate_timeMillis, - recordUpdate_userName, recordUpdate_timeMillis) - values (?, ?, ?, ?, ?, ?)` + workOrderId, lotOccupancyId, + recordCreate_userName, recordCreate_timeMillis, + recordUpdate_userName, recordUpdate_timeMillis) + values (?, ?, ?, ?, ?, ?)` ) .run( workOrderLotOccupancyForm.workOrderId, diff --git a/helpers/lotOccupancyDB/deleteLotField.js b/helpers/lotOccupancyDB/deleteLotField.js index 5c1d8fb1..af60e4c1 100644 --- a/helpers/lotOccupancyDB/deleteLotField.js +++ b/helpers/lotOccupancyDB/deleteLotField.js @@ -5,10 +5,10 @@ export function deleteLotField(lotId, lotTypeFieldId, requestSession, connectedD const rightNowMillis = Date.now(); const result = database .prepare(`update LotFields - set recordDelete_userName = ?, - recordDelete_timeMillis = ? - where lotId = ? - and lotTypeFieldId = ?`) + set recordDelete_userName = ?, + recordDelete_timeMillis = ? + where lotId = ? + and lotTypeFieldId = ?`) .run(requestSession.user.userName, rightNowMillis, lotId, lotTypeFieldId); if (!connectedDatabase) { database.close(); diff --git a/helpers/lotOccupancyDB/deleteLotField.ts b/helpers/lotOccupancyDB/deleteLotField.ts index 309b5703..49f7a90d 100644 --- a/helpers/lotOccupancyDB/deleteLotField.ts +++ b/helpers/lotOccupancyDB/deleteLotField.ts @@ -17,10 +17,10 @@ export function deleteLotField( const result = database .prepare( `update LotFields - set recordDelete_userName = ?, - recordDelete_timeMillis = ? - where lotId = ? - and lotTypeFieldId = ?` + set recordDelete_userName = ?, + recordDelete_timeMillis = ? + where lotId = ? + and lotTypeFieldId = ?` ) .run(requestSession.user!.userName, rightNowMillis, lotId, lotTypeFieldId) diff --git a/helpers/lotOccupancyDB/getOccupancyTypes.d.ts b/helpers/lotOccupancyDB/getOccupancyTypes.d.ts index 2cc82d2d..380e98ac 100644 --- a/helpers/lotOccupancyDB/getOccupancyTypes.d.ts +++ b/helpers/lotOccupancyDB/getOccupancyTypes.d.ts @@ -1,3 +1,3 @@ -import type * as recordTypes from "../../types/recordTypes"; +import type * as recordTypes from '../../types/recordTypes'; export declare function getOccupancyTypes(): recordTypes.OccupancyType[]; export default getOccupancyTypes; diff --git a/helpers/lotOccupancyDB/getOccupancyTypes.js b/helpers/lotOccupancyDB/getOccupancyTypes.js index 7334d430..2386577c 100644 --- a/helpers/lotOccupancyDB/getOccupancyTypes.js +++ b/helpers/lotOccupancyDB/getOccupancyTypes.js @@ -1,21 +1,21 @@ -import sqlite from "better-sqlite3"; -import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; -import { getOccupancyTypeFields } from "./getOccupancyTypeFields.js"; -import { getOccupancyTypePrints } from "./getOccupancyTypePrints.js"; -import { updateRecordOrderNumber } from "./updateRecordOrderNumber.js"; +import sqlite from 'better-sqlite3'; +import { lotOccupancyDB as databasePath } from '../../data/databasePaths.js'; +import { getOccupancyTypeFields } from './getOccupancyTypeFields.js'; +import { getOccupancyTypePrints } from './getOccupancyTypePrints.js'; +import { updateRecordOrderNumber } from './updateRecordOrderNumber.js'; export function getOccupancyTypes() { const database = sqlite(databasePath); const occupancyTypes = database .prepare(`select occupancyTypeId, occupancyType, orderNumber - from OccupancyTypes - where recordDelete_timeMillis is null - order by orderNumber, occupancyType`) + from OccupancyTypes + where recordDelete_timeMillis is null + order by orderNumber, occupancyType`) .all(); let expectedTypeOrderNumber = -1; for (const occupancyType of occupancyTypes) { expectedTypeOrderNumber += 1; if (occupancyType.orderNumber !== expectedTypeOrderNumber) { - updateRecordOrderNumber("OccupancyTypes", occupancyType.occupancyTypeId, expectedTypeOrderNumber, database); + updateRecordOrderNumber('OccupancyTypes', occupancyType.occupancyTypeId, expectedTypeOrderNumber, database); occupancyType.orderNumber = expectedTypeOrderNumber; } occupancyType.occupancyTypeFields = getOccupancyTypeFields(occupancyType.occupancyTypeId, database); diff --git a/helpers/lotOccupancyDB/getOccupancyTypes.ts b/helpers/lotOccupancyDB/getOccupancyTypes.ts index 6cb65eb6..288c066a 100644 --- a/helpers/lotOccupancyDB/getOccupancyTypes.ts +++ b/helpers/lotOccupancyDB/getOccupancyTypes.ts @@ -1,49 +1,55 @@ -import sqlite from "better-sqlite3"; +import sqlite from 'better-sqlite3' -import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { lotOccupancyDB as databasePath } from '../../data/databasePaths.js' -import { getOccupancyTypeFields } from "./getOccupancyTypeFields.js"; -import { getOccupancyTypePrints } from "./getOccupancyTypePrints.js"; +import { getOccupancyTypeFields } from './getOccupancyTypeFields.js' +import { getOccupancyTypePrints } from './getOccupancyTypePrints.js' -import type * as recordTypes from "../../types/recordTypes"; -import { updateRecordOrderNumber } from "./updateRecordOrderNumber.js"; +import type * as recordTypes from '../../types/recordTypes' +import { updateRecordOrderNumber } from './updateRecordOrderNumber.js' export function getOccupancyTypes(): recordTypes.OccupancyType[] { - const database = sqlite(databasePath); + const database = sqlite(databasePath) - const occupancyTypes: recordTypes.OccupancyType[] = database - .prepare( - `select occupancyTypeId, occupancyType, orderNumber - from OccupancyTypes - where recordDelete_timeMillis is null - order by orderNumber, occupancyType` - ) - .all(); + const occupancyTypes: recordTypes.OccupancyType[] = database + .prepare( + `select occupancyTypeId, occupancyType, orderNumber + from OccupancyTypes + where recordDelete_timeMillis is null + order by orderNumber, occupancyType` + ) + .all() - let expectedTypeOrderNumber = -1; + let expectedTypeOrderNumber = -1 - for (const occupancyType of occupancyTypes) { - expectedTypeOrderNumber += 1; + for (const occupancyType of occupancyTypes) { + expectedTypeOrderNumber += 1 - if (occupancyType.orderNumber !== expectedTypeOrderNumber) { - updateRecordOrderNumber( - "OccupancyTypes", - occupancyType.occupancyTypeId, - expectedTypeOrderNumber, - database - ); + if (occupancyType.orderNumber !== expectedTypeOrderNumber) { + updateRecordOrderNumber( + 'OccupancyTypes', + occupancyType.occupancyTypeId, + expectedTypeOrderNumber, + database + ) - occupancyType.orderNumber = expectedTypeOrderNumber; - } - - occupancyType.occupancyTypeFields = getOccupancyTypeFields(occupancyType.occupancyTypeId, database); - - occupancyType.occupancyTypePrints = getOccupancyTypePrints(occupancyType.occupancyTypeId, database); + occupancyType.orderNumber = expectedTypeOrderNumber } - database.close(); + occupancyType.occupancyTypeFields = getOccupancyTypeFields( + occupancyType.occupancyTypeId, + database + ) - return occupancyTypes; + occupancyType.occupancyTypePrints = getOccupancyTypePrints( + occupancyType.occupancyTypeId, + database + ) + } + + database.close() + + return occupancyTypes } -export default getOccupancyTypes; +export default getOccupancyTypes diff --git a/helpers/lotOccupancyDB/getPreviousLotId.js b/helpers/lotOccupancyDB/getPreviousLotId.js index 52dd1657..1111060c 100644 --- a/helpers/lotOccupancyDB/getPreviousLotId.js +++ b/helpers/lotOccupancyDB/getPreviousLotId.js @@ -1,17 +1,17 @@ -import sqlite from "better-sqlite3"; -import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; -import * as configFunctions from "../functions.config.js"; +import sqlite from 'better-sqlite3'; +import { lotOccupancyDB as databasePath } from '../../data/databasePaths.js'; +import * as configFunctions from '../functions.config.js'; export function getPreviousLotId(lotId) { const database = sqlite(databasePath, { readonly: true }); - database.function("userFn_lotNameSortName", configFunctions.getProperty("settings.lot.lotNameSortNameFunction")); + database.function('userFn_lotNameSortName', configFunctions.getProperty('settings.lot.lotNameSortNameFunction')); const result = database .prepare(`select lotId from Lots - where recordDelete_timeMillis is null - and userFn_lotNameSortName(lotName) < (select userFn_lotNameSortName(lotName) from Lots where lotId = ?) - order by userFn_lotNameSortName(lotName) desc - limit 1`) + where recordDelete_timeMillis is null + and userFn_lotNameSortName(lotName) < (select userFn_lotNameSortName(lotName) from Lots where lotId = ?) + order by userFn_lotNameSortName(lotName) desc + limit 1`) .get(lotId); database.close(); if (result) { diff --git a/helpers/lotOccupancyDB/getPreviousLotId.ts b/helpers/lotOccupancyDB/getPreviousLotId.ts index 3d8d079d..59c2e1c4 100644 --- a/helpers/lotOccupancyDB/getPreviousLotId.ts +++ b/helpers/lotOccupancyDB/getPreviousLotId.ts @@ -1,38 +1,38 @@ -import sqlite from "better-sqlite3"; +import sqlite from 'better-sqlite3' -import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { lotOccupancyDB as databasePath } from '../../data/databasePaths.js' -import * as configFunctions from "../functions.config.js"; +import * as configFunctions from '../functions.config.js' export function getPreviousLotId(lotId: number | string): number | undefined { - const database = sqlite(databasePath, { - readonly: true - }); + const database = sqlite(databasePath, { + readonly: true + }) - database.function( - "userFn_lotNameSortName", - configFunctions.getProperty("settings.lot.lotNameSortNameFunction") - ); + database.function( + 'userFn_lotNameSortName', + configFunctions.getProperty('settings.lot.lotNameSortNameFunction') + ) - const result: { - lotId: number; - } = database - .prepare( - `select lotId from Lots - where recordDelete_timeMillis is null - and userFn_lotNameSortName(lotName) < (select userFn_lotNameSortName(lotName) from Lots where lotId = ?) - order by userFn_lotNameSortName(lotName) desc - limit 1` - ) - .get(lotId); + const result: { + lotId: number + } = database + .prepare( + `select lotId from Lots + where recordDelete_timeMillis is null + and userFn_lotNameSortName(lotName) < (select userFn_lotNameSortName(lotName) from Lots where lotId = ?) + order by userFn_lotNameSortName(lotName) desc + limit 1` + ) + .get(lotId) - database.close(); + database.close() - if (result) { - return result.lotId; - } + if (result) { + return result.lotId + } - return undefined; + return undefined } -export default getPreviousLotId; +export default getPreviousLotId diff --git a/helpers/lotOccupancyDB/getWorkOrder.d.ts b/helpers/lotOccupancyDB/getWorkOrder.d.ts index 8f5b3020..0d66b8e8 100644 --- a/helpers/lotOccupancyDB/getWorkOrder.d.ts +++ b/helpers/lotOccupancyDB/getWorkOrder.d.ts @@ -1,5 +1,5 @@ -import sqlite from "better-sqlite3"; -import type * as recordTypes from "../../types/recordTypes"; +import sqlite from 'better-sqlite3'; +import type * as recordTypes from '../../types/recordTypes'; interface WorkOrderOptions { includeLotsAndLotOccupancies: boolean; includeComments: boolean; diff --git a/helpers/lotOccupancyDB/getWorkOrder.js b/helpers/lotOccupancyDB/getWorkOrder.js index f8d54777..51967a05 100644 --- a/helpers/lotOccupancyDB/getWorkOrder.js +++ b/helpers/lotOccupancyDB/getWorkOrder.js @@ -1,28 +1,28 @@ -import sqlite from "better-sqlite3"; -import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; -import { dateIntegerToString } from "@cityssm/expressjs-server-js/dateTimeFns.js"; -import { getLots } from "./getLots.js"; -import { getLotOccupancies } from "./getLotOccupancies.js"; -import { getWorkOrderComments } from "./getWorkOrderComments.js"; -import { getWorkOrderMilestones } from "./getWorkOrderMilestones.js"; +import sqlite from 'better-sqlite3'; +import { lotOccupancyDB as databasePath } from '../../data/databasePaths.js'; +import { dateIntegerToString } from '@cityssm/expressjs-server-js/dateTimeFns.js'; +import { getLots } from './getLots.js'; +import { getLotOccupancies } from './getLotOccupancies.js'; +import { getWorkOrderComments } from './getWorkOrderComments.js'; +import { getWorkOrderMilestones } from './getWorkOrderMilestones.js'; const baseSQL = `select w.workOrderId, - w.workOrderTypeId, t.workOrderType, - w.workOrderNumber, w.workOrderDescription, - w.workOrderOpenDate, userFn_dateIntegerToString(w.workOrderOpenDate) as workOrderOpenDateString, - w.workOrderCloseDate, userFn_dateIntegerToString(w.workOrderCloseDate) as workOrderCloseDateString, - w.recordCreate_timeMillis, w.recordUpdate_timeMillis - from WorkOrders w - left join WorkOrderTypes t on w.workOrderTypeId = t.workOrderTypeId - where w.recordDelete_timeMillis is null`; -function _getWorkOrder(sql, workOrderId_or_workOrderNumber, options, connectedDatabase) { - const database = connectedDatabase || + w.workOrderTypeId, t.workOrderType, + w.workOrderNumber, w.workOrderDescription, + w.workOrderOpenDate, userFn_dateIntegerToString(w.workOrderOpenDate) as workOrderOpenDateString, + w.workOrderCloseDate, userFn_dateIntegerToString(w.workOrderCloseDate) as workOrderCloseDateString, + w.recordCreate_timeMillis, w.recordUpdate_timeMillis + from WorkOrders w + left join WorkOrderTypes t on w.workOrderTypeId = t.workOrderTypeId + where w.recordDelete_timeMillis is null`; +function _getWorkOrder(sql, workOrderIdOrWorkOrderNumber, options, connectedDatabase) { + const database = connectedDatabase ?? sqlite(databasePath, { readonly: true }); - database.function("userFn_dateIntegerToString", dateIntegerToString); + database.function('userFn_dateIntegerToString', dateIntegerToString); const workOrder = database .prepare(sql) - .get(workOrderId_or_workOrderNumber); + .get(workOrderIdOrWorkOrderNumber); if (workOrder) { if (options.includeLotsAndLotOccupancies) { workOrder.workOrderLots = getLots({ @@ -47,7 +47,7 @@ function _getWorkOrder(sql, workOrderId_or_workOrderNumber, options, connectedDa workOrderId: workOrder.workOrderId }, { includeWorkOrders: false, - orderBy: "completion" + orderBy: 'completion' }, database); } } @@ -57,13 +57,13 @@ function _getWorkOrder(sql, workOrderId_or_workOrderNumber, options, connectedDa return workOrder; } export function getWorkOrderByWorkOrderNumber(workOrderNumber) { - return _getWorkOrder(baseSQL + " and w.workOrderNumber = ?", workOrderNumber, { + return _getWorkOrder(baseSQL + ' and w.workOrderNumber = ?', workOrderNumber, { includeLotsAndLotOccupancies: true, includeComments: true, includeMilestones: true }); } export function getWorkOrder(workOrderId, options, connectedDatabase) { - return _getWorkOrder(baseSQL + " and w.workOrderId = ?", workOrderId, options, connectedDatabase); + return _getWorkOrder(baseSQL + ' and w.workOrderId = ?', workOrderId, options, connectedDatabase); } export default getWorkOrder; diff --git a/helpers/lotOccupancyDB/getWorkOrder.ts b/helpers/lotOccupancyDB/getWorkOrder.ts index 656d6544..5ce2dc6d 100644 --- a/helpers/lotOccupancyDB/getWorkOrder.ts +++ b/helpers/lotOccupancyDB/getWorkOrder.ts @@ -1,126 +1,132 @@ -import sqlite from "better-sqlite3"; +import sqlite from 'better-sqlite3' -import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { lotOccupancyDB as databasePath } from '../../data/databasePaths.js' -import { dateIntegerToString } from "@cityssm/expressjs-server-js/dateTimeFns.js"; +import { dateIntegerToString } from '@cityssm/expressjs-server-js/dateTimeFns.js' -import { getLots } from "./getLots.js"; +import { getLots } from './getLots.js' -import { getLotOccupancies } from "./getLotOccupancies.js"; +import { getLotOccupancies } from './getLotOccupancies.js' -import { getWorkOrderComments } from "./getWorkOrderComments.js"; +import { getWorkOrderComments } from './getWorkOrderComments.js' -import { getWorkOrderMilestones } from "./getWorkOrderMilestones.js"; +import { getWorkOrderMilestones } from './getWorkOrderMilestones.js' -import type * as recordTypes from "../../types/recordTypes"; +import type * as recordTypes from '../../types/recordTypes' interface WorkOrderOptions { - includeLotsAndLotOccupancies: boolean; - includeComments: boolean; - includeMilestones: boolean; + includeLotsAndLotOccupancies: boolean + includeComments: boolean + includeMilestones: boolean } const baseSQL = `select w.workOrderId, - w.workOrderTypeId, t.workOrderType, - w.workOrderNumber, w.workOrderDescription, - w.workOrderOpenDate, userFn_dateIntegerToString(w.workOrderOpenDate) as workOrderOpenDateString, - w.workOrderCloseDate, userFn_dateIntegerToString(w.workOrderCloseDate) as workOrderCloseDateString, - w.recordCreate_timeMillis, w.recordUpdate_timeMillis - from WorkOrders w - left join WorkOrderTypes t on w.workOrderTypeId = t.workOrderTypeId - where w.recordDelete_timeMillis is null`; + w.workOrderTypeId, t.workOrderType, + w.workOrderNumber, w.workOrderDescription, + w.workOrderOpenDate, userFn_dateIntegerToString(w.workOrderOpenDate) as workOrderOpenDateString, + w.workOrderCloseDate, userFn_dateIntegerToString(w.workOrderCloseDate) as workOrderCloseDateString, + w.recordCreate_timeMillis, w.recordUpdate_timeMillis + from WorkOrders w + left join WorkOrderTypes t on w.workOrderTypeId = t.workOrderTypeId + where w.recordDelete_timeMillis is null` function _getWorkOrder( - sql: string, - workOrderId_or_workOrderNumber: number | string, - options: WorkOrderOptions, - connectedDatabase?: sqlite.Database + sql: string, + workOrderIdOrWorkOrderNumber: number | string, + options: WorkOrderOptions, + connectedDatabase?: sqlite.Database ): recordTypes.WorkOrder { - const database = - connectedDatabase || - sqlite(databasePath, { - readonly: true - }); + const database = + connectedDatabase ?? + sqlite(databasePath, { + readonly: true + }) - database.function("userFn_dateIntegerToString", dateIntegerToString); + database.function('userFn_dateIntegerToString', dateIntegerToString) - const workOrder: recordTypes.WorkOrder = database - .prepare(sql) - .get(workOrderId_or_workOrderNumber); + const workOrder: recordTypes.WorkOrder = database + .prepare(sql) + .get(workOrderIdOrWorkOrderNumber) - if (workOrder) { - if (options.includeLotsAndLotOccupancies) { - workOrder.workOrderLots = getLots( - { - workOrderId: workOrder.workOrderId - }, - { - limit: -1, - offset: 0 - }, - database - ).lots; + if (workOrder) { + if (options.includeLotsAndLotOccupancies) { + workOrder.workOrderLots = getLots( + { + workOrderId: workOrder.workOrderId + }, + { + limit: -1, + offset: 0 + }, + database + ).lots - workOrder.workOrderLotOccupancies = getLotOccupancies( - { - workOrderId: workOrder.workOrderId - }, - { - limit: -1, - offset: 0, - includeOccupants: true - }, - database - ).lotOccupancies; - } - - if (options.includeComments) { - workOrder.workOrderComments = getWorkOrderComments( - workOrder.workOrderId as number, - database - ); - } - - if (options.includeMilestones) { - workOrder.workOrderMilestones = getWorkOrderMilestones( - { - workOrderId: workOrder.workOrderId - }, - { - includeWorkOrders: false, - orderBy: "completion" - }, - database - ); - } + workOrder.workOrderLotOccupancies = getLotOccupancies( + { + workOrderId: workOrder.workOrderId + }, + { + limit: -1, + offset: 0, + includeOccupants: true + }, + database + ).lotOccupancies } - if (!connectedDatabase) { - database.close(); + if (options.includeComments) { + workOrder.workOrderComments = getWorkOrderComments( + workOrder.workOrderId as number, + database + ) } - return workOrder; + if (options.includeMilestones) { + workOrder.workOrderMilestones = getWorkOrderMilestones( + { + workOrderId: workOrder.workOrderId + }, + { + includeWorkOrders: false, + orderBy: 'completion' + }, + database + ) + } + } + + if (!connectedDatabase) { + database.close() + } + + return workOrder } -export function getWorkOrderByWorkOrderNumber(workOrderNumber: string): recordTypes.WorkOrder { - return _getWorkOrder(baseSQL + " and w.workOrderNumber = ?", workOrderNumber, { - includeLotsAndLotOccupancies: true, - includeComments: true, - includeMilestones: true - }); +export function getWorkOrderByWorkOrderNumber( + workOrderNumber: string +): recordTypes.WorkOrder { + return _getWorkOrder( + baseSQL + ' and w.workOrderNumber = ?', + workOrderNumber, + { + includeLotsAndLotOccupancies: true, + includeComments: true, + includeMilestones: true + } + ) } export function getWorkOrder( - workOrderId: number | string, - options: WorkOrderOptions, - connectedDatabase?: sqlite.Database + workOrderId: number | string, + options: WorkOrderOptions, + connectedDatabase?: sqlite.Database ): recordTypes.WorkOrder { - return _getWorkOrder( - baseSQL + " and w.workOrderId = ?", - workOrderId, - options, - connectedDatabase - ); + return _getWorkOrder( + baseSQL + ' and w.workOrderId = ?', + workOrderId, + options, + connectedDatabase + ) } -export default getWorkOrder; +export default getWorkOrder diff --git a/helpers/lotOccupancyDB/getWorkOrderComments.d.ts b/helpers/lotOccupancyDB/getWorkOrderComments.d.ts index 03a3e6d7..3b7b5e1a 100644 --- a/helpers/lotOccupancyDB/getWorkOrderComments.d.ts +++ b/helpers/lotOccupancyDB/getWorkOrderComments.d.ts @@ -1,4 +1,4 @@ -import sqlite from "better-sqlite3"; -import type * as recordTypes from "../../types/recordTypes"; +import sqlite from 'better-sqlite3'; +import type * as recordTypes from '../../types/recordTypes'; export declare function getWorkOrderComments(workOrderId: number | string, connectedDatabase?: sqlite.Database): recordTypes.WorkOrderComment[]; export default getWorkOrderComments; diff --git a/helpers/lotOccupancyDB/getWorkOrderComments.js b/helpers/lotOccupancyDB/getWorkOrderComments.js index 0daa1fd3..2b42e324 100644 --- a/helpers/lotOccupancyDB/getWorkOrderComments.js +++ b/helpers/lotOccupancyDB/getWorkOrderComments.js @@ -1,13 +1,13 @@ -import sqlite from "better-sqlite3"; -import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; -import { dateIntegerToString, timeIntegerToString } from "@cityssm/expressjs-server-js/dateTimeFns.js"; +import sqlite from 'better-sqlite3'; +import { lotOccupancyDB as databasePath } from '../../data/databasePaths.js'; +import { dateIntegerToString, timeIntegerToString } from '@cityssm/expressjs-server-js/dateTimeFns.js'; export function getWorkOrderComments(workOrderId, connectedDatabase) { - const database = connectedDatabase || + const database = connectedDatabase ?? sqlite(databasePath, { readonly: true }); - database.function("userFn_dateIntegerToString", dateIntegerToString); - database.function("userFn_timeIntegerToString", timeIntegerToString); + database.function('userFn_dateIntegerToString', dateIntegerToString); + database.function('userFn_timeIntegerToString', timeIntegerToString); const workOrderComments = database .prepare(`select workOrderCommentId, workOrderCommentDate, userFn_dateIntegerToString(workOrderCommentDate) as workOrderCommentDateString, diff --git a/helpers/lotOccupancyDB/getWorkOrderComments.ts b/helpers/lotOccupancyDB/getWorkOrderComments.ts index ea063ff4..8e0c03bd 100644 --- a/helpers/lotOccupancyDB/getWorkOrderComments.ts +++ b/helpers/lotOccupancyDB/getWorkOrderComments.ts @@ -1,30 +1,30 @@ -import sqlite from "better-sqlite3"; +import sqlite from 'better-sqlite3' -import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { lotOccupancyDB as databasePath } from '../../data/databasePaths.js' import { - dateIntegerToString, - timeIntegerToString -} from "@cityssm/expressjs-server-js/dateTimeFns.js"; + dateIntegerToString, + timeIntegerToString +} from '@cityssm/expressjs-server-js/dateTimeFns.js' -import type * as recordTypes from "../../types/recordTypes"; +import type * as recordTypes from '../../types/recordTypes' export function getWorkOrderComments( - workOrderId: number | string, - connectedDatabase?: sqlite.Database + workOrderId: number | string, + connectedDatabase?: sqlite.Database ): recordTypes.WorkOrderComment[] { - const database = - connectedDatabase || - sqlite(databasePath, { - readonly: true - }); + const database = + connectedDatabase ?? + sqlite(databasePath, { + readonly: true + }) - database.function("userFn_dateIntegerToString", dateIntegerToString); - database.function("userFn_timeIntegerToString", timeIntegerToString); + database.function('userFn_dateIntegerToString', dateIntegerToString) + database.function('userFn_timeIntegerToString', timeIntegerToString) - const workOrderComments = database - .prepare( - `select workOrderCommentId, + const workOrderComments = database + .prepare( + `select workOrderCommentId, workOrderCommentDate, userFn_dateIntegerToString(workOrderCommentDate) as workOrderCommentDateString, workOrderCommentTime, userFn_timeIntegerToString(workOrderCommentTime) as workOrderCommentTimeString, workOrderComment, @@ -33,14 +33,14 @@ export function getWorkOrderComments( where recordDelete_timeMillis is null and workOrderId = ? order by workOrderCommentDate desc, workOrderCommentTime desc, workOrderCommentId desc` - ) - .all(workOrderId); + ) + .all(workOrderId) - if (!connectedDatabase) { - database.close(); - } + if (!connectedDatabase) { + database.close() + } - return workOrderComments; + return workOrderComments } -export default getWorkOrderComments; +export default getWorkOrderComments diff --git a/helpers/lotOccupancyDB/getWorkOrderMilestoneTypes.d.ts b/helpers/lotOccupancyDB/getWorkOrderMilestoneTypes.d.ts index f83bf17a..454acd15 100644 --- a/helpers/lotOccupancyDB/getWorkOrderMilestoneTypes.d.ts +++ b/helpers/lotOccupancyDB/getWorkOrderMilestoneTypes.d.ts @@ -1,3 +1,3 @@ -import type * as recordTypes from "../../types/recordTypes"; +import type * as recordTypes from '../../types/recordTypes'; export declare function getWorkOrderMilestoneTypes(): recordTypes.WorkOrderMilestoneType[]; export default getWorkOrderMilestoneTypes; diff --git a/helpers/lotOccupancyDB/getWorkOrderMilestoneTypes.js b/helpers/lotOccupancyDB/getWorkOrderMilestoneTypes.js index 987cd646..31f87871 100644 --- a/helpers/lotOccupancyDB/getWorkOrderMilestoneTypes.js +++ b/helpers/lotOccupancyDB/getWorkOrderMilestoneTypes.js @@ -1,6 +1,6 @@ -import sqlite from "better-sqlite3"; -import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; -import { updateRecordOrderNumber } from "./updateRecordOrderNumber.js"; +import sqlite from 'better-sqlite3'; +import { lotOccupancyDB as databasePath } from '../../data/databasePaths.js'; +import { updateRecordOrderNumber } from './updateRecordOrderNumber.js'; export function getWorkOrderMilestoneTypes() { const database = sqlite(databasePath); const workOrderMilestoneTypes = database @@ -12,7 +12,7 @@ export function getWorkOrderMilestoneTypes() { let expectedOrderNumber = 0; for (const workOrderMilestoneType of workOrderMilestoneTypes) { if (workOrderMilestoneType.orderNumber !== expectedOrderNumber) { - updateRecordOrderNumber("WorkOrderMilestoneTypes", workOrderMilestoneType.workOrderMilestoneTypeId, expectedOrderNumber, database); + updateRecordOrderNumber('WorkOrderMilestoneTypes', workOrderMilestoneType.workOrderMilestoneTypeId, expectedOrderNumber, database); workOrderMilestoneType.orderNumber = expectedOrderNumber; } expectedOrderNumber += 1; diff --git a/helpers/lotOccupancyDB/getWorkOrderMilestoneTypes.ts b/helpers/lotOccupancyDB/getWorkOrderMilestoneTypes.ts index a8187b75..d603eff5 100644 --- a/helpers/lotOccupancyDB/getWorkOrderMilestoneTypes.ts +++ b/helpers/lotOccupancyDB/getWorkOrderMilestoneTypes.ts @@ -1,43 +1,43 @@ -import sqlite from "better-sqlite3"; +import sqlite from 'better-sqlite3' -import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { lotOccupancyDB as databasePath } from '../../data/databasePaths.js' -import { updateRecordOrderNumber } from "./updateRecordOrderNumber.js"; +import { updateRecordOrderNumber } from './updateRecordOrderNumber.js' -import type * as recordTypes from "../../types/recordTypes"; +import type * as recordTypes from '../../types/recordTypes' export function getWorkOrderMilestoneTypes(): recordTypes.WorkOrderMilestoneType[] { - const database = sqlite(databasePath); + const database = sqlite(databasePath) - const workOrderMilestoneTypes: recordTypes.WorkOrderMilestoneType[] = database - .prepare( - `select workOrderMilestoneTypeId, workOrderMilestoneType, orderNumber + const workOrderMilestoneTypes: recordTypes.WorkOrderMilestoneType[] = database + .prepare( + `select workOrderMilestoneTypeId, workOrderMilestoneType, orderNumber from WorkOrderMilestoneTypes where recordDelete_timeMillis is null order by orderNumber, workOrderMilestoneType` - ) - .all(); + ) + .all() - let expectedOrderNumber = 0; + let expectedOrderNumber = 0 - for (const workOrderMilestoneType of workOrderMilestoneTypes) { - if (workOrderMilestoneType.orderNumber !== expectedOrderNumber) { - updateRecordOrderNumber( - "WorkOrderMilestoneTypes", - workOrderMilestoneType.workOrderMilestoneTypeId, - expectedOrderNumber, - database - ); + for (const workOrderMilestoneType of workOrderMilestoneTypes) { + if (workOrderMilestoneType.orderNumber !== expectedOrderNumber) { + updateRecordOrderNumber( + 'WorkOrderMilestoneTypes', + workOrderMilestoneType.workOrderMilestoneTypeId, + expectedOrderNumber, + database + ) - workOrderMilestoneType.orderNumber = expectedOrderNumber; - } - - expectedOrderNumber += 1; + workOrderMilestoneType.orderNumber = expectedOrderNumber } - database.close(); + expectedOrderNumber += 1 + } - return workOrderMilestoneTypes; + database.close() + + return workOrderMilestoneTypes } -export default getWorkOrderMilestoneTypes; +export default getWorkOrderMilestoneTypes diff --git a/helpers/lotOccupancyDB/getWorkOrderMilestones.d.ts b/helpers/lotOccupancyDB/getWorkOrderMilestones.d.ts index c138f23a..d0392487 100644 --- a/helpers/lotOccupancyDB/getWorkOrderMilestones.d.ts +++ b/helpers/lotOccupancyDB/getWorkOrderMilestones.d.ts @@ -1,15 +1,15 @@ -import sqlite from "better-sqlite3"; -import type * as recordTypes from "../../types/recordTypes"; +import sqlite from 'better-sqlite3'; +import type * as recordTypes from '../../types/recordTypes'; export interface WorkOrderMilestoneFilters { workOrderId?: number | string; - workOrderMilestoneDateFilter?: "upcomingMissed" | "recent" | "date"; + workOrderMilestoneDateFilter?: 'upcomingMissed' | 'recent' | 'date'; workOrderMilestoneDateString?: string; workOrderTypeIds?: string; workOrderMilestoneTypeIds?: string; } interface WorkOrderMilestoneOptions { includeWorkOrders?: boolean; - orderBy: "completion" | "date"; + orderBy: 'completion' | 'date'; } export declare function getWorkOrderMilestones(filters: WorkOrderMilestoneFilters, options: WorkOrderMilestoneOptions, connectedDatabase?: sqlite.Database): recordTypes.WorkOrderMilestone[]; export default getWorkOrderMilestones; diff --git a/helpers/lotOccupancyDB/getWorkOrderMilestones.js b/helpers/lotOccupancyDB/getWorkOrderMilestones.js index 2d1ac329..78f8c236 100644 --- a/helpers/lotOccupancyDB/getWorkOrderMilestones.js +++ b/helpers/lotOccupancyDB/getWorkOrderMilestones.js @@ -1,49 +1,55 @@ -import sqlite from "better-sqlite3"; -import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; -import { dateIntegerToString, dateStringToInteger, dateToInteger, timeIntegerToString } from "@cityssm/expressjs-server-js/dateTimeFns.js"; -import * as configFunctions from "../functions.config.js"; -import { getLots } from "./getLots.js"; -import { getLotOccupancies } from "./getLotOccupancies.js"; +import sqlite from 'better-sqlite3'; +import { lotOccupancyDB as databasePath } from '../../data/databasePaths.js'; +import { dateIntegerToString, dateStringToInteger, dateToInteger, timeIntegerToString } from '@cityssm/expressjs-server-js/dateTimeFns.js'; +import * as configFunctions from '../functions.config.js'; +import { getLots } from './getLots.js'; +import { getLotOccupancies } from './getLotOccupancies.js'; const commaSeparatedNumbersRegex = /^\d+(,\d+)*$/; function buildWhereClause(filters) { - let sqlWhereClause = " where m.recordDelete_timeMillis is null and w.recordDelete_timeMillis is null"; + let sqlWhereClause = ' where m.recordDelete_timeMillis is null and w.recordDelete_timeMillis is null'; const sqlParameters = []; if (filters.workOrderId) { - sqlWhereClause += " and m.workOrderId = ?"; + sqlWhereClause += ' and m.workOrderId = ?'; sqlParameters.push(filters.workOrderId); } const date = new Date(); const currentDateNumber = dateToInteger(date); date.setDate(date.getDate() - - configFunctions.getProperty("settings.workOrders.workOrderMilestoneDateRecentBeforeDays")); + configFunctions.getProperty('settings.workOrders.workOrderMilestoneDateRecentBeforeDays')); const recentBeforeDateNumber = dateToInteger(date); date.setDate(date.getDate() + - configFunctions.getProperty("settings.workOrders.workOrderMilestoneDateRecentBeforeDays") + - configFunctions.getProperty("settings.workOrders.workOrderMilestoneDateRecentAfterDays")); + configFunctions.getProperty('settings.workOrders.workOrderMilestoneDateRecentBeforeDays') + + configFunctions.getProperty('settings.workOrders.workOrderMilestoneDateRecentAfterDays')); const recentAfterDateNumber = dateToInteger(date); switch (filters.workOrderMilestoneDateFilter) { - case "upcomingMissed": { + case 'upcomingMissed': { sqlWhereClause += - " and (m.workOrderMilestoneCompletionDate is null or m.workOrderMilestoneDate >= ?)"; + ' and (m.workOrderMilestoneCompletionDate is null or m.workOrderMilestoneDate >= ?)'; sqlParameters.push(currentDateNumber); break; } - case "recent": { - sqlWhereClause += " and m.workOrderMilestoneDate >= ? and m.workOrderMilestoneDate <= ?"; + case 'recent': { + sqlWhereClause += + ' and m.workOrderMilestoneDate >= ? and m.workOrderMilestoneDate <= ?'; sqlParameters.push(recentBeforeDateNumber, recentAfterDateNumber); break; } } if (filters.workOrderMilestoneDateString) { - sqlWhereClause += " and m.workOrderMilestoneDate = ?"; + sqlWhereClause += ' and m.workOrderMilestoneDate = ?'; sqlParameters.push(dateStringToInteger(filters.workOrderMilestoneDateString)); } - if (filters.workOrderTypeIds && commaSeparatedNumbersRegex.test(filters.workOrderTypeIds)) { - sqlWhereClause += " and w.workOrderTypeId in (" + filters.workOrderTypeIds + ")"; + if (filters.workOrderTypeIds && + commaSeparatedNumbersRegex.test(filters.workOrderTypeIds)) { + sqlWhereClause += + ' and w.workOrderTypeId in (' + filters.workOrderTypeIds + ')'; } if (filters.workOrderMilestoneTypeIds && commaSeparatedNumbersRegex.test(filters.workOrderMilestoneTypeIds)) { - sqlWhereClause += " and m.workOrderMilestoneTypeId in (" + filters.workOrderMilestoneTypeIds + ")"; + sqlWhereClause += + ' and m.workOrderMilestoneTypeId in (' + + filters.workOrderMilestoneTypeIds + + ')'; } return { sqlWhereClause, @@ -51,52 +57,54 @@ function buildWhereClause(filters) { }; } export function getWorkOrderMilestones(filters, options, connectedDatabase) { - const database = connectedDatabase || + const database = connectedDatabase ?? sqlite(databasePath, { readonly: true }); - database.function("userFn_dateIntegerToString", dateIntegerToString); - database.function("userFn_timeIntegerToString", timeIntegerToString); + database.function('userFn_dateIntegerToString', dateIntegerToString); + database.function('userFn_timeIntegerToString', timeIntegerToString); const { sqlWhereClause, sqlParameters } = buildWhereClause(filters); - let orderByClause = ""; + let orderByClause = ''; switch (options.orderBy) { - case "completion": { + case 'completion': { orderByClause = - " order by" + - " m.workOrderMilestoneCompletionDate, m.workOrderMilestoneCompletionTime," + - " m.workOrderMilestoneDate, case when m.workOrderMilestoneTime = 0 then 9999 else m.workOrderMilestoneTime end," + - " t.orderNumber, m.workOrderMilestoneId"; + ' order by' + + ' m.workOrderMilestoneCompletionDate, m.workOrderMilestoneCompletionTime,' + + ' m.workOrderMilestoneDate, case when m.workOrderMilestoneTime = 0 then 9999 else m.workOrderMilestoneTime end,' + + ' t.orderNumber, m.workOrderMilestoneId'; break; } - case "date": { + case 'date': { orderByClause = - " order by m.workOrderMilestoneDate, case when m.workOrderMilestoneTime = 0 then 9999 else m.workOrderMilestoneTime end," + - " t.orderNumber, m.workOrderId, m.workOrderMilestoneId"; + ' order by m.workOrderMilestoneDate, case when m.workOrderMilestoneTime = 0 then 9999 else m.workOrderMilestoneTime end,' + + ' t.orderNumber, m.workOrderId, m.workOrderMilestoneId'; break; } } - const sql = "select m.workOrderMilestoneId," + - " m.workOrderMilestoneTypeId, t.workOrderMilestoneType," + - " m.workOrderMilestoneDate, userFn_dateIntegerToString(m.workOrderMilestoneDate) as workOrderMilestoneDateString," + - " m.workOrderMilestoneTime, userFn_timeIntegerToString(m.workOrderMilestoneTime) as workOrderMilestoneTimeString," + - " m.workOrderMilestoneDescription," + - " m.workOrderMilestoneCompletionDate, userFn_dateIntegerToString(m.workOrderMilestoneCompletionDate) as workOrderMilestoneCompletionDateString," + - " m.workOrderMilestoneCompletionTime, userFn_timeIntegerToString(m.workOrderMilestoneCompletionTime) as workOrderMilestoneCompletionTimeString," + + const sql = 'select m.workOrderMilestoneId,' + + ' m.workOrderMilestoneTypeId, t.workOrderMilestoneType,' + + ' m.workOrderMilestoneDate, userFn_dateIntegerToString(m.workOrderMilestoneDate) as workOrderMilestoneDateString,' + + ' m.workOrderMilestoneTime, userFn_timeIntegerToString(m.workOrderMilestoneTime) as workOrderMilestoneTimeString,' + + ' m.workOrderMilestoneDescription,' + + ' m.workOrderMilestoneCompletionDate, userFn_dateIntegerToString(m.workOrderMilestoneCompletionDate) as workOrderMilestoneCompletionDateString,' + + ' m.workOrderMilestoneCompletionTime, userFn_timeIntegerToString(m.workOrderMilestoneCompletionTime) as workOrderMilestoneCompletionTimeString,' + (options.includeWorkOrders - ? " m.workOrderId, w.workOrderNumber, wt.workOrderType, w.workOrderDescription," + - " w.workOrderOpenDate, userFn_dateIntegerToString(w.workOrderOpenDate) as workOrderOpenDateString," + - " w.workOrderCloseDate, userFn_dateIntegerToString(w.workOrderCloseDate) as workOrderCloseDateString," + - " w.recordUpdate_timeMillis as workOrderRecordUpdate_timeMillis," - : "") + - " m.recordCreate_userName, m.recordCreate_timeMillis," + - " m.recordUpdate_userName, m.recordUpdate_timeMillis" + - " from WorkOrderMilestones m" + - " left join WorkOrderMilestoneTypes t on m.workOrderMilestoneTypeId = t.workOrderMilestoneTypeId" + - " left join WorkOrders w on m.workOrderId = w.workOrderId" + - " left join WorkOrderTypes wt on w.workOrderTypeId = wt.workOrderTypeId" + + ? ' m.workOrderId, w.workOrderNumber, wt.workOrderType, w.workOrderDescription,' + + ' w.workOrderOpenDate, userFn_dateIntegerToString(w.workOrderOpenDate) as workOrderOpenDateString,' + + ' w.workOrderCloseDate, userFn_dateIntegerToString(w.workOrderCloseDate) as workOrderCloseDateString,' + + ' w.recordUpdate_timeMillis as workOrderRecordUpdate_timeMillis,' + : '') + + ' m.recordCreate_userName, m.recordCreate_timeMillis,' + + ' m.recordUpdate_userName, m.recordUpdate_timeMillis' + + ' from WorkOrderMilestones m' + + ' left join WorkOrderMilestoneTypes t on m.workOrderMilestoneTypeId = t.workOrderMilestoneTypeId' + + ' left join WorkOrders w on m.workOrderId = w.workOrderId' + + ' left join WorkOrderTypes wt on w.workOrderTypeId = wt.workOrderTypeId' + sqlWhereClause + orderByClause; - const workOrderMilestones = database.prepare(sql).all(sqlParameters); + const workOrderMilestones = database + .prepare(sql) + .all(sqlParameters); if (options.includeWorkOrders) { for (const workOrderMilestone of workOrderMilestones) { workOrderMilestone.workOrderLots = getLots({ diff --git a/helpers/lotOccupancyDB/getWorkOrderMilestones.ts b/helpers/lotOccupancyDB/getWorkOrderMilestones.ts index 47055ace..d9277e8d 100644 --- a/helpers/lotOccupancyDB/getWorkOrderMilestones.ts +++ b/helpers/lotOccupancyDB/getWorkOrderMilestones.ts @@ -1,199 +1,218 @@ -import sqlite from "better-sqlite3"; +import sqlite from 'better-sqlite3' -import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { lotOccupancyDB as databasePath } from '../../data/databasePaths.js' import { - dateIntegerToString, - dateStringToInteger, - dateToInteger, - timeIntegerToString -} from "@cityssm/expressjs-server-js/dateTimeFns.js"; + dateIntegerToString, + dateStringToInteger, + dateToInteger, + timeIntegerToString +} from '@cityssm/expressjs-server-js/dateTimeFns.js' -import * as configFunctions from "../functions.config.js"; +import * as configFunctions from '../functions.config.js' -import { getLots } from "./getLots.js"; -import { getLotOccupancies } from "./getLotOccupancies.js"; +import { getLots } from './getLots.js' +import { getLotOccupancies } from './getLotOccupancies.js' -import type * as recordTypes from "../../types/recordTypes"; +import type * as recordTypes from '../../types/recordTypes' export interface WorkOrderMilestoneFilters { - workOrderId?: number | string; - workOrderMilestoneDateFilter?: "upcomingMissed" | "recent" | "date"; - workOrderMilestoneDateString?: string; - workOrderTypeIds?: string; - workOrderMilestoneTypeIds?: string; + workOrderId?: number | string + workOrderMilestoneDateFilter?: 'upcomingMissed' | 'recent' | 'date' + workOrderMilestoneDateString?: string + workOrderTypeIds?: string + workOrderMilestoneTypeIds?: string } interface WorkOrderMilestoneOptions { - includeWorkOrders?: boolean; - orderBy: "completion" | "date"; + includeWorkOrders?: boolean + orderBy: 'completion' | 'date' } -const commaSeparatedNumbersRegex = /^\d+(,\d+)*$/; +const commaSeparatedNumbersRegex = /^\d+(,\d+)*$/ function buildWhereClause(filters: WorkOrderMilestoneFilters): { - sqlWhereClause: string; - sqlParameters: unknown[]; + sqlWhereClause: string + sqlParameters: unknown[] } { - let sqlWhereClause = " where m.recordDelete_timeMillis is null and w.recordDelete_timeMillis is null"; - const sqlParameters: unknown[] = []; + let sqlWhereClause = + ' where m.recordDelete_timeMillis is null and w.recordDelete_timeMillis is null' + const sqlParameters: unknown[] = [] - if (filters.workOrderId) { - sqlWhereClause += " and m.workOrderId = ?"; - sqlParameters.push(filters.workOrderId); + if (filters.workOrderId) { + sqlWhereClause += ' and m.workOrderId = ?' + sqlParameters.push(filters.workOrderId) + } + + const date = new Date() + const currentDateNumber = dateToInteger(date) + + date.setDate( + date.getDate() - + configFunctions.getProperty( + 'settings.workOrders.workOrderMilestoneDateRecentBeforeDays' + ) + ) + + const recentBeforeDateNumber = dateToInteger(date) + + date.setDate( + date.getDate() + + configFunctions.getProperty( + 'settings.workOrders.workOrderMilestoneDateRecentBeforeDays' + ) + + configFunctions.getProperty( + 'settings.workOrders.workOrderMilestoneDateRecentAfterDays' + ) + ) + + const recentAfterDateNumber = dateToInteger(date) + + switch (filters.workOrderMilestoneDateFilter) { + case 'upcomingMissed': { + sqlWhereClause += + ' and (m.workOrderMilestoneCompletionDate is null or m.workOrderMilestoneDate >= ?)' + sqlParameters.push(currentDateNumber) + break } - const date = new Date(); - const currentDateNumber = dateToInteger(date); - - date.setDate( - date.getDate() - - configFunctions.getProperty("settings.workOrders.workOrderMilestoneDateRecentBeforeDays") - ); - - const recentBeforeDateNumber = dateToInteger(date); - - date.setDate( - date.getDate() + - configFunctions.getProperty("settings.workOrders.workOrderMilestoneDateRecentBeforeDays") + - configFunctions.getProperty("settings.workOrders.workOrderMilestoneDateRecentAfterDays") - ); - - const recentAfterDateNumber = dateToInteger(date); - - switch (filters.workOrderMilestoneDateFilter) { - case "upcomingMissed": { - sqlWhereClause += - " and (m.workOrderMilestoneCompletionDate is null or m.workOrderMilestoneDate >= ?)"; - sqlParameters.push(currentDateNumber); - break; - } - - case "recent": { - sqlWhereClause += " and m.workOrderMilestoneDate >= ? and m.workOrderMilestoneDate <= ?"; - sqlParameters.push(recentBeforeDateNumber, recentAfterDateNumber); - break; - } + case 'recent': { + sqlWhereClause += + ' and m.workOrderMilestoneDate >= ? and m.workOrderMilestoneDate <= ?' + sqlParameters.push(recentBeforeDateNumber, recentAfterDateNumber) + break } + } - if (filters.workOrderMilestoneDateString) { - sqlWhereClause += " and m.workOrderMilestoneDate = ?"; - sqlParameters.push(dateStringToInteger(filters.workOrderMilestoneDateString)); - } + if (filters.workOrderMilestoneDateString) { + sqlWhereClause += ' and m.workOrderMilestoneDate = ?' + sqlParameters.push( + dateStringToInteger(filters.workOrderMilestoneDateString) + ) + } - if (filters.workOrderTypeIds && commaSeparatedNumbersRegex.test(filters.workOrderTypeIds)) { - sqlWhereClause += " and w.workOrderTypeId in (" + filters.workOrderTypeIds + ")"; - } + if ( + filters.workOrderTypeIds && + commaSeparatedNumbersRegex.test(filters.workOrderTypeIds) + ) { + sqlWhereClause += + ' and w.workOrderTypeId in (' + filters.workOrderTypeIds + ')' + } - if ( - filters.workOrderMilestoneTypeIds && - commaSeparatedNumbersRegex.test(filters.workOrderMilestoneTypeIds) - ) { - sqlWhereClause += " and m.workOrderMilestoneTypeId in (" + filters.workOrderMilestoneTypeIds + ")"; - } + if ( + filters.workOrderMilestoneTypeIds && + commaSeparatedNumbersRegex.test(filters.workOrderMilestoneTypeIds) + ) { + sqlWhereClause += + ' and m.workOrderMilestoneTypeId in (' + + filters.workOrderMilestoneTypeIds + + ')' + } - return { - sqlWhereClause, - sqlParameters - }; + return { + sqlWhereClause, + sqlParameters + } } export function getWorkOrderMilestones( - filters: WorkOrderMilestoneFilters, - options: WorkOrderMilestoneOptions, - connectedDatabase?: sqlite.Database + filters: WorkOrderMilestoneFilters, + options: WorkOrderMilestoneOptions, + connectedDatabase?: sqlite.Database ): recordTypes.WorkOrderMilestone[] { - const database = - connectedDatabase || - sqlite(databasePath, { - readonly: true - }); + const database = + connectedDatabase ?? + sqlite(databasePath, { + readonly: true + }) - database.function("userFn_dateIntegerToString", dateIntegerToString); - database.function("userFn_timeIntegerToString", timeIntegerToString); + database.function('userFn_dateIntegerToString', dateIntegerToString) + database.function('userFn_timeIntegerToString', timeIntegerToString) - // Filters - const { sqlWhereClause, sqlParameters } = buildWhereClause(filters); + // Filters + const { sqlWhereClause, sqlParameters } = buildWhereClause(filters) - // Order By - let orderByClause = ""; + // Order By + let orderByClause = '' - switch (options.orderBy) { - case "completion": { - orderByClause = - " order by" + - " m.workOrderMilestoneCompletionDate, m.workOrderMilestoneCompletionTime," + - " m.workOrderMilestoneDate, case when m.workOrderMilestoneTime = 0 then 9999 else m.workOrderMilestoneTime end," + - " t.orderNumber, m.workOrderMilestoneId"; - break; - } - - case "date": { - orderByClause = - " order by m.workOrderMilestoneDate, case when m.workOrderMilestoneTime = 0 then 9999 else m.workOrderMilestoneTime end," + - " t.orderNumber, m.workOrderId, m.workOrderMilestoneId"; - break; - } + switch (options.orderBy) { + case 'completion': { + orderByClause = + ' order by' + + ' m.workOrderMilestoneCompletionDate, m.workOrderMilestoneCompletionTime,' + + ' m.workOrderMilestoneDate, case when m.workOrderMilestoneTime = 0 then 9999 else m.workOrderMilestoneTime end,' + + ' t.orderNumber, m.workOrderMilestoneId' + break } - // Query - const sql = - "select m.workOrderMilestoneId," + - " m.workOrderMilestoneTypeId, t.workOrderMilestoneType," + - " m.workOrderMilestoneDate, userFn_dateIntegerToString(m.workOrderMilestoneDate) as workOrderMilestoneDateString," + - " m.workOrderMilestoneTime, userFn_timeIntegerToString(m.workOrderMilestoneTime) as workOrderMilestoneTimeString," + - " m.workOrderMilestoneDescription," + - " m.workOrderMilestoneCompletionDate, userFn_dateIntegerToString(m.workOrderMilestoneCompletionDate) as workOrderMilestoneCompletionDateString," + - " m.workOrderMilestoneCompletionTime, userFn_timeIntegerToString(m.workOrderMilestoneCompletionTime) as workOrderMilestoneCompletionTimeString," + - (options.includeWorkOrders - ? " m.workOrderId, w.workOrderNumber, wt.workOrderType, w.workOrderDescription," + - " w.workOrderOpenDate, userFn_dateIntegerToString(w.workOrderOpenDate) as workOrderOpenDateString," + - " w.workOrderCloseDate, userFn_dateIntegerToString(w.workOrderCloseDate) as workOrderCloseDateString," + - " w.recordUpdate_timeMillis as workOrderRecordUpdate_timeMillis," - : "") + - " m.recordCreate_userName, m.recordCreate_timeMillis," + - " m.recordUpdate_userName, m.recordUpdate_timeMillis" + - " from WorkOrderMilestones m" + - " left join WorkOrderMilestoneTypes t on m.workOrderMilestoneTypeId = t.workOrderMilestoneTypeId" + - " left join WorkOrders w on m.workOrderId = w.workOrderId" + - " left join WorkOrderTypes wt on w.workOrderTypeId = wt.workOrderTypeId" + - sqlWhereClause + - orderByClause; - - const workOrderMilestones: recordTypes.WorkOrderMilestone[] = database.prepare(sql).all(sqlParameters); - - if (options.includeWorkOrders) { - for (const workOrderMilestone of workOrderMilestones) { - workOrderMilestone.workOrderLots = getLots( - { - workOrderId: workOrderMilestone.workOrderId - }, - { - limit: -1, - offset: 0 - }, - database - ).lots; - - workOrderMilestone.workOrderLotOccupancies = getLotOccupancies( - { - workOrderId: workOrderMilestone.workOrderId - }, - { - limit: -1, - offset: 0, - includeOccupants: true - }, - database - ).lotOccupancies; - } + case 'date': { + orderByClause = + ' order by m.workOrderMilestoneDate, case when m.workOrderMilestoneTime = 0 then 9999 else m.workOrderMilestoneTime end,' + + ' t.orderNumber, m.workOrderId, m.workOrderMilestoneId' + break } + } - if (!connectedDatabase) { - database.close(); + // Query + const sql = + 'select m.workOrderMilestoneId,' + + ' m.workOrderMilestoneTypeId, t.workOrderMilestoneType,' + + ' m.workOrderMilestoneDate, userFn_dateIntegerToString(m.workOrderMilestoneDate) as workOrderMilestoneDateString,' + + ' m.workOrderMilestoneTime, userFn_timeIntegerToString(m.workOrderMilestoneTime) as workOrderMilestoneTimeString,' + + ' m.workOrderMilestoneDescription,' + + ' m.workOrderMilestoneCompletionDate, userFn_dateIntegerToString(m.workOrderMilestoneCompletionDate) as workOrderMilestoneCompletionDateString,' + + ' m.workOrderMilestoneCompletionTime, userFn_timeIntegerToString(m.workOrderMilestoneCompletionTime) as workOrderMilestoneCompletionTimeString,' + + (options.includeWorkOrders + ? ' m.workOrderId, w.workOrderNumber, wt.workOrderType, w.workOrderDescription,' + + ' w.workOrderOpenDate, userFn_dateIntegerToString(w.workOrderOpenDate) as workOrderOpenDateString,' + + ' w.workOrderCloseDate, userFn_dateIntegerToString(w.workOrderCloseDate) as workOrderCloseDateString,' + + ' w.recordUpdate_timeMillis as workOrderRecordUpdate_timeMillis,' + : '') + + ' m.recordCreate_userName, m.recordCreate_timeMillis,' + + ' m.recordUpdate_userName, m.recordUpdate_timeMillis' + + ' from WorkOrderMilestones m' + + ' left join WorkOrderMilestoneTypes t on m.workOrderMilestoneTypeId = t.workOrderMilestoneTypeId' + + ' left join WorkOrders w on m.workOrderId = w.workOrderId' + + ' left join WorkOrderTypes wt on w.workOrderTypeId = wt.workOrderTypeId' + + sqlWhereClause + + orderByClause + + const workOrderMilestones: recordTypes.WorkOrderMilestone[] = database + .prepare(sql) + .all(sqlParameters) + + if (options.includeWorkOrders) { + for (const workOrderMilestone of workOrderMilestones) { + workOrderMilestone.workOrderLots = getLots( + { + workOrderId: workOrderMilestone.workOrderId + }, + { + limit: -1, + offset: 0 + }, + database + ).lots + + workOrderMilestone.workOrderLotOccupancies = getLotOccupancies( + { + workOrderId: workOrderMilestone.workOrderId + }, + { + limit: -1, + offset: 0, + includeOccupants: true + }, + database + ).lotOccupancies } + } - return workOrderMilestones; + if (!connectedDatabase) { + database.close() + } + + return workOrderMilestones } -export default getWorkOrderMilestones; +export default getWorkOrderMilestones diff --git a/helpers/lotOccupancyDB/getWorkOrders.d.ts b/helpers/lotOccupancyDB/getWorkOrders.d.ts index d34da4be..9ca7a5a6 100644 --- a/helpers/lotOccupancyDB/getWorkOrders.d.ts +++ b/helpers/lotOccupancyDB/getWorkOrders.d.ts @@ -1,8 +1,8 @@ -import sqlite from "better-sqlite3"; -import type * as recordTypes from "../../types/recordTypes"; +import sqlite from 'better-sqlite3'; +import type * as recordTypes from '../../types/recordTypes'; interface GetWorkOrdersFilters { workOrderTypeId?: number | string; - workOrderOpenStatus?: "" | "open" | "closed"; + workOrderOpenStatus?: '' | 'open' | 'closed'; workOrderOpenDateString?: string; occupantName?: string; lotName?: string; diff --git a/helpers/lotOccupancyDB/getWorkOrders.js b/helpers/lotOccupancyDB/getWorkOrders.js index 2dfe4780..b655ba5a 100644 --- a/helpers/lotOccupancyDB/getWorkOrders.js +++ b/helpers/lotOccupancyDB/getWorkOrders.js @@ -1,54 +1,54 @@ -import sqlite from "better-sqlite3"; -import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; -import { dateIntegerToString, dateStringToInteger } from "@cityssm/expressjs-server-js/dateTimeFns.js"; -import { getWorkOrderComments } from "./getWorkOrderComments.js"; -import { getLots } from "./getLots.js"; -import { getLotOccupancies } from "./getLotOccupancies.js"; -import { getWorkOrderMilestones } from "./getWorkOrderMilestones.js"; -import { getLotNameWhereClause, getOccupantNameWhereClause } from "../functions.sqlFilters.js"; +import sqlite from 'better-sqlite3'; +import { lotOccupancyDB as databasePath } from '../../data/databasePaths.js'; +import { dateIntegerToString, dateStringToInteger } from '@cityssm/expressjs-server-js/dateTimeFns.js'; +import { getWorkOrderComments } from './getWorkOrderComments.js'; +import { getLots } from './getLots.js'; +import { getLotOccupancies } from './getLotOccupancies.js'; +import { getWorkOrderMilestones } from './getWorkOrderMilestones.js'; +import { getLotNameWhereClause, getOccupantNameWhereClause } from '../functions.sqlFilters.js'; function buildWhereClause(filters) { - let sqlWhereClause = " where w.recordDelete_timeMillis is null"; + let sqlWhereClause = ' where w.recordDelete_timeMillis is null'; const sqlParameters = []; if (filters.workOrderTypeId) { - sqlWhereClause += " and w.workOrderTypeId = ?"; + sqlWhereClause += ' and w.workOrderTypeId = ?'; sqlParameters.push(filters.workOrderTypeId); } if (filters.workOrderOpenStatus) { - if (filters.workOrderOpenStatus === "open") { - sqlWhereClause += " and w.workOrderCloseDate is null"; + if (filters.workOrderOpenStatus === 'open') { + sqlWhereClause += ' and w.workOrderCloseDate is null'; } - else if (filters.workOrderOpenStatus === "closed") { - sqlWhereClause += " and w.workOrderCloseDate is not null"; + else if (filters.workOrderOpenStatus === 'closed') { + sqlWhereClause += ' and w.workOrderCloseDate is not null'; } } if (filters.workOrderOpenDateString) { - sqlWhereClause += " and w.workOrderOpenDate = ?"; + sqlWhereClause += ' and w.workOrderOpenDate = ?'; sqlParameters.push(dateStringToInteger(filters.workOrderOpenDateString)); } - const occupantNameFilters = getOccupantNameWhereClause(filters.occupantName, "o"); + const occupantNameFilters = getOccupantNameWhereClause(filters.occupantName, 'o'); if (occupantNameFilters.sqlParameters.length > 0) { sqlWhereClause += - " and w.workOrderId in (" + - "select workOrderId from WorkOrderLotOccupancies o" + - " where recordDelete_timeMillis is null" + - " and o.lotOccupancyId in (select lotOccupancyId from LotOccupancyOccupants o where recordDelete_timeMillis is null" + + ' and w.workOrderId in (' + + 'select workOrderId from WorkOrderLotOccupancies o' + + ' where recordDelete_timeMillis is null' + + ' and o.lotOccupancyId in (select lotOccupancyId from LotOccupancyOccupants o where recordDelete_timeMillis is null' + occupantNameFilters.sqlWhereClause + - ")" + - ")"; + ')' + + ')'; sqlParameters.push(...occupantNameFilters.sqlParameters); } - const lotNameFilters = getLotNameWhereClause(filters.lotName, "", "l"); + const lotNameFilters = getLotNameWhereClause(filters.lotName, '', 'l'); if (lotNameFilters.sqlParameters.length > 0) { sqlWhereClause += - " and w.workOrderId in (" + - "select workOrderId from WorkOrderLots where recordDelete_timeMillis is null and lotId in (select lotId from Lots l where recordDelete_timeMillis is null" + + ' and w.workOrderId in (' + + 'select workOrderId from WorkOrderLots where recordDelete_timeMillis is null and lotId in (select lotId from Lots l where recordDelete_timeMillis is null' + lotNameFilters.sqlWhereClause + - "))"; + '))'; sqlParameters.push(...lotNameFilters.sqlParameters); } if (filters.lotOccupancyId) { sqlWhereClause += - " and w.workOrderId in (select workOrderId from WorkOrderLotOccupancies where recordDelete_timeMillis is null and lotOccupancyId = ?)"; + ' and w.workOrderId in (select workOrderId from WorkOrderLotOccupancies where recordDelete_timeMillis is null and lotOccupancyId = ?)'; sqlParameters.push(filters.lotOccupancyId); } return { @@ -57,40 +57,44 @@ function buildWhereClause(filters) { }; } export function getWorkOrders(filters, options, connectedDatabase) { - const database = connectedDatabase || + const database = connectedDatabase ?? sqlite(databasePath, { readonly: true }); - database.function("userFn_dateIntegerToString", dateIntegerToString); + database.function('userFn_dateIntegerToString', dateIntegerToString); const { sqlWhereClause, sqlParameters } = buildWhereClause(filters); const count = database - .prepare("select count(*) as recordCount from WorkOrders w" + sqlWhereClause) + .prepare('select count(*) as recordCount from WorkOrders w' + sqlWhereClause) .get(sqlParameters).recordCount; let workOrders = []; if (count > 0) { workOrders = database - .prepare("select w.workOrderId," + - " w.workOrderTypeId, t.workOrderType," + - " w.workOrderNumber, w.workOrderDescription," + - " w.workOrderOpenDate, userFn_dateIntegerToString(w.workOrderOpenDate) as workOrderOpenDateString," + - " w.workOrderCloseDate, userFn_dateIntegerToString(w.workOrderCloseDate) as workOrderCloseDateString," + - " ifnull(m.workOrderMilestoneCount, 0) as workOrderMilestoneCount," + - " ifnull(m.workOrderMilestoneCompletionCount, 0) as workOrderMilestoneCompletionCount" + - " from WorkOrders w" + - " left join WorkOrderTypes t on w.workOrderTypeId = t.workOrderTypeId" + - (" left join (select workOrderId," + - " count(workOrderMilestoneId) as workOrderMilestoneCount," + - " sum(case when workOrderMilestoneCompletionDate is null then 0 else 1 end) as workOrderMilestoneCompletionCount" + - " from WorkOrderMilestones" + - " where recordDelete_timeMillis is null" + - " group by workOrderId) m on w.workOrderId = m.workOrderId") + + .prepare('select w.workOrderId,' + + ' w.workOrderTypeId, t.workOrderType,' + + ' w.workOrderNumber, w.workOrderDescription,' + + ' w.workOrderOpenDate, userFn_dateIntegerToString(w.workOrderOpenDate) as workOrderOpenDateString,' + + ' w.workOrderCloseDate, userFn_dateIntegerToString(w.workOrderCloseDate) as workOrderCloseDateString,' + + ' ifnull(m.workOrderMilestoneCount, 0) as workOrderMilestoneCount,' + + ' ifnull(m.workOrderMilestoneCompletionCount, 0) as workOrderMilestoneCompletionCount' + + ' from WorkOrders w' + + ' left join WorkOrderTypes t on w.workOrderTypeId = t.workOrderTypeId' + + (' left join (select workOrderId,' + + ' count(workOrderMilestoneId) as workOrderMilestoneCount,' + + ' sum(case when workOrderMilestoneCompletionDate is null then 0 else 1 end) as workOrderMilestoneCompletionCount' + + ' from WorkOrderMilestones' + + ' where recordDelete_timeMillis is null' + + ' group by workOrderId) m on w.workOrderId = m.workOrderId') + sqlWhereClause + - " order by w.workOrderOpenDate desc, w.workOrderNumber desc" + - (options ? " limit " + options.limit + " offset " + options.offset : "")) + ' order by w.workOrderOpenDate desc, w.workOrderNumber desc' + + (options + ? ` limit ${options.limit} offset ${options.offset}` + : '')) .all(sqlParameters); } if (options && - (options.includeComments || options.includeLotsAndLotOccupancies || options.includeMilestones)) { + (options.includeComments || + options.includeLotsAndLotOccupancies || + options.includeMilestones)) { for (const workOrder of workOrders) { if (options.includeComments) { workOrder.workOrderComments = getWorkOrderComments(workOrder.workOrderId, database); @@ -114,7 +118,7 @@ export function getWorkOrders(filters, options, connectedDatabase) { workOrder.workOrderMilestones = getWorkOrderMilestones({ workOrderId: workOrder.workOrderId }, { - orderBy: "date" + orderBy: 'date' }, database); } } diff --git a/helpers/lotOccupancyDB/getWorkOrders.ts b/helpers/lotOccupancyDB/getWorkOrders.ts index 43464179..1132d86a 100644 --- a/helpers/lotOccupancyDB/getWorkOrders.ts +++ b/helpers/lotOccupancyDB/getWorkOrders.ts @@ -1,92 +1,102 @@ -import sqlite from "better-sqlite3"; +/* eslint-disable @typescript-eslint/indent */ +import sqlite from 'better-sqlite3' -import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { lotOccupancyDB as databasePath } from '../../data/databasePaths.js' -import { dateIntegerToString, dateStringToInteger } from "@cityssm/expressjs-server-js/dateTimeFns.js"; +import { + dateIntegerToString, + dateStringToInteger +} from '@cityssm/expressjs-server-js/dateTimeFns.js' -import { getWorkOrderComments } from "./getWorkOrderComments.js"; -import { getLots } from "./getLots.js"; -import { getLotOccupancies } from "./getLotOccupancies.js"; -import { getWorkOrderMilestones } from "./getWorkOrderMilestones.js"; +import { getWorkOrderComments } from './getWorkOrderComments.js' +import { getLots } from './getLots.js' +import { getLotOccupancies } from './getLotOccupancies.js' +import { getWorkOrderMilestones } from './getWorkOrderMilestones.js' -import type * as recordTypes from "../../types/recordTypes"; -import { getLotNameWhereClause, getOccupantNameWhereClause } from "../functions.sqlFilters.js"; +import type * as recordTypes from '../../types/recordTypes' +import { + getLotNameWhereClause, + getOccupantNameWhereClause +} from '../functions.sqlFilters.js' interface GetWorkOrdersFilters { - workOrderTypeId?: number | string; - workOrderOpenStatus?: "" | "open" | "closed"; - workOrderOpenDateString?: string; - occupantName?: string; - lotName?: string; - lotOccupancyId?: number | string; + workOrderTypeId?: number | string + workOrderOpenStatus?: '' | 'open' | 'closed' + workOrderOpenDateString?: string + occupantName?: string + lotName?: string + lotOccupancyId?: number | string } interface GetWorkOrdersOptions { - limit: number; - offset: number; - includeLotsAndLotOccupancies?: boolean; - includeComments?: boolean; - includeMilestones?: boolean; + limit: number + offset: number + includeLotsAndLotOccupancies?: boolean + includeComments?: boolean + includeMilestones?: boolean } function buildWhereClause(filters: GetWorkOrdersFilters): { - sqlWhereClause: string; - sqlParameters: unknown[]; + sqlWhereClause: string + sqlParameters: unknown[] } { - let sqlWhereClause = " where w.recordDelete_timeMillis is null"; - const sqlParameters: unknown[] = []; + let sqlWhereClause = ' where w.recordDelete_timeMillis is null' + const sqlParameters: unknown[] = [] if (filters.workOrderTypeId) { - sqlWhereClause += " and w.workOrderTypeId = ?"; - sqlParameters.push(filters.workOrderTypeId); + sqlWhereClause += ' and w.workOrderTypeId = ?' + sqlParameters.push(filters.workOrderTypeId) } if (filters.workOrderOpenStatus) { - if (filters.workOrderOpenStatus === "open") { - sqlWhereClause += " and w.workOrderCloseDate is null"; - } else if (filters.workOrderOpenStatus === "closed") { - sqlWhereClause += " and w.workOrderCloseDate is not null"; + if (filters.workOrderOpenStatus === 'open') { + sqlWhereClause += ' and w.workOrderCloseDate is null' + } else if (filters.workOrderOpenStatus === 'closed') { + sqlWhereClause += ' and w.workOrderCloseDate is not null' } } if (filters.workOrderOpenDateString) { - sqlWhereClause += " and w.workOrderOpenDate = ?"; - sqlParameters.push(dateStringToInteger(filters.workOrderOpenDateString)); + sqlWhereClause += ' and w.workOrderOpenDate = ?' + sqlParameters.push(dateStringToInteger(filters.workOrderOpenDateString)) } - const occupantNameFilters = getOccupantNameWhereClause(filters.occupantName, "o"); + const occupantNameFilters = getOccupantNameWhereClause( + filters.occupantName, + 'o' + ) if (occupantNameFilters.sqlParameters.length > 0) { sqlWhereClause += - " and w.workOrderId in (" + - "select workOrderId from WorkOrderLotOccupancies o" + - " where recordDelete_timeMillis is null" + - " and o.lotOccupancyId in (select lotOccupancyId from LotOccupancyOccupants o where recordDelete_timeMillis is null" + + ' and w.workOrderId in (' + + 'select workOrderId from WorkOrderLotOccupancies o' + + ' where recordDelete_timeMillis is null' + + ' and o.lotOccupancyId in (select lotOccupancyId from LotOccupancyOccupants o where recordDelete_timeMillis is null' + occupantNameFilters.sqlWhereClause + - ")" + - ")"; - sqlParameters.push(...occupantNameFilters.sqlParameters); + ')' + + ')' + sqlParameters.push(...occupantNameFilters.sqlParameters) } - const lotNameFilters = getLotNameWhereClause(filters.lotName, "", "l"); + const lotNameFilters = getLotNameWhereClause(filters.lotName, '', 'l') if (lotNameFilters.sqlParameters.length > 0) { sqlWhereClause += - " and w.workOrderId in (" + - "select workOrderId from WorkOrderLots where recordDelete_timeMillis is null and lotId in (select lotId from Lots l where recordDelete_timeMillis is null" + + ' and w.workOrderId in (' + + 'select workOrderId from WorkOrderLots where recordDelete_timeMillis is null and lotId in (select lotId from Lots l where recordDelete_timeMillis is null' + lotNameFilters.sqlWhereClause + - "))"; - sqlParameters.push(...lotNameFilters.sqlParameters); + '))' + sqlParameters.push(...lotNameFilters.sqlParameters) } if (filters.lotOccupancyId) { sqlWhereClause += - " and w.workOrderId in (select workOrderId from WorkOrderLotOccupancies where recordDelete_timeMillis is null and lotOccupancyId = ?)"; - sqlParameters.push(filters.lotOccupancyId); + ' and w.workOrderId in (select workOrderId from WorkOrderLotOccupancies where recordDelete_timeMillis is null and lotOccupancyId = ?)' + sqlParameters.push(filters.lotOccupancyId) } return { sqlWhereClause, sqlParameters - }; + } } export function getWorkOrders( @@ -94,57 +104,66 @@ export function getWorkOrders( options?: GetWorkOrdersOptions, connectedDatabase?: sqlite.Database ): { - count: number; - workOrders: recordTypes.WorkOrder[]; + count: number + workOrders: recordTypes.WorkOrder[] } { const database = - connectedDatabase || + connectedDatabase ?? sqlite(databasePath, { readonly: true - }); + }) - database.function("userFn_dateIntegerToString", dateIntegerToString); + database.function('userFn_dateIntegerToString', dateIntegerToString) - const { sqlWhereClause, sqlParameters } = buildWhereClause(filters); + const { sqlWhereClause, sqlParameters } = buildWhereClause(filters) const count: number = database - .prepare("select count(*) as recordCount from WorkOrders w" + sqlWhereClause) - .get(sqlParameters).recordCount; + .prepare( + 'select count(*) as recordCount from WorkOrders w' + sqlWhereClause + ) + .get(sqlParameters).recordCount - let workOrders: recordTypes.WorkOrder[] = []; + let workOrders: recordTypes.WorkOrder[] = [] if (count > 0) { workOrders = database .prepare( - "select w.workOrderId," + - " w.workOrderTypeId, t.workOrderType," + - " w.workOrderNumber, w.workOrderDescription," + - " w.workOrderOpenDate, userFn_dateIntegerToString(w.workOrderOpenDate) as workOrderOpenDateString," + - " w.workOrderCloseDate, userFn_dateIntegerToString(w.workOrderCloseDate) as workOrderCloseDateString," + - " ifnull(m.workOrderMilestoneCount, 0) as workOrderMilestoneCount," + - " ifnull(m.workOrderMilestoneCompletionCount, 0) as workOrderMilestoneCompletionCount" + - " from WorkOrders w" + - " left join WorkOrderTypes t on w.workOrderTypeId = t.workOrderTypeId" + - (" left join (select workOrderId," + - " count(workOrderMilestoneId) as workOrderMilestoneCount," + - " sum(case when workOrderMilestoneCompletionDate is null then 0 else 1 end) as workOrderMilestoneCompletionCount" + - " from WorkOrderMilestones" + - " where recordDelete_timeMillis is null" + - " group by workOrderId) m on w.workOrderId = m.workOrderId") + + 'select w.workOrderId,' + + ' w.workOrderTypeId, t.workOrderType,' + + ' w.workOrderNumber, w.workOrderDescription,' + + ' w.workOrderOpenDate, userFn_dateIntegerToString(w.workOrderOpenDate) as workOrderOpenDateString,' + + ' w.workOrderCloseDate, userFn_dateIntegerToString(w.workOrderCloseDate) as workOrderCloseDateString,' + + ' ifnull(m.workOrderMilestoneCount, 0) as workOrderMilestoneCount,' + + ' ifnull(m.workOrderMilestoneCompletionCount, 0) as workOrderMilestoneCompletionCount' + + ' from WorkOrders w' + + ' left join WorkOrderTypes t on w.workOrderTypeId = t.workOrderTypeId' + + (' left join (select workOrderId,' + + ' count(workOrderMilestoneId) as workOrderMilestoneCount,' + + ' sum(case when workOrderMilestoneCompletionDate is null then 0 else 1 end) as workOrderMilestoneCompletionCount' + + ' from WorkOrderMilestones' + + ' where recordDelete_timeMillis is null' + + ' group by workOrderId) m on w.workOrderId = m.workOrderId') + sqlWhereClause + - " order by w.workOrderOpenDate desc, w.workOrderNumber desc" + - (options ? " limit " + options.limit + " offset " + options.offset : "") + ' order by w.workOrderOpenDate desc, w.workOrderNumber desc' + + (options + ? ` limit ${options.limit} offset ${options.offset}` + : '') ) - .all(sqlParameters); + .all(sqlParameters) } if ( options && - (options.includeComments || options.includeLotsAndLotOccupancies || options.includeMilestones) + (options.includeComments || + options.includeLotsAndLotOccupancies || + options.includeMilestones) ) { for (const workOrder of workOrders) { if (options.includeComments) { - workOrder.workOrderComments = getWorkOrderComments(workOrder.workOrderId as number, database); + workOrder.workOrderComments = getWorkOrderComments( + workOrder.workOrderId as number, + database + ) } if (options.includeLotsAndLotOccupancies) { @@ -157,7 +176,7 @@ export function getWorkOrders( offset: 0 }, database - ).lots; + ).lots workOrder.workOrderLotOccupancies = getLotOccupancies( { @@ -169,7 +188,7 @@ export function getWorkOrders( includeOccupants: true }, database - ).lotOccupancies; + ).lotOccupancies } if (options.includeMilestones) { @@ -178,22 +197,22 @@ export function getWorkOrders( workOrderId: workOrder.workOrderId }, { - orderBy: "date" + orderBy: 'date' }, database - ); + ) } } } if (!connectedDatabase) { - database.close(); + database.close() } return { count, workOrders - }; + } } -export default getWorkOrders; +export default getWorkOrders diff --git a/helpers/lotOccupancyDB/moveLotTypeField.js b/helpers/lotOccupancyDB/moveLotTypeField.js index bbdf1bab..086c73c9 100644 --- a/helpers/lotOccupancyDB/moveLotTypeField.js +++ b/helpers/lotOccupancyDB/moveLotTypeField.js @@ -1,10 +1,10 @@ -import sqlite from "better-sqlite3"; -import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; -import { clearCacheByTableName } from "../functions.cache.js"; -import { updateRecordOrderNumber } from "./updateRecordOrderNumber.js"; +import sqlite from 'better-sqlite3'; +import { lotOccupancyDB as databasePath } from '../../data/databasePaths.js'; +import { clearCacheByTableName } from '../functions.cache.js'; +import { updateRecordOrderNumber } from './updateRecordOrderNumber.js'; function getCurrentField(lotTypeFieldId, connectedDatabase) { const currentField = connectedDatabase - .prepare("select lotTypeId, orderNumber from LotTypeFields where lotTypeFieldId = ?") + .prepare('select lotTypeId, orderNumber from LotTypeFields where lotTypeFieldId = ?') .get(lotTypeFieldId); return currentField; } @@ -13,13 +13,13 @@ export function moveLotTypeFieldDown(lotTypeFieldId) { const currentField = getCurrentField(lotTypeFieldId, database); database .prepare(`update LotTypeFields - set orderNumber = orderNumber - 1 - where recordDelete_timeMillis is null - and lotTypeId = ? and orderNumber = ? + 1`) + set orderNumber = orderNumber - 1 + where recordDelete_timeMillis is null + and lotTypeId = ? and orderNumber = ? + 1`) .run(currentField.lotTypeId, currentField.orderNumber); - const success = updateRecordOrderNumber("LotTypeFields", lotTypeFieldId, currentField.orderNumber + 1, database); + const success = updateRecordOrderNumber('LotTypeFields', lotTypeFieldId, currentField.orderNumber + 1, database); database.close(); - clearCacheByTableName("LotTypeFields"); + clearCacheByTableName('LotTypeFields'); return success; } export function moveLotTypeFieldDownToBottom(lotTypeFieldId) { @@ -27,22 +27,22 @@ export function moveLotTypeFieldDownToBottom(lotTypeFieldId) { const currentField = getCurrentField(lotTypeFieldId, database); const maxOrderNumber = database .prepare(`select max(orderNumber) as maxOrderNumber - from LotTypeFields - where recordDelete_timeMillis is null - and lotTypeId = ?`) + from LotTypeFields + where recordDelete_timeMillis is null + and lotTypeId = ?`) .get(currentField.lotTypeId).maxOrderNumber; if (currentField.orderNumber !== maxOrderNumber) { - updateRecordOrderNumber("LotTypeFields", lotTypeFieldId, maxOrderNumber + 1, database); + updateRecordOrderNumber('LotTypeFields', lotTypeFieldId, maxOrderNumber + 1, database); database .prepare(`update LotTypeFields - set orderNumber = orderNumber - 1 - where recordDelete_timeMillis is null - and lotTypeId = ? - and orderNumber > ?`) + set orderNumber = orderNumber - 1 + where recordDelete_timeMillis is null + and lotTypeId = ? + and orderNumber > ?`) .run(currentField.lotTypeId, currentField.orderNumber); } database.close(); - clearCacheByTableName("LotTypeFields"); + clearCacheByTableName('LotTypeFields'); return true; } export function moveLotTypeFieldUp(lotTypeFieldId) { @@ -54,30 +54,30 @@ export function moveLotTypeFieldUp(lotTypeFieldId) { } database .prepare(`update LotTypeFields - set orderNumber = orderNumber + 1 - where recordDelete_timeMillis is null - and lotTypeId = ? - and orderNumber = ? - 1`) + set orderNumber = orderNumber + 1 + where recordDelete_timeMillis is null + and lotTypeId = ? + and orderNumber = ? - 1`) .run(currentField.lotTypeId, currentField.orderNumber); - const success = updateRecordOrderNumber("LotTypeFields", lotTypeFieldId, currentField.orderNumber - 1, database); + const success = updateRecordOrderNumber('LotTypeFields', lotTypeFieldId, currentField.orderNumber - 1, database); database.close(); - clearCacheByTableName("LotTypeFields"); + clearCacheByTableName('LotTypeFields'); return success; } export function moveLotTypeFieldUpToTop(lotTypeFieldId) { const database = sqlite(databasePath); const currentField = getCurrentField(lotTypeFieldId, database); if (currentField.orderNumber > 0) { - updateRecordOrderNumber("LotTypeFields", lotTypeFieldId, -1, database); + updateRecordOrderNumber('LotTypeFields', lotTypeFieldId, -1, database); database .prepare(`update LotTypeFields - set orderNumber = orderNumber + 1 - where recordDelete_timeMillis is null - and lotTypeId = ? - and orderNumber < ?`) + set orderNumber = orderNumber + 1 + where recordDelete_timeMillis is null + and lotTypeId = ? + and orderNumber < ?`) .run(currentField.lotTypeId, currentField.orderNumber); } database.close(); - clearCacheByTableName("LotTypeFields"); + clearCacheByTableName('LotTypeFields'); return true; } diff --git a/helpers/lotOccupancyDB/moveLotTypeField.ts b/helpers/lotOccupancyDB/moveLotTypeField.ts index 6aa60827..aa4fdc45 100644 --- a/helpers/lotOccupancyDB/moveLotTypeField.ts +++ b/helpers/lotOccupancyDB/moveLotTypeField.ts @@ -1,140 +1,152 @@ -import sqlite from "better-sqlite3"; +import sqlite from 'better-sqlite3' -import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { lotOccupancyDB as databasePath } from '../../data/databasePaths.js' -import { clearCacheByTableName } from "../functions.cache.js"; -import { updateRecordOrderNumber } from "./updateRecordOrderNumber.js"; +import { clearCacheByTableName } from '../functions.cache.js' +import { updateRecordOrderNumber } from './updateRecordOrderNumber.js' function getCurrentField( - lotTypeFieldId: number | string, - connectedDatabase: sqlite.Database + lotTypeFieldId: number | string, + connectedDatabase: sqlite.Database ): { lotTypeId?: number; orderNumber: number } { - const currentField: { lotTypeId?: number; orderNumber: number } = connectedDatabase - .prepare("select lotTypeId, orderNumber from LotTypeFields where lotTypeFieldId = ?") - .get(lotTypeFieldId); + const currentField: { lotTypeId?: number; orderNumber: number } = + connectedDatabase + .prepare( + 'select lotTypeId, orderNumber from LotTypeFields where lotTypeFieldId = ?' + ) + .get(lotTypeFieldId) - return currentField; + return currentField } export function moveLotTypeFieldDown(lotTypeFieldId: number | string): boolean { - const database = sqlite(databasePath); + const database = sqlite(databasePath) - const currentField = getCurrentField(lotTypeFieldId, database); + const currentField = getCurrentField(lotTypeFieldId, database) + database + .prepare( + `update LotTypeFields + set orderNumber = orderNumber - 1 + where recordDelete_timeMillis is null + and lotTypeId = ? and orderNumber = ? + 1` + ) + .run(currentField.lotTypeId, currentField.orderNumber) + + const success = updateRecordOrderNumber( + 'LotTypeFields', + lotTypeFieldId, + currentField.orderNumber + 1, database - .prepare( - `update LotTypeFields - set orderNumber = orderNumber - 1 - where recordDelete_timeMillis is null - and lotTypeId = ? and orderNumber = ? + 1` - ) - .run(currentField.lotTypeId, currentField.orderNumber); + ) - const success = updateRecordOrderNumber( - "LotTypeFields", - lotTypeFieldId, - currentField.orderNumber + 1, - database - ); + database.close() - database.close(); + clearCacheByTableName('LotTypeFields') - clearCacheByTableName("LotTypeFields"); - - return success; + return success } -export function moveLotTypeFieldDownToBottom(lotTypeFieldId: number | string): boolean { - const database = sqlite(databasePath); +export function moveLotTypeFieldDownToBottom( + lotTypeFieldId: number | string +): boolean { + const database = sqlite(databasePath) - const currentField = getCurrentField(lotTypeFieldId, database); + const currentField = getCurrentField(lotTypeFieldId, database) - const maxOrderNumber: number = database - .prepare( - `select max(orderNumber) as maxOrderNumber - from LotTypeFields - where recordDelete_timeMillis is null - and lotTypeId = ?` - ) - .get(currentField.lotTypeId).maxOrderNumber; + const maxOrderNumber: number = database + .prepare( + `select max(orderNumber) as maxOrderNumber + from LotTypeFields + where recordDelete_timeMillis is null + and lotTypeId = ?` + ) + .get(currentField.lotTypeId).maxOrderNumber - if (currentField.orderNumber !== maxOrderNumber) { - updateRecordOrderNumber("LotTypeFields", lotTypeFieldId, maxOrderNumber + 1, database); + if (currentField.orderNumber !== maxOrderNumber) { + updateRecordOrderNumber( + 'LotTypeFields', + lotTypeFieldId, + maxOrderNumber + 1, + database + ) - database - .prepare( - `update LotTypeFields - set orderNumber = orderNumber - 1 - where recordDelete_timeMillis is null - and lotTypeId = ? - and orderNumber > ?` - ) - .run(currentField.lotTypeId, currentField.orderNumber); - } + database + .prepare( + `update LotTypeFields + set orderNumber = orderNumber - 1 + where recordDelete_timeMillis is null + and lotTypeId = ? + and orderNumber > ?` + ) + .run(currentField.lotTypeId, currentField.orderNumber) + } - database.close(); + database.close() - clearCacheByTableName("LotTypeFields"); + clearCacheByTableName('LotTypeFields') - return true; + return true } export function moveLotTypeFieldUp(lotTypeFieldId: number | string): boolean { - const database = sqlite(databasePath); + const database = sqlite(databasePath) - const currentField = getCurrentField(lotTypeFieldId, database); + const currentField = getCurrentField(lotTypeFieldId, database) - if (currentField.orderNumber <= 0) { - database.close(); - return true; - } + if (currentField.orderNumber <= 0) { + database.close() + return true + } + + database + .prepare( + `update LotTypeFields + set orderNumber = orderNumber + 1 + where recordDelete_timeMillis is null + and lotTypeId = ? + and orderNumber = ? - 1` + ) + .run(currentField.lotTypeId, currentField.orderNumber) + + const success = updateRecordOrderNumber( + 'LotTypeFields', + lotTypeFieldId, + currentField.orderNumber - 1, + database + ) + + database.close() + + clearCacheByTableName('LotTypeFields') + + return success +} + +export function moveLotTypeFieldUpToTop( + lotTypeFieldId: number | string +): boolean { + const database = sqlite(databasePath) + + const currentField = getCurrentField(lotTypeFieldId, database) + + if (currentField.orderNumber > 0) { + updateRecordOrderNumber('LotTypeFields', lotTypeFieldId, -1, database) database - .prepare( - `update LotTypeFields - set orderNumber = orderNumber + 1 - where recordDelete_timeMillis is null - and lotTypeId = ? - and orderNumber = ? - 1` - ) - .run(currentField.lotTypeId, currentField.orderNumber); + .prepare( + `update LotTypeFields + set orderNumber = orderNumber + 1 + where recordDelete_timeMillis is null + and lotTypeId = ? + and orderNumber < ?` + ) + .run(currentField.lotTypeId, currentField.orderNumber) + } - const success = updateRecordOrderNumber( - "LotTypeFields", - lotTypeFieldId, - currentField.orderNumber - 1, - database - ); + database.close() - database.close(); + clearCacheByTableName('LotTypeFields') - clearCacheByTableName("LotTypeFields"); - - return success; -} - -export function moveLotTypeFieldUpToTop(lotTypeFieldId: number | string): boolean { - const database = sqlite(databasePath); - - const currentField = getCurrentField(lotTypeFieldId, database); - - if (currentField.orderNumber > 0) { - updateRecordOrderNumber("LotTypeFields", lotTypeFieldId, -1, database); - - database - .prepare( - `update LotTypeFields - set orderNumber = orderNumber + 1 - where recordDelete_timeMillis is null - and lotTypeId = ? - and orderNumber < ?` - ) - .run(currentField.lotTypeId, currentField.orderNumber); - } - - database.close(); - - clearCacheByTableName("LotTypeFields"); - - return true; + return true } diff --git a/helpers/lotOccupancyDB/moveOccupancyTypePrintDown.js b/helpers/lotOccupancyDB/moveOccupancyTypePrintDown.js index af3a6b03..6c604cc4 100644 --- a/helpers/lotOccupancyDB/moveOccupancyTypePrintDown.js +++ b/helpers/lotOccupancyDB/moveOccupancyTypePrintDown.js @@ -1,29 +1,29 @@ -import sqlite from "better-sqlite3"; -import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; -import { clearCacheByTableName } from "../functions.cache.js"; +import sqlite from 'better-sqlite3'; +import { lotOccupancyDB as databasePath } from '../../data/databasePaths.js'; +import { clearCacheByTableName } from '../functions.cache.js'; export function moveOccupancyTypePrintDown(occupancyTypeId, printEJS) { const database = sqlite(databasePath); const currentOrderNumber = database - .prepare(`select orderNumber from OccupancyTypePrints where occupancyTypeId = ? and printEJS = ?`) + .prepare('select orderNumber from OccupancyTypePrints where occupancyTypeId = ? and printEJS = ?') .get(occupancyTypeId, printEJS).orderNumber; database .prepare(`update OccupancyTypePrints - set orderNumber = orderNumber - 1 - where recordDelete_timeMillis is null - and occupancyTypeId = ? - and orderNumber = ? + 1`) + set orderNumber = orderNumber - 1 + where recordDelete_timeMillis is null + and occupancyTypeId = ? + and orderNumber = ? + 1`) .run(occupancyTypeId, currentOrderNumber); const result = database - .prepare(`update OccupancyTypePrints set orderNumber = ? + 1 where occupancyTypeId = ? and printEJS = ?`) + .prepare('update OccupancyTypePrints set orderNumber = ? + 1 where occupancyTypeId = ? and printEJS = ?') .run(currentOrderNumber, occupancyTypeId, printEJS); database.close(); - clearCacheByTableName("OccupancyTypePrints"); + clearCacheByTableName('OccupancyTypePrints'); return result.changes > 0; } export function moveOccupancyTypePrintDownToBottom(occupancyTypeId, printEJS) { const database = sqlite(databasePath); const currentOrderNumber = database - .prepare(`select orderNumber from OccupancyTypePrints where occupancyTypeId = ? and printEJS = ?`) + .prepare('select orderNumber from OccupancyTypePrints where occupancyTypeId = ? and printEJS = ?') .get(occupancyTypeId, printEJS).orderNumber; const maxOrderNumber = database .prepare(`select max(orderNumber) as maxOrderNumber @@ -34,20 +34,20 @@ export function moveOccupancyTypePrintDownToBottom(occupancyTypeId, printEJS) { if (currentOrderNumber !== maxOrderNumber) { database .prepare(`update OccupancyTypePrints - set orderNumber = ? + 1 - where occupancyTypeId = ? - and printEJS = ?`) + set orderNumber = ? + 1 + where occupancyTypeId = ? + and printEJS = ?`) .run(maxOrderNumber, occupancyTypeId, printEJS); database .prepare(`update OccupancyTypeFields - set orderNumber = orderNumber - 1 - where recordDelete_timeMillis is null - and occupancyTypeId = ? - and orderNumber > ?`) + set orderNumber = orderNumber - 1 + where recordDelete_timeMillis is null + and occupancyTypeId = ? + and orderNumber > ?`) .run(occupancyTypeId, currentOrderNumber); } database.close(); - clearCacheByTableName("OccupancyTypePrints"); + clearCacheByTableName('OccupancyTypePrints'); return true; } export default moveOccupancyTypePrintDown; diff --git a/helpers/lotOccupancyDB/moveOccupancyTypePrintDown.ts b/helpers/lotOccupancyDB/moveOccupancyTypePrintDown.ts index 62245623..ec0591ea 100644 --- a/helpers/lotOccupancyDB/moveOccupancyTypePrintDown.ts +++ b/helpers/lotOccupancyDB/moveOccupancyTypePrintDown.ts @@ -1,91 +1,91 @@ -import sqlite from "better-sqlite3"; +import sqlite from 'better-sqlite3' -import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { lotOccupancyDB as databasePath } from '../../data/databasePaths.js' -import { clearCacheByTableName } from "../functions.cache.js"; +import { clearCacheByTableName } from '../functions.cache.js' export function moveOccupancyTypePrintDown( - occupancyTypeId: number | string, - printEJS: string + occupancyTypeId: number | string, + printEJS: string ): boolean { - const database = sqlite(databasePath); + const database = sqlite(databasePath) - const currentOrderNumber = database - .prepare( - `select orderNumber from OccupancyTypePrints where occupancyTypeId = ? and printEJS = ?` - ) - .get(occupancyTypeId, printEJS).orderNumber; + const currentOrderNumber = database + .prepare( + 'select orderNumber from OccupancyTypePrints where occupancyTypeId = ? and printEJS = ?' + ) + .get(occupancyTypeId, printEJS).orderNumber - database - .prepare( - `update OccupancyTypePrints - set orderNumber = orderNumber - 1 - where recordDelete_timeMillis is null - and occupancyTypeId = ? - and orderNumber = ? + 1` - ) - .run(occupancyTypeId, currentOrderNumber); + database + .prepare( + `update OccupancyTypePrints + set orderNumber = orderNumber - 1 + where recordDelete_timeMillis is null + and occupancyTypeId = ? + and orderNumber = ? + 1` + ) + .run(occupancyTypeId, currentOrderNumber) - const result = database - .prepare( - `update OccupancyTypePrints set orderNumber = ? + 1 where occupancyTypeId = ? and printEJS = ?` - ) - .run(currentOrderNumber, occupancyTypeId, printEJS); + const result = database + .prepare( + 'update OccupancyTypePrints set orderNumber = ? + 1 where occupancyTypeId = ? and printEJS = ?' + ) + .run(currentOrderNumber, occupancyTypeId, printEJS) - database.close(); + database.close() - clearCacheByTableName("OccupancyTypePrints"); + clearCacheByTableName('OccupancyTypePrints') - return result.changes > 0; + return result.changes > 0 } export function moveOccupancyTypePrintDownToBottom( - occupancyTypeId: number | string, - printEJS: string + occupancyTypeId: number | string, + printEJS: string ): boolean { - const database = sqlite(databasePath); + const database = sqlite(databasePath) - const currentOrderNumber = database - .prepare( - `select orderNumber from OccupancyTypePrints where occupancyTypeId = ? and printEJS = ?` - ) - .get(occupancyTypeId, printEJS).orderNumber; + const currentOrderNumber = database + .prepare( + 'select orderNumber from OccupancyTypePrints where occupancyTypeId = ? and printEJS = ?' + ) + .get(occupancyTypeId, printEJS).orderNumber - const maxOrderNumber: number = database - .prepare( - `select max(orderNumber) as maxOrderNumber + const maxOrderNumber: number = database + .prepare( + `select max(orderNumber) as maxOrderNumber from OccupancyTypePrints where recordDelete_timeMillis is null and occupancyTypeId = ?` - ) - .get(occupancyTypeId).maxOrderNumber; + ) + .get(occupancyTypeId).maxOrderNumber - if (currentOrderNumber !== maxOrderNumber) { - database - .prepare( - `update OccupancyTypePrints - set orderNumber = ? + 1 - where occupancyTypeId = ? - and printEJS = ?` - ) - .run(maxOrderNumber, occupancyTypeId, printEJS); + if (currentOrderNumber !== maxOrderNumber) { + database + .prepare( + `update OccupancyTypePrints + set orderNumber = ? + 1 + where occupancyTypeId = ? + and printEJS = ?` + ) + .run(maxOrderNumber, occupancyTypeId, printEJS) - database - .prepare( - `update OccupancyTypeFields - set orderNumber = orderNumber - 1 - where recordDelete_timeMillis is null - and occupancyTypeId = ? - and orderNumber > ?` - ) - .run(occupancyTypeId, currentOrderNumber); - } + database + .prepare( + `update OccupancyTypeFields + set orderNumber = orderNumber - 1 + where recordDelete_timeMillis is null + and occupancyTypeId = ? + and orderNumber > ?` + ) + .run(occupancyTypeId, currentOrderNumber) + } - database.close(); + database.close() - clearCacheByTableName("OccupancyTypePrints"); + clearCacheByTableName('OccupancyTypePrints') - return true; + return true } -export default moveOccupancyTypePrintDown; +export default moveOccupancyTypePrintDown diff --git a/helpers/lotOccupancyDB/moveOccupancyTypePrintUp.js b/helpers/lotOccupancyDB/moveOccupancyTypePrintUp.js index 81d5f4e5..0d789027 100644 --- a/helpers/lotOccupancyDB/moveOccupancyTypePrintUp.js +++ b/helpers/lotOccupancyDB/moveOccupancyTypePrintUp.js @@ -1,10 +1,10 @@ -import sqlite from "better-sqlite3"; -import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; -import { clearCacheByTableName } from "../functions.cache.js"; +import sqlite from 'better-sqlite3'; +import { lotOccupancyDB as databasePath } from '../../data/databasePaths.js'; +import { clearCacheByTableName } from '../functions.cache.js'; export function moveOccupancyTypePrintUp(occupancyTypeId, printEJS) { const database = sqlite(databasePath); const currentOrderNumber = database - .prepare(`select orderNumber from OccupancyTypePrints where occupancyTypeId = ? and printEJS = ?`) + .prepare('select orderNumber from OccupancyTypePrints where occupancyTypeId = ? and printEJS = ?') .get(occupancyTypeId, printEJS).orderNumber; if (currentOrderNumber <= 0) { database.close(); @@ -12,22 +12,22 @@ export function moveOccupancyTypePrintUp(occupancyTypeId, printEJS) { } database .prepare(`update OccupancyTypePrints - set orderNumber = orderNumber + 1 - where recordDelete_timeMillis is null - and occupancyTypeId = ? - and orderNumber = ? - 1`) + set orderNumber = orderNumber + 1 + where recordDelete_timeMillis is null + and occupancyTypeId = ? + and orderNumber = ? - 1`) .run(occupancyTypeId, currentOrderNumber); const result = database - .prepare(`update OccupancyTypePrints set orderNumber = ? - 1 where occupancyTypeId = ? and printEJS = ?`) + .prepare('update OccupancyTypePrints set orderNumber = ? - 1 where occupancyTypeId = ? and printEJS = ?') .run(currentOrderNumber, occupancyTypeId, printEJS); database.close(); - clearCacheByTableName("OccupancyTypePrints"); + clearCacheByTableName('OccupancyTypePrints'); return result.changes > 0; } export function moveOccupancyTypePrintUpToTop(occupancyTypeId, printEJS) { const database = sqlite(databasePath); const currentOrderNumber = database - .prepare(`select orderNumber from OccupancyTypePrints where occupancyTypeId = ? and printEJS = ?`) + .prepare('select orderNumber from OccupancyTypePrints where occupancyTypeId = ? and printEJS = ?') .get(occupancyTypeId, printEJS).orderNumber; if (currentOrderNumber > 0) { database @@ -45,7 +45,7 @@ export function moveOccupancyTypePrintUpToTop(occupancyTypeId, printEJS) { .run(occupancyTypeId, currentOrderNumber); } database.close(); - clearCacheByTableName("OccupancyTypePrints"); + clearCacheByTableName('OccupancyTypePrints'); return true; } export default moveOccupancyTypePrintUp; diff --git a/helpers/lotOccupancyDB/moveOccupancyTypePrintUp.ts b/helpers/lotOccupancyDB/moveOccupancyTypePrintUp.ts index 4c20b561..f2adbf75 100644 --- a/helpers/lotOccupancyDB/moveOccupancyTypePrintUp.ts +++ b/helpers/lotOccupancyDB/moveOccupancyTypePrintUp.ts @@ -1,87 +1,87 @@ -import sqlite from "better-sqlite3"; +import sqlite from 'better-sqlite3' -import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +import { lotOccupancyDB as databasePath } from '../../data/databasePaths.js' -import { clearCacheByTableName } from "../functions.cache.js"; +import { clearCacheByTableName } from '../functions.cache.js' export function moveOccupancyTypePrintUp( - occupancyTypeId: number | string, - printEJS: string + occupancyTypeId: number | string, + printEJS: string ): boolean { - const database = sqlite(databasePath); + const database = sqlite(databasePath) - const currentOrderNumber = database - .prepare( - `select orderNumber from OccupancyTypePrints where occupancyTypeId = ? and printEJS = ?` - ) - .get(occupancyTypeId, printEJS).orderNumber; + const currentOrderNumber = database + .prepare( + 'select orderNumber from OccupancyTypePrints where occupancyTypeId = ? and printEJS = ?' + ) + .get(occupancyTypeId, printEJS).orderNumber - if (currentOrderNumber <= 0) { - database.close(); - return true; - } + if (currentOrderNumber <= 0) { + database.close() + return true + } - database - .prepare( - `update OccupancyTypePrints - set orderNumber = orderNumber + 1 - where recordDelete_timeMillis is null - and occupancyTypeId = ? - and orderNumber = ? - 1` - ) - .run(occupancyTypeId, currentOrderNumber); + database + .prepare( + `update OccupancyTypePrints + set orderNumber = orderNumber + 1 + where recordDelete_timeMillis is null + and occupancyTypeId = ? + and orderNumber = ? - 1` + ) + .run(occupancyTypeId, currentOrderNumber) - const result = database - .prepare( - `update OccupancyTypePrints set orderNumber = ? - 1 where occupancyTypeId = ? and printEJS = ?` - ) - .run(currentOrderNumber, occupancyTypeId, printEJS); + const result = database + .prepare( + 'update OccupancyTypePrints set orderNumber = ? - 1 where occupancyTypeId = ? and printEJS = ?' + ) + .run(currentOrderNumber, occupancyTypeId, printEJS) - database.close(); + database.close() - clearCacheByTableName("OccupancyTypePrints"); + clearCacheByTableName('OccupancyTypePrints') - return result.changes > 0; + return result.changes > 0 } export function moveOccupancyTypePrintUpToTop( - occupancyTypeId: number | string, - printEJS: string + occupancyTypeId: number | string, + printEJS: string ): boolean { - const database = sqlite(databasePath); + const database = sqlite(databasePath) - const currentOrderNumber = database - .prepare( - `select orderNumber from OccupancyTypePrints where occupancyTypeId = ? and printEJS = ?` - ) - .get(occupancyTypeId, printEJS).orderNumber; + const currentOrderNumber = database + .prepare( + 'select orderNumber from OccupancyTypePrints where occupancyTypeId = ? and printEJS = ?' + ) + .get(occupancyTypeId, printEJS).orderNumber - if (currentOrderNumber > 0) { - database - .prepare( - `update OccupancyTypePrints + if (currentOrderNumber > 0) { + database + .prepare( + `update OccupancyTypePrints set orderNumber = -1 where occupancyTypeId = ? and printEJS = ?` - ) - .run(occupancyTypeId, printEJS); + ) + .run(occupancyTypeId, printEJS) - database - .prepare( - `update OccupancyTypePrints + database + .prepare( + `update OccupancyTypePrints set orderNumber = orderNumber + 1 where recordDelete_timeMillis is null and occupancyTypeId = ? and orderNumber < ?` - ) - .run(occupancyTypeId, currentOrderNumber); - } + ) + .run(occupancyTypeId, currentOrderNumber) + } - database.close(); + database.close() - clearCacheByTableName("OccupancyTypePrints"); + clearCacheByTableName('OccupancyTypePrints') - return true; + return true } -export default moveOccupancyTypePrintUp; +export default moveOccupancyTypePrintUp diff --git a/helpers/lotOccupancyDB/moveRecord.d.ts b/helpers/lotOccupancyDB/moveRecord.d.ts index bbddecdb..91862056 100644 --- a/helpers/lotOccupancyDB/moveRecord.d.ts +++ b/helpers/lotOccupancyDB/moveRecord.d.ts @@ -1,4 +1,4 @@ -declare type RecordTable = "FeeCategories" | "LotOccupantTypes" | "LotStatuses" | "LotTypes" | "OccupancyTypes" | "WorkOrderMilestoneTypes" | "WorkOrderTypes"; +declare type RecordTable = 'FeeCategories' | 'LotOccupantTypes' | 'LotStatuses' | 'LotTypes' | 'OccupancyTypes' | 'WorkOrderMilestoneTypes' | 'WorkOrderTypes'; export declare function moveRecordDown(recordTable: RecordTable, recordId: number): boolean; export declare function moveRecordDownToBottom(recordTable: RecordTable, recordId: number): boolean; export declare function moveRecordUp(recordTable: RecordTable, recordId: number): boolean; diff --git a/helpers/lotOccupancyDB/moveRecord.js b/helpers/lotOccupancyDB/moveRecord.js index 65d3921a..e3a810b5 100644 --- a/helpers/lotOccupancyDB/moveRecord.js +++ b/helpers/lotOccupancyDB/moveRecord.js @@ -1,15 +1,15 @@ -import sqlite from "better-sqlite3"; -import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; -import { clearCacheByTableName } from "../functions.cache.js"; -import { updateRecordOrderNumber } from "./updateRecordOrderNumber.js"; +import sqlite from 'better-sqlite3'; +import { lotOccupancyDB as databasePath } from '../../data/databasePaths.js'; +import { clearCacheByTableName } from '../functions.cache.js'; +import { updateRecordOrderNumber } from './updateRecordOrderNumber.js'; const recordIdColumns = new Map(); -recordIdColumns.set("FeeCategories", "feeCategoryId"); -recordIdColumns.set("LotOccupantTypes", "lotOccupantTypeId"); -recordIdColumns.set("LotStatuses", "lotStatusId"); -recordIdColumns.set("LotTypes", "lotTypeId"); -recordIdColumns.set("OccupancyTypes", "occupancyTypeId"); -recordIdColumns.set("WorkOrderMilestoneTypes", "workOrderMilestoneTypeId"); -recordIdColumns.set("WorkOrderTypes", "workOrderTypeId"); +recordIdColumns.set('FeeCategories', 'feeCategoryId'); +recordIdColumns.set('LotOccupantTypes', 'lotOccupantTypeId'); +recordIdColumns.set('LotStatuses', 'lotStatusId'); +recordIdColumns.set('LotTypes', 'lotTypeId'); +recordIdColumns.set('OccupancyTypes', 'occupancyTypeId'); +recordIdColumns.set('WorkOrderMilestoneTypes', 'workOrderMilestoneTypeId'); +recordIdColumns.set('WorkOrderTypes', 'workOrderTypeId'); function getCurrentOrderNumber(recordTable, recordId, database) { const currentOrderNumber = database .prepare(`select orderNumber @@ -23,9 +23,9 @@ export function moveRecordDown(recordTable, recordId) { const currentOrderNumber = getCurrentOrderNumber(recordTable, recordId, database); database .prepare(`update ${recordTable} - set orderNumber = orderNumber - 1 - where recordDelete_timeMillis is null - and orderNumber = ? + 1`) + set orderNumber = orderNumber - 1 + where recordDelete_timeMillis is null + and orderNumber = ? + 1`) .run(currentOrderNumber); const success = updateRecordOrderNumber(recordTable, recordId, currentOrderNumber + 1, database); database.close(); @@ -37,16 +37,16 @@ export function moveRecordDownToBottom(recordTable, recordId) { const currentOrderNumber = getCurrentOrderNumber(recordTable, recordId, database); const maxOrderNumber = database .prepare(`select max(orderNumber) as maxOrderNumber - from ${recordTable} - where recordDelete_timeMillis is null`) + from ${recordTable} + where recordDelete_timeMillis is null`) .get().maxOrderNumber; if (currentOrderNumber !== maxOrderNumber) { updateRecordOrderNumber(recordTable, recordId, maxOrderNumber + 1, database); database .prepare(`update ${recordTable} - set orderNumber = orderNumber - 1 - where recordDelete_timeMillis is null - and orderNumber > ?`) + set orderNumber = orderNumber - 1 + where recordDelete_timeMillis is null + and orderNumber > ?`) .run(currentOrderNumber); } database.close(); @@ -62,9 +62,9 @@ export function moveRecordUp(recordTable, recordId) { } database .prepare(`update ${recordTable} - set orderNumber = orderNumber + 1 - where recordDelete_timeMillis is null - and orderNumber = ? - 1`) + set orderNumber = orderNumber + 1 + where recordDelete_timeMillis is null + and orderNumber = ? - 1`) .run(currentOrderNumber); const success = updateRecordOrderNumber(recordTable, recordId, currentOrderNumber - 1, database); database.close(); @@ -78,9 +78,9 @@ export function moveRecordUpToTop(recordTable, recordId) { updateRecordOrderNumber(recordTable, recordId, -1, database); database .prepare(`update ${recordTable} - set orderNumber = orderNumber + 1 - where recordDelete_timeMillis is null - and orderNumber < ?`) + set orderNumber = orderNumber + 1 + where recordDelete_timeMillis is null + and orderNumber < ?`) .run(currentOrderNumber); } database.close(); diff --git a/helpers/lotOccupancyDB/moveRecord.ts b/helpers/lotOccupancyDB/moveRecord.ts index d649e575..6cbb1904 100644 --- a/helpers/lotOccupancyDB/moveRecord.ts +++ b/helpers/lotOccupancyDB/moveRecord.ts @@ -1,148 +1,186 @@ -import sqlite from "better-sqlite3"; +import sqlite from 'better-sqlite3' -import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; -import { clearCacheByTableName } from "../functions.cache.js"; -import { updateRecordOrderNumber } from "./updateRecordOrderNumber.js"; +import { lotOccupancyDB as databasePath } from '../../data/databasePaths.js' +import { clearCacheByTableName } from '../functions.cache.js' +import { updateRecordOrderNumber } from './updateRecordOrderNumber.js' type RecordTable = - | "FeeCategories" - | "LotOccupantTypes" - | "LotStatuses" - | "LotTypes" - | "OccupancyTypes" - | "WorkOrderMilestoneTypes" - | "WorkOrderTypes"; + | 'FeeCategories' + | 'LotOccupantTypes' + | 'LotStatuses' + | 'LotTypes' + | 'OccupancyTypes' + | 'WorkOrderMilestoneTypes' + | 'WorkOrderTypes' -const recordIdColumns: Map = new Map(); -recordIdColumns.set("FeeCategories", "feeCategoryId"); -recordIdColumns.set("LotOccupantTypes", "lotOccupantTypeId"); -recordIdColumns.set("LotStatuses", "lotStatusId"); -recordIdColumns.set("LotTypes", "lotTypeId"); -recordIdColumns.set("OccupancyTypes", "occupancyTypeId"); -recordIdColumns.set("WorkOrderMilestoneTypes", "workOrderMilestoneTypeId"); -recordIdColumns.set("WorkOrderTypes", "workOrderTypeId"); +const recordIdColumns: Map = new Map() +recordIdColumns.set('FeeCategories', 'feeCategoryId') +recordIdColumns.set('LotOccupantTypes', 'lotOccupantTypeId') +recordIdColumns.set('LotStatuses', 'lotStatusId') +recordIdColumns.set('LotTypes', 'lotTypeId') +recordIdColumns.set('OccupancyTypes', 'occupancyTypeId') +recordIdColumns.set('WorkOrderMilestoneTypes', 'workOrderMilestoneTypeId') +recordIdColumns.set('WorkOrderTypes', 'workOrderTypeId') function getCurrentOrderNumber( - recordTable: RecordTable, - recordId: number | string, - database: sqlite.Database + recordTable: RecordTable, + recordId: number | string, + database: sqlite.Database ): number { - const currentOrderNumber: number = database - .prepare( - `select orderNumber + const currentOrderNumber: number = database + .prepare( + `select orderNumber from ${recordTable} - where ${recordIdColumns.get(recordTable)} = ?` - ) - .get(recordId).orderNumber; + where ${recordIdColumns.get(recordTable)!} = ?` + ) + .get(recordId).orderNumber - return currentOrderNumber; + return currentOrderNumber } -export function moveRecordDown(recordTable: RecordTable, recordId: number): boolean { - const database = sqlite(databasePath); +export function moveRecordDown( + recordTable: RecordTable, + recordId: number +): boolean { + const database = sqlite(databasePath) - const currentOrderNumber = getCurrentOrderNumber(recordTable, recordId, database); + const currentOrderNumber = getCurrentOrderNumber( + recordTable, + recordId, + database + ) + + database + .prepare( + `update ${recordTable} + set orderNumber = orderNumber - 1 + where recordDelete_timeMillis is null + and orderNumber = ? + 1` + ) + .run(currentOrderNumber) + + const success = updateRecordOrderNumber( + recordTable, + recordId, + currentOrderNumber + 1, + database + ) + + database.close() + + clearCacheByTableName(recordTable) + + return success +} + +export function moveRecordDownToBottom( + recordTable: RecordTable, + recordId: number +): boolean { + const database = sqlite(databasePath) + + const currentOrderNumber = getCurrentOrderNumber( + recordTable, + recordId, + database + ) + + const maxOrderNumber: number = database + .prepare( + `select max(orderNumber) as maxOrderNumber + from ${recordTable} + where recordDelete_timeMillis is null` + ) + .get().maxOrderNumber + + if (currentOrderNumber !== maxOrderNumber) { + updateRecordOrderNumber(recordTable, recordId, maxOrderNumber + 1, database) database - .prepare( - `update ${recordTable} - set orderNumber = orderNumber - 1 - where recordDelete_timeMillis is null - and orderNumber = ? + 1` - ) - .run(currentOrderNumber); + .prepare( + `update ${recordTable} + set orderNumber = orderNumber - 1 + where recordDelete_timeMillis is null + and orderNumber > ?` + ) + .run(currentOrderNumber) + } - const success = updateRecordOrderNumber(recordTable, recordId, currentOrderNumber + 1, database); + database.close() - database.close(); + clearCacheByTableName(recordTable) - clearCacheByTableName(recordTable); - - return success; + return true } -export function moveRecordDownToBottom(recordTable: RecordTable, recordId: number): boolean { - const database = sqlite(databasePath); +export function moveRecordUp( + recordTable: RecordTable, + recordId: number +): boolean { + const database = sqlite(databasePath) - const currentOrderNumber = getCurrentOrderNumber(recordTable, recordId, database); + const currentOrderNumber = getCurrentOrderNumber( + recordTable, + recordId, + database + ) - const maxOrderNumber: number = database - .prepare( - `select max(orderNumber) as maxOrderNumber - from ${recordTable} - where recordDelete_timeMillis is null` - ) - .get().maxOrderNumber; + if (currentOrderNumber <= 0) { + database.close() + return true + } - if (currentOrderNumber !== maxOrderNumber) { - updateRecordOrderNumber(recordTable, recordId, maxOrderNumber + 1, database); + database + .prepare( + `update ${recordTable} + set orderNumber = orderNumber + 1 + where recordDelete_timeMillis is null + and orderNumber = ? - 1` + ) + .run(currentOrderNumber) - database - .prepare( - `update ${recordTable} - set orderNumber = orderNumber - 1 - where recordDelete_timeMillis is null - and orderNumber > ?` - ) - .run(currentOrderNumber); - } + const success = updateRecordOrderNumber( + recordTable, + recordId, + currentOrderNumber - 1, + database + ) - database.close(); + database.close() - clearCacheByTableName(recordTable); + clearCacheByTableName(recordTable) - return true; + return success } -export function moveRecordUp(recordTable: RecordTable, recordId: number): boolean { - const database = sqlite(databasePath); +export function moveRecordUpToTop( + recordTable: RecordTable, + recordId: number +): boolean { + const database = sqlite(databasePath) - const currentOrderNumber = getCurrentOrderNumber(recordTable, recordId, database); + const currentOrderNumber = getCurrentOrderNumber( + recordTable, + recordId, + database + ) - if (currentOrderNumber <= 0) { - database.close(); - return true; - } + if (currentOrderNumber > 0) { + updateRecordOrderNumber(recordTable, recordId, -1, database) database - .prepare( - `update ${recordTable} - set orderNumber = orderNumber + 1 - where recordDelete_timeMillis is null - and orderNumber = ? - 1` - ) - .run(currentOrderNumber); + .prepare( + `update ${recordTable} + set orderNumber = orderNumber + 1 + where recordDelete_timeMillis is null + and orderNumber < ?` + ) + .run(currentOrderNumber) + } - const success = updateRecordOrderNumber(recordTable, recordId, currentOrderNumber - 1, database); + database.close() - database.close(); + clearCacheByTableName(recordTable) - clearCacheByTableName(recordTable); - - return success; -} - -export function moveRecordUpToTop(recordTable: RecordTable, recordId: number): boolean { - const database = sqlite(databasePath); - - const currentOrderNumber = getCurrentOrderNumber(recordTable, recordId, database); - - if (currentOrderNumber > 0) { - updateRecordOrderNumber(recordTable, recordId, -1, database); - - database - .prepare( - `update ${recordTable} - set orderNumber = orderNumber + 1 - where recordDelete_timeMillis is null - and orderNumber < ?` - ) - .run(currentOrderNumber); - } - - database.close(); - - clearCacheByTableName(recordTable); - - return true; + return true }