diff --git a/handlers/admin-get/tables.d.ts b/handlers/admin-get/tables.d.ts
new file mode 100644
index 00000000..9621c611
--- /dev/null
+++ b/handlers/admin-get/tables.d.ts
@@ -0,0 +1,3 @@
+import type { RequestHandler } from "express";
+export declare const handler: RequestHandler;
+export default handler;
diff --git a/handlers/admin-get/tables.js b/handlers/admin-get/tables.js
new file mode 100644
index 00000000..d96e137c
--- /dev/null
+++ b/handlers/admin-get/tables.js
@@ -0,0 +1,13 @@
+import { getLotOccupantTypes, getLotStatuses, getWorkOrderTypes } from "../../helpers/functions.cache.js";
+export const handler = (_request, response) => {
+ const workOrderTypes = getWorkOrderTypes();
+ const lotStatuses = getLotStatuses();
+ const lotOccupantTypes = getLotOccupantTypes();
+ response.render("admin-tables", {
+ headTitle: "Config Table Management",
+ workOrderTypes,
+ lotStatuses,
+ lotOccupantTypes
+ });
+};
+export default handler;
diff --git a/handlers/admin-get/tables.ts b/handlers/admin-get/tables.ts
new file mode 100644
index 00000000..9b558dde
--- /dev/null
+++ b/handlers/admin-get/tables.ts
@@ -0,0 +1,23 @@
+import type {
+ RequestHandler
+} from "express";
+
+import { getLotOccupantTypes, getLotStatuses, getWorkOrderTypes } from "../../helpers/functions.cache.js";
+
+
+export const handler: RequestHandler = (_request, response) => {
+
+ const workOrderTypes = getWorkOrderTypes();
+ const lotStatuses = getLotStatuses();
+ const lotOccupantTypes = getLotOccupantTypes();
+
+ response.render("admin-tables", {
+ headTitle: "Config Table Management",
+ workOrderTypes,
+ lotStatuses,
+ lotOccupantTypes
+ });
+};
+
+
+export default handler;
\ No newline at end of file
diff --git a/handlers/admin-post/doAddWorkOrderType.d.ts b/handlers/admin-post/doAddWorkOrderType.d.ts
new file mode 100644
index 00000000..9621c611
--- /dev/null
+++ b/handlers/admin-post/doAddWorkOrderType.d.ts
@@ -0,0 +1,3 @@
+import type { RequestHandler } from "express";
+export declare const handler: RequestHandler;
+export default handler;
diff --git a/handlers/admin-post/doAddWorkOrderType.js b/handlers/admin-post/doAddWorkOrderType.js
new file mode 100644
index 00000000..2ccfd8d8
--- /dev/null
+++ b/handlers/admin-post/doAddWorkOrderType.js
@@ -0,0 +1,12 @@
+import { addWorkOrderType } from "../../helpers/lotOccupancyDB/addWorkOrderType.js";
+import { getWorkOrderTypes } from "../../helpers/functions.cache.js";
+export const handler = async (request, response) => {
+ const workOrderTypeId = addWorkOrderType(request.body, request.session);
+ const workOrderTypes = getWorkOrderTypes();
+ response.json({
+ success: true,
+ workOrderTypeId,
+ workOrderTypes
+ });
+};
+export default handler;
diff --git a/handlers/admin-post/doAddWorkOrderType.ts b/handlers/admin-post/doAddWorkOrderType.ts
new file mode 100644
index 00000000..ebbf65d0
--- /dev/null
+++ b/handlers/admin-post/doAddWorkOrderType.ts
@@ -0,0 +1,28 @@
+import type {
+ RequestHandler
+} from "express";
+
+import {
+ addWorkOrderType
+} from "../../helpers/lotOccupancyDB/addWorkOrderType.js";
+
+import {
+ getWorkOrderTypes
+} from "../../helpers/functions.cache.js";
+
+
+export const handler: RequestHandler = async (request, response) => {
+
+ const workOrderTypeId = addWorkOrderType(request.body, request.session);
+
+ const workOrderTypes = getWorkOrderTypes();
+
+ response.json({
+ success: true,
+ workOrderTypeId,
+ workOrderTypes
+ });
+};
+
+
+export default handler;
\ No newline at end of file
diff --git a/handlers/admin-post/doDeleteWorkOrderType.d.ts b/handlers/admin-post/doDeleteWorkOrderType.d.ts
new file mode 100644
index 00000000..9621c611
--- /dev/null
+++ b/handlers/admin-post/doDeleteWorkOrderType.d.ts
@@ -0,0 +1,3 @@
+import type { RequestHandler } from "express";
+export declare const handler: RequestHandler;
+export default handler;
diff --git a/handlers/admin-post/doDeleteWorkOrderType.js b/handlers/admin-post/doDeleteWorkOrderType.js
new file mode 100644
index 00000000..ee97f65b
--- /dev/null
+++ b/handlers/admin-post/doDeleteWorkOrderType.js
@@ -0,0 +1,11 @@
+import { deleteWorkOrderType } from "../../helpers/lotOccupancyDB/deleteWorkOrderType.js";
+import { getWorkOrderTypes } from "../../helpers/functions.cache.js";
+export const handler = async (request, response) => {
+ const success = deleteWorkOrderType(request.body.workOrderTypeId, request.session);
+ const workOrderTypes = getWorkOrderTypes();
+ response.json({
+ success,
+ workOrderTypes
+ });
+};
+export default handler;
diff --git a/handlers/admin-post/doDeleteWorkOrderType.ts b/handlers/admin-post/doDeleteWorkOrderType.ts
new file mode 100644
index 00000000..ca5be76d
--- /dev/null
+++ b/handlers/admin-post/doDeleteWorkOrderType.ts
@@ -0,0 +1,27 @@
+import type {
+ RequestHandler
+} from "express";
+
+import {
+ deleteWorkOrderType
+} from "../../helpers/lotOccupancyDB/deleteWorkOrderType.js";
+
+import {
+ getWorkOrderTypes
+} from "../../helpers/functions.cache.js";
+
+
+export const handler: RequestHandler = async (request, response) => {
+
+ const success = deleteWorkOrderType(request.body.workOrderTypeId, request.session);
+
+ const workOrderTypes = getWorkOrderTypes();
+
+ response.json({
+ success,
+ workOrderTypes
+ });
+};
+
+
+export default handler;
\ No newline at end of file
diff --git a/handlers/admin-post/doMoveWorkOrderTypeDown.d.ts b/handlers/admin-post/doMoveWorkOrderTypeDown.d.ts
new file mode 100644
index 00000000..9621c611
--- /dev/null
+++ b/handlers/admin-post/doMoveWorkOrderTypeDown.d.ts
@@ -0,0 +1,3 @@
+import type { RequestHandler } from "express";
+export declare const handler: RequestHandler;
+export default handler;
diff --git a/handlers/admin-post/doMoveWorkOrderTypeDown.js b/handlers/admin-post/doMoveWorkOrderTypeDown.js
new file mode 100644
index 00000000..4aae884c
--- /dev/null
+++ b/handlers/admin-post/doMoveWorkOrderTypeDown.js
@@ -0,0 +1,11 @@
+import { moveWorkOrderTypeDown } from "../../helpers/lotOccupancyDB/moveWorkOrderTypeDown.js";
+import { getWorkOrderTypes } from "../../helpers/functions.cache.js";
+export const handler = async (request, response) => {
+ const success = moveWorkOrderTypeDown(request.body.workOrderTypeId);
+ const workOrderTypes = getWorkOrderTypes();
+ response.json({
+ success,
+ workOrderTypes
+ });
+};
+export default handler;
diff --git a/handlers/admin-post/doMoveWorkOrderTypeDown.ts b/handlers/admin-post/doMoveWorkOrderTypeDown.ts
new file mode 100644
index 00000000..8b66bd41
--- /dev/null
+++ b/handlers/admin-post/doMoveWorkOrderTypeDown.ts
@@ -0,0 +1,27 @@
+import type {
+ RequestHandler
+} from "express";
+
+import {
+ moveWorkOrderTypeDown
+} from "../../helpers/lotOccupancyDB/moveWorkOrderTypeDown.js";
+
+import {
+ getWorkOrderTypes
+} from "../../helpers/functions.cache.js";
+
+
+export const handler: RequestHandler = async (request, response) => {
+
+ const success = moveWorkOrderTypeDown(request.body.workOrderTypeId);
+
+ const workOrderTypes = getWorkOrderTypes();
+
+ response.json({
+ success,
+ workOrderTypes
+ });
+};
+
+
+export default handler;
\ No newline at end of file
diff --git a/handlers/admin-post/doMoveWorkOrderTypeUp.d.ts b/handlers/admin-post/doMoveWorkOrderTypeUp.d.ts
new file mode 100644
index 00000000..9621c611
--- /dev/null
+++ b/handlers/admin-post/doMoveWorkOrderTypeUp.d.ts
@@ -0,0 +1,3 @@
+import type { RequestHandler } from "express";
+export declare const handler: RequestHandler;
+export default handler;
diff --git a/handlers/admin-post/doMoveWorkOrderTypeUp.js b/handlers/admin-post/doMoveWorkOrderTypeUp.js
new file mode 100644
index 00000000..621d5f97
--- /dev/null
+++ b/handlers/admin-post/doMoveWorkOrderTypeUp.js
@@ -0,0 +1,11 @@
+import { moveWorkOrderTypeUp } from "../../helpers/lotOccupancyDB/moveWorkOrderTypeUp.js";
+import { getWorkOrderTypes } from "../../helpers/functions.cache.js";
+export const handler = async (request, response) => {
+ const success = moveWorkOrderTypeUp(request.body.workOrderTypeId);
+ const workOrderTypes = getWorkOrderTypes();
+ response.json({
+ success,
+ workOrderTypes
+ });
+};
+export default handler;
diff --git a/handlers/admin-post/doMoveWorkOrderTypeUp.ts b/handlers/admin-post/doMoveWorkOrderTypeUp.ts
new file mode 100644
index 00000000..428e2531
--- /dev/null
+++ b/handlers/admin-post/doMoveWorkOrderTypeUp.ts
@@ -0,0 +1,27 @@
+import type {
+ RequestHandler
+} from "express";
+
+import {
+ moveWorkOrderTypeUp
+} from "../../helpers/lotOccupancyDB/moveWorkOrderTypeUp.js";
+
+import {
+ getWorkOrderTypes
+} from "../../helpers/functions.cache.js";
+
+
+export const handler: RequestHandler = async (request, response) => {
+
+ const success = moveWorkOrderTypeUp(request.body.workOrderTypeId);
+
+ const workOrderTypes = getWorkOrderTypes();
+
+ response.json({
+ success,
+ workOrderTypes
+ });
+};
+
+
+export default handler;
\ No newline at end of file
diff --git a/handlers/admin-post/doUpdateWorkOrderType.d.ts b/handlers/admin-post/doUpdateWorkOrderType.d.ts
new file mode 100644
index 00000000..9621c611
--- /dev/null
+++ b/handlers/admin-post/doUpdateWorkOrderType.d.ts
@@ -0,0 +1,3 @@
+import type { RequestHandler } from "express";
+export declare const handler: RequestHandler;
+export default handler;
diff --git a/handlers/admin-post/doUpdateWorkOrderType.js b/handlers/admin-post/doUpdateWorkOrderType.js
new file mode 100644
index 00000000..b371576f
--- /dev/null
+++ b/handlers/admin-post/doUpdateWorkOrderType.js
@@ -0,0 +1,11 @@
+import { updateWorkOrderType } from "../../helpers/lotOccupancyDB/updateWorkOrderType.js";
+import { getWorkOrderTypes } from "../../helpers/functions.cache.js";
+export const handler = async (request, response) => {
+ const success = updateWorkOrderType(request.body, request.session);
+ const workOrderTypes = getWorkOrderTypes();
+ response.json({
+ success,
+ workOrderTypes
+ });
+};
+export default handler;
diff --git a/handlers/admin-post/doUpdateWorkOrderType.ts b/handlers/admin-post/doUpdateWorkOrderType.ts
new file mode 100644
index 00000000..f5cff47a
--- /dev/null
+++ b/handlers/admin-post/doUpdateWorkOrderType.ts
@@ -0,0 +1,27 @@
+import type {
+ RequestHandler
+} from "express";
+
+import {
+ updateWorkOrderType
+} from "../../helpers/lotOccupancyDB/updateWorkOrderType.js";
+
+import {
+ getWorkOrderTypes
+} from "../../helpers/functions.cache.js";
+
+
+export const handler: RequestHandler = async (request, response) => {
+
+ const success = updateWorkOrderType(request.body, request.session);
+
+ const workOrderTypes = getWorkOrderTypes();
+
+ response.json({
+ success,
+ workOrderTypes
+ });
+};
+
+
+export default handler;
\ No newline at end of file
diff --git a/helpers/functions.cache.d.ts b/helpers/functions.cache.d.ts
index 5d9ead16..f51f02a4 100644
--- a/helpers/functions.cache.d.ts
+++ b/helpers/functions.cache.d.ts
@@ -15,3 +15,5 @@ export declare function getOccupancyTypes(): recordTypes.OccupancyType[];
export declare function getOccupancyTypeById(occupancyTypeId: number): recordTypes.OccupancyType;
export declare function getOccupancyTypeByOccupancyType(occupancyTypeString: string): recordTypes.OccupancyType;
export declare function clearOccupancyTypesCache(): void;
+export declare function getWorkOrderTypes(): recordTypes.WorkOrderType[];
+export declare function clearWorkOrderTypesCache(): void;
diff --git a/helpers/functions.cache.js b/helpers/functions.cache.js
index c53ae7f3..8431185b 100644
--- a/helpers/functions.cache.js
+++ b/helpers/functions.cache.js
@@ -2,6 +2,7 @@ import { getLotOccupantTypes as getLotOccupantTypesFromDatabase } from "./lotOcc
import { getLotStatuses as getLotStatusesFromDatabase } from "./lotOccupancyDB/getLotStatuses.js";
import { getLotTypes as getLotTypesFromDatabase } from "./lotOccupancyDB/getLotTypes.js";
import { getOccupancyTypes as getOccupancyTypesFromDatabase } from "./lotOccupancyDB/getOccupancyTypes.js";
+import { getWorkOrderTypes as getWorkOrderTypesFromDatabase } from "./lotOccupancyDB/getWorkOrderTypes.js";
import { getOccupancyType } from "./lotOccupancyDB/getOccupancyType.js";
let lotOccupantTypes;
export function getLotOccupantTypes() {
@@ -102,3 +103,13 @@ export function clearOccupancyTypesCache() {
occupancyTypes = undefined;
occupancyTypeMap.clear();
}
+let workOrderTypes;
+export function getWorkOrderTypes() {
+ if (!workOrderTypes) {
+ workOrderTypes = getWorkOrderTypesFromDatabase();
+ }
+ return workOrderTypes;
+}
+export function clearWorkOrderTypesCache() {
+ workOrderTypes = undefined;
+}
diff --git a/helpers/functions.cache.ts b/helpers/functions.cache.ts
index 2da7ec4c..d41ef5a7 100644
--- a/helpers/functions.cache.ts
+++ b/helpers/functions.cache.ts
@@ -14,6 +14,10 @@ import {
getOccupancyTypes as getOccupancyTypesFromDatabase
} from "./lotOccupancyDB/getOccupancyTypes.js";
+import {
+ getWorkOrderTypes as getWorkOrderTypesFromDatabase
+} from "./lotOccupancyDB/getWorkOrderTypes.js";
+
import {
getOccupancyType
} from "./lotOccupancyDB/getOccupancyType.js";
@@ -187,4 +191,23 @@ export function getOccupancyTypeByOccupancyType(occupancyTypeString: string) {
export function clearOccupancyTypesCache() {
occupancyTypes = undefined;
occupancyTypeMap.clear();
+}
+
+/*
+ * Work Order Types
+ */
+
+let workOrderTypes: recordTypes.WorkOrderType[];
+
+export function getWorkOrderTypes() {
+
+ if (!workOrderTypes) {
+ workOrderTypes = getWorkOrderTypesFromDatabase();
+ }
+
+ return workOrderTypes;
+}
+
+export function clearWorkOrderTypesCache() {
+ workOrderTypes = undefined;
}
\ No newline at end of file
diff --git a/helpers/lotOccupancyDB/addLotType.ts b/helpers/lotOccupancyDB/addLotType.ts
index daa48ca1..32ac543e 100644
--- a/helpers/lotOccupancyDB/addLotType.ts
+++ b/helpers/lotOccupancyDB/addLotType.ts
@@ -4,13 +4,16 @@ import {
lotOccupancyDB as databasePath
} from "../../data/databasePaths.js";
+import {
+ clearLotTypesCache
+} from "../functions.cache.js";
+
import type * as recordTypes from "../../types/recordTypes";
-import { clearLotTypesCache } from "../functions.cache.js";
interface AddLotTypeForm {
lotType: string;
- orderNumber?: number;
+ orderNumber ? : number;
}
diff --git a/helpers/lotOccupancyDB/addWorkOrderType.d.ts b/helpers/lotOccupancyDB/addWorkOrderType.d.ts
new file mode 100644
index 00000000..b320376c
--- /dev/null
+++ b/helpers/lotOccupancyDB/addWorkOrderType.d.ts
@@ -0,0 +1,7 @@
+import type * as recordTypes from "../../types/recordTypes";
+interface AddWorkOrderTypeForm {
+ workOrderType: string;
+ orderNumber?: number;
+}
+export declare const addWorkOrderType: (workOrderTypeForm: AddWorkOrderTypeForm, requestSession: recordTypes.PartialSession) => number;
+export default addWorkOrderType;
diff --git a/helpers/lotOccupancyDB/addWorkOrderType.js b/helpers/lotOccupancyDB/addWorkOrderType.js
new file mode 100644
index 00000000..95559beb
--- /dev/null
+++ b/helpers/lotOccupancyDB/addWorkOrderType.js
@@ -0,0 +1,18 @@
+import sqlite from "better-sqlite3";
+import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
+import { clearWorkOrderTypesCache } from "../functions.cache.js";
+export const addWorkOrderType = (workOrderTypeForm, requestSession) => {
+ const database = sqlite(databasePath);
+ const rightNowMillis = Date.now();
+ const result = database
+ .prepare("insert into WorkOrderTypes (" +
+ "workOrderType, orderNumber," +
+ " recordCreate_userName, recordCreate_timeMillis," +
+ " recordUpdate_userName, recordUpdate_timeMillis)" +
+ " values (?, ?, ?, ?, ?, ?)")
+ .run(workOrderTypeForm.workOrderType, (workOrderTypeForm.orderNumber || -1), requestSession.user.userName, rightNowMillis, requestSession.user.userName, rightNowMillis);
+ database.close();
+ clearWorkOrderTypesCache();
+ return result.lastInsertRowid;
+};
+export default addWorkOrderType;
diff --git a/helpers/lotOccupancyDB/addWorkOrderType.ts b/helpers/lotOccupancyDB/addWorkOrderType.ts
new file mode 100644
index 00000000..f65dbcb0
--- /dev/null
+++ b/helpers/lotOccupancyDB/addWorkOrderType.ts
@@ -0,0 +1,48 @@
+import sqlite from "better-sqlite3";
+
+import {
+ lotOccupancyDB as databasePath
+} from "../../data/databasePaths.js";
+
+import {
+ clearWorkOrderTypesCache
+} from "../functions.cache.js";
+
+import type * as recordTypes from "../../types/recordTypes";
+
+
+interface AddWorkOrderTypeForm {
+ workOrderType: string;
+ orderNumber ? : number;
+}
+
+
+export const addWorkOrderType =
+ (workOrderTypeForm: AddWorkOrderTypeForm, requestSession: recordTypes.PartialSession): number => {
+
+ const database = sqlite(databasePath);
+
+ const rightNowMillis = Date.now();
+
+ const result = database
+ .prepare("insert into WorkOrderTypes (" +
+ "workOrderType, orderNumber," +
+ " recordCreate_userName, recordCreate_timeMillis," +
+ " recordUpdate_userName, recordUpdate_timeMillis)" +
+ " values (?, ?, ?, ?, ?, ?)")
+ .run(workOrderTypeForm.workOrderType,
+ (workOrderTypeForm.orderNumber || -1),
+ requestSession.user.userName,
+ rightNowMillis,
+ requestSession.user.userName,
+ rightNowMillis);
+
+ database.close();
+
+ clearWorkOrderTypesCache();
+
+ return result.lastInsertRowid as number;
+ };
+
+
+export default addWorkOrderType;
\ No newline at end of file
diff --git a/helpers/lotOccupancyDB/deleteWorkOrderType.d.ts b/helpers/lotOccupancyDB/deleteWorkOrderType.d.ts
new file mode 100644
index 00000000..42e11cd7
--- /dev/null
+++ b/helpers/lotOccupancyDB/deleteWorkOrderType.d.ts
@@ -0,0 +1,3 @@
+import type * as recordTypes from "../../types/recordTypes";
+export declare const deleteWorkOrderType: (workOrderTypeId: number | string, requestSession: recordTypes.PartialSession) => boolean;
+export default deleteWorkOrderType;
diff --git a/helpers/lotOccupancyDB/deleteWorkOrderType.js b/helpers/lotOccupancyDB/deleteWorkOrderType.js
new file mode 100644
index 00000000..a4fda52c
--- /dev/null
+++ b/helpers/lotOccupancyDB/deleteWorkOrderType.js
@@ -0,0 +1,17 @@
+import sqlite from "better-sqlite3";
+import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
+import { clearWorkOrderTypesCache } from "../functions.cache.js";
+export const deleteWorkOrderType = (workOrderTypeId, requestSession) => {
+ const database = sqlite(databasePath);
+ const rightNowMillis = Date.now();
+ const result = database
+ .prepare("update WorkOrderTypes" +
+ " set recordDelete_userName = ?," +
+ " recordDelete_timeMillis = ?" +
+ " where workOrderTypeId = ?")
+ .run(requestSession.user.userName, rightNowMillis, workOrderTypeId);
+ database.close();
+ clearWorkOrderTypesCache();
+ return (result.changes > 0);
+};
+export default deleteWorkOrderType;
diff --git a/helpers/lotOccupancyDB/deleteWorkOrderType.ts b/helpers/lotOccupancyDB/deleteWorkOrderType.ts
new file mode 100644
index 00000000..8c9ef8d9
--- /dev/null
+++ b/helpers/lotOccupancyDB/deleteWorkOrderType.ts
@@ -0,0 +1,36 @@
+import sqlite from "better-sqlite3";
+
+import {
+ lotOccupancyDB as databasePath
+} from "../../data/databasePaths.js";
+
+import type * as recordTypes from "../../types/recordTypes";
+import { clearWorkOrderTypesCache } from "../functions.cache.js";
+
+
+export const deleteWorkOrderType =
+ (workOrderTypeId: number | string,
+ requestSession: recordTypes.PartialSession): boolean => {
+
+ const database = sqlite(databasePath);
+
+ const rightNowMillis = Date.now();
+
+ const result = database
+ .prepare("update WorkOrderTypes" +
+ " set recordDelete_userName = ?," +
+ " recordDelete_timeMillis = ?" +
+ " where workOrderTypeId = ?")
+ .run(requestSession.user.userName,
+ rightNowMillis,
+ workOrderTypeId);
+
+ database.close();
+
+ clearWorkOrderTypesCache();
+
+ return (result.changes > 0);
+ };
+
+
+export default deleteWorkOrderType;
\ No newline at end of file
diff --git a/helpers/lotOccupancyDB/getWorkOrderTypes.d.ts b/helpers/lotOccupancyDB/getWorkOrderTypes.d.ts
new file mode 100644
index 00000000..23e17a3d
--- /dev/null
+++ b/helpers/lotOccupancyDB/getWorkOrderTypes.d.ts
@@ -0,0 +1,3 @@
+import type * as recordTypes from "../../types/recordTypes";
+export declare const getWorkOrderTypes: () => recordTypes.WorkOrderType[];
+export default getWorkOrderTypes;
diff --git a/helpers/lotOccupancyDB/getWorkOrderTypes.js b/helpers/lotOccupancyDB/getWorkOrderTypes.js
new file mode 100644
index 00000000..1841ce6c
--- /dev/null
+++ b/helpers/lotOccupancyDB/getWorkOrderTypes.js
@@ -0,0 +1,25 @@
+import sqlite from "better-sqlite3";
+import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
+export const getWorkOrderTypes = () => {
+ const database = sqlite(databasePath);
+ const workOrderTypes = database
+ .prepare("select workOrderTypeId, workOrderType, orderNumber" +
+ " from WorkOrderTypes" +
+ " where recordDelete_timeMillis is null" +
+ " order by orderNumber, workOrderType")
+ .all();
+ let expectedOrderNumber = 0;
+ for (const workOrderType of workOrderTypes) {
+ if (workOrderType.orderNumber !== expectedOrderNumber) {
+ database.prepare("update WorkOrderTypes" +
+ " set orderNumber = ?" +
+ " where workOrderTypeId = ?")
+ .run(expectedOrderNumber, workOrderType.workOrderTypeId);
+ workOrderType.orderNumber = expectedOrderNumber;
+ }
+ expectedOrderNumber += 1;
+ }
+ database.close();
+ return workOrderTypes;
+};
+export default getWorkOrderTypes;
diff --git a/helpers/lotOccupancyDB/getWorkOrderTypes.ts b/helpers/lotOccupancyDB/getWorkOrderTypes.ts
new file mode 100644
index 00000000..15cb9a4d
--- /dev/null
+++ b/helpers/lotOccupancyDB/getWorkOrderTypes.ts
@@ -0,0 +1,44 @@
+import sqlite from "better-sqlite3";
+import {
+ lotOccupancyDB as databasePath
+} from "../../data/databasePaths.js";
+
+import type * as recordTypes from "../../types/recordTypes";
+
+
+export const getWorkOrderTypes = (): recordTypes.WorkOrderType[] => {
+
+ const database = sqlite(databasePath);
+
+ const workOrderTypes: recordTypes.WorkOrderType[] = database
+ .prepare("select workOrderTypeId, workOrderType, orderNumber" +
+ " from WorkOrderTypes" +
+ " where recordDelete_timeMillis is null" +
+ " order by orderNumber, workOrderType")
+ .all();
+
+ let expectedOrderNumber = 0;
+
+ for (const workOrderType of workOrderTypes) {
+
+ if (workOrderType.orderNumber !== expectedOrderNumber) {
+
+ database.prepare("update WorkOrderTypes" +
+ " set orderNumber = ?" +
+ " where workOrderTypeId = ?")
+ .run(expectedOrderNumber,
+ workOrderType.workOrderTypeId);
+
+ workOrderType.orderNumber = expectedOrderNumber;
+ }
+
+ expectedOrderNumber += 1;
+ }
+
+ database.close();
+
+ return workOrderTypes;
+};
+
+
+export default getWorkOrderTypes;
\ No newline at end of file
diff --git a/helpers/lotOccupancyDB/moveWorkOrderTypeDown.d.ts b/helpers/lotOccupancyDB/moveWorkOrderTypeDown.d.ts
new file mode 100644
index 00000000..03a81485
--- /dev/null
+++ b/helpers/lotOccupancyDB/moveWorkOrderTypeDown.d.ts
@@ -0,0 +1,2 @@
+export declare const moveWorkOrderTypeDown: (workOrderTypeId: number | string) => boolean;
+export default moveWorkOrderTypeDown;
diff --git a/helpers/lotOccupancyDB/moveWorkOrderTypeDown.js b/helpers/lotOccupancyDB/moveWorkOrderTypeDown.js
new file mode 100644
index 00000000..ded00dca
--- /dev/null
+++ b/helpers/lotOccupancyDB/moveWorkOrderTypeDown.js
@@ -0,0 +1,26 @@
+import sqlite from "better-sqlite3";
+import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
+import { clearWorkOrderTypesCache } from "../functions.cache.js";
+export const moveWorkOrderTypeDown = (workOrderTypeId) => {
+ const database = sqlite(databasePath);
+ const currentOrderNumber = database.prepare("select orderNumber" +
+ " from WorkOrderTypes" +
+ " where workOrderTypeId = ?")
+ .get(workOrderTypeId)
+ .orderNumber;
+ database
+ .prepare("update WorkOrderTypes" +
+ " set orderNumber = orderNumber - 1" +
+ " where recordDelete_timeMillis is null" +
+ " and orderNumber = ? + 1")
+ .run(currentOrderNumber);
+ const result = database
+ .prepare("update WorkOrderTypes" +
+ " set orderNumber = ? + 1" +
+ " where workOrderTypeId = ?")
+ .run(currentOrderNumber, workOrderTypeId);
+ database.close();
+ clearWorkOrderTypesCache();
+ return result.changes > 0;
+};
+export default moveWorkOrderTypeDown;
diff --git a/helpers/lotOccupancyDB/moveWorkOrderTypeDown.ts b/helpers/lotOccupancyDB/moveWorkOrderTypeDown.ts
new file mode 100644
index 00000000..52d561e7
--- /dev/null
+++ b/helpers/lotOccupancyDB/moveWorkOrderTypeDown.ts
@@ -0,0 +1,44 @@
+import sqlite from "better-sqlite3";
+
+import {
+ lotOccupancyDB as databasePath
+} from "../../data/databasePaths.js";
+
+import {
+ clearWorkOrderTypesCache
+} from "../functions.cache.js";
+
+
+export const moveWorkOrderTypeDown =
+ (workOrderTypeId: number | string): boolean => {
+
+ const database = sqlite(databasePath);
+
+ const currentOrderNumber: number = database.prepare("select orderNumber" +
+ " from WorkOrderTypes" +
+ " where workOrderTypeId = ?")
+ .get(workOrderTypeId)
+ .orderNumber;
+
+ database
+ .prepare("update WorkOrderTypes" +
+ " set orderNumber = orderNumber - 1" +
+ " where recordDelete_timeMillis is null" +
+ " and orderNumber = ? + 1")
+ .run(currentOrderNumber);
+
+ const result = database
+ .prepare("update WorkOrderTypes" +
+ " set orderNumber = ? + 1" +
+ " where workOrderTypeId = ?")
+ .run(currentOrderNumber, workOrderTypeId);
+
+ database.close();
+
+ clearWorkOrderTypesCache();
+
+ return result.changes > 0;
+ };
+
+
+export default moveWorkOrderTypeDown;
\ No newline at end of file
diff --git a/helpers/lotOccupancyDB/moveWorkOrderTypeUp.d.ts b/helpers/lotOccupancyDB/moveWorkOrderTypeUp.d.ts
new file mode 100644
index 00000000..3d6c2c0e
--- /dev/null
+++ b/helpers/lotOccupancyDB/moveWorkOrderTypeUp.d.ts
@@ -0,0 +1,2 @@
+export declare const moveWorkOrderTypeUp: (workOrderTypeId: number | string) => boolean;
+export default moveWorkOrderTypeUp;
diff --git a/helpers/lotOccupancyDB/moveWorkOrderTypeUp.js b/helpers/lotOccupancyDB/moveWorkOrderTypeUp.js
new file mode 100644
index 00000000..8936db77
--- /dev/null
+++ b/helpers/lotOccupancyDB/moveWorkOrderTypeUp.js
@@ -0,0 +1,30 @@
+import sqlite from "better-sqlite3";
+import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
+import { clearWorkOrderTypesCache } from "../functions.cache.js";
+export const moveWorkOrderTypeUp = (workOrderTypeId) => {
+ const database = sqlite(databasePath);
+ const currentOrderNumber = database.prepare("select orderNumber" +
+ " from WorkOrderTypes" +
+ " where workOrderTypeId = ?")
+ .get(workOrderTypeId)
+ .orderNumber;
+ if (currentOrderNumber <= 0) {
+ database.close();
+ return true;
+ }
+ database
+ .prepare("update WorkOrderTypes" +
+ " set orderNumber = orderNumber + 1" +
+ " where recordDelete_timeMillis is null" +
+ " and orderNumber = ? - 1")
+ .run(currentOrderNumber);
+ const result = database
+ .prepare("update WorkOrderTypes" +
+ " set orderNumber = ? - 1" +
+ " where workOrderTypeId = ?")
+ .run(currentOrderNumber, workOrderTypeId);
+ database.close();
+ clearWorkOrderTypesCache();
+ return result.changes > 0;
+};
+export default moveWorkOrderTypeUp;
diff --git a/helpers/lotOccupancyDB/moveWorkOrderTypeUp.ts b/helpers/lotOccupancyDB/moveWorkOrderTypeUp.ts
new file mode 100644
index 00000000..0d6ac758
--- /dev/null
+++ b/helpers/lotOccupancyDB/moveWorkOrderTypeUp.ts
@@ -0,0 +1,49 @@
+import sqlite from "better-sqlite3";
+
+import {
+ lotOccupancyDB as databasePath
+} from "../../data/databasePaths.js";
+
+import {
+ clearWorkOrderTypesCache
+} from "../functions.cache.js";
+
+
+export const moveWorkOrderTypeUp =
+ (workOrderTypeId: number | string): boolean => {
+
+ const database = sqlite(databasePath);
+
+ const currentOrderNumber: number = database.prepare("select orderNumber" +
+ " from WorkOrderTypes" +
+ " where workOrderTypeId = ?")
+ .get(workOrderTypeId)
+ .orderNumber;
+
+ if (currentOrderNumber <= 0) {
+ database.close();
+ return true;
+ }
+
+ database
+ .prepare("update WorkOrderTypes" +
+ " set orderNumber = orderNumber + 1" +
+ " where recordDelete_timeMillis is null" +
+ " and orderNumber = ? - 1")
+ .run(currentOrderNumber);
+
+ const result = database
+ .prepare("update WorkOrderTypes" +
+ " set orderNumber = ? - 1" +
+ " where workOrderTypeId = ?")
+ .run(currentOrderNumber, workOrderTypeId);
+
+ database.close();
+
+ clearWorkOrderTypesCache();
+
+ return result.changes > 0;
+ };
+
+
+export default moveWorkOrderTypeUp;
\ No newline at end of file
diff --git a/helpers/lotOccupancyDB/updateWorkOrderType.d.ts b/helpers/lotOccupancyDB/updateWorkOrderType.d.ts
new file mode 100644
index 00000000..370ccad0
--- /dev/null
+++ b/helpers/lotOccupancyDB/updateWorkOrderType.d.ts
@@ -0,0 +1,7 @@
+import type * as recordTypes from "../../types/recordTypes";
+interface UpdateWorkOrderTypeForm {
+ workOrderTypeId: number | string;
+ workOrderType: string;
+}
+export declare const updateWorkOrderType: (workOrderTypeForm: UpdateWorkOrderTypeForm, requestSession: recordTypes.PartialSession) => boolean;
+export default updateWorkOrderType;
diff --git a/helpers/lotOccupancyDB/updateWorkOrderType.js b/helpers/lotOccupancyDB/updateWorkOrderType.js
new file mode 100644
index 00000000..419db684
--- /dev/null
+++ b/helpers/lotOccupancyDB/updateWorkOrderType.js
@@ -0,0 +1,19 @@
+import sqlite from "better-sqlite3";
+import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
+import { clearWorkOrderTypesCache } from "../functions.cache.js";
+export const updateWorkOrderType = (workOrderTypeForm, requestSession) => {
+ const database = sqlite(databasePath);
+ const rightNowMillis = Date.now();
+ const result = database
+ .prepare("update WorkOrderTypes" +
+ " set workOrderType = ?," +
+ " recordUpdate_userName = ?," +
+ " recordUpdate_timeMillis = ?" +
+ " where workOrderTypeId = ?" +
+ " and recordDelete_timeMillis is null")
+ .run(workOrderTypeForm.workOrderType, requestSession.user.userName, rightNowMillis, workOrderTypeForm.workOrderTypeId);
+ database.close();
+ clearWorkOrderTypesCache();
+ return result.changes > 0;
+};
+export default updateWorkOrderType;
diff --git a/helpers/lotOccupancyDB/updateWorkOrderType.ts b/helpers/lotOccupancyDB/updateWorkOrderType.ts
new file mode 100644
index 00000000..9b42d121
--- /dev/null
+++ b/helpers/lotOccupancyDB/updateWorkOrderType.ts
@@ -0,0 +1,44 @@
+import sqlite from "better-sqlite3";
+
+import {
+ lotOccupancyDB as databasePath
+} from "../../data/databasePaths.js";
+
+import type * as recordTypes from "../../types/recordTypes";
+import { clearWorkOrderTypesCache } from "../functions.cache.js";
+
+
+interface UpdateWorkOrderTypeForm {
+ workOrderTypeId: number | string;
+ workOrderType: string;
+}
+
+
+export const updateWorkOrderType =
+ (workOrderTypeForm: UpdateWorkOrderTypeForm, requestSession: recordTypes.PartialSession): boolean => {
+
+ const database = sqlite(databasePath);
+
+ const rightNowMillis = Date.now();
+
+ const result = database
+ .prepare("update WorkOrderTypes" +
+ " set workOrderType = ?," +
+ " recordUpdate_userName = ?," +
+ " recordUpdate_timeMillis = ?" +
+ " where workOrderTypeId = ?" +
+ " and recordDelete_timeMillis is null")
+ .run(workOrderTypeForm.workOrderType,
+ requestSession.user.userName,
+ rightNowMillis,
+ workOrderTypeForm.workOrderTypeId);
+
+ database.close();
+
+ clearWorkOrderTypesCache();
+
+ return result.changes > 0;
+ };
+
+
+export default updateWorkOrderType;
\ No newline at end of file
diff --git a/public-typescript/adminTables.d.ts b/public-typescript/adminTables.d.ts
new file mode 100644
index 00000000..cb0ff5c3
--- /dev/null
+++ b/public-typescript/adminTables.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/public-typescript/adminTables.js b/public-typescript/adminTables.js
new file mode 100644
index 00000000..daf80e10
--- /dev/null
+++ b/public-typescript/adminTables.js
@@ -0,0 +1,181 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+(() => {
+ const los = exports.los;
+ const urlPrefix = document.querySelector("main").dataset.urlPrefix;
+ let workOrderTypes = exports.workOrderTypes;
+ delete exports.workOrderTypes;
+ const updateWorkOrderType = (submitEvent) => {
+ submitEvent.preventDefault();
+ cityssm.postJSON(urlPrefix + "/admin/doUpdateWorkOrderType", submitEvent.currentTarget, (responseJSON) => {
+ if (responseJSON.success) {
+ workOrderTypes = responseJSON.workOrderTypes;
+ bulmaJS.alert({
+ message: "Work Order Type Updated Successfully",
+ contextualColorName: "success"
+ });
+ }
+ else {
+ bulmaJS.alert({
+ title: "Error Updating Work Order Type",
+ message: responseJSON.errorMessage,
+ contextualColorName: "danger"
+ });
+ }
+ });
+ };
+ const deleteWorkOrderType = (clickEvent) => {
+ const tableRowElement = clickEvent.currentTarget.closest("tr");
+ const workOrderTypeId = tableRowElement.dataset.workOrderTypeId;
+ const doDelete = () => {
+ cityssm.postJSON(urlPrefix + "/admin/doDeleteWorkOrderType", {
+ workOrderTypeId
+ }, (responseJSON) => {
+ if (responseJSON.success) {
+ workOrderTypes = responseJSON.workOrderTypes;
+ if (workOrderTypes.length === 0) {
+ renderWorkOrderTypes();
+ }
+ else {
+ tableRowElement.remove();
+ }
+ bulmaJS.alert({
+ message: "Work Order Type Deleted Successfully",
+ contextualColorName: "success"
+ });
+ }
+ else {
+ bulmaJS.alert({
+ title: "Error Deleting Work Order Type",
+ message: responseJSON.errorMessage,
+ contextualColorName: "danger"
+ });
+ }
+ });
+ };
+ bulmaJS.confirm({
+ title: "Delete Work Order Type",
+ message: "Are you sure you want to delete this work order type?
" +
+ "Note that no work orders will be removed.",
+ messageIsHtml: true,
+ contextualColorName: "warning",
+ okButton: {
+ text: "Yes, Delete Work Order Type",
+ callbackFunction: doDelete
+ }
+ });
+ };
+ const moveWorkOrderTypeUp = (clickEvent) => {
+ const tableRowElement = clickEvent.currentTarget.closest("tr");
+ const workOrderTypeId = tableRowElement.dataset.workOrderTypeId;
+ cityssm.postJSON(urlPrefix + "/admin/doMoveWorkOrderTypeUp", {
+ workOrderTypeId
+ }, (responseJSON) => {
+ if (responseJSON.success) {
+ workOrderTypes = responseJSON.workOrderTypes;
+ renderWorkOrderTypes();
+ }
+ else {
+ bulmaJS.alert({
+ title: "Error Moving Work Order Type",
+ message: responseJSON.errorMessage,
+ contextualColorName: "danger"
+ });
+ }
+ });
+ };
+ const moveWorkOrderTypeDown = (clickEvent) => {
+ const tableRowElement = clickEvent.currentTarget.closest("tr");
+ const workOrderTypeId = tableRowElement.dataset.workOrderTypeId;
+ cityssm.postJSON(urlPrefix + "/admin/doMoveWorkOrderTypeDown", {
+ workOrderTypeId
+ }, (responseJSON) => {
+ if (responseJSON.success) {
+ workOrderTypes = responseJSON.workOrderTypes;
+ renderWorkOrderTypes();
+ }
+ else {
+ bulmaJS.alert({
+ title: "Error Moving Work Order Type",
+ message: responseJSON.errorMessage,
+ contextualColorName: "danger"
+ });
+ }
+ });
+ };
+ const renderWorkOrderTypes = () => {
+ const containerElement = document.querySelector("#container--workOrderTypes");
+ if (workOrderTypes.length === 0) {
+ containerElement.innerHTML = "
| Work Order Type | +Options | +
|---|---|
| + + | +|
+ Manage simple configuration tables fees for + work order types, + <%= configFunctions.getProperty("aliases.lot").toLowerCase() %> statuses, + and <%= configFunctions.getProperty("aliases.lot").toLowerCase() %> <%= configFunctions.getProperty("aliases.occupant").toLowerCase() %> types. +
+