linting
parent
c937521807
commit
062892ac3f
|
|
@ -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';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<boolean> {
|
||||
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<boolean> {
|
||||
if (!userName || userName === "" || !password || password === "") {
|
||||
return false;
|
||||
}
|
||||
export async function authenticate(
|
||||
userName: string,
|
||||
password: string
|
||||
): Promise<boolean> {
|
||||
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'
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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<string, unknown>();
|
||||
const configFallbackValues = new Map<string, unknown>()
|
||||
|
||||
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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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[];
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<string[]> {
|
||||
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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<string, unknown>): Record<string, unknown>;
|
||||
export {};
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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<string, PrintConfig> = {
|
||||
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<string, PrintConfig> = {
|
||||
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<string, unknown>
|
||||
): Record<string, unknown> {
|
||||
const reportData: Record<string, unknown> = {
|
||||
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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import type { User } from "../types/recordTypes";
|
||||
import type { User } from '../types/recordTypes';
|
||||
export interface UserRequest {
|
||||
session?: {
|
||||
user?: User;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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<boolean> {
|
||||
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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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({
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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<RecordTable, string> = 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<RecordTable, string> = 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
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue