pull/11/head
Dan Gowans 2025-04-30 08:45:39 -04:00
parent 3c1d023ccd
commit 656f1b052e
12 changed files with 109 additions and 56 deletions

View File

@ -1,10 +1,11 @@
import { type DateString, type TimeString } from '@cityssm/utils-datetime';
export interface AddWorkOrderMilestoneForm { export interface AddWorkOrderMilestoneForm {
workOrderId: number | string; workOrderId: number | string;
workOrderMilestoneTypeId: number | string; workOrderMilestoneTypeId: number | string;
workOrderMilestoneDateString: string; workOrderMilestoneDateString: '' | DateString;
workOrderMilestoneTimeString?: string; workOrderMilestoneTimeString?: '' | TimeString;
workOrderMilestoneDescription: string; workOrderMilestoneDescription: string;
workOrderMilestoneCompletionDateString?: string; workOrderMilestoneCompletionDateString?: '' | DateString;
workOrderMilestoneCompletionTimeString?: string; workOrderMilestoneCompletionTimeString?: '' | TimeString;
} }
export default function addWorkOrderMilestone(milestoneForm: AddWorkOrderMilestoneForm, user: User): number; export default function addWorkOrderMilestone(milestoneForm: AddWorkOrderMilestoneForm, user: User): number;

View File

@ -1,4 +1,6 @@
import { import {
type DateString,
type TimeString,
dateStringToInteger, dateStringToInteger,
timeStringToInteger timeStringToInteger
} from '@cityssm/utils-datetime' } from '@cityssm/utils-datetime'
@ -10,13 +12,13 @@ export interface AddWorkOrderMilestoneForm {
workOrderId: number | string workOrderId: number | string
workOrderMilestoneTypeId: number | string workOrderMilestoneTypeId: number | string
workOrderMilestoneDateString: string workOrderMilestoneDateString: '' | DateString
workOrderMilestoneTimeString?: string workOrderMilestoneTimeString?: '' | TimeString
workOrderMilestoneDescription: string workOrderMilestoneDescription: string
workOrderMilestoneCompletionDateString?: string workOrderMilestoneCompletionDateString?: '' | DateString
workOrderMilestoneCompletionTimeString?: string workOrderMilestoneCompletionTimeString?: '' | TimeString
} }
export default function addWorkOrderMilestone( export default function addWorkOrderMilestone(
@ -48,17 +50,19 @@ export default function addWorkOrderMilestone(
: dateStringToInteger(milestoneForm.workOrderMilestoneDateString), : dateStringToInteger(milestoneForm.workOrderMilestoneDateString),
(milestoneForm.workOrderMilestoneTimeString ?? '') === '' (milestoneForm.workOrderMilestoneTimeString ?? '') === ''
? 0 ? 0
: timeStringToInteger(milestoneForm.workOrderMilestoneTimeString!), : timeStringToInteger(
milestoneForm.workOrderMilestoneTimeString as TimeString
),
milestoneForm.workOrderMilestoneDescription, milestoneForm.workOrderMilestoneDescription,
(milestoneForm.workOrderMilestoneCompletionDateString ?? '') === '' (milestoneForm.workOrderMilestoneCompletionDateString ?? '') === ''
? undefined ? undefined
: dateStringToInteger( : dateStringToInteger(
milestoneForm.workOrderMilestoneCompletionDateString! milestoneForm.workOrderMilestoneCompletionDateString as DateString
), ),
(milestoneForm.workOrderMilestoneCompletionTimeString ?? '') === '' (milestoneForm.workOrderMilestoneCompletionTimeString ?? '') === ''
? undefined ? undefined
: timeStringToInteger( : timeStringToInteger(
milestoneForm.workOrderMilestoneCompletionTimeString! milestoneForm.workOrderMilestoneCompletionTimeString as TimeString
), ),
user.userName, user.userName,
rightNowMillis, rightNowMillis,

View File

@ -1,6 +1,7 @@
import { type DateString, type TimeString } from '@cityssm/utils-datetime';
export interface CompleteWorkOrderMilestoneForm { export interface CompleteWorkOrderMilestoneForm {
workOrderMilestoneId: number | string; workOrderMilestoneId: number | string;
workOrderMilestoneCompletionDateString?: string; workOrderMilestoneCompletionDateString?: '' | DateString;
workOrderMilestoneCompletionTimeString?: string; workOrderMilestoneCompletionTimeString?: '' | TimeString;
} }
export default function completeWorkOrderMilestone(milestoneForm: CompleteWorkOrderMilestoneForm, user: User): boolean; export default function completeWorkOrderMilestone(milestoneForm: CompleteWorkOrderMilestoneForm, user: User): boolean;

View File

@ -4,6 +4,12 @@ import { sunriseDB } from '../helpers/database.helpers.js';
export default function completeWorkOrderMilestone(milestoneForm, user) { export default function completeWorkOrderMilestone(milestoneForm, user) {
const rightNow = new Date(); const rightNow = new Date();
const database = sqlite(sunriseDB); const database = sqlite(sunriseDB);
const completionDate = (milestoneForm.workOrderMilestoneCompletionDateString ?? '') === ''
? dateToInteger(rightNow)
: dateStringToInteger(milestoneForm.workOrderMilestoneCompletionDateString);
const completionTime = (milestoneForm.workOrderMilestoneCompletionTimeString ?? '') === ''
? dateToTimeInteger(rightNow)
: timeStringToInteger(milestoneForm.workOrderMilestoneCompletionTimeString);
const result = database const result = database
.prepare(`update WorkOrderMilestones .prepare(`update WorkOrderMilestones
set workOrderMilestoneCompletionDate = ?, set workOrderMilestoneCompletionDate = ?,
@ -11,11 +17,7 @@ export default function completeWorkOrderMilestone(milestoneForm, user) {
recordUpdate_userName = ?, recordUpdate_userName = ?,
recordUpdate_timeMillis = ? recordUpdate_timeMillis = ?
where workOrderMilestoneId = ?`) where workOrderMilestoneId = ?`)
.run((milestoneForm.workOrderMilestoneCompletionDateString ?? '') === '' .run(completionDate, completionTime, user.userName, rightNow.getTime(), milestoneForm.workOrderMilestoneId);
? dateToInteger(rightNow)
: dateStringToInteger(milestoneForm.workOrderMilestoneCompletionDateString), (milestoneForm.workOrderMilestoneCompletionTimeString ?? '') === ''
? dateToTimeInteger(rightNow)
: timeStringToInteger(milestoneForm.workOrderMilestoneCompletionTimeString), user.userName, rightNow.getTime(), milestoneForm.workOrderMilestoneId);
database.close(); database.close();
return result.changes > 0; return result.changes > 0;
} }

View File

@ -1,4 +1,6 @@
import { import {
type DateString,
type TimeString,
dateStringToInteger, dateStringToInteger,
dateToInteger, dateToInteger,
dateToTimeInteger, dateToTimeInteger,
@ -11,8 +13,8 @@ import { sunriseDB } from '../helpers/database.helpers.js'
export interface CompleteWorkOrderMilestoneForm { export interface CompleteWorkOrderMilestoneForm {
workOrderMilestoneId: number | string workOrderMilestoneId: number | string
workOrderMilestoneCompletionDateString?: string workOrderMilestoneCompletionDateString?: '' | DateString
workOrderMilestoneCompletionTimeString?: string workOrderMilestoneCompletionTimeString?: '' | TimeString
} }
export default function completeWorkOrderMilestone( export default function completeWorkOrderMilestone(
@ -23,6 +25,20 @@ export default function completeWorkOrderMilestone(
const database = sqlite(sunriseDB) const database = sqlite(sunriseDB)
const completionDate =
(milestoneForm.workOrderMilestoneCompletionDateString ?? '') === ''
? dateToInteger(rightNow)
: dateStringToInteger(
milestoneForm.workOrderMilestoneCompletionDateString as DateString
)
const completionTime =
(milestoneForm.workOrderMilestoneCompletionTimeString ?? '') === ''
? dateToTimeInteger(rightNow)
: timeStringToInteger(
milestoneForm.workOrderMilestoneCompletionTimeString as TimeString
)
const result = database const result = database
.prepare( .prepare(
`update WorkOrderMilestones `update WorkOrderMilestones
@ -33,16 +49,8 @@ export default function completeWorkOrderMilestone(
where workOrderMilestoneId = ?` where workOrderMilestoneId = ?`
) )
.run( .run(
(milestoneForm.workOrderMilestoneCompletionDateString ?? '') === '' completionDate,
? dateToInteger(rightNow) completionTime,
: dateStringToInteger(
milestoneForm.workOrderMilestoneCompletionDateString!
),
(milestoneForm.workOrderMilestoneCompletionTimeString ?? '') === ''
? dateToTimeInteger(rightNow)
: timeStringToInteger(
milestoneForm.workOrderMilestoneCompletionTimeString!
),
user.userName, user.userName,
rightNow.getTime(), rightNow.getTime(),
milestoneForm.workOrderMilestoneId milestoneForm.workOrderMilestoneId

View File

@ -1,6 +1,6 @@
import sqlite from 'better-sqlite3'; import sqlite from 'better-sqlite3';
import { sunriseDB } from '../helpers/database.helpers.js'; import { sunriseDB } from '../helpers/database.helpers.js';
import { clearCacheByTableName } from '../helpers/functions.cache.js'; import { cacheTableNames, clearCacheByTableName } from '../helpers/functions.cache.js';
const recordIdColumns = new Map([ const recordIdColumns = new Map([
['BurialSiteComments', 'burialSiteCommentId'], ['BurialSiteComments', 'burialSiteCommentId'],
['BurialSiteStatuses', 'burialSiteStatusId'], ['BurialSiteStatuses', 'burialSiteStatusId'],
@ -55,6 +55,9 @@ export function deleteRecord(recordTable, recordId, user) {
.run(user.userName, rightNowMillis, recordId); .run(user.userName, rightNowMillis, recordId);
} }
database.close(); database.close();
// Clear cache for tables that are cached
if (cacheTableNames.includes(recordTable)) {
clearCacheByTableName(recordTable); clearCacheByTableName(recordTable);
}
return result.changes > 0; return result.changes > 0;
} }

View File

@ -1,7 +1,11 @@
import sqlite from 'better-sqlite3' import sqlite from 'better-sqlite3'
import { sunriseDB } from '../helpers/database.helpers.js' import { sunriseDB } from '../helpers/database.helpers.js'
import { clearCacheByTableName } from '../helpers/functions.cache.js' import {
CacheTableNames,
cacheTableNames,
clearCacheByTableName
} from '../helpers/functions.cache.js'
type RecordTable = type RecordTable =
| 'BurialSiteComments' | 'BurialSiteComments'
@ -73,7 +77,7 @@ export function deleteRecord(
`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(user.userName, rightNowMillis, recordId) .run(user.userName, rightNowMillis, recordId)
@ -84,7 +88,7 @@ export function deleteRecord(
`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(user.userName, rightNowMillis, recordId) .run(user.userName, rightNowMillis, recordId)
@ -92,7 +96,10 @@ export function deleteRecord(
database.close() database.close()
clearCacheByTableName(recordTable) // Clear cache for tables that are cached
if (cacheTableNames.includes(recordTable as CacheTableNames)) {
clearCacheByTableName(recordTable as CacheTableNames)
}
return result.changes > 0 return result.changes > 0
} }

View File

@ -13,13 +13,17 @@ const recordNameIdColumns = new Map([
]); ]);
export function updateRecord(recordTable, recordId, recordName, user) { export function updateRecord(recordTable, recordId, recordName, user) {
const database = sqlite(sunriseDB); const database = sqlite(sunriseDB);
const columnNames = recordNameIdColumns.get(recordTable);
if (columnNames === undefined) {
throw new Error(`Invalid record table: ${recordTable}`);
}
const result = database const result = database
.prepare(`update ${recordTable} .prepare(`update ${recordTable}
set ${recordNameIdColumns.get(recordTable)[0]} = ?, set ${columnNames[0]} = ?,
recordUpdate_userName = ?, recordUpdate_userName = ?,
recordUpdate_timeMillis = ? recordUpdate_timeMillis = ?
where recordDelete_timeMillis is null where recordDelete_timeMillis is null
and ${recordNameIdColumns.get(recordTable)[1]} = ?`) and ${columnNames[1]} = ?`)
.run(recordName, user.userName, Date.now(), recordId); .run(recordName, user.userName, Date.now(), recordId);
database.close(); database.close();
clearCacheByTableName(recordTable); clearCacheByTableName(recordTable);

View File

@ -29,14 +29,20 @@ export function updateRecord(
): boolean { ): boolean {
const database = sqlite(sunriseDB) const database = sqlite(sunriseDB)
const columnNames = recordNameIdColumns.get(recordTable)
if (columnNames === undefined) {
throw new Error(`Invalid record table: ${recordTable}`)
}
const result = database const result = database
.prepare( .prepare(
`update ${recordTable} `update ${recordTable}
set ${recordNameIdColumns.get(recordTable)![0]} = ?, set ${columnNames[0]} = ?,
recordUpdate_userName = ?, recordUpdate_userName = ?,
recordUpdate_timeMillis = ? recordUpdate_timeMillis = ?
where recordDelete_timeMillis is null where recordDelete_timeMillis is null
and ${recordNameIdColumns.get(recordTable)![1]} = ?` and ${columnNames[1]} = ?`
) )
.run(recordName, user.userName, Date.now(), recordId) .run(recordName, user.userName, Date.now(), recordId)

View File

@ -20,7 +20,7 @@ export declare function getWorkOrderMilestoneTypeById(workOrderMilestoneTypeId:
export declare function getWorkOrderMilestoneTypeByWorkOrderMilestoneType(workOrderMilestoneTypeString: string): WorkOrderMilestoneType | undefined; export declare function getWorkOrderMilestoneTypeByWorkOrderMilestoneType(workOrderMilestoneTypeString: string): WorkOrderMilestoneType | undefined;
export declare function getWorkOrderMilestoneTypes(): WorkOrderMilestoneType[]; export declare function getWorkOrderMilestoneTypes(): WorkOrderMilestoneType[];
export declare function preloadCaches(): void; export declare function preloadCaches(): void;
type CacheTableNames = 'BurialSiteStatuses' | 'BurialSiteTypeFields' | 'BurialSiteTypes' | 'CommittalTypes' | 'ContractTypeFields' | 'ContractTypePrints' | 'ContractTypes' | 'FeeCategories' | 'Fees' | 'IntermentContainerTypes' | 'WorkOrderMilestoneTypes' | 'WorkOrderTypes'; export declare const cacheTableNames: readonly ["BurialSiteStatuses", "BurialSiteTypeFields", "BurialSiteTypes", "CommittalTypes", "ContractTypeFields", "ContractTypePrints", "ContractTypes", "FeeCategories", "Fees", "IntermentContainerTypes", "WorkOrderMilestoneTypes", "WorkOrderTypes"];
export type CacheTableNames = typeof cacheTableNames[number];
export declare function clearCacheByTableName(tableName: CacheTableNames, relayMessage?: boolean): void; export declare function clearCacheByTableName(tableName: CacheTableNames, relayMessage?: boolean): void;
export declare function clearCaches(): void; export declare function clearCaches(): void;
export {};

View File

@ -170,6 +170,20 @@ export function preloadCaches() {
getWorkOrderTypes(); getWorkOrderTypes();
getWorkOrderMilestoneTypes(); getWorkOrderMilestoneTypes();
} }
export const cacheTableNames = [
'BurialSiteStatuses',
'BurialSiteTypeFields',
'BurialSiteTypes',
'CommittalTypes',
'ContractTypeFields',
'ContractTypePrints',
'ContractTypes',
'FeeCategories',
'Fees',
'IntermentContainerTypes',
'WorkOrderMilestoneTypes',
'WorkOrderTypes'
];
export function clearCacheByTableName(tableName, relayMessage = true) { export function clearCacheByTableName(tableName, relayMessage = true) {
switch (tableName) { switch (tableName) {
case 'BurialSiteStatuses': { case 'BurialSiteStatuses': {

View File

@ -305,19 +305,22 @@ export function preloadCaches(): void {
getWorkOrderMilestoneTypes() getWorkOrderMilestoneTypes()
} }
type CacheTableNames = export const cacheTableNames = [
| 'BurialSiteStatuses' 'BurialSiteStatuses'
| 'BurialSiteTypeFields' , 'BurialSiteTypeFields'
| 'BurialSiteTypes' , 'BurialSiteTypes'
| 'CommittalTypes' , 'CommittalTypes'
| 'ContractTypeFields' , 'ContractTypeFields'
| 'ContractTypePrints' , 'ContractTypePrints'
| 'ContractTypes' , 'ContractTypes'
| 'FeeCategories' , 'FeeCategories'
| 'Fees' , 'Fees'
| 'IntermentContainerTypes' , 'IntermentContainerTypes'
| 'WorkOrderMilestoneTypes' , 'WorkOrderMilestoneTypes'
| 'WorkOrderTypes' , 'WorkOrderTypes'
] as const
export type CacheTableNames = typeof cacheTableNames[number]
export function clearCacheByTableName( export function clearCacheByTableName(
tableName: CacheTableNames, tableName: CacheTableNames,