From 2ddd02d40aee9eeb27d35269b9d3c6878ddac239 Mon Sep 17 00:00:00 2001 From: dangowans Date: Tue, 12 Jul 2022 14:21:15 -0400 Subject: [PATCH] more tables, table indexes --- app.js | 2 +- app.ts | 2 +- helpers/databaseInitializer.d.ts | 2 +- helpers/databaseInitializer.js | 134 ++++++++++++++++++++++++- helpers/databaseInitializer.ts | 163 ++++++++++++++++++++++++++++++- 5 files changed, 294 insertions(+), 9 deletions(-) diff --git a/app.js b/app.js index fd1f32be..4ce3f2bd 100644 --- a/app.js +++ b/app.js @@ -20,7 +20,7 @@ import { version } from "./version.js"; import * as databaseInitializer from "./helpers/databaseInitializer.js"; import debug from "debug"; const debugApp = debug("general-licence-manager:app"); -databaseInitializer.initLicencesDB(); +databaseInitializer.initLotOccupancyDB(); const __dirname = "."; export const app = express(); if (!configFunctions.getProperty("reverseProxy.disableEtag")) { diff --git a/app.ts b/app.ts index 0d002732..08b5c4f6 100644 --- a/app.ts +++ b/app.ts @@ -33,7 +33,7 @@ const debugApp = debug("general-licence-manager:app"); */ -databaseInitializer.initLicencesDB(); +databaseInitializer.initLotOccupancyDB(); /* diff --git a/helpers/databaseInitializer.d.ts b/helpers/databaseInitializer.d.ts index e67c7333..00f76489 100644 --- a/helpers/databaseInitializer.d.ts +++ b/helpers/databaseInitializer.d.ts @@ -1 +1 @@ -export declare const initLotsDB: () => boolean; +export declare const initLotOccupancyDB: () => boolean; diff --git a/helpers/databaseInitializer.js b/helpers/databaseInitializer.js index e1d7dec3..e7281e4c 100644 --- a/helpers/databaseInitializer.js +++ b/helpers/databaseInitializer.js @@ -8,7 +8,7 @@ const recordColumns = " recordCreate_userName varchar(30) not null," + " recordUpdate_timeMillis integer not null," + " recordDelete_userName varchar(30)," + " recordDelete_timeMillis integer"; -export const initLotsDB = () => { +export const initLotOccupancyDB = () => { const lotOccupancyDB = sqlite(databasePath); const row = lotOccupancyDB .prepare("select name from sqlite_master where type = 'table' and name = 'Lots'") @@ -23,6 +23,7 @@ export const initLotsDB = () => { " orderNumber smallint not null default 0," + recordColumns + ")").run(); + lotOccupancyDB.prepare("create index if not exists idx_contacttypes_ordernumber (orderNumber, contactType)").run(); lotOccupancyDB.prepare("create table if not exists Contacts (" + "contactId integer not null primary key autoincrement," + " contactTypeId integer not null," + @@ -45,6 +46,7 @@ export const initLotsDB = () => { " orderNumber smallint not null default 0," + recordColumns + ")").run(); + lotOccupancyDB.prepare("create index if not exists idx_lottypes_ordernumber (orderNumber, lotType)").run(); lotOccupancyDB.prepare("create table if not exists LotTypeFields (" + "lotTypeFieldId integer not null primary key autoincrement," + " lotTypeId integer not null," + @@ -58,6 +60,7 @@ export const initLotsDB = () => { recordColumns + "," + " foreign key (lotTypeId) references LotTypes (lotTypeId)" + ")").run(); + lotOccupancyDB.prepare("create index if not exists idx_lottypefields_ordernumber (lotTypeId, orderNumber, lotTypeField)").run(); lotOccupancyDB.prepare("create table if not exists LotTypeStatuses (" + "lotTypeStatusId integer not null primary key autoincrement," + " lotTypeId integer not null," + @@ -66,6 +69,7 @@ export const initLotsDB = () => { recordColumns + "," + " foreign key (lotTypeId) references LotTypes (lotTypeId)" + ")").run(); + lotOccupancyDB.prepare("create index if not exists idx_lottypestatuses_ordernumber (lotTypeId, orderNumber, lotTypeStatus)").run(); lotOccupancyDB.prepare("create table if not exists Lots (" + "lotId integer not null primary key autoincrement," + " lotTypeId integer not null," + @@ -79,15 +83,139 @@ export const initLotsDB = () => { " foreign key (lotContactId) references Contacts (contactId)," + " foreign key (lotTypeStatusId) references LotTypeStatuses (lotTypeStatusId)" + ")").run(); + lotOccupancyDB.prepare("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").run(); lotOccupancyDB.prepare("create table if not exists LotComments (" + "lotCommentId integer not null primary key autoincrement," + " lotId integer not null," + - " lotCommentDate integer not null," + - " lotCommentTime 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)" + ")").run(); + lotOccupancyDB.prepare("create index if not exists idx_lotcomments_datetime (lotId, lotCommentDate, lotCommentTime)").run(); + lotOccupancyDB.prepare("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 + + ")").run(); + lotOccupancyDB.prepare("create index if not exists idx_occupancytypes_ordernumber (orderNumber, occupancyType)").run(); + lotOccupancyDB.prepare("create table if not exists OccupancyTypeFields (" + + "occupancyTypeFieldId integer not null primary key autoincrement," + + " occupancyTypeId integer not null," + + " 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)" + + ")").run(); + lotOccupancyDB.prepare("create index if not exists idx_occupancytypefields_ordernumber (occupancyTypeId, orderNumber, occupancyTypeField)").run(); + lotOccupancyDB.prepare("create table if not exists LotOccupancies (" + + "lotOccupancyId integer not null primary key autoincrement," + + " occupancyTypeId integer not null," + + " lotId integer not null," + + " occupantContactId integer," + + " occupancyStartDate integer not null check (occupancyStartDate > 0)," + + " occupancyEndDate integer check (occupancyEndDate > 0)," + + recordColumns + "," + + " foreign key (lotId) references Lots (lotId)," + + " foreign key (occupantContactId) references Contacts (contactId)" + + ")").run(); + lotOccupancyDB.prepare("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").run(); + lotOccupancyDB.prepare("create table if not exists Fees (" + + "feeId integer not null primary key autoincrement," + + " feeName varchar(100) not null," + + " contactTypeId integer," + + " contactId integer," + + " lotTypeId integer," + + " feeAmount decimal(6, 2)," + + " feeFunction varchar(100)," + + " isRequired bit not null default 0," + + " orderNumber smallint not null default 0," + + recordColumns + + " foreign key (contactTypeId) references ContactTypes (contactTypeId)," + + " foreign key (contactId) references Contacts (contactId)," + + " foreign key (lotTypeId) references LotTypes (lotTypeId)" + + ")").run(); + lotOccupancyDB.prepare("create index if not exists idx_fees_ordernumber (orderNumber, feeName)").run(); + lotOccupancyDB.prepare("create table if not exists LotOccupancyFees (" + + "lotOccupancyId integer not null," + + " feeId integer not null," + + " feeAmount decimal(6, 2) not null," + + recordColumns + "," + + " primary key (lotOccupancyId, feeId)," + + " foreign key (lotOccupancyId) references LotOccupancies (lotOccupancyId)," + + " foreign key (feeId) references Fees (feeId)" + + ") without rowid").run(); + lotOccupancyDB.prepare("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(6, 2) not null," + + " externalReceiptNumber varchar(100)," + + " transactionNote text," + + recordColumns + "," + + " primary key (lotOccupancyId, transactionIndex)," + + " foreign key (lotOccupancyId) references LotOccupancies (lotOccupancyId)" + + ") without rowid").run(); + lotOccupancyDB.prepare("create index if not exists idx_lotoccupancytransactions_ordernumber (lotOccupancyId, transactionDate, transactionTime)").run(); + lotOccupancyDB.prepare("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 + + ")").run(); + lotOccupancyDB.prepare("create index if not exists idx_workordertypes_ordernumber (orderNumber, workOrderType)").run(); + lotOccupancyDB.prepare("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)" + + ")").run(); + lotOccupancyDB.prepare("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").run(); + lotOccupancyDB.prepare("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)" + + ")").run(); + lotOccupancyDB.prepare("create index if not exists idx_workordercomments_datetime (workOrderId, workOrderCommentDate, workOrderCommentTime)").run(); lotOccupancyDB.close(); return true; } diff --git a/helpers/databaseInitializer.ts b/helpers/databaseInitializer.ts index 93b1e2ca..fc304f5f 100644 --- a/helpers/databaseInitializer.ts +++ b/helpers/databaseInitializer.ts @@ -13,7 +13,7 @@ const recordColumns = " recordCreate_userName varchar(30) not null," + " recordDelete_userName varchar(30)," + " recordDelete_timeMillis integer"; -export const initLotsDB = (): boolean => { +export const initLotOccupancyDB = (): boolean => { const lotOccupancyDB = sqlite(databasePath); @@ -36,6 +36,8 @@ export const initLotsDB = (): boolean => { recordColumns + ")").run(); + lotOccupancyDB.prepare("create index if not exists idx_contacttypes_ordernumber (orderNumber, contactType)").run(); + lotOccupancyDB.prepare("create table if not exists Contacts (" + "contactId integer not null primary key autoincrement," + " contactTypeId integer not null," + @@ -65,6 +67,8 @@ export const initLotsDB = (): boolean => { recordColumns + ")").run(); + lotOccupancyDB.prepare("create index if not exists idx_lottypes_ordernumber (orderNumber, lotType)").run(); + lotOccupancyDB.prepare("create table if not exists LotTypeFields (" + "lotTypeFieldId integer not null primary key autoincrement," + " lotTypeId integer not null," + @@ -79,6 +83,8 @@ export const initLotsDB = (): boolean => { " foreign key (lotTypeId) references LotTypes (lotTypeId)" + ")").run(); + lotOccupancyDB.prepare("create index if not exists idx_lottypefields_ordernumber (lotTypeId, orderNumber, lotTypeField)").run(); + lotOccupancyDB.prepare("create table if not exists LotTypeStatuses (" + "lotTypeStatusId integer not null primary key autoincrement," + " lotTypeId integer not null," + @@ -88,6 +94,8 @@ export const initLotsDB = (): boolean => { " foreign key (lotTypeId) references LotTypes (lotTypeId)" + ")").run(); + lotOccupancyDB.prepare("create index if not exists idx_lottypestatuses_ordernumber (lotTypeId, orderNumber, lotTypeStatus)").run(); + // Lots lotOccupancyDB.prepare("create table if not exists Lots (" + @@ -107,16 +115,165 @@ export const initLotsDB = (): boolean => { " foreign key (lotTypeStatusId) references LotTypeStatuses (lotTypeStatusId)" + ")").run(); + lotOccupancyDB.prepare("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").run(); + lotOccupancyDB.prepare("create table if not exists LotComments (" + "lotCommentId integer not null primary key autoincrement," + " lotId integer not null," + - " lotCommentDate integer not null," + - " lotCommentTime 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)" + ")").run(); + lotOccupancyDB.prepare("create index if not exists idx_lotcomments_datetime (lotId, lotCommentDate, lotCommentTime)").run(); + + // Occupancies + + lotOccupancyDB.prepare("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 + + ")").run(); + + lotOccupancyDB.prepare("create index if not exists idx_occupancytypes_ordernumber (orderNumber, occupancyType)").run(); + + lotOccupancyDB.prepare("create table if not exists OccupancyTypeFields (" + + "occupancyTypeFieldId integer not null primary key autoincrement," + + " occupancyTypeId integer not null," + + " 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)" + + ")").run(); + + lotOccupancyDB.prepare("create index if not exists idx_occupancytypefields_ordernumber (occupancyTypeId, orderNumber, occupancyTypeField)").run(); + + lotOccupancyDB.prepare("create table if not exists LotOccupancies (" + + "lotOccupancyId integer not null primary key autoincrement," + + " occupancyTypeId integer not null," + + " lotId integer not null," + + " occupantContactId integer," + + " occupancyStartDate integer not null check (occupancyStartDate > 0)," + + " occupancyEndDate integer check (occupancyEndDate > 0)," + + recordColumns + "," + + " foreign key (lotId) references Lots (lotId)," + + " foreign key (occupantContactId) references Contacts (contactId)" + + ")").run(); + + lotOccupancyDB.prepare("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").run(); + + // Occupancy Fees and Transactions + + lotOccupancyDB.prepare("create table if not exists Fees (" + + "feeId integer not null primary key autoincrement," + + " feeName varchar(100) not null," + + " contactTypeId integer," + + " contactId integer," + + " lotTypeId integer," + + " feeAmount decimal(6, 2)," + + " feeFunction varchar(100)," + + " isRequired bit not null default 0," + + " orderNumber smallint not null default 0," + + recordColumns + + " foreign key (contactTypeId) references ContactTypes (contactTypeId)," + + " foreign key (contactId) references Contacts (contactId)," + + " foreign key (lotTypeId) references LotTypes (lotTypeId)" + + ")").run(); + + lotOccupancyDB.prepare("create index if not exists idx_fees_ordernumber (orderNumber, feeName)").run(); + + lotOccupancyDB.prepare("create table if not exists LotOccupancyFees (" + + "lotOccupancyId integer not null," + + " feeId integer not null," + + " feeAmount decimal(6, 2) not null," + + recordColumns + "," + + " primary key (lotOccupancyId, feeId)," + + " foreign key (lotOccupancyId) references LotOccupancies (lotOccupancyId)," + + " foreign key (feeId) references Fees (feeId)" + + ") without rowid").run(); + + lotOccupancyDB.prepare("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(6, 2) not null," + + " externalReceiptNumber varchar(100)," + + " transactionNote text," + + recordColumns + "," + + " primary key (lotOccupancyId, transactionIndex)," + + " foreign key (lotOccupancyId) references LotOccupancies (lotOccupancyId)" + + ") without rowid").run(); + + lotOccupancyDB.prepare("create index if not exists idx_lotoccupancytransactions_ordernumber (lotOccupancyId, transactionDate, transactionTime)").run(); + + // Work Orders + + lotOccupancyDB.prepare("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 + + ")").run(); + + lotOccupancyDB.prepare("create index if not exists idx_workordertypes_ordernumber (orderNumber, workOrderType)").run(); + + lotOccupancyDB.prepare("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)" + + ")").run(); + + lotOccupancyDB.prepare("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").run(); + + lotOccupancyDB.prepare("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)" + + ")").run(); + + lotOccupancyDB.prepare("create index if not exists idx_workordercomments_datetime (workOrderId, workOrderCommentDate, workOrderCommentTime)").run(); + lotOccupancyDB.close(); return true;