deepsource-autofix-76c6eb20
Dan Gowans 2023-01-11 15:54:32 -05:00
parent 991ad5bc82
commit 263c316573
72 changed files with 1850 additions and 1755 deletions

View File

@ -1,4 +1,4 @@
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes';
interface AddOccupancyTypeFieldForm { interface AddOccupancyTypeFieldForm {
occupancyTypeId?: string | number; occupancyTypeId?: string | number;
occupancyTypeField: string; occupancyTypeField: string;

View File

@ -1,6 +1,6 @@
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 addOccupancyTypeField(occupancyTypeFieldForm, requestSession) { export function addOccupancyTypeField(occupancyTypeFieldForm, requestSession) {
const database = sqlite(databasePath); const database = sqlite(databasePath);
const rightNowMillis = Date.now(); const rightNowMillis = Date.now();
@ -13,9 +13,9 @@ export function addOccupancyTypeField(occupancyTypeFieldForm, requestSession) {
recordCreate_userName, recordCreate_timeMillis, recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis) recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
.run(occupancyTypeFieldForm.occupancyTypeId || undefined, occupancyTypeFieldForm.occupancyTypeField, occupancyTypeFieldForm.occupancyTypeFieldValues || "", occupancyTypeFieldForm.isRequired ? 1 : 0, occupancyTypeFieldForm.pattern || "", occupancyTypeFieldForm.minimumLength || 0, occupancyTypeFieldForm.maximumLength || 100, occupancyTypeFieldForm.orderNumber || -1, requestSession.user.userName, rightNowMillis, requestSession.user.userName, rightNowMillis); .run(occupancyTypeFieldForm.occupancyTypeId ?? undefined, occupancyTypeFieldForm.occupancyTypeField, occupancyTypeFieldForm.occupancyTypeFieldValues ?? '', occupancyTypeFieldForm.isRequired === '' ? 0 : 1, occupancyTypeFieldForm.pattern ?? '', occupancyTypeFieldForm.minimumLength ?? 0, occupancyTypeFieldForm.maximumLength ?? 100, occupancyTypeFieldForm.orderNumber ?? -1, requestSession.user.userName, rightNowMillis, requestSession.user.userName, rightNowMillis);
database.close(); database.close();
clearCacheByTableName("OccupancyTypeFields"); clearCacheByTableName('OccupancyTypeFields');
return result.lastInsertRowid; return result.lastInsertRowid;
} }
export default addOccupancyTypeField; export default addOccupancyTypeField;

View File

@ -1,32 +1,32 @@
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 type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes'
import { clearCacheByTableName } from "../functions.cache.js"; import { clearCacheByTableName } from '../functions.cache.js'
interface AddOccupancyTypeFieldForm { interface AddOccupancyTypeFieldForm {
occupancyTypeId?: string | number; occupancyTypeId?: string | number
occupancyTypeField: string; occupancyTypeField: string
occupancyTypeFieldValues?: string; occupancyTypeFieldValues?: string
isRequired?: string; isRequired?: string
pattern?: string; pattern?: string
minimumLength: string | number; minimumLength: string | number
maximumLength: string | number; maximumLength: string | number
orderNumber?: number; orderNumber?: number
} }
export function addOccupancyTypeField( export function addOccupancyTypeField(
occupancyTypeFieldForm: AddOccupancyTypeFieldForm, occupancyTypeFieldForm: AddOccupancyTypeFieldForm,
requestSession: recordTypes.PartialSession requestSession: recordTypes.PartialSession
): number { ): number {
const database = sqlite(databasePath); const database = sqlite(databasePath)
const rightNowMillis = Date.now(); const rightNowMillis = Date.now()
const result = database const result = database
.prepare( .prepare(
`insert into OccupancyTypeFields ( `insert into OccupancyTypeFields (
occupancyTypeId, occupancyTypeField, occupancyTypeId, occupancyTypeField,
occupancyTypeFieldValues, isRequired, pattern, occupancyTypeFieldValues, isRequired, pattern,
minimumLength, maximumLength, minimumLength, maximumLength,
@ -34,27 +34,27 @@ export function addOccupancyTypeField(
recordCreate_userName, recordCreate_timeMillis, recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis) recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)` values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
) )
.run( .run(
occupancyTypeFieldForm.occupancyTypeId || undefined, occupancyTypeFieldForm.occupancyTypeId ?? undefined,
occupancyTypeFieldForm.occupancyTypeField, occupancyTypeFieldForm.occupancyTypeField,
occupancyTypeFieldForm.occupancyTypeFieldValues || "", occupancyTypeFieldForm.occupancyTypeFieldValues ?? '',
occupancyTypeFieldForm.isRequired ? 1 : 0, occupancyTypeFieldForm.isRequired === '' ? 0 : 1,
occupancyTypeFieldForm.pattern || "", occupancyTypeFieldForm.pattern ?? '',
occupancyTypeFieldForm.minimumLength || 0, occupancyTypeFieldForm.minimumLength ?? 0,
occupancyTypeFieldForm.maximumLength || 100, occupancyTypeFieldForm.maximumLength ?? 100,
occupancyTypeFieldForm.orderNumber || -1, occupancyTypeFieldForm.orderNumber ?? -1,
requestSession.user.userName, requestSession.user!.userName,
rightNowMillis, rightNowMillis,
requestSession.user.userName, requestSession.user!.userName,
rightNowMillis rightNowMillis
); )
database.close(); database.close()
clearCacheByTableName("OccupancyTypeFields"); clearCacheByTableName('OccupancyTypeFields')
return result.lastInsertRowid as number; return result.lastInsertRowid as number
} }
export default addOccupancyTypeField; export default addOccupancyTypeField

View File

@ -1,4 +1,4 @@
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes';
interface OccupancyTypePrintForm { interface OccupancyTypePrintForm {
occupancyTypeId: string | number; occupancyTypeId: string | number;
printEJS: string; printEJS: string;

View File

@ -1,6 +1,6 @@
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 addOccupancyTypePrint(occupancyTypePrintForm, requestSession) { export function addOccupancyTypePrint(occupancyTypePrintForm, requestSession) {
const database = sqlite(databasePath); const database = sqlite(databasePath);
const rightNowMillis = Date.now(); const rightNowMillis = Date.now();
@ -20,10 +20,10 @@ export function addOccupancyTypePrint(occupancyTypePrintForm, requestSession) {
recordCreate_userName, recordCreate_timeMillis, recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis) recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?)`) values (?, ?, ?, ?, ?, ?, ?)`)
.run(occupancyTypePrintForm.occupancyTypeId, occupancyTypePrintForm.printEJS, occupancyTypePrintForm.orderNumber || -1, requestSession.user.userName, rightNowMillis, requestSession.user.userName, rightNowMillis); .run(occupancyTypePrintForm.occupancyTypeId, occupancyTypePrintForm.printEJS, occupancyTypePrintForm.orderNumber ?? -1, requestSession.user.userName, rightNowMillis, requestSession.user.userName, rightNowMillis);
} }
database.close(); database.close();
clearCacheByTableName("OccupancyTypePrints"); clearCacheByTableName('OccupancyTypePrints');
return result.changes > 0; return result.changes > 0;
} }
export default addOccupancyTypePrint; export default addOccupancyTypePrint;

View File

@ -1,67 +1,67 @@
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'
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes'
interface OccupancyTypePrintForm { interface OccupancyTypePrintForm {
occupancyTypeId: string | number; occupancyTypeId: string | number
printEJS: string; printEJS: string
orderNumber?: number; orderNumber?: number
} }
export function addOccupancyTypePrint( export function addOccupancyTypePrint(
occupancyTypePrintForm: OccupancyTypePrintForm, occupancyTypePrintForm: OccupancyTypePrintForm,
requestSession: recordTypes.PartialSession requestSession: recordTypes.PartialSession
): boolean { ): boolean {
const database = sqlite(databasePath); const database = sqlite(databasePath)
const rightNowMillis = Date.now(); const rightNowMillis = Date.now()
let result = database let result = database
.prepare( .prepare(
`update OccupancyTypePrints `update OccupancyTypePrints
set recordUpdate_userName = ?, set recordUpdate_userName = ?,
recordUpdate_timeMillis = ?, recordUpdate_timeMillis = ?,
recordDelete_userName = null, recordDelete_userName = null,
recordDelete_timeMillis = null recordDelete_timeMillis = null
where occupancyTypeId = ? where occupancyTypeId = ?
and printEJS = ?` and printEJS = ?`
) )
.run( .run(
requestSession.user.userName, requestSession.user!.userName,
rightNowMillis, rightNowMillis,
occupancyTypePrintForm.occupancyTypeId, occupancyTypePrintForm.occupancyTypeId,
occupancyTypePrintForm.printEJS occupancyTypePrintForm.printEJS
); )
if (result.changes === 0) { if (result.changes === 0) {
result = database result = database
.prepare( .prepare(
`insert into OccupancyTypePrints ( `insert into OccupancyTypePrints (
occupancyTypeId, printEJS, orderNumber, occupancyTypeId, printEJS, orderNumber,
recordCreate_userName, recordCreate_timeMillis, recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis) recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?)` values (?, ?, ?, ?, ?, ?, ?)`
) )
.run( .run(
occupancyTypePrintForm.occupancyTypeId, occupancyTypePrintForm.occupancyTypeId,
occupancyTypePrintForm.printEJS, occupancyTypePrintForm.printEJS,
occupancyTypePrintForm.orderNumber || -1, occupancyTypePrintForm.orderNumber ?? -1,
requestSession.user.userName, requestSession.user!.userName,
rightNowMillis, rightNowMillis,
requestSession.user.userName, requestSession.user!.userName,
rightNowMillis rightNowMillis
); )
} }
database.close(); database.close()
clearCacheByTableName("OccupancyTypePrints"); clearCacheByTableName('OccupancyTypePrints')
return result.changes > 0; return result.changes > 0
} }
export default addOccupancyTypePrint; export default addOccupancyTypePrint

View File

@ -1,5 +1,5 @@
import sqlite from "better-sqlite3"; import sqlite from 'better-sqlite3';
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes';
interface LotFieldForm { interface LotFieldForm {
lotId: string | number; lotId: string | number;
lotTypeFieldId: string | number; lotTypeFieldId: string | number;

View File

@ -1,17 +1,17 @@
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';
export function addOrUpdateLotField(lotFieldForm, requestSession, connectedDatabase) { export function addOrUpdateLotField(lotFieldForm, requestSession, connectedDatabase) {
const database = connectedDatabase || sqlite(databasePath); const database = connectedDatabase ?? sqlite(databasePath);
const rightNowMillis = Date.now(); const rightNowMillis = Date.now();
let result = database let result = database
.prepare(`update LotFields .prepare(`update LotFields
set lotFieldValue = ?, set lotFieldValue = ?,
recordUpdate_userName = ?, recordUpdate_userName = ?,
recordUpdate_timeMillis = ?, recordUpdate_timeMillis = ?,
recordDelete_userName = null, recordDelete_userName = null,
recordDelete_timeMillis = null recordDelete_timeMillis = null
where lotId = ? where lotId = ?
and lotTypeFieldId = ?`) and lotTypeFieldId = ?`)
.run(lotFieldForm.lotFieldValue, requestSession.user.userName, rightNowMillis, lotFieldForm.lotId, lotFieldForm.lotTypeFieldId); .run(lotFieldForm.lotFieldValue, requestSession.user.userName, rightNowMillis, lotFieldForm.lotId, lotFieldForm.lotTypeFieldId);
if (result.changes === 0) { if (result.changes === 0) {
result = database result = database

View File

@ -1,68 +1,68 @@
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 type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes'
interface LotFieldForm { interface LotFieldForm {
lotId: string | number; lotId: string | number
lotTypeFieldId: string | number; lotTypeFieldId: string | number
lotFieldValue: string; lotFieldValue: string
} }
export function addOrUpdateLotField( export function addOrUpdateLotField(
lotFieldForm: LotFieldForm, lotFieldForm: LotFieldForm,
requestSession: recordTypes.PartialSession, requestSession: recordTypes.PartialSession,
connectedDatabase?: sqlite.Database connectedDatabase?: sqlite.Database
): boolean { ): boolean {
const database = connectedDatabase || sqlite(databasePath); const database = connectedDatabase ?? sqlite(databasePath)
const rightNowMillis = Date.now(); const rightNowMillis = Date.now()
let result = database let result = database
.prepare( .prepare(
`update LotFields `update LotFields
set lotFieldValue = ?, set lotFieldValue = ?,
recordUpdate_userName = ?, recordUpdate_userName = ?,
recordUpdate_timeMillis = ?, recordUpdate_timeMillis = ?,
recordDelete_userName = null, recordDelete_userName = null,
recordDelete_timeMillis = null recordDelete_timeMillis = null
where lotId = ? where lotId = ?
and lotTypeFieldId = ?` and lotTypeFieldId = ?`
) )
.run( .run(
lotFieldForm.lotFieldValue, lotFieldForm.lotFieldValue,
requestSession.user.userName, requestSession.user!.userName,
rightNowMillis, rightNowMillis,
lotFieldForm.lotId, lotFieldForm.lotId,
lotFieldForm.lotTypeFieldId lotFieldForm.lotTypeFieldId
); )
if (result.changes === 0) { if (result.changes === 0) {
result = database result = database
.prepare( .prepare(
`insert into LotFields ( `insert into LotFields (
lotId, lotTypeFieldId, lotFieldValue, lotId, lotTypeFieldId, lotFieldValue,
recordCreate_userName, recordCreate_timeMillis, recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis) recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?)` values (?, ?, ?, ?, ?, ?, ?)`
) )
.run( .run(
lotFieldForm.lotId, lotFieldForm.lotId,
lotFieldForm.lotTypeFieldId, lotFieldForm.lotTypeFieldId,
lotFieldForm.lotFieldValue, lotFieldForm.lotFieldValue,
requestSession.user.userName, requestSession.user!.userName,
rightNowMillis, rightNowMillis,
requestSession.user.userName, requestSession.user!.userName,
rightNowMillis rightNowMillis
); )
} }
if (!connectedDatabase) { if (!connectedDatabase) {
database.close(); database.close()
} }
return result.changes > 0; return result.changes > 0
} }
export default addOrUpdateLotField; export default addOrUpdateLotField

View File

@ -1,5 +1,5 @@
import sqlite from "better-sqlite3"; import sqlite from 'better-sqlite3';
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes';
interface LotOccupancyFieldForm { interface LotOccupancyFieldForm {
lotOccupancyId: string | number; lotOccupancyId: string | number;
occupancyTypeFieldId: string | number; occupancyTypeFieldId: string | number;

View File

@ -1,25 +1,25 @@
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';
export function addOrUpdateLotOccupancyField(lotOccupancyFieldForm, requestSession, connectedDatabase) { export function addOrUpdateLotOccupancyField(lotOccupancyFieldForm, requestSession, connectedDatabase) {
const database = connectedDatabase || sqlite(databasePath); const database = connectedDatabase ?? sqlite(databasePath);
const rightNowMillis = Date.now(); const rightNowMillis = Date.now();
let result = database let result = database
.prepare(`update LotOccupancyFields .prepare(`update LotOccupancyFields
set lotOccupancyFieldValue = ?, set lotOccupancyFieldValue = ?,
recordUpdate_userName = ?, recordUpdate_userName = ?,
recordUpdate_timeMillis = ?, recordUpdate_timeMillis = ?,
recordDelete_userName = null, recordDelete_userName = null,
recordDelete_timeMillis = null recordDelete_timeMillis = null
where lotOccupancyId = ? where lotOccupancyId = ?
and occupancyTypeFieldId = ?`) and occupancyTypeFieldId = ?`)
.run(lotOccupancyFieldForm.lotOccupancyFieldValue, requestSession.user.userName, rightNowMillis, lotOccupancyFieldForm.lotOccupancyId, lotOccupancyFieldForm.occupancyTypeFieldId); .run(lotOccupancyFieldForm.lotOccupancyFieldValue, requestSession.user.userName, rightNowMillis, lotOccupancyFieldForm.lotOccupancyId, lotOccupancyFieldForm.occupancyTypeFieldId);
if (result.changes === 0) { if (result.changes === 0) {
result = database result = database
.prepare(`insert into LotOccupancyFields ( .prepare(`insert into LotOccupancyFields (
lotOccupancyId, occupancyTypeFieldId, lotOccupancyFieldValue, lotOccupancyId, occupancyTypeFieldId, lotOccupancyFieldValue,
recordCreate_userName, recordCreate_timeMillis, recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis) recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?)`) values (?, ?, ?, ?, ?, ?, ?)`)
.run(lotOccupancyFieldForm.lotOccupancyId, lotOccupancyFieldForm.occupancyTypeFieldId, lotOccupancyFieldForm.lotOccupancyFieldValue, requestSession.user.userName, rightNowMillis, requestSession.user.userName, rightNowMillis); .run(lotOccupancyFieldForm.lotOccupancyId, lotOccupancyFieldForm.occupancyTypeFieldId, lotOccupancyFieldForm.lotOccupancyFieldValue, requestSession.user.userName, rightNowMillis, requestSession.user.userName, rightNowMillis);
} }
if (!connectedDatabase) { if (!connectedDatabase) {

View File

@ -1,68 +1,68 @@
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 type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes'
interface LotOccupancyFieldForm { interface LotOccupancyFieldForm {
lotOccupancyId: string | number; lotOccupancyId: string | number
occupancyTypeFieldId: string | number; occupancyTypeFieldId: string | number
lotOccupancyFieldValue: string; lotOccupancyFieldValue: string
} }
export function addOrUpdateLotOccupancyField( export function addOrUpdateLotOccupancyField(
lotOccupancyFieldForm: LotOccupancyFieldForm, lotOccupancyFieldForm: LotOccupancyFieldForm,
requestSession: recordTypes.PartialSession, requestSession: recordTypes.PartialSession,
connectedDatabase?: sqlite.Database connectedDatabase?: sqlite.Database
): boolean { ): boolean {
const database = connectedDatabase || sqlite(databasePath); const database = connectedDatabase ?? sqlite(databasePath)
const rightNowMillis = Date.now(); const rightNowMillis = Date.now()
let result = database let result = database
.prepare( .prepare(
`update LotOccupancyFields `update LotOccupancyFields
set lotOccupancyFieldValue = ?, set lotOccupancyFieldValue = ?,
recordUpdate_userName = ?, recordUpdate_userName = ?,
recordUpdate_timeMillis = ?, recordUpdate_timeMillis = ?,
recordDelete_userName = null, recordDelete_userName = null,
recordDelete_timeMillis = null recordDelete_timeMillis = null
where lotOccupancyId = ? where lotOccupancyId = ?
and occupancyTypeFieldId = ?` and occupancyTypeFieldId = ?`
) )
.run( .run(
lotOccupancyFieldForm.lotOccupancyFieldValue, lotOccupancyFieldForm.lotOccupancyFieldValue,
requestSession.user.userName, requestSession.user!.userName,
rightNowMillis, rightNowMillis,
lotOccupancyFieldForm.lotOccupancyId, lotOccupancyFieldForm.lotOccupancyId,
lotOccupancyFieldForm.occupancyTypeFieldId lotOccupancyFieldForm.occupancyTypeFieldId
); )
if (result.changes === 0) { if (result.changes === 0) {
result = database result = database
.prepare( .prepare(
`insert into LotOccupancyFields ( `insert into LotOccupancyFields (
lotOccupancyId, occupancyTypeFieldId, lotOccupancyFieldValue, lotOccupancyId, occupancyTypeFieldId, lotOccupancyFieldValue,
recordCreate_userName, recordCreate_timeMillis, recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis) recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?)` values (?, ?, ?, ?, ?, ?, ?)`
) )
.run( .run(
lotOccupancyFieldForm.lotOccupancyId, lotOccupancyFieldForm.lotOccupancyId,
lotOccupancyFieldForm.occupancyTypeFieldId, lotOccupancyFieldForm.occupancyTypeFieldId,
lotOccupancyFieldForm.lotOccupancyFieldValue, lotOccupancyFieldForm.lotOccupancyFieldValue,
requestSession.user.userName, requestSession.user!.userName,
rightNowMillis, rightNowMillis,
requestSession.user.userName, requestSession.user!.userName,
rightNowMillis rightNowMillis
); )
} }
if (!connectedDatabase) { if (!connectedDatabase) {
database.close(); database.close()
} }
return result.changes > 0; return result.changes > 0
} }
export default addOrUpdateLotOccupancyField; export default addOrUpdateLotOccupancyField

View File

@ -1,4 +1,4 @@
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes';
declare type RecordTable = "FeeCategories" | "LotStatuses" | "LotTypes" | "OccupancyTypes" | "WorkOrderMilestoneTypes" | "WorkOrderTypes"; declare type RecordTable = 'FeeCategories' | 'LotStatuses' | 'LotTypes' | 'OccupancyTypes' | 'WorkOrderMilestoneTypes' | 'WorkOrderTypes';
export declare function addRecord(recordTable: RecordTable, recordName: string, orderNumber: number, requestSession: recordTypes.PartialSession): number; export declare function addRecord(recordTable: RecordTable, recordName: string, orderNumber: number, requestSession: recordTypes.PartialSession): number;
export {}; export {};

View File

@ -1,22 +1,22 @@
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';
const recordNameColumns = new Map(); const recordNameColumns = new Map();
recordNameColumns.set("FeeCategories", "feeCategory"); recordNameColumns.set('FeeCategories', 'feeCategory');
recordNameColumns.set("LotStatuses", "lotStatus"); recordNameColumns.set('LotStatuses', 'lotStatus');
recordNameColumns.set("LotTypes", "lotType"); recordNameColumns.set('LotTypes', 'lotType');
recordNameColumns.set("OccupancyTypes", "occupancyType"); recordNameColumns.set('OccupancyTypes', 'occupancyType');
recordNameColumns.set("WorkOrderMilestoneTypes", "workOrderMilestoneType"); recordNameColumns.set('WorkOrderMilestoneTypes', 'workOrderMilestoneType');
recordNameColumns.set("WorkOrderTypes", "workOrderType"); recordNameColumns.set('WorkOrderTypes', 'workOrderType');
export function addRecord(recordTable, recordName, orderNumber, requestSession) { export function addRecord(recordTable, recordName, orderNumber, requestSession) {
const database = sqlite(databasePath); const database = sqlite(databasePath);
const rightNowMillis = Date.now(); const rightNowMillis = Date.now();
const result = database const result = database
.prepare(`insert into ${recordTable} ( .prepare(`insert into ${recordTable} (
${recordNameColumns.get(recordTable)}, orderNumber, ${recordNameColumns.get(recordTable)}, orderNumber,
recordCreate_userName, recordCreate_timeMillis, recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis) recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?)`) values (?, ?, ?, ?, ?, ?)`)
.run(recordName, orderNumber, requestSession.user.userName, rightNowMillis, requestSession.user.userName, rightNowMillis); .run(recordName, orderNumber, requestSession.user.userName, rightNowMillis, requestSession.user.userName, rightNowMillis);
database.close(); database.close();
clearCacheByTableName(recordTable); clearCacheByTableName(recordTable);

View File

@ -1,56 +1,56 @@
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 type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes'
import { clearCacheByTableName } from "../functions.cache.js"; import { clearCacheByTableName } from '../functions.cache.js'
type RecordTable = type RecordTable =
| "FeeCategories" | 'FeeCategories'
| "LotStatuses" | 'LotStatuses'
| "LotTypes" | 'LotTypes'
| "OccupancyTypes" | 'OccupancyTypes'
| "WorkOrderMilestoneTypes" | 'WorkOrderMilestoneTypes'
| "WorkOrderTypes"; | 'WorkOrderTypes'
const recordNameColumns: Map<RecordTable, string> = new Map(); const recordNameColumns: Map<RecordTable, string> = new Map()
recordNameColumns.set("FeeCategories", "feeCategory"); recordNameColumns.set('FeeCategories', 'feeCategory')
recordNameColumns.set("LotStatuses", "lotStatus"); recordNameColumns.set('LotStatuses', 'lotStatus')
recordNameColumns.set("LotTypes", "lotType"); recordNameColumns.set('LotTypes', 'lotType')
recordNameColumns.set("OccupancyTypes", "occupancyType"); recordNameColumns.set('OccupancyTypes', 'occupancyType')
recordNameColumns.set("WorkOrderMilestoneTypes", "workOrderMilestoneType"); recordNameColumns.set('WorkOrderMilestoneTypes', 'workOrderMilestoneType')
recordNameColumns.set("WorkOrderTypes", "workOrderType"); recordNameColumns.set('WorkOrderTypes', 'workOrderType')
export function addRecord( export function addRecord(
recordTable: RecordTable, recordTable: RecordTable,
recordName: string, recordName: string,
orderNumber: number, orderNumber: number,
requestSession: recordTypes.PartialSession requestSession: recordTypes.PartialSession
): number { ): number {
const database = sqlite(databasePath); const database = sqlite(databasePath)
const rightNowMillis = Date.now(); const rightNowMillis = Date.now()
const result = database const result = database
.prepare( .prepare(
`insert into ${recordTable} ( `insert into ${recordTable} (
${recordNameColumns.get(recordTable)}, orderNumber, ${recordNameColumns.get(recordTable)!}, orderNumber,
recordCreate_userName, recordCreate_timeMillis, recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis) recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?)` values (?, ?, ?, ?, ?, ?)`
) )
.run( .run(
recordName, recordName,
orderNumber, orderNumber,
requestSession.user.userName, requestSession.user!.userName,
rightNowMillis, rightNowMillis,
requestSession.user.userName, requestSession.user!.userName,
rightNowMillis rightNowMillis
); )
database.close(); database.close()
clearCacheByTableName(recordTable); clearCacheByTableName(recordTable)
return result.lastInsertRowid as number; return result.lastInsertRowid as number
} }

View File

@ -1,4 +1,4 @@
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes';
interface AddWorkOrderForm { interface AddWorkOrderForm {
workOrderTypeId: number | string; workOrderTypeId: number | string;
workOrderNumber?: string; workOrderNumber?: string;

View File

@ -1,8 +1,8 @@
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 { getNextWorkOrderNumber } from "./getNextWorkOrderNumber.js"; import { getNextWorkOrderNumber } from './getNextWorkOrderNumber.js';
import { addWorkOrderLotOccupancy } from "./addWorkOrderLotOccupancy.js"; import { addWorkOrderLotOccupancy } from './addWorkOrderLotOccupancy.js';
import { dateStringToInteger, dateToInteger } from "@cityssm/expressjs-server-js/dateTimeFns.js"; import { dateStringToInteger, dateToInteger } from '@cityssm/expressjs-server-js/dateTimeFns.js';
export function addWorkOrder(workOrderForm, requestSession) { export function addWorkOrder(workOrderForm, requestSession) {
const database = sqlite(databasePath); const database = sqlite(databasePath);
const rightNow = new Date(); const rightNow = new Date();

View File

@ -1,78 +1,81 @@
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 { getNextWorkOrderNumber } from "./getNextWorkOrderNumber.js"; import { getNextWorkOrderNumber } from './getNextWorkOrderNumber.js'
import { addWorkOrderLotOccupancy } from "./addWorkOrderLotOccupancy.js"; import { addWorkOrderLotOccupancy } from './addWorkOrderLotOccupancy.js'
import { dateStringToInteger, dateToInteger } from "@cityssm/expressjs-server-js/dateTimeFns.js"; import {
dateStringToInteger,
dateToInteger
} from '@cityssm/expressjs-server-js/dateTimeFns.js'
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes'
interface AddWorkOrderForm { interface AddWorkOrderForm {
workOrderTypeId: number | string; workOrderTypeId: number | string
workOrderNumber?: string; workOrderNumber?: string
workOrderDescription: string; workOrderDescription: string
workOrderOpenDateString?: string; workOrderOpenDateString?: string
workOrderCloseDateString?: string; workOrderCloseDateString?: string
lotOccupancyId?: string; lotOccupancyId?: string
} }
export function addWorkOrder( export function addWorkOrder(
workOrderForm: AddWorkOrderForm, workOrderForm: AddWorkOrderForm,
requestSession: recordTypes.PartialSession requestSession: recordTypes.PartialSession
): number { ): number {
const database = sqlite(databasePath); const database = sqlite(databasePath)
const rightNow = new Date(); const rightNow = new Date()
let workOrderNumber = workOrderForm.workOrderNumber; let workOrderNumber = workOrderForm.workOrderNumber
if (!workOrderNumber) { if (!workOrderNumber) {
workOrderNumber = getNextWorkOrderNumber(database); workOrderNumber = getNextWorkOrderNumber(database)
} }
const result = database const result = database
.prepare( .prepare(
`insert into WorkOrders ( `insert into WorkOrders (
workOrderTypeId, workOrderNumber, workOrderDescription, workOrderTypeId, workOrderNumber, workOrderDescription,
workOrderOpenDate, workOrderCloseDate, workOrderOpenDate, workOrderCloseDate,
recordCreate_userName, recordCreate_timeMillis, recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis) recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?, ?, ?)` values (?, ?, ?, ?, ?, ?, ?, ?, ?)`
) )
.run( .run(
workOrderForm.workOrderTypeId, workOrderForm.workOrderTypeId,
workOrderNumber, workOrderNumber,
workOrderForm.workOrderDescription, workOrderForm.workOrderDescription,
workOrderForm.workOrderOpenDateString workOrderForm.workOrderOpenDateString
? dateStringToInteger(workOrderForm.workOrderOpenDateString) ? dateStringToInteger(workOrderForm.workOrderOpenDateString)
: dateToInteger(rightNow), : dateToInteger(rightNow),
workOrderForm.workOrderCloseDateString workOrderForm.workOrderCloseDateString
? dateStringToInteger(workOrderForm.workOrderCloseDateString) ? dateStringToInteger(workOrderForm.workOrderCloseDateString)
: undefined, : undefined,
requestSession.user.userName, requestSession.user!.userName,
rightNow.getTime(), rightNow.getTime(),
requestSession.user.userName, requestSession.user!.userName,
rightNow.getTime() rightNow.getTime()
); )
const workOrderId = result.lastInsertRowid as number; const workOrderId = result.lastInsertRowid as number
if (workOrderForm.lotOccupancyId) { if (workOrderForm.lotOccupancyId) {
addWorkOrderLotOccupancy( addWorkOrderLotOccupancy(
{ {
workOrderId, workOrderId,
lotOccupancyId: workOrderForm.lotOccupancyId lotOccupancyId: workOrderForm.lotOccupancyId
}, },
requestSession, requestSession,
database database
); )
} }
database.close(); database.close()
return workOrderId; return workOrderId
} }
export default addWorkOrder; export default addWorkOrder

View File

@ -1,4 +1,4 @@
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes';
interface AddWorkOrderCommentForm { interface AddWorkOrderCommentForm {
workOrderId: string; workOrderId: string;
workOrderComment: string; workOrderComment: string;

View File

@ -1,6 +1,6 @@
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 dateTimeFunctions from "@cityssm/expressjs-server-js/dateTimeFns.js"; import * as dateTimeFunctions from '@cityssm/expressjs-server-js/dateTimeFns.js';
export function addWorkOrderComment(workOrderCommentForm, requestSession) { export function addWorkOrderComment(workOrderCommentForm, requestSession) {
const database = sqlite(databasePath); const database = sqlite(databasePath);
const rightNow = new Date(); const rightNow = new Date();

View File

@ -1,48 +1,48 @@
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 dateTimeFunctions from "@cityssm/expressjs-server-js/dateTimeFns.js"; import * as dateTimeFunctions from '@cityssm/expressjs-server-js/dateTimeFns.js'
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes'
interface AddWorkOrderCommentForm { interface AddWorkOrderCommentForm {
workOrderId: string; workOrderId: string
workOrderComment: string; workOrderComment: string
} }
export function addWorkOrderComment( export function addWorkOrderComment(
workOrderCommentForm: AddWorkOrderCommentForm, workOrderCommentForm: AddWorkOrderCommentForm,
requestSession: recordTypes.PartialSession requestSession: recordTypes.PartialSession
): number { ): number {
const database = sqlite(databasePath); const database = sqlite(databasePath)
const rightNow = new Date(); const rightNow = new Date()
const result = database const result = database
.prepare( .prepare(
`insert into WorkOrderComments ( `insert into WorkOrderComments (
workOrderId, workOrderId,
workOrderCommentDate, workOrderCommentTime, workOrderCommentDate, workOrderCommentTime,
workOrderComment, workOrderComment,
recordCreate_userName, recordCreate_timeMillis, recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis) recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?, ?)` values (?, ?, ?, ?, ?, ?, ?, ?)`
) )
.run( .run(
workOrderCommentForm.workOrderId, workOrderCommentForm.workOrderId,
dateTimeFunctions.dateToInteger(rightNow), dateTimeFunctions.dateToInteger(rightNow),
dateTimeFunctions.dateToTimeInteger(rightNow), dateTimeFunctions.dateToTimeInteger(rightNow),
workOrderCommentForm.workOrderComment, workOrderCommentForm.workOrderComment,
requestSession.user.userName, requestSession.user!.userName,
rightNow.getTime(), rightNow.getTime(),
requestSession.user.userName, requestSession.user!.userName,
rightNow.getTime() rightNow.getTime()
); )
database.close(); database.close()
return result.lastInsertRowid as number; return result.lastInsertRowid as number
} }
export default addWorkOrderComment; export default addWorkOrderComment

View File

@ -1,4 +1,4 @@
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes';
interface AddWorkOrderLotForm { interface AddWorkOrderLotForm {
workOrderId: number | string; workOrderId: number | string;
lotId: number | string; lotId: number | string;

View File

@ -1,5 +1,5 @@
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';
export function addWorkOrderLot(workOrderLotForm, requestSession) { export function addWorkOrderLot(workOrderLotForm, requestSession) {
const database = sqlite(databasePath); const database = sqlite(databasePath);
const rightNowMillis = Date.now(); const rightNowMillis = Date.now();

View File

@ -1,36 +1,36 @@
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 type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes'
interface AddWorkOrderLotForm { interface AddWorkOrderLotForm {
workOrderId: number | string; workOrderId: number | string
lotId: number | string; lotId: number | string
} }
export function addWorkOrderLot( export function addWorkOrderLot(
workOrderLotForm: AddWorkOrderLotForm, workOrderLotForm: AddWorkOrderLotForm,
requestSession: recordTypes.PartialSession requestSession: recordTypes.PartialSession
): boolean { ): boolean {
const database = sqlite(databasePath); const database = sqlite(databasePath)
const rightNowMillis = Date.now(); const rightNowMillis = Date.now()
const row: { recordDelete_timeMillis?: number } = database const row: { recordDelete_timeMillis?: number } = database
.prepare( .prepare(
`select recordDelete_timeMillis `select recordDelete_timeMillis
from WorkOrderLots from WorkOrderLots
where workOrderId = ? where workOrderId = ?
and lotId = ?` and lotId = ?`
) )
.get(workOrderLotForm.workOrderId, workOrderLotForm.lotId); .get(workOrderLotForm.workOrderId, workOrderLotForm.lotId)
if (row) { if (row) {
if (row.recordDelete_timeMillis) { if (row.recordDelete_timeMillis) {
database database
.prepare( .prepare(
`update WorkOrderLots `update WorkOrderLots
set recordCreate_userName = ?, set recordCreate_userName = ?,
recordCreate_timeMillis = ?, recordCreate_timeMillis = ?,
recordUpdate_userName = ?, recordUpdate_userName = ?,
@ -39,38 +39,38 @@ export function addWorkOrderLot(
recordDelete_timeMillis = null recordDelete_timeMillis = null
where workOrderId = ? where workOrderId = ?
and lotId = ?` and lotId = ?`
) )
.run( .run(
requestSession.user.userName, requestSession.user!.userName,
rightNowMillis, rightNowMillis,
requestSession.user.userName, requestSession.user!.userName,
rightNowMillis, rightNowMillis,
workOrderLotForm.workOrderId, workOrderLotForm.workOrderId,
workOrderLotForm.lotId workOrderLotForm.lotId
); )
} }
} else { } else {
database database
.prepare( .prepare(
`insert into WorkOrderLots ( `insert into WorkOrderLots (
workOrderId, lotId, workOrderId, lotId,
recordCreate_userName, recordCreate_timeMillis, recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis) recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?)` values (?, ?, ?, ?, ?, ?)`
) )
.run( .run(
workOrderLotForm.workOrderId, workOrderLotForm.workOrderId,
workOrderLotForm.lotId, workOrderLotForm.lotId,
requestSession.user.userName, requestSession.user!.userName,
rightNowMillis, rightNowMillis,
requestSession.user.userName, requestSession.user!.userName,
rightNowMillis rightNowMillis
); )
} }
database.close(); database.close()
return true; return true
} }
export default addWorkOrderLot; export default addWorkOrderLot

View File

@ -1,5 +1,5 @@
import sqlite from "better-sqlite3"; import sqlite from 'better-sqlite3';
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes';
interface AddWorkOrderLotOccupancyForm { interface AddWorkOrderLotOccupancyForm {
workOrderId: number | string; workOrderId: number | string;
lotOccupancyId: number | string; lotOccupancyId: number | string;

View File

@ -1,7 +1,7 @@
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';
export function addWorkOrderLotOccupancy(workOrderLotOccupancyForm, requestSession, connectedDatabase) { export function addWorkOrderLotOccupancy(workOrderLotOccupancyForm, requestSession, connectedDatabase) {
const database = connectedDatabase || sqlite(databasePath); const database = connectedDatabase ?? sqlite(databasePath);
const rightNowMillis = Date.now(); const rightNowMillis = Date.now();
const row = database const row = database
.prepare(`select recordDelete_timeMillis .prepare(`select recordDelete_timeMillis

View File

@ -1,37 +1,40 @@
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 type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes'
interface AddWorkOrderLotOccupancyForm { interface AddWorkOrderLotOccupancyForm {
workOrderId: number | string; workOrderId: number | string
lotOccupancyId: number | string; lotOccupancyId: number | string
} }
export function addWorkOrderLotOccupancy( export function addWorkOrderLotOccupancy(
workOrderLotOccupancyForm: AddWorkOrderLotOccupancyForm, workOrderLotOccupancyForm: AddWorkOrderLotOccupancyForm,
requestSession: recordTypes.PartialSession, requestSession: recordTypes.PartialSession,
connectedDatabase?: sqlite.Database connectedDatabase?: sqlite.Database
): boolean { ): boolean {
const database = connectedDatabase || sqlite(databasePath); const database = connectedDatabase ?? sqlite(databasePath)
const rightNowMillis = Date.now(); const rightNowMillis = Date.now()
const row: { recordDelete_timeMillis?: number } = database const row: { recordDelete_timeMillis?: number } = database
.prepare( .prepare(
`select recordDelete_timeMillis `select recordDelete_timeMillis
from WorkOrderLotOccupancies from WorkOrderLotOccupancies
where workOrderId = ? where workOrderId = ?
and lotOccupancyId = ?` and lotOccupancyId = ?`
) )
.get(workOrderLotOccupancyForm.workOrderId, workOrderLotOccupancyForm.lotOccupancyId); .get(
workOrderLotOccupancyForm.workOrderId,
workOrderLotOccupancyForm.lotOccupancyId
)
if (row) { if (row) {
if (row.recordDelete_timeMillis) { if (row.recordDelete_timeMillis) {
database database
.prepare( .prepare(
`update WorkOrderLotOccupancies `update WorkOrderLotOccupancies
set recordCreate_userName = ?, set recordCreate_userName = ?,
recordCreate_timeMillis = ?, recordCreate_timeMillis = ?,
recordUpdate_userName = ?, recordUpdate_userName = ?,
@ -40,40 +43,40 @@ export function addWorkOrderLotOccupancy(
recordDelete_timeMillis = null recordDelete_timeMillis = null
where workOrderId = ? where workOrderId = ?
and lotOccupancyId = ?` and lotOccupancyId = ?`
) )
.run( .run(
requestSession.user.userName, requestSession.user!.userName,
rightNowMillis, rightNowMillis,
requestSession.user.userName, requestSession.user!.userName,
rightNowMillis, rightNowMillis,
workOrderLotOccupancyForm.workOrderId, workOrderLotOccupancyForm.workOrderId,
workOrderLotOccupancyForm.lotOccupancyId workOrderLotOccupancyForm.lotOccupancyId
); )
} }
} else { } else {
database database
.prepare( .prepare(
`insert into WorkOrderLotOccupancies ( `insert into WorkOrderLotOccupancies (
workOrderId, lotOccupancyId, workOrderId, lotOccupancyId,
recordCreate_userName, recordCreate_timeMillis, recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis) recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?)` values (?, ?, ?, ?, ?, ?)`
) )
.run( .run(
workOrderLotOccupancyForm.workOrderId, workOrderLotOccupancyForm.workOrderId,
workOrderLotOccupancyForm.lotOccupancyId, workOrderLotOccupancyForm.lotOccupancyId,
requestSession.user.userName, requestSession.user!.userName,
rightNowMillis, rightNowMillis,
requestSession.user.userName, requestSession.user!.userName,
rightNowMillis rightNowMillis
); )
} }
if (!connectedDatabase) { if (!connectedDatabase) {
database.close(); database.close()
} }
return true; return true
} }
export default addWorkOrderLotOccupancy; export default addWorkOrderLotOccupancy

View File

@ -1,4 +1,4 @@
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes';
interface AddWorkOrderMilestoneForm { interface AddWorkOrderMilestoneForm {
workOrderId: string | number; workOrderId: string | number;
workOrderMilestoneTypeId?: number | string; workOrderMilestoneTypeId?: number | string;

View File

@ -1,19 +1,19 @@
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 { dateStringToInteger, timeStringToInteger } from "@cityssm/expressjs-server-js/dateTimeFns.js"; import { dateStringToInteger, timeStringToInteger } from '@cityssm/expressjs-server-js/dateTimeFns.js';
export function addWorkOrderMilestone(milestoneForm, requestSession) { export function addWorkOrderMilestone(milestoneForm, requestSession) {
const rightNow = new Date(); const rightNow = new Date();
const database = sqlite(databasePath); const database = sqlite(databasePath);
const result = database const result = database
.prepare(`insert into WorkOrderMilestones ( .prepare(`insert into WorkOrderMilestones (
workOrderId, workOrderMilestoneTypeId, workOrderId, workOrderMilestoneTypeId,
workOrderMilestoneDate, workOrderMilestoneTime, workOrderMilestoneDate, workOrderMilestoneTime,
workOrderMilestoneDescription, workOrderMilestoneDescription,
workOrderMilestoneCompletionDate, workOrderMilestoneCompletionTime, workOrderMilestoneCompletionDate, workOrderMilestoneCompletionTime,
recordCreate_userName, recordCreate_timeMillis, recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis) recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
.run(milestoneForm.workOrderId, milestoneForm.workOrderMilestoneTypeId || undefined, dateStringToInteger(milestoneForm.workOrderMilestoneDateString), milestoneForm.workOrderMilestoneTimeString .run(milestoneForm.workOrderId, milestoneForm.workOrderMilestoneTypeId ?? undefined, dateStringToInteger(milestoneForm.workOrderMilestoneDateString), milestoneForm.workOrderMilestoneTimeString
? timeStringToInteger(milestoneForm.workOrderMilestoneTimeString) ? timeStringToInteger(milestoneForm.workOrderMilestoneTimeString)
: 0, milestoneForm.workOrderMilestoneDescription, milestoneForm.workOrderMilestoneCompletionDateString : 0, milestoneForm.workOrderMilestoneDescription, milestoneForm.workOrderMilestoneCompletionDateString
? dateStringToInteger(milestoneForm.workOrderMilestoneCompletionDateString) ? dateStringToInteger(milestoneForm.workOrderMilestoneCompletionDateString)

View File

@ -1,66 +1,72 @@
import sqlite from "better-sqlite3"; /* eslint-disable @typescript-eslint/indent */
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; import sqlite from 'better-sqlite3'
import { lotOccupancyDB as databasePath } from '../../data/databasePaths.js'
import { import {
dateStringToInteger, dateStringToInteger,
timeStringToInteger timeStringToInteger
} from "@cityssm/expressjs-server-js/dateTimeFns.js"; } from '@cityssm/expressjs-server-js/dateTimeFns.js'
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes'
interface AddWorkOrderMilestoneForm { interface AddWorkOrderMilestoneForm {
workOrderId: string | number; workOrderId: string | number
workOrderMilestoneTypeId?: number | string; workOrderMilestoneTypeId?: number | string
workOrderMilestoneDateString: string; workOrderMilestoneDateString: string
workOrderMilestoneTimeString?: string; workOrderMilestoneTimeString?: string
workOrderMilestoneDescription: string; workOrderMilestoneDescription: string
workOrderMilestoneCompletionDateString?: string; workOrderMilestoneCompletionDateString?: string
workOrderMilestoneCompletionTimeString?: string; workOrderMilestoneCompletionTimeString?: string
} }
export function addWorkOrderMilestone( export function addWorkOrderMilestone(
milestoneForm: AddWorkOrderMilestoneForm, milestoneForm: AddWorkOrderMilestoneForm,
requestSession: recordTypes.PartialSession requestSession: recordTypes.PartialSession
): number { ): number {
const rightNow = new Date(); const rightNow = new Date()
const database = sqlite(databasePath); const database = sqlite(databasePath)
const result = database const result = database
.prepare( .prepare(
`insert into WorkOrderMilestones ( `insert into WorkOrderMilestones (
workOrderId, workOrderMilestoneTypeId, workOrderId, workOrderMilestoneTypeId,
workOrderMilestoneDate, workOrderMilestoneTime, workOrderMilestoneDate, workOrderMilestoneTime,
workOrderMilestoneDescription, workOrderMilestoneDescription,
workOrderMilestoneCompletionDate, workOrderMilestoneCompletionTime, workOrderMilestoneCompletionDate, workOrderMilestoneCompletionTime,
recordCreate_userName, recordCreate_timeMillis, recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis) recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)` values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
) )
.run( .run(
milestoneForm.workOrderId, milestoneForm.workOrderId,
milestoneForm.workOrderMilestoneTypeId || undefined, milestoneForm.workOrderMilestoneTypeId ?? undefined,
dateStringToInteger(milestoneForm.workOrderMilestoneDateString), dateStringToInteger(milestoneForm.workOrderMilestoneDateString),
milestoneForm.workOrderMilestoneTimeString milestoneForm.workOrderMilestoneTimeString
? timeStringToInteger(milestoneForm.workOrderMilestoneTimeString) ? timeStringToInteger(milestoneForm.workOrderMilestoneTimeString)
: 0, : 0,
milestoneForm.workOrderMilestoneDescription, milestoneForm.workOrderMilestoneDescription,
milestoneForm.workOrderMilestoneCompletionDateString
? dateStringToInteger(
milestoneForm.workOrderMilestoneCompletionDateString milestoneForm.workOrderMilestoneCompletionDateString
? dateStringToInteger(milestoneForm.workOrderMilestoneCompletionDateString) )
: undefined, : undefined,
milestoneForm.workOrderMilestoneCompletionTimeString
? timeStringToInteger(
milestoneForm.workOrderMilestoneCompletionTimeString milestoneForm.workOrderMilestoneCompletionTimeString
? timeStringToInteger(milestoneForm.workOrderMilestoneCompletionTimeString) )
: undefined, : undefined,
requestSession.user.userName, requestSession.user!.userName,
rightNow.getTime(), rightNow.getTime(),
requestSession.user.userName, requestSession.user!.userName,
rightNow.getTime() rightNow.getTime()
); )
database.close(); database.close()
return result.lastInsertRowid as number; return result.lastInsertRowid as number
} }
export default addWorkOrderMilestone; export default addWorkOrderMilestone

View File

@ -1,4 +1,4 @@
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes';
export declare function cleanupDatabase(requestSession: recordTypes.PartialSession): { export declare function cleanupDatabase(requestSession: recordTypes.PartialSession): {
inactivedRecordCount: number; inactivedRecordCount: number;
purgedRecordCount: number; purgedRecordCount: number;

View File

@ -1,232 +1,234 @@
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 cleanupDatabase(requestSession) { export function cleanupDatabase(requestSession) {
const database = sqlite(databasePath); const database = sqlite(databasePath);
const rightNowMillis = Date.now(); const rightNowMillis = Date.now();
const recordDelete_timeMillisMin = rightNowMillis - const recordDeleteTimeMillisMin = rightNowMillis -
configFunctions.getProperty("settings.adminCleanup.recordDeleteAgeDays") * 86400 * 1000; configFunctions.getProperty('settings.adminCleanup.recordDeleteAgeDays') *
86400 *
1000;
let inactivedRecordCount = 0; let inactivedRecordCount = 0;
let purgedRecordCount = 0; let purgedRecordCount = 0;
inactivedRecordCount += database inactivedRecordCount += database
.prepare(`update WorkOrderComments .prepare(`update WorkOrderComments
set recordDelete_userName = ?, set recordDelete_userName = ?,
recordDelete_timeMillis = ? recordDelete_timeMillis = ?
where recordDelete_timeMillis is null where recordDelete_timeMillis is null
and workOrderId in ( and workOrderId in (
select workOrderId from WorkOrders where recordDelete_timeMillis is not null)`) select workOrderId from WorkOrders where recordDelete_timeMillis is not null)`)
.run(requestSession.user.userName, rightNowMillis).changes; .run(requestSession.user.userName, rightNowMillis).changes;
purgedRecordCount += database purgedRecordCount += database
.prepare("delete from WorkOrderComments where recordDelete_timeMillis <= ?") .prepare('delete from WorkOrderComments where recordDelete_timeMillis <= ?')
.run(recordDelete_timeMillisMin).changes; .run(recordDeleteTimeMillisMin).changes;
inactivedRecordCount += database inactivedRecordCount += database
.prepare(`update WorkOrderLotOccupancies .prepare(`update WorkOrderLotOccupancies
set recordDelete_userName = ?, set recordDelete_userName = ?,
recordDelete_timeMillis = ? recordDelete_timeMillis = ?
where recordDelete_timeMillis is null where recordDelete_timeMillis is null
and workOrderId in ( and workOrderId in (
select workOrderId from WorkOrders where recordDelete_timeMillis is not null)`) select workOrderId from WorkOrders where recordDelete_timeMillis is not null)`)
.run(requestSession.user.userName, rightNowMillis).changes; .run(requestSession.user.userName, rightNowMillis).changes;
purgedRecordCount += database purgedRecordCount += database
.prepare("delete from WorkOrderLotOccupancies where recordDelete_timeMillis <= ?") .prepare('delete from WorkOrderLotOccupancies where recordDelete_timeMillis <= ?')
.run(recordDelete_timeMillisMin).changes; .run(recordDeleteTimeMillisMin).changes;
inactivedRecordCount += database inactivedRecordCount += database
.prepare(`update WorkOrderLots .prepare(`update WorkOrderLots
set recordDelete_userName = ?, set recordDelete_userName = ?,
recordDelete_timeMillis = ? recordDelete_timeMillis = ?
where recordDelete_timeMillis is null where recordDelete_timeMillis is null
and workOrderId in ( and workOrderId in (
select workOrderId from WorkOrders where recordDelete_timeMillis is not null)`) select workOrderId from WorkOrders where recordDelete_timeMillis is not null)`)
.run(requestSession.user.userName, rightNowMillis).changes; .run(requestSession.user.userName, rightNowMillis).changes;
purgedRecordCount += database purgedRecordCount += database
.prepare("delete from WorkOrderLots where recordDelete_timeMillis <= ?") .prepare('delete from WorkOrderLots where recordDelete_timeMillis <= ?')
.run(recordDelete_timeMillisMin).changes; .run(recordDeleteTimeMillisMin).changes;
inactivedRecordCount += database inactivedRecordCount += database
.prepare(`update WorkOrderMilestones .prepare(`update WorkOrderMilestones
set recordDelete_userName = ?, set recordDelete_userName = ?,
recordDelete_timeMillis = ? recordDelete_timeMillis = ?
where recordDelete_timeMillis is null where recordDelete_timeMillis is null
and workOrderId in ( and workOrderId in (
select workOrderId from WorkOrders where recordDelete_timeMillis is not null)`) select workOrderId from WorkOrders where recordDelete_timeMillis is not null)`)
.run(requestSession.user.userName, rightNowMillis).changes; .run(requestSession.user.userName, rightNowMillis).changes;
purgedRecordCount += database purgedRecordCount += database
.prepare("delete from WorkOrderMilestones where recordDelete_timeMillis <= ?") .prepare('delete from WorkOrderMilestones where recordDelete_timeMillis <= ?')
.run(recordDelete_timeMillisMin).changes; .run(recordDeleteTimeMillisMin).changes;
purgedRecordCount += database purgedRecordCount += database
.prepare(`delete from WorkOrders .prepare(`delete from WorkOrders
where recordDelete_timeMillis <= ? where recordDelete_timeMillis <= ?
and workOrderId not in (select workOrderId from WorkOrderComments) and workOrderId not in (select workOrderId from WorkOrderComments)
and workOrderId not in (select workOrderId from WorkOrderLotOccupancies) and workOrderId not in (select workOrderId from WorkOrderLotOccupancies)
and workOrderId not in (select workOrderId from WorkOrderLots) and workOrderId not in (select workOrderId from WorkOrderLots)
and workOrderId not in (select workOrderId from WorkOrderMilestones)`) and workOrderId not in (select workOrderId from WorkOrderMilestones)`)
.run(recordDelete_timeMillisMin).changes; .run(recordDeleteTimeMillisMin).changes;
purgedRecordCount += database purgedRecordCount += database
.prepare(`delete from WorkOrderMilestoneTypes .prepare(`delete from WorkOrderMilestoneTypes
where recordDelete_timeMillis <= ? where recordDelete_timeMillis <= ?
and workOrderMilestoneTypeId not in ( and workOrderMilestoneTypeId not in (
select workOrderMilestoneTypeId from WorkOrderMilestones)`) select workOrderMilestoneTypeId from WorkOrderMilestones)`)
.run(recordDelete_timeMillisMin).changes; .run(recordDeleteTimeMillisMin).changes;
purgedRecordCount += database purgedRecordCount += database
.prepare(`delete from WorkOrderTypes .prepare(`delete from WorkOrderTypes
where recordDelete_timeMillis <= ? where recordDelete_timeMillis <= ?
and workOrderTypeId not in (select workOrderTypeId from WorkOrders)`) and workOrderTypeId not in (select workOrderTypeId from WorkOrders)`)
.run(recordDelete_timeMillisMin).changes; .run(recordDeleteTimeMillisMin).changes;
inactivedRecordCount += database inactivedRecordCount += database
.prepare(`update LotOccupancyComments .prepare(`update LotOccupancyComments
set recordDelete_userName = ?, set recordDelete_userName = ?,
recordDelete_timeMillis = ? recordDelete_timeMillis = ?
where recordDelete_timeMillis is null where recordDelete_timeMillis is null
and lotOccupancyId in ( and lotOccupancyId in (
select lotOccupancyId from LotOccupancies where recordDelete_timeMillis is not null)`) select lotOccupancyId from LotOccupancies where recordDelete_timeMillis is not null)`)
.run(requestSession.user.userName, rightNowMillis).changes; .run(requestSession.user.userName, rightNowMillis).changes;
purgedRecordCount += database purgedRecordCount += database
.prepare("delete from LotOccupancyComments where recordDelete_timeMillis <= ?") .prepare('delete from LotOccupancyComments where recordDelete_timeMillis <= ?')
.run(recordDelete_timeMillisMin).changes; .run(recordDeleteTimeMillisMin).changes;
inactivedRecordCount += database inactivedRecordCount += database
.prepare(`update LotOccupancyFields .prepare(`update LotOccupancyFields
set recordDelete_userName = ?, set recordDelete_userName = ?,
recordDelete_timeMillis = ? recordDelete_timeMillis = ?
where recordDelete_timeMillis is null where recordDelete_timeMillis is null
and lotOccupancyId in (select lotOccupancyId from LotOccupancies where recordDelete_timeMillis is not null)`) and lotOccupancyId in (select lotOccupancyId from LotOccupancies where recordDelete_timeMillis is not null)`)
.run(requestSession.user.userName, rightNowMillis).changes; .run(requestSession.user.userName, rightNowMillis).changes;
purgedRecordCount += database purgedRecordCount += database
.prepare("delete from LotOccupancyFields where recordDelete_timeMillis <= ?") .prepare('delete from LotOccupancyFields where recordDelete_timeMillis <= ?')
.run(recordDelete_timeMillisMin).changes; .run(recordDeleteTimeMillisMin).changes;
inactivedRecordCount += database inactivedRecordCount += database
.prepare(`update LotOccupancyOccupants .prepare(`update LotOccupancyOccupants
set recordDelete_userName = ?, set recordDelete_userName = ?,
recordDelete_timeMillis = ? recordDelete_timeMillis = ?
where recordDelete_timeMillis is null where recordDelete_timeMillis is null
and lotOccupancyId in (select lotOccupancyId from LotOccupancies where recordDelete_timeMillis is not null)`) and lotOccupancyId in (select lotOccupancyId from LotOccupancies where recordDelete_timeMillis is not null)`)
.run(requestSession.user.userName, rightNowMillis).changes; .run(requestSession.user.userName, rightNowMillis).changes;
purgedRecordCount += database purgedRecordCount += database
.prepare("delete from LotOccupancyOccupants where recordDelete_timeMillis <= ?") .prepare('delete from LotOccupancyOccupants where recordDelete_timeMillis <= ?')
.run(recordDelete_timeMillisMin).changes; .run(recordDeleteTimeMillisMin).changes;
purgedRecordCount += database purgedRecordCount += database
.prepare("delete from LotOccupancyFees where recordDelete_timeMillis <= ?") .prepare('delete from LotOccupancyFees where recordDelete_timeMillis <= ?')
.run(recordDelete_timeMillisMin).changes; .run(recordDeleteTimeMillisMin).changes;
purgedRecordCount += database purgedRecordCount += database
.prepare("delete from LotOccupancyTransactions where recordDelete_timeMillis <= ?") .prepare('delete from LotOccupancyTransactions where recordDelete_timeMillis <= ?')
.run(recordDelete_timeMillisMin).changes; .run(recordDeleteTimeMillisMin).changes;
purgedRecordCount += database purgedRecordCount += database
.prepare(`delete from LotOccupancies .prepare(`delete from LotOccupancies
where recordDelete_timeMillis <= ? where recordDelete_timeMillis <= ?
and lotOccupancyId not in (select lotOccupancyId from LotOccupancyComments) and lotOccupancyId not in (select lotOccupancyId from LotOccupancyComments)
and lotOccupancyId not in (select lotOccupancyId from LotOccupancyFees) and lotOccupancyId not in (select lotOccupancyId from LotOccupancyFees)
and lotOccupancyId not in (select lotOccupancyId from LotOccupancyFields) and lotOccupancyId not in (select lotOccupancyId from LotOccupancyFields)
and lotOccupancyId not in (select lotOccupancyId from LotOccupancyOccupants) and lotOccupancyId not in (select lotOccupancyId from LotOccupancyOccupants)
and lotOccupancyId not in (select lotOccupancyId from LotOccupancyTransactions) and lotOccupancyId not in (select lotOccupancyId from LotOccupancyTransactions)
and lotOccupancyId not in (select lotOccupancyId from WorkOrderLotOccupancies)`) and lotOccupancyId not in (select lotOccupancyId from WorkOrderLotOccupancies)`)
.run(recordDelete_timeMillisMin).changes; .run(recordDeleteTimeMillisMin).changes;
inactivedRecordCount += database inactivedRecordCount += database
.prepare(`update Fees .prepare(`update Fees
set recordDelete_userName = ?, set recordDelete_userName = ?,
recordDelete_timeMillis = ? recordDelete_timeMillis = ?
where recordDelete_timeMillis is null where recordDelete_timeMillis is null
and feeCategoryId in (select feeCategoryId from FeeCategories where recordDelete_timeMillis is not null)`) and feeCategoryId in (select feeCategoryId from FeeCategories where recordDelete_timeMillis is not null)`)
.run(requestSession.user.userName, rightNowMillis).changes; .run(requestSession.user.userName, rightNowMillis).changes;
purgedRecordCount += database purgedRecordCount += database
.prepare(`delete from Fees .prepare(`delete from Fees
where recordDelete_timeMillis <= ? where recordDelete_timeMillis <= ?
and feeId not in (select feeId from LotOccupancyFees)`) and feeId not in (select feeId from LotOccupancyFees)`)
.run(recordDelete_timeMillisMin).changes; .run(recordDeleteTimeMillisMin).changes;
purgedRecordCount += database purgedRecordCount += database
.prepare(`delete from FeeCategories .prepare(`delete from FeeCategories
where recordDelete_timeMillis <= ? where recordDelete_timeMillis <= ?
and feeCategoryId not in (select feeCategoryId from Fees)`) and feeCategoryId not in (select feeCategoryId from Fees)`)
.run(recordDelete_timeMillisMin).changes; .run(recordDeleteTimeMillisMin).changes;
inactivedRecordCount += database inactivedRecordCount += database
.prepare(`update OccupancyTypeFields .prepare(`update OccupancyTypeFields
set recordDelete_userName = ?, set recordDelete_userName = ?,
recordDelete_timeMillis = ? recordDelete_timeMillis = ?
where recordDelete_timeMillis is null where recordDelete_timeMillis is null
and occupancyTypeId in (select occupancyTypeId from OccupancyTypes where recordDelete_timeMillis is not null)`) and occupancyTypeId in (select occupancyTypeId from OccupancyTypes where recordDelete_timeMillis is not null)`)
.run(requestSession.user.userName, rightNowMillis).changes; .run(requestSession.user.userName, rightNowMillis).changes;
purgedRecordCount += database purgedRecordCount += database
.prepare(`delete from OccupancyTypeFields .prepare(`delete from OccupancyTypeFields
where recordDelete_timeMillis <= ? where recordDelete_timeMillis <= ?
and occupancyTypeFieldId not in (select occupancyTypeFieldId from LotOccupancyFields)`) and occupancyTypeFieldId not in (select occupancyTypeFieldId from LotOccupancyFields)`)
.run(recordDelete_timeMillisMin).changes; .run(recordDeleteTimeMillisMin).changes;
inactivedRecordCount += database inactivedRecordCount += database
.prepare(`update OccupancyTypePrints .prepare(`update OccupancyTypePrints
set recordDelete_userName = ?, set recordDelete_userName = ?,
recordDelete_timeMillis = ? recordDelete_timeMillis = ?
where recordDelete_timeMillis is null where recordDelete_timeMillis is null
and occupancyTypeId in (select occupancyTypeId from OccupancyTypes where recordDelete_timeMillis is not null)`) and occupancyTypeId in (select occupancyTypeId from OccupancyTypes where recordDelete_timeMillis is not null)`)
.run(requestSession.user.userName, rightNowMillis).changes; .run(requestSession.user.userName, rightNowMillis).changes;
purgedRecordCount += database purgedRecordCount += database
.prepare("delete from OccupancyTypePrints where recordDelete_timeMillis <= ?") .prepare('delete from OccupancyTypePrints where recordDelete_timeMillis <= ?')
.run(recordDelete_timeMillisMin).changes; .run(recordDeleteTimeMillisMin).changes;
purgedRecordCount += database purgedRecordCount += database
.prepare(`delete from OccupancyTypes .prepare(`delete from OccupancyTypes
where recordDelete_timeMillis <= ? where recordDelete_timeMillis <= ?
and occupancyTypeId not in (select occupancyTypeId from OccupancyTypeFields) and occupancyTypeId not in (select occupancyTypeId from OccupancyTypeFields)
and occupancyTypeId not in (select occupancyTypeId from OccupancyTypePrints) and occupancyTypeId not in (select occupancyTypeId from OccupancyTypePrints)
and occupancyTypeId not in (select occupancyTypeId from LotOccupancies) and occupancyTypeId not in (select occupancyTypeId from LotOccupancies)
and occupancyTypeId not in (select occupancyTypeId from Fees)`) and occupancyTypeId not in (select occupancyTypeId from Fees)`)
.run(recordDelete_timeMillisMin).changes; .run(recordDeleteTimeMillisMin).changes;
purgedRecordCount += database purgedRecordCount += database
.prepare(`delete from LotOccupantTypes .prepare(`delete from LotOccupantTypes
where recordDelete_timeMillis <= ? where recordDelete_timeMillis <= ?
and lotOccupantTypeId not in (select lotOccupantTypeId from LotOccupancyOccupants)`) and lotOccupantTypeId not in (select lotOccupantTypeId from LotOccupancyOccupants)`)
.run(recordDelete_timeMillisMin).changes; .run(recordDeleteTimeMillisMin).changes;
inactivedRecordCount += database inactivedRecordCount += database
.prepare(`update LotComments .prepare(`update LotComments
set recordDelete_userName = ?, set recordDelete_userName = ?,
recordDelete_timeMillis = ? recordDelete_timeMillis = ?
where recordDelete_timeMillis is null where recordDelete_timeMillis is null
and lotId in (select lotId from Lots where recordDelete_timeMillis is not null)`) and lotId in (select lotId from Lots where recordDelete_timeMillis is not null)`)
.run(requestSession.user.userName, rightNowMillis).changes; .run(requestSession.user.userName, rightNowMillis).changes;
purgedRecordCount += database purgedRecordCount += database
.prepare("delete from LotComments where recordDelete_timeMillis <= ?") .prepare('delete from LotComments where recordDelete_timeMillis <= ?')
.run(recordDelete_timeMillisMin).changes; .run(recordDeleteTimeMillisMin).changes;
inactivedRecordCount += database inactivedRecordCount += database
.prepare(`update LotFields .prepare(`update LotFields
set recordDelete_userName = ?, set recordDelete_userName = ?,
recordDelete_timeMillis = ? recordDelete_timeMillis = ?
where recordDelete_timeMillis is null where recordDelete_timeMillis is null
and lotId in (select lotId from Lots where recordDelete_timeMillis is not null)`) and lotId in (select lotId from Lots where recordDelete_timeMillis is not null)`)
.run(requestSession.user.userName, rightNowMillis).changes; .run(requestSession.user.userName, rightNowMillis).changes;
purgedRecordCount += database purgedRecordCount += database
.prepare("delete from LotFields where recordDelete_timeMillis <= ?") .prepare('delete from LotFields where recordDelete_timeMillis <= ?')
.run(recordDelete_timeMillisMin).changes; .run(recordDeleteTimeMillisMin).changes;
inactivedRecordCount += database inactivedRecordCount += database
.prepare(`update Lots .prepare(`update Lots
set recordDelete_userName = ?, set recordDelete_userName = ?,
recordDelete_timeMillis = ? recordDelete_timeMillis = ?
where recordDelete_timeMillis is null where recordDelete_timeMillis is null
and mapId in (select mapId from Maps where recordDelete_timeMillis is not null)`) and mapId in (select mapId from Maps where recordDelete_timeMillis is not null)`)
.run(requestSession.user.userName, rightNowMillis).changes; .run(requestSession.user.userName, rightNowMillis).changes;
purgedRecordCount += database purgedRecordCount += database
.prepare(`delete from Lots .prepare(`delete from Lots
where recordDelete_timeMillis <= ? where recordDelete_timeMillis <= ?
and lotId not in (select lotId from LotComments) and lotId not in (select lotId from LotComments)
and lotId not in (select lotId from LotFields) and lotId not in (select lotId from LotFields)
and lotId not in (select lotId from LotOccupancies) and lotId not in (select lotId from LotOccupancies)
and lotId not in (select lotId from WorkOrderLots)`) and lotId not in (select lotId from WorkOrderLots)`)
.run(recordDelete_timeMillisMin).changes; .run(recordDeleteTimeMillisMin).changes;
purgedRecordCount += database purgedRecordCount += database
.prepare(`delete from LotStatuses .prepare(`delete from LotStatuses
where recordDelete_timeMillis <= ? where recordDelete_timeMillis <= ?
and lotStatusId not in (select lotStatusId from Lots)`) and lotStatusId not in (select lotStatusId from Lots)`)
.run(recordDelete_timeMillisMin).changes; .run(recordDeleteTimeMillisMin).changes;
inactivedRecordCount += database inactivedRecordCount += database
.prepare(`update LotTypeFields .prepare(`update LotTypeFields
set recordDelete_userName = ?, set recordDelete_userName = ?,
recordDelete_timeMillis = ? recordDelete_timeMillis = ?
where recordDelete_timeMillis is null where recordDelete_timeMillis is null
and lotTypeId in (select lotTypeId from LotTypes where recordDelete_timeMillis is not null)`) and lotTypeId in (select lotTypeId from LotTypes where recordDelete_timeMillis is not null)`)
.run(requestSession.user.userName, rightNowMillis).changes; .run(requestSession.user.userName, rightNowMillis).changes;
purgedRecordCount += database purgedRecordCount += database
.prepare(`delete from LotTypeFields .prepare(`delete from LotTypeFields
where recordDelete_timeMillis <= ? where recordDelete_timeMillis <= ?
and lotTypeFieldId not in (select lotTypeFieldId from LotFields)`) and lotTypeFieldId not in (select lotTypeFieldId from LotFields)`)
.run(recordDelete_timeMillisMin).changes; .run(recordDeleteTimeMillisMin).changes;
purgedRecordCount += database purgedRecordCount += database
.prepare(`delete from LotTypes .prepare(`delete from LotTypes
where recordDelete_timeMillis <= ? where recordDelete_timeMillis <= ?
and lotTypeId not in (select lotTypeId from Lots)`) and lotTypeId not in (select lotTypeId from Lots)`)
.run(recordDelete_timeMillisMin).changes; .run(recordDeleteTimeMillisMin).changes;
database.close(); database.close();
return { return {
inactivedRecordCount, inactivedRecordCount,

View File

@ -1,437 +1,456 @@
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'
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes'
export function cleanupDatabase(requestSession: recordTypes.PartialSession) { export function cleanupDatabase(requestSession: recordTypes.PartialSession): {
const database = sqlite(databasePath); inactivedRecordCount: number
purgedRecordCount: number
const rightNowMillis = Date.now(); } {
const recordDelete_timeMillisMin = const database = sqlite(databasePath)
rightNowMillis -
configFunctions.getProperty("settings.adminCleanup.recordDeleteAgeDays") * 86_400 * 1000; const rightNowMillis = Date.now()
const recordDeleteTimeMillisMin =
let inactivedRecordCount = 0; rightNowMillis -
let purgedRecordCount = 0; configFunctions.getProperty('settings.adminCleanup.recordDeleteAgeDays') *
86_400 *
/* 1000
* Work Order Comments
*/ let inactivedRecordCount = 0
let purgedRecordCount = 0
inactivedRecordCount += database
.prepare( /*
`update WorkOrderComments * Work Order Comments
set recordDelete_userName = ?, */
recordDelete_timeMillis = ?
where recordDelete_timeMillis is null inactivedRecordCount += database
and workOrderId in ( .prepare(
select workOrderId from WorkOrders where recordDelete_timeMillis is not null)` `update WorkOrderComments
) set recordDelete_userName = ?,
.run(requestSession.user.userName, rightNowMillis).changes; recordDelete_timeMillis = ?
where recordDelete_timeMillis is null
purgedRecordCount += database and workOrderId in (
.prepare("delete from WorkOrderComments where recordDelete_timeMillis <= ?") select workOrderId from WorkOrders where recordDelete_timeMillis is not null)`
.run(recordDelete_timeMillisMin).changes; )
.run(requestSession.user!.userName, rightNowMillis).changes
/*
* Work Order Lot Occupancies purgedRecordCount += database
*/ .prepare('delete from WorkOrderComments where recordDelete_timeMillis <= ?')
.run(recordDeleteTimeMillisMin).changes
inactivedRecordCount += database
.prepare( /*
`update WorkOrderLotOccupancies * Work Order Lot Occupancies
set recordDelete_userName = ?, */
recordDelete_timeMillis = ?
where recordDelete_timeMillis is null inactivedRecordCount += database
and workOrderId in ( .prepare(
select workOrderId from WorkOrders where recordDelete_timeMillis is not null)` `update WorkOrderLotOccupancies
) set recordDelete_userName = ?,
.run(requestSession.user.userName, rightNowMillis).changes; recordDelete_timeMillis = ?
where recordDelete_timeMillis is null
purgedRecordCount += database and workOrderId in (
.prepare("delete from WorkOrderLotOccupancies where recordDelete_timeMillis <= ?") select workOrderId from WorkOrders where recordDelete_timeMillis is not null)`
.run(recordDelete_timeMillisMin).changes; )
.run(requestSession.user!.userName, rightNowMillis).changes
/*
* Work Order Lots purgedRecordCount += database
*/ .prepare(
'delete from WorkOrderLotOccupancies where recordDelete_timeMillis <= ?'
inactivedRecordCount += database )
.prepare( .run(recordDeleteTimeMillisMin).changes
`update WorkOrderLots
set recordDelete_userName = ?, /*
recordDelete_timeMillis = ? * Work Order Lots
where recordDelete_timeMillis is null */
and workOrderId in (
select workOrderId from WorkOrders where recordDelete_timeMillis is not null)` inactivedRecordCount += database
) .prepare(
.run(requestSession.user.userName, rightNowMillis).changes; `update WorkOrderLots
set recordDelete_userName = ?,
purgedRecordCount += database recordDelete_timeMillis = ?
.prepare("delete from WorkOrderLots where recordDelete_timeMillis <= ?") where recordDelete_timeMillis is null
.run(recordDelete_timeMillisMin).changes; and workOrderId in (
select workOrderId from WorkOrders where recordDelete_timeMillis is not null)`
/* )
* Work Order Milestones .run(requestSession.user!.userName, rightNowMillis).changes
*/
purgedRecordCount += database
inactivedRecordCount += database .prepare('delete from WorkOrderLots where recordDelete_timeMillis <= ?')
.prepare( .run(recordDeleteTimeMillisMin).changes
`update WorkOrderMilestones
set recordDelete_userName = ?, /*
recordDelete_timeMillis = ? * Work Order Milestones
where recordDelete_timeMillis is null */
and workOrderId in (
select workOrderId from WorkOrders where recordDelete_timeMillis is not null)` inactivedRecordCount += database
) .prepare(
.run(requestSession.user.userName, rightNowMillis).changes; `update WorkOrderMilestones
set recordDelete_userName = ?,
purgedRecordCount += database recordDelete_timeMillis = ?
.prepare("delete from WorkOrderMilestones where recordDelete_timeMillis <= ?") where recordDelete_timeMillis is null
.run(recordDelete_timeMillisMin).changes; and workOrderId in (
select workOrderId from WorkOrders where recordDelete_timeMillis is not null)`
/* )
* Work Orders .run(requestSession.user!.userName, rightNowMillis).changes
*/
purgedRecordCount += database
purgedRecordCount += database .prepare(
.prepare( 'delete from WorkOrderMilestones where recordDelete_timeMillis <= ?'
`delete from WorkOrders )
where recordDelete_timeMillis <= ? .run(recordDeleteTimeMillisMin).changes
and workOrderId not in (select workOrderId from WorkOrderComments)
and workOrderId not in (select workOrderId from WorkOrderLotOccupancies) /*
and workOrderId not in (select workOrderId from WorkOrderLots) * Work Orders
and workOrderId not in (select workOrderId from WorkOrderMilestones)` */
)
.run(recordDelete_timeMillisMin).changes; purgedRecordCount += database
.prepare(
/* `delete from WorkOrders
* Work Order Milestone Types where recordDelete_timeMillis <= ?
*/ and workOrderId not in (select workOrderId from WorkOrderComments)
and workOrderId not in (select workOrderId from WorkOrderLotOccupancies)
purgedRecordCount += database and workOrderId not in (select workOrderId from WorkOrderLots)
.prepare( and workOrderId not in (select workOrderId from WorkOrderMilestones)`
`delete from WorkOrderMilestoneTypes )
where recordDelete_timeMillis <= ? .run(recordDeleteTimeMillisMin).changes
and workOrderMilestoneTypeId not in (
select workOrderMilestoneTypeId from WorkOrderMilestones)` /*
) * Work Order Milestone Types
.run(recordDelete_timeMillisMin).changes; */
/* purgedRecordCount += database
* Work Order Types .prepare(
*/ `delete from WorkOrderMilestoneTypes
where recordDelete_timeMillis <= ?
purgedRecordCount += database and workOrderMilestoneTypeId not in (
.prepare( select workOrderMilestoneTypeId from WorkOrderMilestones)`
`delete from WorkOrderTypes )
where recordDelete_timeMillis <= ? .run(recordDeleteTimeMillisMin).changes
and workOrderTypeId not in (select workOrderTypeId from WorkOrders)`
) /*
.run(recordDelete_timeMillisMin).changes; * Work Order Types
*/
/*
* Lot Occupancy Comments purgedRecordCount += database
*/ .prepare(
`delete from WorkOrderTypes
inactivedRecordCount += database where recordDelete_timeMillis <= ?
.prepare( and workOrderTypeId not in (select workOrderTypeId from WorkOrders)`
`update LotOccupancyComments )
set recordDelete_userName = ?, .run(recordDeleteTimeMillisMin).changes
recordDelete_timeMillis = ?
where recordDelete_timeMillis is null /*
and lotOccupancyId in ( * Lot Occupancy Comments
select lotOccupancyId from LotOccupancies where recordDelete_timeMillis is not null)` */
)
.run(requestSession.user.userName, rightNowMillis).changes; inactivedRecordCount += database
.prepare(
purgedRecordCount += database `update LotOccupancyComments
.prepare("delete from LotOccupancyComments where recordDelete_timeMillis <= ?") set recordDelete_userName = ?,
.run(recordDelete_timeMillisMin).changes; recordDelete_timeMillis = ?
where recordDelete_timeMillis is null
/* and lotOccupancyId in (
* Lot Occupancy Fields select lotOccupancyId from LotOccupancies where recordDelete_timeMillis is not null)`
*/ )
.run(requestSession.user!.userName, rightNowMillis).changes
inactivedRecordCount += database
.prepare( purgedRecordCount += database
`update LotOccupancyFields .prepare(
set recordDelete_userName = ?, 'delete from LotOccupancyComments where recordDelete_timeMillis <= ?'
recordDelete_timeMillis = ? )
where recordDelete_timeMillis is null .run(recordDeleteTimeMillisMin).changes
and lotOccupancyId in (select lotOccupancyId from LotOccupancies where recordDelete_timeMillis is not null)`
) /*
.run(requestSession.user.userName, rightNowMillis).changes; * Lot Occupancy Fields
*/
purgedRecordCount += database
.prepare("delete from LotOccupancyFields where recordDelete_timeMillis <= ?") inactivedRecordCount += database
.run(recordDelete_timeMillisMin).changes; .prepare(
`update LotOccupancyFields
/* set recordDelete_userName = ?,
* Lot Occupancy Occupants recordDelete_timeMillis = ?
*/ where recordDelete_timeMillis is null
and lotOccupancyId in (select lotOccupancyId from LotOccupancies where recordDelete_timeMillis is not null)`
inactivedRecordCount += database )
.prepare( .run(requestSession.user!.userName, rightNowMillis).changes
`update LotOccupancyOccupants
set recordDelete_userName = ?, purgedRecordCount += database
recordDelete_timeMillis = ? .prepare(
where recordDelete_timeMillis is null 'delete from LotOccupancyFields where recordDelete_timeMillis <= ?'
and lotOccupancyId in (select lotOccupancyId from LotOccupancies where recordDelete_timeMillis is not null)` )
) .run(recordDeleteTimeMillisMin).changes
.run(requestSession.user.userName, rightNowMillis).changes;
/*
purgedRecordCount += database * Lot Occupancy Occupants
.prepare("delete from LotOccupancyOccupants where recordDelete_timeMillis <= ?") */
.run(recordDelete_timeMillisMin).changes;
inactivedRecordCount += database
/* .prepare(
* Lot Occupancy Fees/Transactions `update LotOccupancyOccupants
* - Maintain financials, do not delete related. set recordDelete_userName = ?,
*/ recordDelete_timeMillis = ?
where recordDelete_timeMillis is null
purgedRecordCount += database and lotOccupancyId in (select lotOccupancyId from LotOccupancies where recordDelete_timeMillis is not null)`
.prepare("delete from LotOccupancyFees where recordDelete_timeMillis <= ?") )
.run(recordDelete_timeMillisMin).changes; .run(requestSession.user!.userName, rightNowMillis).changes
purgedRecordCount += database purgedRecordCount += database
.prepare("delete from LotOccupancyTransactions where recordDelete_timeMillis <= ?") .prepare(
.run(recordDelete_timeMillisMin).changes; 'delete from LotOccupancyOccupants where recordDelete_timeMillis <= ?'
)
/* .run(recordDeleteTimeMillisMin).changes
* Lot Occupancies
*/ /*
* Lot Occupancy Fees/Transactions
purgedRecordCount += database * - Maintain financials, do not delete related.
.prepare( */
`delete from LotOccupancies
where recordDelete_timeMillis <= ? purgedRecordCount += database
and lotOccupancyId not in (select lotOccupancyId from LotOccupancyComments) .prepare('delete from LotOccupancyFees where recordDelete_timeMillis <= ?')
and lotOccupancyId not in (select lotOccupancyId from LotOccupancyFees) .run(recordDeleteTimeMillisMin).changes
and lotOccupancyId not in (select lotOccupancyId from LotOccupancyFields)
and lotOccupancyId not in (select lotOccupancyId from LotOccupancyOccupants) purgedRecordCount += database
and lotOccupancyId not in (select lotOccupancyId from LotOccupancyTransactions) .prepare(
and lotOccupancyId not in (select lotOccupancyId from WorkOrderLotOccupancies)` 'delete from LotOccupancyTransactions where recordDelete_timeMillis <= ?'
) )
.run(recordDelete_timeMillisMin).changes; .run(recordDeleteTimeMillisMin).changes
/* /*
* Fees * Lot Occupancies
*/ */
inactivedRecordCount += database purgedRecordCount += database
.prepare( .prepare(
`update Fees `delete from LotOccupancies
set recordDelete_userName = ?, where recordDelete_timeMillis <= ?
recordDelete_timeMillis = ? and lotOccupancyId not in (select lotOccupancyId from LotOccupancyComments)
where recordDelete_timeMillis is null and lotOccupancyId not in (select lotOccupancyId from LotOccupancyFees)
and feeCategoryId in (select feeCategoryId from FeeCategories where recordDelete_timeMillis is not null)` and lotOccupancyId not in (select lotOccupancyId from LotOccupancyFields)
) and lotOccupancyId not in (select lotOccupancyId from LotOccupancyOccupants)
.run(requestSession.user.userName, rightNowMillis).changes; and lotOccupancyId not in (select lotOccupancyId from LotOccupancyTransactions)
and lotOccupancyId not in (select lotOccupancyId from WorkOrderLotOccupancies)`
purgedRecordCount += database )
.prepare( .run(recordDeleteTimeMillisMin).changes
`delete from Fees
where recordDelete_timeMillis <= ? /*
and feeId not in (select feeId from LotOccupancyFees)` * Fees
) */
.run(recordDelete_timeMillisMin).changes;
inactivedRecordCount += database
/* .prepare(
* Fee Categories `update Fees
*/ set recordDelete_userName = ?,
recordDelete_timeMillis = ?
purgedRecordCount += database where recordDelete_timeMillis is null
.prepare( and feeCategoryId in (select feeCategoryId from FeeCategories where recordDelete_timeMillis is not null)`
`delete from FeeCategories )
where recordDelete_timeMillis <= ? .run(requestSession.user!.userName, rightNowMillis).changes
and feeCategoryId not in (select feeCategoryId from Fees)`
) purgedRecordCount += database
.run(recordDelete_timeMillisMin).changes; .prepare(
`delete from Fees
/* where recordDelete_timeMillis <= ?
* Occupancy Type Fields and feeId not in (select feeId from LotOccupancyFees)`
*/ )
.run(recordDeleteTimeMillisMin).changes
inactivedRecordCount += database
.prepare( /*
`update OccupancyTypeFields * Fee Categories
set recordDelete_userName = ?, */
recordDelete_timeMillis = ?
where recordDelete_timeMillis is null purgedRecordCount += database
and occupancyTypeId in (select occupancyTypeId from OccupancyTypes where recordDelete_timeMillis is not null)` .prepare(
) `delete from FeeCategories
.run(requestSession.user.userName, rightNowMillis).changes; where recordDelete_timeMillis <= ?
and feeCategoryId not in (select feeCategoryId from Fees)`
purgedRecordCount += database )
.prepare( .run(recordDeleteTimeMillisMin).changes
`delete from OccupancyTypeFields
where recordDelete_timeMillis <= ? /*
and occupancyTypeFieldId not in (select occupancyTypeFieldId from LotOccupancyFields)` * Occupancy Type Fields
) */
.run(recordDelete_timeMillisMin).changes;
inactivedRecordCount += database
/* .prepare(
* Occupancy Type Prints `update OccupancyTypeFields
*/ set recordDelete_userName = ?,
recordDelete_timeMillis = ?
inactivedRecordCount += database where recordDelete_timeMillis is null
.prepare( and occupancyTypeId in (select occupancyTypeId from OccupancyTypes where recordDelete_timeMillis is not null)`
`update OccupancyTypePrints )
set recordDelete_userName = ?, .run(requestSession.user!.userName, rightNowMillis).changes
recordDelete_timeMillis = ?
where recordDelete_timeMillis is null purgedRecordCount += database
and occupancyTypeId in (select occupancyTypeId from OccupancyTypes where recordDelete_timeMillis is not null)` .prepare(
) `delete from OccupancyTypeFields
.run(requestSession.user.userName, rightNowMillis).changes; where recordDelete_timeMillis <= ?
and occupancyTypeFieldId not in (select occupancyTypeFieldId from LotOccupancyFields)`
purgedRecordCount += database )
.prepare("delete from OccupancyTypePrints where recordDelete_timeMillis <= ?") .run(recordDeleteTimeMillisMin).changes
.run(recordDelete_timeMillisMin).changes;
/*
/* * Occupancy Type Prints
* Occupancy Types */
*/
inactivedRecordCount += database
purgedRecordCount += database .prepare(
.prepare( `update OccupancyTypePrints
`delete from OccupancyTypes set recordDelete_userName = ?,
where recordDelete_timeMillis <= ? recordDelete_timeMillis = ?
and occupancyTypeId not in (select occupancyTypeId from OccupancyTypeFields) where recordDelete_timeMillis is null
and occupancyTypeId not in (select occupancyTypeId from OccupancyTypePrints) and occupancyTypeId in (select occupancyTypeId from OccupancyTypes where recordDelete_timeMillis is not null)`
and occupancyTypeId not in (select occupancyTypeId from LotOccupancies) )
and occupancyTypeId not in (select occupancyTypeId from Fees)` .run(requestSession.user!.userName, rightNowMillis).changes
)
.run(recordDelete_timeMillisMin).changes; purgedRecordCount += database
.prepare(
/* 'delete from OccupancyTypePrints where recordDelete_timeMillis <= ?'
* Lot Occupant Types )
*/ .run(recordDeleteTimeMillisMin).changes
purgedRecordCount += database /*
.prepare( * Occupancy Types
`delete from LotOccupantTypes */
where recordDelete_timeMillis <= ?
and lotOccupantTypeId not in (select lotOccupantTypeId from LotOccupancyOccupants)` purgedRecordCount += database
) .prepare(
.run(recordDelete_timeMillisMin).changes; `delete from OccupancyTypes
where recordDelete_timeMillis <= ?
/* and occupancyTypeId not in (select occupancyTypeId from OccupancyTypeFields)
* Lot Comments and occupancyTypeId not in (select occupancyTypeId from OccupancyTypePrints)
*/ and occupancyTypeId not in (select occupancyTypeId from LotOccupancies)
and occupancyTypeId not in (select occupancyTypeId from Fees)`
inactivedRecordCount += database )
.prepare( .run(recordDeleteTimeMillisMin).changes
`update LotComments
set recordDelete_userName = ?, /*
recordDelete_timeMillis = ? * Lot Occupant Types
where recordDelete_timeMillis is null */
and lotId in (select lotId from Lots where recordDelete_timeMillis is not null)`
) purgedRecordCount += database
.run(requestSession.user.userName, rightNowMillis).changes; .prepare(
`delete from LotOccupantTypes
purgedRecordCount += database where recordDelete_timeMillis <= ?
.prepare("delete from LotComments where recordDelete_timeMillis <= ?") and lotOccupantTypeId not in (select lotOccupantTypeId from LotOccupancyOccupants)`
.run(recordDelete_timeMillisMin).changes; )
.run(recordDeleteTimeMillisMin).changes
/*
* Lot Fields /*
*/ * Lot Comments
*/
inactivedRecordCount += database
.prepare( inactivedRecordCount += database
`update LotFields .prepare(
set recordDelete_userName = ?, `update LotComments
recordDelete_timeMillis = ? set recordDelete_userName = ?,
where recordDelete_timeMillis is null recordDelete_timeMillis = ?
and lotId in (select lotId from Lots where recordDelete_timeMillis is not null)` where recordDelete_timeMillis is null
) and lotId in (select lotId from Lots where recordDelete_timeMillis is not null)`
.run(requestSession.user.userName, rightNowMillis).changes; )
.run(requestSession.user!.userName, rightNowMillis).changes
purgedRecordCount += database
.prepare("delete from LotFields where recordDelete_timeMillis <= ?") purgedRecordCount += database
.run(recordDelete_timeMillisMin).changes; .prepare('delete from LotComments where recordDelete_timeMillis <= ?')
.run(recordDeleteTimeMillisMin).changes
/*
* Lots /*
*/ * Lot Fields
*/
inactivedRecordCount += database
.prepare( inactivedRecordCount += database
`update Lots .prepare(
set recordDelete_userName = ?, `update LotFields
recordDelete_timeMillis = ? set recordDelete_userName = ?,
where recordDelete_timeMillis is null recordDelete_timeMillis = ?
and mapId in (select mapId from Maps where recordDelete_timeMillis is not null)` where recordDelete_timeMillis is null
) and lotId in (select lotId from Lots where recordDelete_timeMillis is not null)`
.run(requestSession.user.userName, rightNowMillis).changes; )
.run(requestSession.user!.userName, rightNowMillis).changes
purgedRecordCount += database
.prepare( purgedRecordCount += database
`delete from Lots .prepare('delete from LotFields where recordDelete_timeMillis <= ?')
where recordDelete_timeMillis <= ? .run(recordDeleteTimeMillisMin).changes
and lotId not in (select lotId from LotComments)
and lotId not in (select lotId from LotFields) /*
and lotId not in (select lotId from LotOccupancies) * Lots
and lotId not in (select lotId from WorkOrderLots)` */
)
.run(recordDelete_timeMillisMin).changes; inactivedRecordCount += database
.prepare(
/* `update Lots
* Lot Statuses set recordDelete_userName = ?,
*/ recordDelete_timeMillis = ?
where recordDelete_timeMillis is null
purgedRecordCount += database and mapId in (select mapId from Maps where recordDelete_timeMillis is not null)`
.prepare( )
`delete from LotStatuses .run(requestSession.user!.userName, rightNowMillis).changes
where recordDelete_timeMillis <= ?
and lotStatusId not in (select lotStatusId from Lots)` purgedRecordCount += database
) .prepare(
.run(recordDelete_timeMillisMin).changes; `delete from Lots
where recordDelete_timeMillis <= ?
/* and lotId not in (select lotId from LotComments)
* Lot Type Fields and lotId not in (select lotId from LotFields)
*/ and lotId not in (select lotId from LotOccupancies)
and lotId not in (select lotId from WorkOrderLots)`
inactivedRecordCount += database )
.prepare( .run(recordDeleteTimeMillisMin).changes
`update LotTypeFields
set recordDelete_userName = ?, /*
recordDelete_timeMillis = ? * Lot Statuses
where recordDelete_timeMillis is null */
and lotTypeId in (select lotTypeId from LotTypes where recordDelete_timeMillis is not null)`
) purgedRecordCount += database
.run(requestSession.user.userName, rightNowMillis).changes; .prepare(
`delete from LotStatuses
purgedRecordCount += database where recordDelete_timeMillis <= ?
.prepare( and lotStatusId not in (select lotStatusId from Lots)`
`delete from LotTypeFields )
where recordDelete_timeMillis <= ? .run(recordDeleteTimeMillisMin).changes
and lotTypeFieldId not in (select lotTypeFieldId from LotFields)`
) /*
.run(recordDelete_timeMillisMin).changes; * Lot Type Fields
*/
/*
* Lot Types inactivedRecordCount += database
*/ .prepare(
`update LotTypeFields
purgedRecordCount += database set recordDelete_userName = ?,
.prepare( recordDelete_timeMillis = ?
`delete from LotTypes where recordDelete_timeMillis is null
where recordDelete_timeMillis <= ? and lotTypeId in (select lotTypeId from LotTypes where recordDelete_timeMillis is not null)`
and lotTypeId not in (select lotTypeId from Lots)` )
) .run(requestSession.user!.userName, rightNowMillis).changes
.run(recordDelete_timeMillisMin).changes;
purgedRecordCount += database
database.close(); .prepare(
`delete from LotTypeFields
return { where recordDelete_timeMillis <= ?
inactivedRecordCount, and lotTypeFieldId not in (select lotTypeFieldId from LotFields)`
purgedRecordCount )
}; .run(recordDeleteTimeMillisMin).changes
/*
* Lot Types
*/
purgedRecordCount += database
.prepare(
`delete from LotTypes
where recordDelete_timeMillis <= ?
and lotTypeId not in (select lotTypeId from Lots)`
)
.run(recordDeleteTimeMillisMin).changes
database.close()
return {
inactivedRecordCount,
purgedRecordCount
}
} }
export default cleanupDatabase; export default cleanupDatabase

View File

@ -1,4 +1,4 @@
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes';
interface AddWorkOrderForm { interface AddWorkOrderForm {
workOrderId: number | string; workOrderId: number | string;
workOrderCloseDateString?: string; workOrderCloseDateString?: string;

View File

@ -1,6 +1,6 @@
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 { dateStringToInteger, dateToInteger } from "@cityssm/expressjs-server-js/dateTimeFns.js"; import { dateStringToInteger, dateToInteger } from '@cityssm/expressjs-server-js/dateTimeFns.js';
export function closeWorkOrder(workOrderForm, requestSession) { export function closeWorkOrder(workOrderForm, requestSession) {
const database = sqlite(databasePath); const database = sqlite(databasePath);
const rightNow = new Date(); const rightNow = new Date();

View File

@ -1,44 +1,47 @@
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 { dateStringToInteger, dateToInteger } from "@cityssm/expressjs-server-js/dateTimeFns.js"; import {
dateStringToInteger,
dateToInteger
} from '@cityssm/expressjs-server-js/dateTimeFns.js'
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes'
interface AddWorkOrderForm { interface AddWorkOrderForm {
workOrderId: number | string; workOrderId: number | string
workOrderCloseDateString?: string; workOrderCloseDateString?: string
} }
export function closeWorkOrder( export function closeWorkOrder(
workOrderForm: AddWorkOrderForm, workOrderForm: AddWorkOrderForm,
requestSession: recordTypes.PartialSession requestSession: recordTypes.PartialSession
): boolean { ): boolean {
const database = sqlite(databasePath); const database = sqlite(databasePath)
const rightNow = new Date(); const rightNow = new Date()
const result = database const result = database
.prepare( .prepare(
`update WorkOrders `update WorkOrders
set workOrderCloseDate = ?, set workOrderCloseDate = ?,
recordUpdate_userName = ?, recordUpdate_userName = ?,
recordUpdate_timeMillis = ? recordUpdate_timeMillis = ?
where workOrderId = ?` where workOrderId = ?`
) )
.run( .run(
workOrderForm.workOrderCloseDateString workOrderForm.workOrderCloseDateString
? dateStringToInteger(workOrderForm.workOrderCloseDateString) ? dateStringToInteger(workOrderForm.workOrderCloseDateString)
: dateToInteger(new Date()), : dateToInteger(new Date()),
requestSession.user.userName, requestSession.user!.userName,
rightNow.getTime(), rightNow.getTime(),
workOrderForm.workOrderId workOrderForm.workOrderId
); )
database.close(); database.close()
return result.changes > 0; return result.changes > 0
} }
export default closeWorkOrder; export default closeWorkOrder

View File

@ -1,4 +1,4 @@
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes';
interface CompleteWorkOrderMilestoneForm { interface CompleteWorkOrderMilestoneForm {
workOrderMilestoneId: string | number; workOrderMilestoneId: string | number;
workOrderMilestoneCompletionDateString?: string; workOrderMilestoneCompletionDateString?: string;

View File

@ -1,6 +1,6 @@
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 { dateStringToInteger, dateToInteger, dateToTimeInteger, timeStringToInteger } from "@cityssm/expressjs-server-js/dateTimeFns.js"; import { dateStringToInteger, dateToInteger, dateToTimeInteger, timeStringToInteger } from '@cityssm/expressjs-server-js/dateTimeFns.js';
export function completeWorkOrderMilestone(milestoneForm, requestSession) { export function completeWorkOrderMilestone(milestoneForm, requestSession) {
const rightNow = new Date(); const rightNow = new Date();
const database = sqlite(databasePath); const database = sqlite(databasePath);

View File

@ -1,54 +1,60 @@
import sqlite from "better-sqlite3"; /* eslint-disable @typescript-eslint/indent */
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; import sqlite from 'better-sqlite3'
import { lotOccupancyDB as databasePath } from '../../data/databasePaths.js'
import { import {
dateStringToInteger, dateStringToInteger,
dateToInteger, dateToInteger,
dateToTimeInteger, dateToTimeInteger,
timeStringToInteger timeStringToInteger
} from "@cityssm/expressjs-server-js/dateTimeFns.js"; } from '@cityssm/expressjs-server-js/dateTimeFns.js'
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes'
interface CompleteWorkOrderMilestoneForm { interface CompleteWorkOrderMilestoneForm {
workOrderMilestoneId: string | number; workOrderMilestoneId: string | number
workOrderMilestoneCompletionDateString?: string; workOrderMilestoneCompletionDateString?: string
workOrderMilestoneCompletionTimeString?: string; workOrderMilestoneCompletionTimeString?: string
} }
export function completeWorkOrderMilestone( export function completeWorkOrderMilestone(
milestoneForm: CompleteWorkOrderMilestoneForm, milestoneForm: CompleteWorkOrderMilestoneForm,
requestSession: recordTypes.PartialSession requestSession: recordTypes.PartialSession
): boolean { ): boolean {
const rightNow = new Date(); const rightNow = new Date()
const database = sqlite(databasePath); const database = sqlite(databasePath)
const result = database const result = database
.prepare( .prepare(
`update WorkOrderMilestones `update WorkOrderMilestones
set workOrderMilestoneCompletionDate = ?, set workOrderMilestoneCompletionDate = ?,
workOrderMilestoneCompletionTime = ?, workOrderMilestoneCompletionTime = ?,
recordUpdate_userName = ?, recordUpdate_userName = ?,
recordUpdate_timeMillis = ? recordUpdate_timeMillis = ?
where workOrderMilestoneId = ?` where workOrderMilestoneId = ?`
) )
.run( .run(
milestoneForm.workOrderMilestoneCompletionDateString
? dateStringToInteger(
milestoneForm.workOrderMilestoneCompletionDateString milestoneForm.workOrderMilestoneCompletionDateString
? dateStringToInteger(milestoneForm.workOrderMilestoneCompletionDateString) )
: dateToInteger(rightNow), : dateToInteger(rightNow),
milestoneForm.workOrderMilestoneCompletionTimeString
? timeStringToInteger(
milestoneForm.workOrderMilestoneCompletionTimeString milestoneForm.workOrderMilestoneCompletionTimeString
? timeStringToInteger(milestoneForm.workOrderMilestoneCompletionTimeString) )
: dateToTimeInteger(rightNow), : dateToTimeInteger(rightNow),
requestSession.user.userName, requestSession.user!.userName,
rightNow.getTime(), rightNow.getTime(),
milestoneForm.workOrderMilestoneId milestoneForm.workOrderMilestoneId
); )
database.close(); database.close()
return result.changes > 0; return result.changes > 0
} }
export default completeWorkOrderMilestone; export default completeWorkOrderMilestone

View File

@ -1,3 +1,3 @@
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes';
export declare function copyLotOccupancy(oldLotOccupancyId: number | string, requestSession: recordTypes.PartialSession): number; export declare function copyLotOccupancy(oldLotOccupancyId: number | string, requestSession: recordTypes.PartialSession): number;
export default copyLotOccupancy; export default copyLotOccupancy;

View File

@ -1,20 +1,20 @@
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 { getLotOccupancy } from "./getLotOccupancy.js"; import { getLotOccupancy } from './getLotOccupancy.js';
import { addLotOccupancy } from "./addLotOccupancy.js"; import { addLotOccupancy } from './addLotOccupancy.js';
import { addLotOccupancyOccupant } from "./addLotOccupancyOccupant.js"; import { addLotOccupancyOccupant } from './addLotOccupancyOccupant.js';
import { dateToString } from "@cityssm/expressjs-server-js/dateTimeFns.js"; import { dateToString } from '@cityssm/expressjs-server-js/dateTimeFns.js';
export function copyLotOccupancy(oldLotOccupancyId, requestSession) { export function copyLotOccupancy(oldLotOccupancyId, requestSession) {
const database = sqlite(databasePath); const database = sqlite(databasePath);
const oldLotOccupancy = getLotOccupancy(oldLotOccupancyId, database); const oldLotOccupancy = getLotOccupancy(oldLotOccupancyId, database);
const newLotOccupancyId = addLotOccupancy({ const newLotOccupancyId = addLotOccupancy({
lotId: oldLotOccupancy.lotId || "", lotId: oldLotOccupancy.lotId ?? '',
occupancyTypeId: oldLotOccupancy.occupancyTypeId, occupancyTypeId: oldLotOccupancy.occupancyTypeId,
occupancyStartDateString: dateToString(new Date()), occupancyStartDateString: dateToString(new Date()),
occupancyEndDateString: "" occupancyEndDateString: ''
}, requestSession, database); }, requestSession, database);
const rightNowMillis = Date.now(); const rightNowMillis = Date.now();
for (const occupancyField of oldLotOccupancy.lotOccupancyFields) { for (const occupancyField of oldLotOccupancy.lotOccupancyFields ?? []) {
database database
.prepare(`insert into LotOccupancyFields ( .prepare(`insert into LotOccupancyFields (
lotOccupancyId, occupancyTypeFieldId, lotOccupancyFieldValue, lotOccupancyId, occupancyTypeFieldId, lotOccupancyFieldValue,
@ -23,7 +23,7 @@ export function copyLotOccupancy(oldLotOccupancyId, requestSession) {
values (?, ?, ?, ?, ?, ?, ?)`) values (?, ?, ?, ?, ?, ?, ?)`)
.run(newLotOccupancyId, occupancyField.occupancyTypeFieldId, occupancyField.lotOccupancyFieldValue, requestSession.user.userName, rightNowMillis, requestSession.user.userName, rightNowMillis); .run(newLotOccupancyId, occupancyField.occupancyTypeFieldId, occupancyField.lotOccupancyFieldValue, requestSession.user.userName, rightNowMillis, requestSession.user.userName, rightNowMillis);
} }
for (const occupant of oldLotOccupancy.lotOccupancyOccupants) { for (const occupant of oldLotOccupancy.lotOccupancyOccupants ?? []) {
addLotOccupancyOccupant({ addLotOccupancyOccupant({
lotOccupancyId: newLotOccupancyId, lotOccupancyId: newLotOccupancyId,
lotOccupantTypeId: occupant.lotOccupantTypeId, lotOccupantTypeId: occupant.lotOccupantTypeId,

View File

@ -1,86 +1,86 @@
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 { getLotOccupancy } from "./getLotOccupancy.js"; import { getLotOccupancy } from './getLotOccupancy.js'
import { addLotOccupancy } from "./addLotOccupancy.js"; import { addLotOccupancy } from './addLotOccupancy.js'
import { addLotOccupancyOccupant } from "./addLotOccupancyOccupant.js"; import { addLotOccupancyOccupant } from './addLotOccupancyOccupant.js'
import { dateToString } from "@cityssm/expressjs-server-js/dateTimeFns.js"; import { dateToString } from '@cityssm/expressjs-server-js/dateTimeFns.js'
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes'
export function copyLotOccupancy( export function copyLotOccupancy(
oldLotOccupancyId: number | string, oldLotOccupancyId: number | string,
requestSession: recordTypes.PartialSession requestSession: recordTypes.PartialSession
): number { ): number {
const database = sqlite(databasePath); const database = sqlite(databasePath)
const oldLotOccupancy = getLotOccupancy(oldLotOccupancyId, database); const oldLotOccupancy = getLotOccupancy(oldLotOccupancyId, database)!
const newLotOccupancyId = addLotOccupancy( const newLotOccupancyId = addLotOccupancy(
{ {
lotId: oldLotOccupancy.lotId || "", lotId: oldLotOccupancy.lotId ?? '',
occupancyTypeId: oldLotOccupancy.occupancyTypeId, occupancyTypeId: oldLotOccupancy.occupancyTypeId!,
occupancyStartDateString: dateToString(new Date()), occupancyStartDateString: dateToString(new Date()),
occupancyEndDateString: "" occupancyEndDateString: ''
}, },
requestSession, requestSession,
database database
); )
/* /*
* Copy Fields * Copy Fields
*/ */
const rightNowMillis = Date.now(); const rightNowMillis = Date.now()
for (const occupancyField of oldLotOccupancy.lotOccupancyFields) { for (const occupancyField of oldLotOccupancy.lotOccupancyFields ?? []) {
database database
.prepare( .prepare(
`insert into LotOccupancyFields ( `insert into LotOccupancyFields (
lotOccupancyId, occupancyTypeFieldId, lotOccupancyFieldValue, lotOccupancyId, occupancyTypeFieldId, lotOccupancyFieldValue,
recordCreate_userName, recordCreate_timeMillis, recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis) recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?)` values (?, ?, ?, ?, ?, ?, ?)`
) )
.run( .run(
newLotOccupancyId, newLotOccupancyId,
occupancyField.occupancyTypeFieldId, occupancyField.occupancyTypeFieldId,
occupancyField.lotOccupancyFieldValue, occupancyField.lotOccupancyFieldValue,
requestSession.user.userName, requestSession.user!.userName,
rightNowMillis, rightNowMillis,
requestSession.user.userName, requestSession.user!.userName,
rightNowMillis rightNowMillis
); )
} }
/* /*
* Copy Occupants * Copy Occupants
*/ */
for (const occupant of oldLotOccupancy.lotOccupancyOccupants) { for (const occupant of oldLotOccupancy.lotOccupancyOccupants ?? []) {
addLotOccupancyOccupant( addLotOccupancyOccupant(
{ {
lotOccupancyId: newLotOccupancyId, lotOccupancyId: newLotOccupancyId,
lotOccupantTypeId: occupant.lotOccupantTypeId, lotOccupantTypeId: occupant.lotOccupantTypeId!,
occupantName: occupant.occupantName, occupantName: occupant.occupantName!,
occupantAddress1: occupant.occupantAddress1, occupantAddress1: occupant.occupantAddress1!,
occupantAddress2: occupant.occupantAddress2, occupantAddress2: occupant.occupantAddress2!,
occupantCity: occupant.occupantCity, occupantCity: occupant.occupantCity!,
occupantProvince: occupant.occupantProvince, occupantProvince: occupant.occupantProvince!,
occupantPostalCode: occupant.occupantPostalCode, occupantPostalCode: occupant.occupantPostalCode!,
occupantPhoneNumber: occupant.occupantPhoneNumber, occupantPhoneNumber: occupant.occupantPhoneNumber!,
occupantEmailAddress: occupant.occupantEmailAddress occupantEmailAddress: occupant.occupantEmailAddress!
}, },
requestSession, requestSession,
database database
); )
} }
database.close(); database.close()
return newLotOccupancyId; return newLotOccupancyId
} }
export default copyLotOccupancy; export default copyLotOccupancy

View File

@ -1,4 +1,4 @@
import sqlite from "better-sqlite3"; import sqlite from 'better-sqlite3';
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes';
export declare function deleteLotField(lotId: number | string, lotTypeFieldId: number | string, requestSession: recordTypes.PartialSession, connectedDatabase?: sqlite.Database): boolean; export declare function deleteLotField(lotId: number | string, lotTypeFieldId: number | string, requestSession: recordTypes.PartialSession, connectedDatabase?: sqlite.Database): boolean;
export default deleteLotField; export default deleteLotField;

View File

@ -1,7 +1,7 @@
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';
export function deleteLotField(lotId, lotTypeFieldId, requestSession, connectedDatabase) { export function deleteLotField(lotId, lotTypeFieldId, requestSession, connectedDatabase) {
const database = connectedDatabase || sqlite(databasePath); const database = connectedDatabase ?? sqlite(databasePath);
const rightNowMillis = Date.now(); const rightNowMillis = Date.now();
const result = database const result = database
.prepare(`update LotFields .prepare(`update LotFields

View File

@ -1,34 +1,34 @@
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 type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes'
export function deleteLotField( export function deleteLotField(
lotId: number | string, lotId: number | string,
lotTypeFieldId: number | string, lotTypeFieldId: number | string,
requestSession: recordTypes.PartialSession, requestSession: recordTypes.PartialSession,
connectedDatabase?: sqlite.Database connectedDatabase?: sqlite.Database
): boolean { ): boolean {
const database = connectedDatabase || sqlite(databasePath); const database = connectedDatabase ?? sqlite(databasePath)
const rightNowMillis = Date.now(); const rightNowMillis = Date.now()
const result = database const result = database
.prepare( .prepare(
`update LotFields `update LotFields
set recordDelete_userName = ?, set recordDelete_userName = ?,
recordDelete_timeMillis = ? recordDelete_timeMillis = ?
where lotId = ? where lotId = ?
and lotTypeFieldId = ?` and lotTypeFieldId = ?`
) )
.run(requestSession.user.userName, rightNowMillis, lotId, lotTypeFieldId); .run(requestSession.user!.userName, rightNowMillis, lotId, lotTypeFieldId)
if (!connectedDatabase) { if (!connectedDatabase) {
database.close(); database.close()
} }
return result.changes > 0; return result.changes > 0
} }
export default deleteLotField; export default deleteLotField

View File

@ -1,3 +1,3 @@
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes';
export declare function deleteLotOccupancyFee(lotOccupancyId: number | string, feeId: number | string, requestSession: recordTypes.PartialSession): boolean; export declare function deleteLotOccupancyFee(lotOccupancyId: number | string, feeId: number | string, requestSession: recordTypes.PartialSession): boolean;
export default deleteLotOccupancyFee; export default deleteLotOccupancyFee;

View File

@ -1,14 +1,14 @@
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';
export function deleteLotOccupancyFee(lotOccupancyId, feeId, requestSession) { export function deleteLotOccupancyFee(lotOccupancyId, feeId, requestSession) {
const database = sqlite(databasePath); const database = sqlite(databasePath);
const rightNowMillis = Date.now(); const rightNowMillis = Date.now();
const result = database const result = database
.prepare(`update LotOccupancyFees .prepare(`update LotOccupancyFees
set recordDelete_userName = ?, set recordDelete_userName = ?,
recordDelete_timeMillis = ? recordDelete_timeMillis = ?
where lotOccupancyId = ? where lotOccupancyId = ?
and feeId = ?`) and feeId = ?`)
.run(requestSession.user.userName, rightNowMillis, lotOccupancyId, feeId); .run(requestSession.user.userName, rightNowMillis, lotOccupancyId, feeId);
database.close(); database.close();
return result.changes > 0; return result.changes > 0;

View File

@ -1,31 +1,31 @@
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 type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes'
export function deleteLotOccupancyFee( export function deleteLotOccupancyFee(
lotOccupancyId: number | string, lotOccupancyId: number | string,
feeId: number | string, feeId: number | string,
requestSession: recordTypes.PartialSession requestSession: recordTypes.PartialSession
): boolean { ): boolean {
const database = sqlite(databasePath); const database = sqlite(databasePath)
const rightNowMillis = Date.now(); const rightNowMillis = Date.now()
const result = database const result = database
.prepare( .prepare(
`update LotOccupancyFees `update LotOccupancyFees
set recordDelete_userName = ?, set recordDelete_userName = ?,
recordDelete_timeMillis = ? recordDelete_timeMillis = ?
where lotOccupancyId = ? where lotOccupancyId = ?
and feeId = ?` and feeId = ?`
) )
.run(requestSession.user.userName, rightNowMillis, lotOccupancyId, feeId); .run(requestSession.user!.userName, rightNowMillis, lotOccupancyId, feeId)
database.close(); database.close()
return result.changes > 0; return result.changes > 0
} }
export default deleteLotOccupancyFee; export default deleteLotOccupancyFee

View File

@ -1,4 +1,4 @@
import sqlite from "better-sqlite3"; import sqlite from 'better-sqlite3';
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes';
export declare function deleteLotOccupancyField(lotOccupancyId: number | string, occupancyTypeFieldId: number | string, requestSession: recordTypes.PartialSession, connectedDatabase?: sqlite.Database): boolean; export declare function deleteLotOccupancyField(lotOccupancyId: number | string, occupancyTypeFieldId: number | string, requestSession: recordTypes.PartialSession, connectedDatabase?: sqlite.Database): boolean;
export default deleteLotOccupancyField; export default deleteLotOccupancyField;

View File

@ -1,14 +1,14 @@
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';
export function deleteLotOccupancyField(lotOccupancyId, occupancyTypeFieldId, requestSession, connectedDatabase) { export function deleteLotOccupancyField(lotOccupancyId, occupancyTypeFieldId, requestSession, connectedDatabase) {
const database = connectedDatabase || sqlite(databasePath); const database = connectedDatabase ?? sqlite(databasePath);
const rightNowMillis = Date.now(); const rightNowMillis = Date.now();
const result = database const result = database
.prepare(`update LotOccupancyFields .prepare(`update LotOccupancyFields
set recordDelete_userName = ?, set recordDelete_userName = ?,
recordDelete_timeMillis = ? recordDelete_timeMillis = ?
where lotOccupancyId = ? where lotOccupancyId = ?
and occupancyTypeFieldId = ?`) and occupancyTypeFieldId = ?`)
.run(requestSession.user.userName, rightNowMillis, lotOccupancyId, occupancyTypeFieldId); .run(requestSession.user.userName, rightNowMillis, lotOccupancyId, occupancyTypeFieldId);
if (!connectedDatabase) { if (!connectedDatabase) {
database.close(); database.close();

View File

@ -1,34 +1,39 @@
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 type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes'
export function deleteLotOccupancyField( export function deleteLotOccupancyField(
lotOccupancyId: number | string, lotOccupancyId: number | string,
occupancyTypeFieldId: number | string, occupancyTypeFieldId: number | string,
requestSession: recordTypes.PartialSession, requestSession: recordTypes.PartialSession,
connectedDatabase?: sqlite.Database connectedDatabase?: sqlite.Database
): boolean { ): boolean {
const database = connectedDatabase || sqlite(databasePath); const database = connectedDatabase ?? sqlite(databasePath)
const rightNowMillis = Date.now(); const rightNowMillis = Date.now()
const result = database const result = database
.prepare( .prepare(
`update LotOccupancyFields `update LotOccupancyFields
set recordDelete_userName = ?, set recordDelete_userName = ?,
recordDelete_timeMillis = ? recordDelete_timeMillis = ?
where lotOccupancyId = ? where lotOccupancyId = ?
and occupancyTypeFieldId = ?` and occupancyTypeFieldId = ?`
) )
.run(requestSession.user.userName, rightNowMillis, lotOccupancyId, occupancyTypeFieldId); .run(
requestSession.user!.userName,
rightNowMillis,
lotOccupancyId,
occupancyTypeFieldId
)
if (!connectedDatabase) { if (!connectedDatabase) {
database.close(); database.close()
} }
return result.changes > 0; return result.changes > 0
} }
export default deleteLotOccupancyField; export default deleteLotOccupancyField

View File

@ -1,3 +1,3 @@
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes';
export declare function deleteLotOccupancyOccupant(lotOccupancyId: number | string, lotOccupantIndex: number | string, requestSession: recordTypes.PartialSession): boolean; export declare function deleteLotOccupancyOccupant(lotOccupancyId: number | string, lotOccupantIndex: number | string, requestSession: recordTypes.PartialSession): boolean;
export default deleteLotOccupancyOccupant; export default deleteLotOccupancyOccupant;

View File

@ -1,14 +1,14 @@
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';
export function deleteLotOccupancyOccupant(lotOccupancyId, lotOccupantIndex, requestSession) { export function deleteLotOccupancyOccupant(lotOccupancyId, lotOccupantIndex, requestSession) {
const database = sqlite(databasePath); const database = sqlite(databasePath);
const rightNowMillis = Date.now(); const rightNowMillis = Date.now();
const result = database const result = database
.prepare(`update LotOccupancyOccupants .prepare(`update LotOccupancyOccupants
set recordDelete_userName = ?, set recordDelete_userName = ?,
recordDelete_timeMillis = ? recordDelete_timeMillis = ?
where lotOccupancyId = ? where lotOccupancyId = ?
and lotOccupantIndex = ?`) and lotOccupantIndex = ?`)
.run(requestSession.user.userName, rightNowMillis, lotOccupancyId, lotOccupantIndex); .run(requestSession.user.userName, rightNowMillis, lotOccupancyId, lotOccupantIndex);
database.close(); database.close();
return result.changes > 0; return result.changes > 0;

View File

@ -1,31 +1,36 @@
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 type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes'
export function deleteLotOccupancyOccupant( export function deleteLotOccupancyOccupant(
lotOccupancyId: number | string, lotOccupancyId: number | string,
lotOccupantIndex: number | string, lotOccupantIndex: number | string,
requestSession: recordTypes.PartialSession requestSession: recordTypes.PartialSession
): boolean { ): boolean {
const database = sqlite(databasePath); const database = sqlite(databasePath)
const rightNowMillis = Date.now(); const rightNowMillis = Date.now()
const result = database const result = database
.prepare( .prepare(
`update LotOccupancyOccupants `update LotOccupancyOccupants
set recordDelete_userName = ?, set recordDelete_userName = ?,
recordDelete_timeMillis = ? recordDelete_timeMillis = ?
where lotOccupancyId = ? where lotOccupancyId = ?
and lotOccupantIndex = ?` and lotOccupantIndex = ?`
) )
.run(requestSession.user.userName, rightNowMillis, lotOccupancyId, lotOccupantIndex); .run(
requestSession.user!.userName,
rightNowMillis,
lotOccupancyId,
lotOccupantIndex
)
database.close(); database.close()
return result.changes > 0; return result.changes > 0
} }
export default deleteLotOccupancyOccupant; export default deleteLotOccupancyOccupant

View File

@ -1,3 +1,3 @@
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes';
export declare function deleteLotOccupancyTransaction(lotOccupancyId: number | string, transactionIndex: number | string, requestSession: recordTypes.PartialSession): boolean; export declare function deleteLotOccupancyTransaction(lotOccupancyId: number | string, transactionIndex: number | string, requestSession: recordTypes.PartialSession): boolean;
export default deleteLotOccupancyTransaction; export default deleteLotOccupancyTransaction;

View File

@ -1,14 +1,14 @@
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';
export function deleteLotOccupancyTransaction(lotOccupancyId, transactionIndex, requestSession) { export function deleteLotOccupancyTransaction(lotOccupancyId, transactionIndex, requestSession) {
const database = sqlite(databasePath); const database = sqlite(databasePath);
const rightNowMillis = Date.now(); const rightNowMillis = Date.now();
const result = database const result = database
.prepare(`update LotOccupancyTransactions .prepare(`update LotOccupancyTransactions
set recordDelete_userName = ?, set recordDelete_userName = ?,
recordDelete_timeMillis = ? recordDelete_timeMillis = ?
where lotOccupancyId = ? where lotOccupancyId = ?
and transactionIndex = ?`) and transactionIndex = ?`)
.run(requestSession.user.userName, rightNowMillis, lotOccupancyId, transactionIndex); .run(requestSession.user.userName, rightNowMillis, lotOccupancyId, transactionIndex);
database.close(); database.close();
return result.changes > 0; return result.changes > 0;

View File

@ -1,31 +1,36 @@
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 type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes'
export function deleteLotOccupancyTransaction( export function deleteLotOccupancyTransaction(
lotOccupancyId: number | string, lotOccupancyId: number | string,
transactionIndex: number | string, transactionIndex: number | string,
requestSession: recordTypes.PartialSession requestSession: recordTypes.PartialSession
): boolean { ): boolean {
const database = sqlite(databasePath); const database = sqlite(databasePath)
const rightNowMillis = Date.now(); const rightNowMillis = Date.now()
const result = database const result = database
.prepare( .prepare(
`update LotOccupancyTransactions `update LotOccupancyTransactions
set recordDelete_userName = ?, set recordDelete_userName = ?,
recordDelete_timeMillis = ? recordDelete_timeMillis = ?
where lotOccupancyId = ? where lotOccupancyId = ?
and transactionIndex = ?` and transactionIndex = ?`
) )
.run(requestSession.user.userName, rightNowMillis, lotOccupancyId, transactionIndex); .run(
requestSession.user!.userName,
rightNowMillis,
lotOccupancyId,
transactionIndex
)
database.close(); database.close()
return result.changes > 0; return result.changes > 0
} }
export default deleteLotOccupancyTransaction; export default deleteLotOccupancyTransaction

View File

@ -1,3 +1,3 @@
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes';
export declare function deleteOccupancyTypePrint(occupancyTypeId: number | string, printEJS: string, requestSession: recordTypes.PartialSession): boolean; export declare function deleteOccupancyTypePrint(occupancyTypeId: number | string, printEJS: string, requestSession: recordTypes.PartialSession): boolean;
export default deleteOccupancyTypePrint; export default deleteOccupancyTypePrint;

View File

@ -1,18 +1,18 @@
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 deleteOccupancyTypePrint(occupancyTypeId, printEJS, requestSession) { export function deleteOccupancyTypePrint(occupancyTypeId, printEJS, requestSession) {
const database = sqlite(databasePath); const database = sqlite(databasePath);
const rightNowMillis = Date.now(); const rightNowMillis = Date.now();
const result = database const result = database
.prepare(`update OccupancyTypePrints .prepare(`update OccupancyTypePrints
set recordDelete_userName = ?, set recordDelete_userName = ?,
recordDelete_timeMillis = ? recordDelete_timeMillis = ?
where occupancyTypeId = ? where occupancyTypeId = ?
and printEJS = ?`) and printEJS = ?`)
.run(requestSession.user.userName, rightNowMillis, occupancyTypeId, printEJS); .run(requestSession.user.userName, rightNowMillis, occupancyTypeId, printEJS);
database.close(); database.close();
clearCacheByTableName("OccupancyTypePrints"); clearCacheByTableName('OccupancyTypePrints');
return result.changes > 0; return result.changes > 0;
} }
export default deleteOccupancyTypePrint; export default deleteOccupancyTypePrint;

View File

@ -1,35 +1,40 @@
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'
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes'
export function deleteOccupancyTypePrint( export function deleteOccupancyTypePrint(
occupancyTypeId: number | string, occupancyTypeId: number | string,
printEJS: string, printEJS: string,
requestSession: recordTypes.PartialSession requestSession: recordTypes.PartialSession
): boolean { ): boolean {
const database = sqlite(databasePath); const database = sqlite(databasePath)
const rightNowMillis = Date.now(); const rightNowMillis = Date.now()
const result = database const result = database
.prepare( .prepare(
`update OccupancyTypePrints `update OccupancyTypePrints
set recordDelete_userName = ?, set recordDelete_userName = ?,
recordDelete_timeMillis = ? recordDelete_timeMillis = ?
where occupancyTypeId = ? where occupancyTypeId = ?
and printEJS = ?` and printEJS = ?`
) )
.run(requestSession.user.userName, rightNowMillis, occupancyTypeId, printEJS); .run(
requestSession.user!.userName,
rightNowMillis,
occupancyTypeId,
printEJS
)
database.close(); database.close()
clearCacheByTableName("OccupancyTypePrints"); clearCacheByTableName('OccupancyTypePrints')
return result.changes > 0; return result.changes > 0
} }
export default deleteOccupancyTypePrint; export default deleteOccupancyTypePrint

View File

@ -1,4 +1,4 @@
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes';
declare type RecordTable = "FeeCategories" | "Fees" | "Lots" | "LotComments" | "LotOccupancies" | "LotOccupancyComments" | "LotOccupantTypes" | "LotStatuses" | "LotTypes" | "LotTypeFields" | "Maps" | "OccupancyTypes" | "OccupancyTypeFields" | "WorkOrders" | "WorkOrderComments" | "WorkOrderMilestones" | "WorkOrderMilestoneTypes" | "WorkOrderTypes"; declare type RecordTable = 'FeeCategories' | 'Fees' | 'Lots' | 'LotComments' | 'LotOccupancies' | 'LotOccupancyComments' | 'LotOccupantTypes' | 'LotStatuses' | 'LotTypes' | 'LotTypeFields' | 'Maps' | 'OccupancyTypes' | 'OccupancyTypeFields' | 'WorkOrders' | 'WorkOrderComments' | 'WorkOrderMilestones' | 'WorkOrderMilestoneTypes' | 'WorkOrderTypes';
export declare function deleteRecord(recordTable: RecordTable, recordId: number | string, requestSession: recordTypes.PartialSession): boolean; export declare function deleteRecord(recordTable: RecordTable, recordId: number | string, requestSession: recordTypes.PartialSession): boolean;
export {}; export {};

View File

@ -1,37 +1,44 @@
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';
const recordIdColumns = new Map(); const recordIdColumns = new Map();
recordIdColumns.set("FeeCategories", "feeCategoryId"); recordIdColumns.set('FeeCategories', 'feeCategoryId');
recordIdColumns.set("Fees", "feeId"); recordIdColumns.set('Fees', 'feeId');
recordIdColumns.set("Lots", "lotId"); recordIdColumns.set('Lots', 'lotId');
recordIdColumns.set("LotComments", "lotCommentId"); recordIdColumns.set('LotComments', 'lotCommentId');
recordIdColumns.set("LotOccupancies", "lotOccupancyId"); recordIdColumns.set('LotOccupancies', 'lotOccupancyId');
recordIdColumns.set("LotOccupancyComments", "lotOccupancyCommentId"); recordIdColumns.set('LotOccupancyComments', 'lotOccupancyCommentId');
recordIdColumns.set("LotOccupantTypes", "lotOccupantTypeId"); recordIdColumns.set('LotOccupantTypes', 'lotOccupantTypeId');
recordIdColumns.set("LotStatuses", "lotStatusId"); recordIdColumns.set('LotStatuses', 'lotStatusId');
recordIdColumns.set("LotTypes", "lotTypeId"); recordIdColumns.set('LotTypes', 'lotTypeId');
recordIdColumns.set("LotTypeFields", "lotTypeId"); recordIdColumns.set('LotTypeFields', 'lotTypeId');
recordIdColumns.set("Maps", "mapId"); recordIdColumns.set('Maps', 'mapId');
recordIdColumns.set("OccupancyTypes", "occupancyTypeId"); recordIdColumns.set('OccupancyTypes', 'occupancyTypeId');
recordIdColumns.set("OccupancyTypeFields", "occupancyTypeFieldId"); recordIdColumns.set('OccupancyTypeFields', 'occupancyTypeFieldId');
recordIdColumns.set("WorkOrders", "workOrderId"); recordIdColumns.set('WorkOrders', 'workOrderId');
recordIdColumns.set("WorkOrderComments", "workOrderCommentId"); recordIdColumns.set('WorkOrderComments', 'workOrderCommentId');
recordIdColumns.set("WorkOrderMilestones", "workOrderMilestoneId"); recordIdColumns.set('WorkOrderMilestones', 'workOrderMilestoneId');
recordIdColumns.set("WorkOrderMilestoneTypes", "workOrderMilestoneTypeId"); recordIdColumns.set('WorkOrderMilestoneTypes', 'workOrderMilestoneTypeId');
recordIdColumns.set("WorkOrderTypes", "workOrderTypeId"); recordIdColumns.set('WorkOrderTypes', 'workOrderTypeId');
const relatedTables = new Map(); const relatedTables = new Map();
relatedTables.set("FeeCategories", ["Fees"]); relatedTables.set('FeeCategories', ['Fees']);
relatedTables.set("Lots", ["LotFields", "LotComments"]); relatedTables.set('Lots', ['LotFields', 'LotComments']);
relatedTables.set("LotOccupancies", ["LotOccupancyOccupants", "LotOccupancyFields", "LotOccupancyComments"]); relatedTables.set('LotOccupancies', [
relatedTables.set("LotTypes", ["LotTypeFields"]); 'LotOccupancyOccupants',
relatedTables.set("Maps", ["Lots"]); 'LotOccupancyFields',
relatedTables.set("OccupancyTypes", ["OccupancyTypePrints", "OccupancyTypeFields"]); 'LotOccupancyComments'
relatedTables.set("WorkOrders", [ ]);
"WorkOrderMilestones", relatedTables.set('LotTypes', ['LotTypeFields']);
"WorkOrderLots", relatedTables.set('Maps', ['Lots']);
"WorkOrderLotOccupancies", relatedTables.set('OccupancyTypes', [
"WorkOrderComments" 'OccupancyTypePrints',
'OccupancyTypeFields'
]);
relatedTables.set('WorkOrders', [
'WorkOrderMilestones',
'WorkOrderLots',
'WorkOrderLotOccupancies',
'WorkOrderComments'
]); ]);
export function deleteRecord(recordTable, recordId, requestSession) { export function deleteRecord(recordTable, recordId, requestSession) {
const database = sqlite(databasePath); const database = sqlite(databasePath);
@ -43,7 +50,7 @@ export function deleteRecord(recordTable, recordId, requestSession) {
where ${recordIdColumns.get(recordTable)} = ? where ${recordIdColumns.get(recordTable)} = ?
and recordDelete_timeMillis is null`) and recordDelete_timeMillis is null`)
.run(requestSession.user.userName, rightNowMillis, recordId); .run(requestSession.user.userName, rightNowMillis, recordId);
for (const relatedTable of relatedTables.get(recordTable) || []) { for (const relatedTable of relatedTables.get(recordTable) ?? []) {
database database
.prepare(`update ${relatedTable} .prepare(`update ${relatedTable}
set recordDelete_userName = ?, set recordDelete_userName = ?,

View File

@ -1,99 +1,106 @@
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'
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes'
type RecordTable = type RecordTable =
| "FeeCategories" | 'FeeCategories'
| "Fees" | 'Fees'
| "Lots" | 'Lots'
| "LotComments" | 'LotComments'
| "LotOccupancies" | 'LotOccupancies'
| "LotOccupancyComments" | 'LotOccupancyComments'
| "LotOccupantTypes" | 'LotOccupantTypes'
| "LotStatuses" | 'LotStatuses'
| "LotTypes" | 'LotTypes'
| "LotTypeFields" | 'LotTypeFields'
| "Maps" | 'Maps'
| "OccupancyTypes" | 'OccupancyTypes'
| "OccupancyTypeFields" | 'OccupancyTypeFields'
| "WorkOrders" | 'WorkOrders'
| "WorkOrderComments" | 'WorkOrderComments'
| "WorkOrderMilestones" | 'WorkOrderMilestones'
| "WorkOrderMilestoneTypes" | 'WorkOrderMilestoneTypes'
| "WorkOrderTypes"; | 'WorkOrderTypes'
const recordIdColumns: Map<RecordTable, string> = new Map(); const recordIdColumns: Map<RecordTable, string> = new Map()
recordIdColumns.set("FeeCategories", "feeCategoryId"); recordIdColumns.set('FeeCategories', 'feeCategoryId')
recordIdColumns.set("Fees", "feeId"); recordIdColumns.set('Fees', 'feeId')
recordIdColumns.set("Lots", "lotId"); recordIdColumns.set('Lots', 'lotId')
recordIdColumns.set("LotComments", "lotCommentId"); recordIdColumns.set('LotComments', 'lotCommentId')
recordIdColumns.set("LotOccupancies", "lotOccupancyId"); recordIdColumns.set('LotOccupancies', 'lotOccupancyId')
recordIdColumns.set("LotOccupancyComments", "lotOccupancyCommentId"); recordIdColumns.set('LotOccupancyComments', 'lotOccupancyCommentId')
recordIdColumns.set("LotOccupantTypes", "lotOccupantTypeId"); recordIdColumns.set('LotOccupantTypes', 'lotOccupantTypeId')
recordIdColumns.set("LotStatuses", "lotStatusId"); recordIdColumns.set('LotStatuses', 'lotStatusId')
recordIdColumns.set("LotTypes", "lotTypeId"); recordIdColumns.set('LotTypes', 'lotTypeId')
recordIdColumns.set("LotTypeFields", "lotTypeId"); recordIdColumns.set('LotTypeFields', 'lotTypeId')
recordIdColumns.set("Maps", "mapId"); recordIdColumns.set('Maps', 'mapId')
recordIdColumns.set("OccupancyTypes", "occupancyTypeId"); recordIdColumns.set('OccupancyTypes', 'occupancyTypeId')
recordIdColumns.set("OccupancyTypeFields", "occupancyTypeFieldId"); recordIdColumns.set('OccupancyTypeFields', 'occupancyTypeFieldId')
recordIdColumns.set("WorkOrders", "workOrderId"); recordIdColumns.set('WorkOrders', 'workOrderId')
recordIdColumns.set("WorkOrderComments", "workOrderCommentId"); recordIdColumns.set('WorkOrderComments', 'workOrderCommentId')
recordIdColumns.set("WorkOrderMilestones", "workOrderMilestoneId"); recordIdColumns.set('WorkOrderMilestones', 'workOrderMilestoneId')
recordIdColumns.set("WorkOrderMilestoneTypes", "workOrderMilestoneTypeId"); recordIdColumns.set('WorkOrderMilestoneTypes', 'workOrderMilestoneTypeId')
recordIdColumns.set("WorkOrderTypes", "workOrderTypeId"); recordIdColumns.set('WorkOrderTypes', 'workOrderTypeId')
const relatedTables: Map<RecordTable, string[]> = new Map(); const relatedTables: Map<RecordTable, string[]> = new Map()
relatedTables.set("FeeCategories", ["Fees"]); relatedTables.set('FeeCategories', ['Fees'])
relatedTables.set("Lots", ["LotFields", "LotComments"]); relatedTables.set('Lots', ['LotFields', 'LotComments'])
relatedTables.set("LotOccupancies", ["LotOccupancyOccupants", "LotOccupancyFields", "LotOccupancyComments"]); relatedTables.set('LotOccupancies', [
relatedTables.set("LotTypes", ["LotTypeFields"]); 'LotOccupancyOccupants',
relatedTables.set("Maps", ["Lots"]); 'LotOccupancyFields',
relatedTables.set("OccupancyTypes", ["OccupancyTypePrints", "OccupancyTypeFields"]); 'LotOccupancyComments'
relatedTables.set("WorkOrders", [ ])
"WorkOrderMilestones", relatedTables.set('LotTypes', ['LotTypeFields'])
"WorkOrderLots", relatedTables.set('Maps', ['Lots'])
"WorkOrderLotOccupancies", relatedTables.set('OccupancyTypes', [
"WorkOrderComments" 'OccupancyTypePrints',
]); 'OccupancyTypeFields'
])
relatedTables.set('WorkOrders', [
'WorkOrderMilestones',
'WorkOrderLots',
'WorkOrderLotOccupancies',
'WorkOrderComments'
])
export function deleteRecord( export function deleteRecord(
recordTable: RecordTable, recordTable: RecordTable,
recordId: number | string, recordId: number | string,
requestSession: recordTypes.PartialSession requestSession: recordTypes.PartialSession
): boolean { ): boolean {
const database = sqlite(databasePath); const database = sqlite(databasePath)
const rightNowMillis = Date.now(); const rightNowMillis = Date.now()
const result = database const result = database
.prepare( .prepare(
`update ${recordTable} `update ${recordTable}
set recordDelete_userName = ?, set recordDelete_userName = ?,
recordDelete_timeMillis = ? recordDelete_timeMillis = ?
where ${recordIdColumns.get(recordTable)} = ? where ${recordIdColumns.get(recordTable)!} = ?
and recordDelete_timeMillis is null` and recordDelete_timeMillis is null`
) )
.run(requestSession.user.userName, rightNowMillis, recordId); .run(requestSession.user!.userName, rightNowMillis, recordId)
for (const relatedTable of relatedTables.get(recordTable) || []) { for (const relatedTable of relatedTables.get(recordTable) ?? []) {
database database
.prepare( .prepare(
`update ${relatedTable} `update ${relatedTable}
set recordDelete_userName = ?, set recordDelete_userName = ?,
recordDelete_timeMillis = ? recordDelete_timeMillis = ?
where ${recordIdColumns.get(recordTable)} = ? where ${recordIdColumns.get(recordTable)!} = ?
and recordDelete_timeMillis is null` and recordDelete_timeMillis is null`
) )
.run(requestSession.user.userName, rightNowMillis, recordId); .run(requestSession.user!.userName, rightNowMillis, recordId)
} }
database.close(); database.close()
clearCacheByTableName(recordTable); clearCacheByTableName(recordTable)
return result.changes > 0; return result.changes > 0
} }

View File

@ -1,3 +1,3 @@
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes';
export declare function deleteWorkOrderLot(workOrderId: number | string, lotId: number | string, requestSession: recordTypes.PartialSession): boolean; export declare function deleteWorkOrderLot(workOrderId: number | string, lotId: number | string, requestSession: recordTypes.PartialSession): boolean;
export default deleteWorkOrderLot; export default deleteWorkOrderLot;

View File

@ -1,14 +1,14 @@
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';
export function deleteWorkOrderLot(workOrderId, lotId, requestSession) { export function deleteWorkOrderLot(workOrderId, lotId, requestSession) {
const database = sqlite(databasePath); const database = sqlite(databasePath);
const rightNowMillis = Date.now(); const rightNowMillis = Date.now();
const result = database const result = database
.prepare(`update WorkOrderLots .prepare(`update WorkOrderLots
set recordDelete_userName = ?, set recordDelete_userName = ?,
recordDelete_timeMillis = ? recordDelete_timeMillis = ?
where workOrderId = ? where workOrderId = ?
and lotId = ?`) and lotId = ?`)
.run(requestSession.user.userName, rightNowMillis, workOrderId, lotId); .run(requestSession.user.userName, rightNowMillis, workOrderId, lotId);
database.close(); database.close();
return result.changes > 0; return result.changes > 0;

View File

@ -1,31 +1,31 @@
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 type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes'
export function deleteWorkOrderLot( export function deleteWorkOrderLot(
workOrderId: number | string, workOrderId: number | string,
lotId: number | string, lotId: number | string,
requestSession: recordTypes.PartialSession requestSession: recordTypes.PartialSession
): boolean { ): boolean {
const database = sqlite(databasePath); const database = sqlite(databasePath)
const rightNowMillis = Date.now(); const rightNowMillis = Date.now()
const result = database const result = database
.prepare( .prepare(
`update WorkOrderLots `update WorkOrderLots
set recordDelete_userName = ?, set recordDelete_userName = ?,
recordDelete_timeMillis = ? recordDelete_timeMillis = ?
where workOrderId = ? where workOrderId = ?
and lotId = ?` and lotId = ?`
) )
.run(requestSession.user.userName, rightNowMillis, workOrderId, lotId); .run(requestSession.user!.userName, rightNowMillis, workOrderId, lotId)
database.close(); database.close()
return result.changes > 0; return result.changes > 0
} }
export default deleteWorkOrderLot; export default deleteWorkOrderLot

View File

@ -1,3 +1,3 @@
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes';
export declare function deleteWorkOrderLotOccupancy(workOrderId: number | string, lotOccupancyId: number | string, requestSession: recordTypes.PartialSession): boolean; export declare function deleteWorkOrderLotOccupancy(workOrderId: number | string, lotOccupancyId: number | string, requestSession: recordTypes.PartialSession): boolean;
export default deleteWorkOrderLotOccupancy; export default deleteWorkOrderLotOccupancy;

View File

@ -1,5 +1,5 @@
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';
export function deleteWorkOrderLotOccupancy(workOrderId, lotOccupancyId, requestSession) { export function deleteWorkOrderLotOccupancy(workOrderId, lotOccupancyId, requestSession) {
const database = sqlite(databasePath); const database = sqlite(databasePath);
const rightNowMillis = Date.now(); const rightNowMillis = Date.now();

View File

@ -1,31 +1,36 @@
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 type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes'
export function deleteWorkOrderLotOccupancy( export function deleteWorkOrderLotOccupancy(
workOrderId: number | string, workOrderId: number | string,
lotOccupancyId: number | string, lotOccupancyId: number | string,
requestSession: recordTypes.PartialSession requestSession: recordTypes.PartialSession
): boolean { ): boolean {
const database = sqlite(databasePath); const database = sqlite(databasePath)
const rightNowMillis = Date.now(); const rightNowMillis = Date.now()
const result = database const result = database
.prepare( .prepare(
`update WorkOrderLotOccupancies `update WorkOrderLotOccupancies
set recordDelete_userName = ?, set recordDelete_userName = ?,
recordDelete_timeMillis = ? recordDelete_timeMillis = ?
where workOrderId = ? where workOrderId = ?
and lotOccupancyId = ?` and lotOccupancyId = ?`
) )
.run(requestSession.user.userName, rightNowMillis, workOrderId, lotOccupancyId); .run(
requestSession.user!.userName,
rightNowMillis,
workOrderId,
lotOccupancyId
)
database.close(); database.close()
return result.changes > 0; return result.changes > 0
} }
export default deleteWorkOrderLotOccupancy; export default deleteWorkOrderLotOccupancy

View File

@ -1,14 +1,14 @@
import sqlite from "better-sqlite3"; import sqlite from 'better-sqlite3';
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes';
interface GetLotOccupanciesFilters { interface GetLotOccupanciesFilters {
lotId?: number | string; lotId?: number | string;
occupancyTime?: "" | "past" | "current" | "future"; occupancyTime?: '' | 'past' | 'current' | 'future';
occupancyStartDateString?: string; occupancyStartDateString?: string;
occupancyEffectiveDateString?: string; occupancyEffectiveDateString?: string;
occupantName?: string; occupantName?: string;
occupancyTypeId?: number | string; occupancyTypeId?: number | string;
mapId?: number | string; mapId?: number | string;
lotNameSearchType?: "" | "startsWith" | "endsWith"; lotNameSearchType?: '' | 'startsWith' | 'endsWith';
lotName?: string; lotName?: string;
lotTypeId?: number | string; lotTypeId?: number | string;
workOrderId?: number | string; workOrderId?: number | string;

View File

@ -1,60 +1,60 @@
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 } from "@cityssm/expressjs-server-js/dateTimeFns.js"; import { dateIntegerToString, dateStringToInteger } from '@cityssm/expressjs-server-js/dateTimeFns.js';
import * as configFunctions from "../functions.config.js"; import * as configFunctions from '../functions.config.js';
import { getOccupancyTypeById } from "../functions.cache.js"; import { getOccupancyTypeById } from '../functions.cache.js';
import { getLotOccupancyOccupants } from "./getLotOccupancyOccupants.js"; import { getLotOccupancyOccupants } from './getLotOccupancyOccupants.js';
import { getLotNameWhereClause, getOccupancyTimeWhereClause, getOccupantNameWhereClause } from "../functions.sqlFilters.js"; import { getLotNameWhereClause, getOccupancyTimeWhereClause, getOccupantNameWhereClause } from '../functions.sqlFilters.js';
function buildWhereClause(filters) { function buildWhereClause(filters) {
let sqlWhereClause = " where o.recordDelete_timeMillis is null"; let sqlWhereClause = ' where o.recordDelete_timeMillis is null';
const sqlParameters = []; const sqlParameters = [];
if (filters.lotId) { if (filters.lotId) {
sqlWhereClause += " and o.lotId = ?"; sqlWhereClause += ' and o.lotId = ?';
sqlParameters.push(filters.lotId); sqlParameters.push(filters.lotId);
} }
const lotNameFilters = getLotNameWhereClause(filters.lotName, filters.lotNameSearchType, "l"); const lotNameFilters = getLotNameWhereClause(filters.lotName, filters.lotNameSearchType ?? '', 'l');
sqlWhereClause += lotNameFilters.sqlWhereClause; sqlWhereClause += lotNameFilters.sqlWhereClause;
sqlParameters.push(...lotNameFilters.sqlParameters); sqlParameters.push(...lotNameFilters.sqlParameters);
const occupantNameFilters = getOccupantNameWhereClause(filters.occupantName, "o"); const occupantNameFilters = getOccupantNameWhereClause(filters.occupantName, 'o');
if (occupantNameFilters.sqlParameters.length > 0) { if (occupantNameFilters.sqlParameters.length > 0) {
sqlWhereClause += sqlWhereClause +=
" and o.lotOccupancyId in (select lotOccupancyId from LotOccupancyOccupants o where recordDelete_timeMillis is null" + ' and o.lotOccupancyId in (select lotOccupancyId from LotOccupancyOccupants o where recordDelete_timeMillis is null' +
occupantNameFilters.sqlWhereClause + occupantNameFilters.sqlWhereClause +
")"; ')';
sqlParameters.push(...occupantNameFilters.sqlParameters); sqlParameters.push(...occupantNameFilters.sqlParameters);
} }
if (filters.occupancyTypeId) { if (filters.occupancyTypeId) {
sqlWhereClause += " and o.occupancyTypeId = ?"; sqlWhereClause += ' and o.occupancyTypeId = ?';
sqlParameters.push(filters.occupancyTypeId); sqlParameters.push(filters.occupancyTypeId);
} }
const occupancyTimeFilters = getOccupancyTimeWhereClause(filters.occupancyTime, "o"); const occupancyTimeFilters = getOccupancyTimeWhereClause(filters.occupancyTime ?? '', 'o');
sqlWhereClause += occupancyTimeFilters.sqlWhereClause; sqlWhereClause += occupancyTimeFilters.sqlWhereClause;
sqlParameters.push(...occupancyTimeFilters.sqlParameters); sqlParameters.push(...occupancyTimeFilters.sqlParameters);
if (filters.occupancyStartDateString) { if (filters.occupancyStartDateString) {
sqlWhereClause += " and o.occupancyStartDate = ?"; sqlWhereClause += ' and o.occupancyStartDate = ?';
sqlParameters.push(dateStringToInteger(filters.occupancyStartDateString)); sqlParameters.push(dateStringToInteger(filters.occupancyStartDateString));
} }
if (filters.occupancyEffectiveDateString) { if (filters.occupancyEffectiveDateString) {
sqlWhereClause += sqlWhereClause +=
" and (o.occupancyStartDate <= ? and (o.occupancyEndDate is null or o.occupancyEndDate >= ?))"; ' and (o.occupancyStartDate <= ? and (o.occupancyEndDate is null or o.occupancyEndDate >= ?))';
sqlParameters.push(dateStringToInteger(filters.occupancyEffectiveDateString), dateStringToInteger(filters.occupancyEffectiveDateString)); sqlParameters.push(dateStringToInteger(filters.occupancyEffectiveDateString), dateStringToInteger(filters.occupancyEffectiveDateString));
} }
if (filters.mapId) { if (filters.mapId) {
sqlWhereClause += " and l.mapId = ?"; sqlWhereClause += ' and l.mapId = ?';
sqlParameters.push(filters.mapId); sqlParameters.push(filters.mapId);
} }
if (filters.lotTypeId) { if (filters.lotTypeId) {
sqlWhereClause += " and l.lotTypeId = ?"; sqlWhereClause += ' and l.lotTypeId = ?';
sqlParameters.push(filters.lotTypeId); sqlParameters.push(filters.lotTypeId);
} }
if (filters.workOrderId) { if (filters.workOrderId) {
sqlWhereClause += sqlWhereClause +=
" and o.lotOccupancyId in (select lotOccupancyId from WorkOrderLotOccupancies where recordDelete_timeMillis is null and workOrderId = ?)"; ' and o.lotOccupancyId in (select lotOccupancyId from WorkOrderLotOccupancies where recordDelete_timeMillis is null and workOrderId = ?)';
sqlParameters.push(filters.workOrderId); sqlParameters.push(filters.workOrderId);
} }
if (filters.notWorkOrderId) { if (filters.notWorkOrderId) {
sqlWhereClause += sqlWhereClause +=
" and o.lotOccupancyId not in (select lotOccupancyId from WorkOrderLotOccupancies where recordDelete_timeMillis is null and workOrderId = ?)"; ' and o.lotOccupancyId not in (select lotOccupancyId from WorkOrderLotOccupancies where recordDelete_timeMillis is null and workOrderId = ?)';
sqlParameters.push(filters.notWorkOrderId); sqlParameters.push(filters.notWorkOrderId);
} }
return { return {
@ -63,19 +63,19 @@ function buildWhereClause(filters) {
}; };
} }
export function getLotOccupancies(filters, options, connectedDatabase) { export function getLotOccupancies(filters, options, connectedDatabase) {
const database = connectedDatabase || const database = connectedDatabase ??
sqlite(databasePath, { sqlite(databasePath, {
readonly: true readonly: true
}); });
database.function("userFn_dateIntegerToString", dateIntegerToString); database.function('userFn_dateIntegerToString', dateIntegerToString);
const { sqlWhereClause, sqlParameters } = buildWhereClause(filters); const { sqlWhereClause, sqlParameters } = buildWhereClause(filters);
let count = options.limit; let count = options.limit;
const isLimited = options.limit !== -1; const isLimited = options.limit !== -1;
if (isLimited) { if (isLimited) {
count = database count = database
.prepare("select count(*) as recordCount" + .prepare('select count(*) as recordCount' +
" from LotOccupancies o" + ' from LotOccupancies o' +
" left join Lots l on o.lotId = l.lotId" + ' left join Lots l on o.lotId = l.lotId' +
sqlWhereClause) sqlWhereClause)
.get(sqlParameters).recordCount; .get(sqlParameters).recordCount;
} }
@ -95,7 +95,7 @@ export function getLotOccupancies(filters, options, connectedDatabase) {
left join Maps m on l.mapId = m.mapId left join Maps m on l.mapId = m.mapId
${sqlWhereClause} ${sqlWhereClause}
order by o.occupancyStartDate desc, ifnull(o.occupancyEndDate, 99999999) desc, l.lotName, o.lotId, o.lotOccupancyId desc` + order by o.occupancyStartDate desc, ifnull(o.occupancyEndDate, 99999999) desc, l.lotName, o.lotId, o.lotOccupancyId desc` +
(isLimited ? ` limit ${options.limit} offset ${options.offset}` : "")) (isLimited ? ` limit ${options.limit} offset ${options.offset}` : ''))
.all(sqlParameters); .all(sqlParameters);
if (!isLimited) { if (!isLimited) {
count = lotOccupancies.length; count = lotOccupancies.length;
@ -103,8 +103,8 @@ export function getLotOccupancies(filters, options, connectedDatabase) {
for (const lotOccupancy of lotOccupancies) { for (const lotOccupancy of lotOccupancies) {
const occupancyType = getOccupancyTypeById(lotOccupancy.occupancyTypeId); const occupancyType = getOccupancyTypeById(lotOccupancy.occupancyTypeId);
if (occupancyType) { if (occupancyType) {
lotOccupancy.printEJS = occupancyType.occupancyTypePrints.includes("*") lotOccupancy.printEJS = (occupancyType.occupancyTypePrints ?? []).includes('*')
? configFunctions.getProperty("settings.lotOccupancy.prints")[0] ? configFunctions.getProperty('settings.lotOccupancy.prints')[0]
: occupancyType.occupancyTypePrints[0]; : occupancyType.occupancyTypePrints[0];
} }
if (options.includeOccupants) { if (options.includeOccupants) {

View File

@ -1,160 +1,172 @@
import sqlite from "better-sqlite3"; /* eslint-disable @typescript-eslint/indent */
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; import sqlite from 'better-sqlite3'
import { lotOccupancyDB as databasePath } from '../../data/databasePaths.js'
import { import {
dateIntegerToString, dateIntegerToString,
dateStringToInteger dateStringToInteger
} from "@cityssm/expressjs-server-js/dateTimeFns.js"; } from '@cityssm/expressjs-server-js/dateTimeFns.js'
import * as configFunctions from "../functions.config.js"; import * as configFunctions from '../functions.config.js'
import { getOccupancyTypeById } from "../functions.cache.js"; import { getOccupancyTypeById } from '../functions.cache.js'
import { getLotOccupancyOccupants } from "./getLotOccupancyOccupants.js"; import { getLotOccupancyOccupants } from './getLotOccupancyOccupants.js'
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from '../../types/recordTypes'
import { import {
getLotNameWhereClause, getLotNameWhereClause,
getOccupancyTimeWhereClause, getOccupancyTimeWhereClause,
getOccupantNameWhereClause getOccupantNameWhereClause
} from "../functions.sqlFilters.js"; } from '../functions.sqlFilters.js'
interface GetLotOccupanciesFilters { interface GetLotOccupanciesFilters {
lotId?: number | string; lotId?: number | string
occupancyTime?: "" | "past" | "current" | "future"; occupancyTime?: '' | 'past' | 'current' | 'future'
occupancyStartDateString?: string; occupancyStartDateString?: string
occupancyEffectiveDateString?: string; occupancyEffectiveDateString?: string
occupantName?: string; occupantName?: string
occupancyTypeId?: number | string; occupancyTypeId?: number | string
mapId?: number | string; mapId?: number | string
lotNameSearchType?: "" | "startsWith" | "endsWith"; lotNameSearchType?: '' | 'startsWith' | 'endsWith'
lotName?: string; lotName?: string
lotTypeId?: number | string; lotTypeId?: number | string
workOrderId?: number | string; workOrderId?: number | string
notWorkOrderId?: number | string; notWorkOrderId?: number | string
} }
interface GetLotOccupanciesOptions { interface GetLotOccupanciesOptions {
limit: -1 | number; limit: -1 | number
offset: number; offset: number
includeOccupants: boolean; includeOccupants: boolean
} }
function buildWhereClause(filters: GetLotOccupanciesFilters): { function buildWhereClause(filters: GetLotOccupanciesFilters): {
sqlWhereClause: string; sqlWhereClause: string
sqlParameters: unknown[]; sqlParameters: unknown[]
} { } {
let sqlWhereClause = " where o.recordDelete_timeMillis is null"; let sqlWhereClause = ' where o.recordDelete_timeMillis is null'
const sqlParameters: unknown[] = []; const sqlParameters: unknown[] = []
if (filters.lotId) { if (filters.lotId) {
sqlWhereClause += " and o.lotId = ?"; sqlWhereClause += ' and o.lotId = ?'
sqlParameters.push(filters.lotId); sqlParameters.push(filters.lotId)
} }
const lotNameFilters = getLotNameWhereClause(filters.lotName, filters.lotNameSearchType, "l"); const lotNameFilters = getLotNameWhereClause(
sqlWhereClause += lotNameFilters.sqlWhereClause; filters.lotName,
sqlParameters.push(...lotNameFilters.sqlParameters); filters.lotNameSearchType ?? '',
'l'
)
sqlWhereClause += lotNameFilters.sqlWhereClause
sqlParameters.push(...lotNameFilters.sqlParameters)
const occupantNameFilters = getOccupantNameWhereClause(filters.occupantName, "o"); const occupantNameFilters = getOccupantNameWhereClause(
if (occupantNameFilters.sqlParameters.length > 0) { filters.occupantName,
sqlWhereClause += 'o'
" and o.lotOccupancyId in (select lotOccupancyId from LotOccupancyOccupants o where recordDelete_timeMillis is null" + )
occupantNameFilters.sqlWhereClause + if (occupantNameFilters.sqlParameters.length > 0) {
")"; sqlWhereClause +=
sqlParameters.push(...occupantNameFilters.sqlParameters); ' and o.lotOccupancyId in (select lotOccupancyId from LotOccupancyOccupants o where recordDelete_timeMillis is null' +
} occupantNameFilters.sqlWhereClause +
')'
sqlParameters.push(...occupantNameFilters.sqlParameters)
}
if (filters.occupancyTypeId) { if (filters.occupancyTypeId) {
sqlWhereClause += " and o.occupancyTypeId = ?"; sqlWhereClause += ' and o.occupancyTypeId = ?'
sqlParameters.push(filters.occupancyTypeId); sqlParameters.push(filters.occupancyTypeId)
} }
const occupancyTimeFilters = getOccupancyTimeWhereClause(filters.occupancyTime, "o"); const occupancyTimeFilters = getOccupancyTimeWhereClause(
sqlWhereClause += occupancyTimeFilters.sqlWhereClause; filters.occupancyTime ?? '',
sqlParameters.push(...occupancyTimeFilters.sqlParameters); 'o'
)
sqlWhereClause += occupancyTimeFilters.sqlWhereClause
sqlParameters.push(...occupancyTimeFilters.sqlParameters)
if (filters.occupancyStartDateString) { if (filters.occupancyStartDateString) {
sqlWhereClause += " and o.occupancyStartDate = ?"; sqlWhereClause += ' and o.occupancyStartDate = ?'
sqlParameters.push(dateStringToInteger(filters.occupancyStartDateString)); sqlParameters.push(dateStringToInteger(filters.occupancyStartDateString))
} }
if (filters.occupancyEffectiveDateString) { if (filters.occupancyEffectiveDateString) {
sqlWhereClause += sqlWhereClause +=
" and (o.occupancyStartDate <= ? and (o.occupancyEndDate is null or o.occupancyEndDate >= ?))"; ' and (o.occupancyStartDate <= ? and (o.occupancyEndDate is null or o.occupancyEndDate >= ?))'
sqlParameters.push( sqlParameters.push(
dateStringToInteger(filters.occupancyEffectiveDateString), dateStringToInteger(filters.occupancyEffectiveDateString),
dateStringToInteger(filters.occupancyEffectiveDateString) dateStringToInteger(filters.occupancyEffectiveDateString)
); )
} }
if (filters.mapId) { if (filters.mapId) {
sqlWhereClause += " and l.mapId = ?"; sqlWhereClause += ' and l.mapId = ?'
sqlParameters.push(filters.mapId); sqlParameters.push(filters.mapId)
} }
if (filters.lotTypeId) { if (filters.lotTypeId) {
sqlWhereClause += " and l.lotTypeId = ?"; sqlWhereClause += ' and l.lotTypeId = ?'
sqlParameters.push(filters.lotTypeId); sqlParameters.push(filters.lotTypeId)
} }
if (filters.workOrderId) { if (filters.workOrderId) {
sqlWhereClause += sqlWhereClause +=
" and o.lotOccupancyId in (select lotOccupancyId from WorkOrderLotOccupancies where recordDelete_timeMillis is null and workOrderId = ?)"; ' and o.lotOccupancyId in (select lotOccupancyId from WorkOrderLotOccupancies where recordDelete_timeMillis is null and workOrderId = ?)'
sqlParameters.push(filters.workOrderId); sqlParameters.push(filters.workOrderId)
} }
if (filters.notWorkOrderId) { if (filters.notWorkOrderId) {
sqlWhereClause += sqlWhereClause +=
" and o.lotOccupancyId not in (select lotOccupancyId from WorkOrderLotOccupancies where recordDelete_timeMillis is null and workOrderId = ?)"; ' and o.lotOccupancyId not in (select lotOccupancyId from WorkOrderLotOccupancies where recordDelete_timeMillis is null and workOrderId = ?)'
sqlParameters.push(filters.notWorkOrderId); sqlParameters.push(filters.notWorkOrderId)
} }
return { return {
sqlWhereClause, sqlWhereClause,
sqlParameters sqlParameters
}; }
} }
export function getLotOccupancies( export function getLotOccupancies(
filters: GetLotOccupanciesFilters, filters: GetLotOccupanciesFilters,
options: GetLotOccupanciesOptions, options: GetLotOccupanciesOptions,
connectedDatabase?: sqlite.Database connectedDatabase?: sqlite.Database
): { ): {
count: number; count: number
lotOccupancies: recordTypes.LotOccupancy[]; lotOccupancies: recordTypes.LotOccupancy[]
} { } {
const database = const database =
connectedDatabase || connectedDatabase ??
sqlite(databasePath, { sqlite(databasePath, {
readonly: true readonly: true
}); })
database.function("userFn_dateIntegerToString", dateIntegerToString); database.function('userFn_dateIntegerToString', dateIntegerToString)
const { sqlWhereClause, sqlParameters } = buildWhereClause(filters); const { sqlWhereClause, sqlParameters } = buildWhereClause(filters)
let count = options.limit; let count = options.limit
const isLimited = options.limit !== -1; const isLimited = options.limit !== -1
if (isLimited) { if (isLimited) {
count = database count = database
.prepare( .prepare(
"select count(*) as recordCount" + 'select count(*) as recordCount' +
" from LotOccupancies o" + ' from LotOccupancies o' +
" left join Lots l on o.lotId = l.lotId" + ' left join Lots l on o.lotId = l.lotId' +
sqlWhereClause sqlWhereClause
) )
.get(sqlParameters).recordCount; .get(sqlParameters).recordCount
} }
let lotOccupancies: recordTypes.LotOccupancy[] = []; let lotOccupancies: recordTypes.LotOccupancy[] = []
if (count !== 0) { if (count !== 0) {
lotOccupancies = database lotOccupancies = database
.prepare( .prepare(
`select o.lotOccupancyId, `select o.lotOccupancyId,
o.occupancyTypeId, t.occupancyType, o.occupancyTypeId, t.occupancyType,
o.lotId, lt.lotType, l.lotName, o.lotId, lt.lotType, l.lotName,
l.mapId, m.mapName, l.mapId, m.mapName,
@ -167,40 +179,42 @@ export function getLotOccupancies(
left join Maps m on l.mapId = m.mapId left join Maps m on l.mapId = m.mapId
${sqlWhereClause} ${sqlWhereClause}
order by o.occupancyStartDate desc, ifnull(o.occupancyEndDate, 99999999) desc, l.lotName, o.lotId, o.lotOccupancyId desc` + order by o.occupancyStartDate desc, ifnull(o.occupancyEndDate, 99999999) desc, l.lotName, o.lotId, o.lotOccupancyId desc` +
(isLimited ? ` limit ${options.limit} offset ${options.offset}` : "") (isLimited ? ` limit ${options.limit} offset ${options.offset}` : '')
) )
.all(sqlParameters); .all(sqlParameters)
if (!isLimited) { if (!isLimited) {
count = lotOccupancies.length; count = lotOccupancies.length
}
for (const lotOccupancy of lotOccupancies) {
const occupancyType = getOccupancyTypeById(lotOccupancy.occupancyTypeId);
if (occupancyType) {
lotOccupancy.printEJS = occupancyType.occupancyTypePrints.includes("*")
? configFunctions.getProperty("settings.lotOccupancy.prints")[0]
: occupancyType.occupancyTypePrints[0];
}
if (options.includeOccupants) {
lotOccupancy.lotOccupancyOccupants = getLotOccupancyOccupants(
lotOccupancy.lotOccupancyId,
database
);
}
}
} }
if (!connectedDatabase) { for (const lotOccupancy of lotOccupancies) {
database.close(); const occupancyType = getOccupancyTypeById(lotOccupancy.occupancyTypeId!)
}
return { if (occupancyType) {
count, lotOccupancy.printEJS = (
lotOccupancies occupancyType.occupancyTypePrints ?? []
}; ).includes('*')
? configFunctions.getProperty('settings.lotOccupancy.prints')[0]
: occupancyType.occupancyTypePrints![0]
}
if (options.includeOccupants) {
lotOccupancy.lotOccupancyOccupants = getLotOccupancyOccupants(
lotOccupancy.lotOccupancyId!,
database
)
}
}
}
if (!connectedDatabase) {
database.close()
}
return {
count,
lotOccupancies
}
} }
export default getLotOccupancies; export default getLotOccupancies