Compare commits

...

23 Commits

Author SHA1 Message Date
Dan Gowans 118fc1959b fix undefined transaction time 2025-05-02 08:52:35 -04:00
Dan Gowans 9830bede34 linting 2025-05-01 14:53:07 -04:00
Dan Gowans 302a9a4c48 include "cms" in title 2025-05-01 12:45:59 -04:00
Dan Gowans fe9188d1fb version bump 2025-05-01 12:36:08 -04:00
Dan Gowans 4664366e12 linting 2025-05-01 12:32:36 -04:00
Dan Gowans afcdca959b use built in database backup function 2025-05-01 12:19:48 -04:00
Dan Gowans 434e15ba1d highlight today's funerals 2025-05-01 11:34:47 -04:00
Dan Gowans 39dc10369f show funeral home upcoming contracts 2025-05-01 11:20:33 -04:00
Dan Gowans 7371be711a restore deleted burial sites 2025-05-01 10:38:13 -04:00
Dan Gowans 9048235ef2 more deleted item loading 2025-05-01 09:26:40 -04:00
Dan Gowans 59b0fb7e5f ensure deleted items are loaded for import 2025-05-01 09:16:02 -04:00
Dan Gowans 57b6dbf35e use common "cremation" cemetery list 2025-05-01 08:55:34 -04:00
Dan Gowans c460d073e7 linting 2025-04-30 15:14:56 -04:00
Dan Gowans a7ce5a99cb add default city to interment modals 2025-04-30 15:11:12 -04:00
Dan Gowans db05999c72 track burial site capacities
alter table BurialSiteTypes
add bodyCapacityMax smallint

alter table BurialSiteTypes
add crematedCapacityMax smallint

alter table BurialSites
add bodyCapacity smallint

alter table BurialSites
add crematedCapacity smallint
2025-04-30 14:40:47 -04:00
Dan Gowans 9c47b48abc linting 2025-04-30 10:42:16 -04:00
Dan Gowans 2ed7902320 rename "switch to edit mode" buttons 2025-04-30 10:19:16 -04:00
Dan Gowans 7887230c86 linting 2025-04-30 10:00:59 -04:00
Dan Gowans 18edc57f70 update linter 2025-04-30 10:00:27 -04:00
Dan Gowans 656f1b052e linting 2025-04-30 08:45:39 -04:00
Dan Gowans 3c1d023ccd linting 2025-04-29 15:22:01 -04:00
Dan Gowans 2c506711fb add id to pdf file name 2025-04-29 14:57:07 -04:00
Dan Gowans 0dcdfaaa8a fix small screen alignment 2025-04-29 13:44:33 -04:00
214 changed files with 3018 additions and 1895 deletions

View File

@ -1,2 +1,2 @@
theme: jekyll-theme-cayman
title: Sunrise Cemetery Management System
title: Sunrise Cemetery Management System (CMS)

View File

@ -12,7 +12,7 @@ import { getConfigProperty } from '../helpers/config.helpers.js';
import version from '../version.js';
const debug = Debug(`${DEBUG_NAMESPACE}:www:${process.pid}`);
// INITIALIZE THE DATABASE
await initializeDatabase();
initializeDatabase();
const directoryName = path.dirname(fileURLToPath(import.meta.url));
const processCount = Math.min(getConfigProperty('application.maximumProcesses'), os.cpus().length * 2);
const applicationName = getConfigProperty('application.applicationName');

View File

@ -17,7 +17,7 @@ import version from '../version.js'
const debug = Debug(`${DEBUG_NAMESPACE}:www:${process.pid}`)
// INITIALIZE THE DATABASE
await initializeDatabase()
initializeDatabase()
const directoryName = path.dirname(fileURLToPath(import.meta.url))

View File

@ -10,7 +10,7 @@ import { getConfigProperty } from '../helpers/config.helpers.js';
const debug = Debug(`${DEBUG_NAMESPACE}:wwwProcess:${process.pid.toString().padEnd(5)}`);
if (process.send === undefined) {
// INITIALIZE THE DATABASE
await initializeDatabase();
initializeDatabase();
}
function onError(error) {
if (error.syscall !== 'listen') {

View File

@ -15,7 +15,7 @@ const debug = Debug(`${DEBUG_NAMESPACE}:wwwProcess:${process.pid.toString().padE
if (process.send === undefined) {
// INITIALIZE THE DATABASE
await initializeDatabase()
initializeDatabase()
}
interface ServerError extends Error {

View File

@ -6,6 +6,7 @@ export const config = {
settings: {
adminCleanup: {},
burialSites: {},
burialSiteTypes: {},
cemeteries: {},
contracts: {},
dynamicsGP: {

View File

@ -8,6 +8,7 @@ export const config: Config = {
settings: {
adminCleanup: {},
burialSites: {},
burialSiteTypes: {},
cemeteries: {},
contracts: {},
dynamicsGP: {

View File

@ -33,6 +33,8 @@ export declare const configDefaultValues: {
'settings.longitudeMax': number;
'settings.longitudeMin': number;
'settings.cemeteries.refreshImageChanges': boolean;
'settings.burialSiteTypes.bodyCapacityMaxDefault': number;
'settings.burialSiteTypes.crematedCapacityMaxDefault': number;
'settings.burialSites.burialSiteNameSegments': ConfigBurialSiteNameSegments;
'settings.burialSites.burialSiteNameSegments.includeCemeteryKey': boolean;
'settings.burialSites.refreshImageChanges': boolean;

View File

@ -32,6 +32,10 @@ export const configDefaultValues = {
'settings.longitudeMax': 180,
'settings.longitudeMin': -180,
'settings.cemeteries.refreshImageChanges': false,
// eslint-disable-next-line no-secrets/no-secrets
'settings.burialSiteTypes.bodyCapacityMaxDefault': 2,
// eslint-disable-next-line no-secrets/no-secrets
'settings.burialSiteTypes.crematedCapacityMaxDefault': 6,
'settings.burialSites.burialSiteNameSegments': {
includeCemeteryKey: false,
separator: '-',

View File

@ -1,6 +1,5 @@
import type { config as MSSQLConfig } from 'mssql'
import { hoursToMillis } from '@cityssm/to-millis'
import type { config as MSSQLConfig } from 'mssql'
import type {
ConfigActiveDirectory,
@ -52,6 +51,12 @@ export const configDefaultValues = {
'settings.cemeteries.refreshImageChanges': false,
// eslint-disable-next-line no-secrets/no-secrets
'settings.burialSiteTypes.bodyCapacityMaxDefault': 2,
// eslint-disable-next-line no-secrets/no-secrets
'settings.burialSiteTypes.crematedCapacityMaxDefault': 6,
'settings.burialSites.burialSiteNameSegments': {
includeCemeteryKey: false,
separator: '-',

View File

@ -6,6 +6,8 @@ export interface AddBurialSiteForm {
burialSiteNameSegment5?: string;
burialSiteStatusId: number | string;
burialSiteTypeId: number | string;
bodyCapacity?: number | string;
crematedCapacity?: number | string;
burialSiteImage?: string;
cemeteryId: number | string;
cemeterySvgId?: string;

View File

@ -10,6 +10,7 @@ import getCemetery from './getCemetery.js';
* @returns The new burial site's id.
* @throws If an active burial site with the same name already exists.
*/
// eslint-disable-next-line complexity
export default function addBurialSite(burialSiteForm, user) {
const database = sqlite(sunriseDB);
const rightNowMillis = Date.now();
@ -38,17 +39,22 @@ export default function addBurialSite(burialSiteForm, user) {
burialSiteNameSegment5,
burialSiteName,
burialSiteTypeId, burialSiteStatusId,
bodyCapacity, crematedCapacity,
cemeteryId, cemeterySvgId, burialSiteImage,
burialSiteLatitude, burialSiteLongitude,
recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?,
values (?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?)`)
.run(burialSiteForm.burialSiteNameSegment1 ?? '', burialSiteForm.burialSiteNameSegment2 ?? '', burialSiteForm.burialSiteNameSegment3 ?? '', burialSiteForm.burialSiteNameSegment4 ?? '', burialSiteForm.burialSiteNameSegment5 ?? '', burialSiteName, burialSiteForm.burialSiteTypeId, burialSiteForm.burialSiteStatusId === ''
? undefined
: burialSiteForm.burialSiteStatusId, burialSiteForm.cemeteryId === '' ? undefined : burialSiteForm.cemeteryId, burialSiteForm.cemeterySvgId, burialSiteForm.burialSiteImage ?? '', burialSiteForm.burialSiteLatitude === ''
: burialSiteForm.burialSiteStatusId, burialSiteForm.bodyCapacity === ''
? undefined
: burialSiteForm.bodyCapacity, burialSiteForm.crematedCapacity === ''
? undefined
: burialSiteForm.crematedCapacity, burialSiteForm.cemeteryId === '' ? undefined : burialSiteForm.cemeteryId, burialSiteForm.cemeterySvgId, burialSiteForm.burialSiteImage ?? '', burialSiteForm.burialSiteLatitude === ''
? undefined
: burialSiteForm.burialSiteLatitude, burialSiteForm.burialSiteLongitude === ''
? undefined

View File

@ -16,6 +16,9 @@ export interface AddBurialSiteForm {
burialSiteStatusId: number | string
burialSiteTypeId: number | string
bodyCapacity?: number | string
crematedCapacity?: number | string
burialSiteImage?: string
cemeteryId: number | string
cemeterySvgId?: string
@ -35,6 +38,7 @@ export interface AddBurialSiteForm {
* @returns The new burial site's id.
* @throws If an active burial site with the same name already exists.
*/
// eslint-disable-next-line complexity
export default function addBurialSite(
burialSiteForm: AddBurialSiteForm,
user: User
@ -80,12 +84,13 @@ export default function addBurialSite(
burialSiteNameSegment5,
burialSiteName,
burialSiteTypeId, burialSiteStatusId,
bodyCapacity, crematedCapacity,
cemeteryId, cemeterySvgId, burialSiteImage,
burialSiteLatitude, burialSiteLongitude,
recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?,
values (?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?)`
)
@ -100,6 +105,15 @@ export default function addBurialSite(
burialSiteForm.burialSiteStatusId === ''
? undefined
: burialSiteForm.burialSiteStatusId,
burialSiteForm.bodyCapacity === ''
? undefined
: burialSiteForm.bodyCapacity,
burialSiteForm.crematedCapacity === ''
? undefined
: burialSiteForm.crematedCapacity,
burialSiteForm.cemeteryId === '' ? undefined : burialSiteForm.cemeteryId,
burialSiteForm.cemeterySvgId,
burialSiteForm.burialSiteImage ?? '',

View File

@ -0,0 +1,7 @@
export interface AddBurialSiteTypeForm {
burialSiteType: string;
bodyCapacityMax: number | string;
crematedCapacityMax: number | string;
orderNumber?: number | string;
}
export default function addBurialSiteType(addForm: AddBurialSiteTypeForm, user: User): number;

View File

@ -0,0 +1,20 @@
import sqlite from 'better-sqlite3';
import { sunriseDB } from '../helpers/database.helpers.js';
import { clearCacheByTableName } from '../helpers/functions.cache.js';
export default function addBurialSiteType(addForm, user) {
const database = sqlite(sunriseDB);
const rightNowMillis = Date.now();
const result = database
.prepare(`insert into BurialSiteTypes (
burialSiteType, bodyCapacityMax, crematedCapacityMax,
orderNumber,
recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?, ?)`)
.run(addForm.burialSiteType, addForm.bodyCapacityMax === '' ? undefined : addForm.bodyCapacityMax, addForm.crematedCapacityMax === ''
? undefined
: addForm.crematedCapacityMax, addForm.orderNumber ?? -1, user.userName, rightNowMillis, user.userName, rightNowMillis);
database.close();
clearCacheByTableName('BurialSiteTypes');
return result.lastInsertRowid;
}

View File

@ -0,0 +1,50 @@
import sqlite from 'better-sqlite3'
import { sunriseDB } from '../helpers/database.helpers.js'
import { clearCacheByTableName } from '../helpers/functions.cache.js'
export interface AddBurialSiteTypeForm {
burialSiteType: string
bodyCapacityMax: number | string
crematedCapacityMax: number | string
orderNumber?: number | string
}
export default function addBurialSiteType(
addForm: AddBurialSiteTypeForm,
user: User
): number {
const database = sqlite(sunriseDB)
const rightNowMillis = Date.now()
const result = database
.prepare(
`insert into BurialSiteTypes (
burialSiteType, bodyCapacityMax, crematedCapacityMax,
orderNumber,
recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?, ?)`
)
.run(
addForm.burialSiteType,
addForm.bodyCapacityMax === '' ? undefined : addForm.bodyCapacityMax,
addForm.crematedCapacityMax === ''
? undefined
: addForm.crematedCapacityMax,
addForm.orderNumber ?? -1,
user.userName,
rightNowMillis,
user.userName,
rightNowMillis
)
database.close()
clearCacheByTableName('BurialSiteTypes')
return result.lastInsertRowid as number
}

View File

@ -14,7 +14,9 @@ export default function addBurialSiteTypeField(addForm, user) {
recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
.run(addForm.burialSiteTypeId, addForm.burialSiteTypeField, addForm.fieldType ?? 'text', addForm.fieldValues ?? '', addForm.isRequired === '' ? 0 : 1, addForm.pattern ?? '', addForm.minLength ?? 0, addForm.maxLength ?? 100, addForm.orderNumber ?? -1, user.userName, rightNowMillis, user.userName, rightNowMillis);
.run(addForm.burialSiteTypeId, addForm.burialSiteTypeField, addForm.fieldType ?? 'text', addForm.fieldValues ?? '', addForm.isRequired === '' ? 0 : 1, addForm.pattern ?? '', addForm.minLength ?? 0,
// eslint-disable-next-line @typescript-eslint/no-magic-numbers
addForm.maxLength ?? 100, addForm.orderNumber ?? -1, user.userName, rightNowMillis, user.userName, rightNowMillis);
database.close();
clearCacheByTableName('BurialSiteTypeFields');
return result.lastInsertRowid;

View File

@ -47,6 +47,7 @@ export default function addBurialSiteTypeField(
addForm.isRequired === '' ? 0 : 1,
addForm.pattern ?? '',
addForm.minLength ?? 0,
// eslint-disable-next-line @typescript-eslint/no-magic-numbers
addForm.maxLength ?? 100,
addForm.orderNumber ?? -1,
user.userName,

View File

@ -1,7 +1,8 @@
import { type DateString, type TimeString } from '@cityssm/utils-datetime';
export interface AddTransactionForm {
contractId: number | string;
transactionDateString?: string;
transactionTimeString?: string;
transactionDateString?: '' | DateString;
transactionTimeString?: '' | TimeString;
externalReceiptNumber: string;
transactionAmount: number | string;
transactionNote: string;

View File

@ -15,12 +15,12 @@ export default function addContractTransaction(contractTransactionForm, user) {
transactionIndex = maxIndexResult.transactionIndex + 1;
}
const rightNow = new Date();
const transactionDate = contractTransactionForm.transactionDateString
? dateStringToInteger(contractTransactionForm.transactionDateString)
: dateToInteger(rightNow);
const transactionTime = contractTransactionForm.transactionTimeString
? timeStringToInteger(contractTransactionForm.transactionTimeString)
: dateToTimeInteger(rightNow);
const transactionDate = (contractTransactionForm.transactionDateString ?? '') === ''
? dateToInteger(rightNow)
: dateStringToInteger(contractTransactionForm.transactionDateString);
const transactionTime = (contractTransactionForm.transactionTimeString ?? '') === ''
? dateToTimeInteger(rightNow)
: timeStringToInteger(contractTransactionForm.transactionTimeString);
database
.prepare(`insert into ContractTransactions (
contractId, transactionIndex,

View File

@ -1,4 +1,6 @@
import {
type DateString,
type TimeString,
dateStringToInteger,
dateToInteger,
dateToTimeInteger,
@ -11,8 +13,8 @@ import { sunriseDB } from '../helpers/database.helpers.js'
export interface AddTransactionForm {
contractId: number | string
transactionDateString?: string
transactionTimeString?: string
transactionDateString?: '' | DateString
transactionTimeString?: '' | TimeString
externalReceiptNumber: string
transactionAmount: number | string
@ -45,13 +47,19 @@ export default function addContractTransaction(
const rightNow = new Date()
const transactionDate = contractTransactionForm.transactionDateString
? dateStringToInteger(contractTransactionForm.transactionDateString)
: dateToInteger(rightNow)
const transactionDate =
(contractTransactionForm.transactionDateString ?? '') === ''
? dateToInteger(rightNow)
: dateStringToInteger(
contractTransactionForm.transactionDateString as DateString
)
const transactionTime = contractTransactionForm.transactionTimeString
? timeStringToInteger(contractTransactionForm.transactionTimeString)
: dateToTimeInteger(rightNow)
const transactionTime =
(contractTransactionForm.transactionTimeString ?? '') === ''
? dateToTimeInteger(rightNow)
: timeStringToInteger(
contractTransactionForm.transactionTimeString as TimeString
)
database
.prepare(

View File

@ -1,8 +1,8 @@
export interface AddContractTypeFieldForm {
contractTypeId?: number | string;
contractTypeField: string;
fieldValues?: string;
fieldType?: string;
fieldValues?: string;
isRequired?: string;
maxLength?: number | string;
minLength?: number | string;

View File

@ -13,7 +13,9 @@ export default function addContractTypeField(addForm, user) {
recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
.run(addForm.contractTypeId ?? undefined, addForm.contractTypeField, addForm.fieldType ?? 'text', addForm.fieldValues ?? '', addForm.isRequired === '' ? 0 : 1, addForm.pattern ?? '', addForm.minLength ?? 0, addForm.maxLength ?? 100, addForm.orderNumber ?? -1, user.userName, rightNowMillis, user.userName, rightNowMillis);
.run(addForm.contractTypeId ?? undefined, addForm.contractTypeField, addForm.fieldType ?? 'text', addForm.fieldValues ?? '', addForm.isRequired === '' ? 0 : 1, addForm.pattern ?? '', addForm.minLength ?? 0,
// eslint-disable-next-line @typescript-eslint/no-magic-numbers
addForm.maxLength ?? 100, addForm.orderNumber ?? -1, user.userName, rightNowMillis, user.userName, rightNowMillis);
database.close();
clearCacheByTableName('ContractTypeFields');
return result.lastInsertRowid;

View File

@ -5,9 +5,11 @@ import { clearCacheByTableName } from '../helpers/functions.cache.js'
export interface AddContractTypeFieldForm {
contractTypeId?: number | string
contractTypeField: string
fieldValues?: string
fieldType?: string
fieldValues?: string
isRequired?: string
maxLength?: number | string
minLength?: number | string
@ -43,6 +45,7 @@ export default function addContractTypeField(
addForm.isRequired === '' ? 0 : 1,
addForm.pattern ?? '',
addForm.minLength ?? 0,
// eslint-disable-next-line @typescript-eslint/no-magic-numbers
addForm.maxLength ?? 100,
addForm.orderNumber ?? -1,
user.userName,

View File

@ -6,6 +6,7 @@ import { clearCacheByTableName } from '../helpers/functions.cache.js'
export interface AddContractTypePrintForm {
contractTypeId: number | string
printEJS: string
orderNumber?: number
}

View File

@ -1,6 +1,6 @@
export interface AddForm {
funeralHomeName: string;
funeralHomeKey: string;
funeralHomeName: string;
funeralHomeAddress1: string;
funeralHomeAddress2: string;
funeralHomeCity: string;

View File

@ -3,8 +3,8 @@ import sqlite from 'better-sqlite3'
import { sunriseDB } from '../helpers/database.helpers.js'
export interface AddForm {
funeralHomeName: string
funeralHomeKey: string
funeralHomeName: string
funeralHomeAddress1: string
funeralHomeAddress2: string

View File

@ -1,3 +1,3 @@
type RecordTable = 'BurialSiteStatuses' | 'BurialSiteTypes' | 'WorkOrderMilestoneTypes' | 'WorkOrderTypes';
type RecordTable = 'BurialSiteStatuses' | 'WorkOrderMilestoneTypes' | 'WorkOrderTypes';
export default function addRecord(recordTable: RecordTable, recordName: string, orderNumber: number | string, user: User): number;
export {};

View File

@ -3,7 +3,6 @@ import { sunriseDB } from '../helpers/database.helpers.js';
import { clearCacheByTableName } from '../helpers/functions.cache.js';
const recordNameColumns = new Map([
['BurialSiteStatuses', 'burialSiteStatus'],
['BurialSiteTypes', 'burialSiteType'],
['WorkOrderMilestoneTypes', 'workOrderMilestoneType'],
['WorkOrderTypes', 'workOrderType']
]);

View File

@ -5,13 +5,11 @@ import { clearCacheByTableName } from '../helpers/functions.cache.js'
type RecordTable =
| 'BurialSiteStatuses'
| 'BurialSiteTypes'
| 'WorkOrderMilestoneTypes'
| 'WorkOrderTypes'
const recordNameColumns = new Map<RecordTable, string>([
['BurialSiteStatuses', 'burialSiteStatus'],
['BurialSiteTypes', 'burialSiteType'],
['WorkOrderMilestoneTypes', 'workOrderMilestoneType'],
['WorkOrderTypes', 'workOrderType']
])

View File

@ -1,9 +1,9 @@
export interface AddWorkOrderForm {
workOrderTypeId: number | string;
workOrderNumber?: string;
workOrderDescription: string;
workOrderOpenDateString?: string;
workOrderNumber?: string;
workOrderTypeId: number | string;
workOrderCloseDateString?: string;
workOrderOpenDateString?: string;
contractId?: string;
}
export default function addWorkOrder(workOrderForm: AddWorkOrderForm, user: User): number;

View File

@ -25,8 +25,8 @@ export default function addWorkOrder(workOrderForm, user) {
const workOrderId = result.lastInsertRowid;
if ((workOrderForm.contractId ?? '') !== '') {
addWorkOrderContract({
contractId: workOrderForm.contractId,
workOrderId,
contractId: workOrderForm.contractId
}, user, database);
}
database.close();

View File

@ -11,11 +11,14 @@ import addWorkOrderContract from './addWorkOrderContract.js'
import getNextWorkOrderNumber from './getNextWorkOrderNumber.js'
export interface AddWorkOrderForm {
workOrderTypeId: number | string
workOrderNumber?: string
workOrderDescription: string
workOrderOpenDateString?: string
workOrderNumber?: string
workOrderTypeId: number | string
workOrderCloseDateString?: string
workOrderOpenDateString?: string
contractId?: string
}
@ -67,8 +70,8 @@ export default function addWorkOrder(
if ((workOrderForm.contractId ?? '') !== '') {
addWorkOrderContract(
{
contractId: workOrderForm.contractId as string,
workOrderId,
contractId: workOrderForm.contractId as string
},
user,
database

View File

@ -1,5 +1,5 @@
export interface AddForm {
workOrderId: number | string;
burialSiteId: number | string;
workOrderId: number | string;
}
export default function addWorkOrderBurialSite(workOrderLotForm: AddForm, user: User): boolean;

View File

@ -3,8 +3,8 @@ import sqlite from 'better-sqlite3'
import { sunriseDB } from '../helpers/database.helpers.js'
export interface AddForm {
workOrderId: number | string
burialSiteId: number | string
workOrderId: number | string
}
export default function addWorkOrderBurialSite(

View File

@ -1,5 +1,5 @@
export interface AddWorkOrderCommentForm {
workOrderId: string;
comment: string;
workOrderId: string;
}
export default function addWorkOrderComment(workOrderCommentForm: AddWorkOrderCommentForm, user: User): number;

View File

@ -4,8 +4,8 @@ import sqlite from 'better-sqlite3'
import { sunriseDB } from '../helpers/database.helpers.js'
export interface AddWorkOrderCommentForm {
workOrderId: string
comment: string
workOrderId: string
}
export default function addWorkOrderComment(

View File

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

View File

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

1
database/backupDatabase.d.ts vendored 100644
View File

@ -0,0 +1 @@
export declare function backupDatabase(): Promise<false | string>;

View File

@ -0,0 +1,28 @@
import sqlite from 'better-sqlite3';
import Debug from 'debug';
import { sunriseDB } from '../helpers/database.helpers.js';
const debug = Debug('sunrise:database:backupDatabase');
const backupFolder = 'data/backups';
export async function backupDatabase() {
const databasePathSplit = sunriseDB.split(/[/\\]/);
const backupDatabasePath = `${backupFolder}/${databasePathSplit.at(-1)}.${Date.now().toString()}`;
const database = sqlite(sunriseDB);
try {
const result = await database.backup(backupDatabasePath);
if (result.remainingPages === 0) {
debug('Database backup completed successfully:', backupDatabasePath);
return backupDatabasePath;
}
else {
debug('Database backup incomplete:', result.remainingPages, 'pages remaining');
return false;
}
}
catch (error) {
debug('Error backing up database:', error);
return false;
}
finally {
database.close();
}
}

View File

@ -0,0 +1,37 @@
import sqlite from 'better-sqlite3'
import Debug from 'debug'
import { sunriseDB } from '../helpers/database.helpers.js'
const debug = Debug('sunrise:database:backupDatabase')
const backupFolder = 'data/backups'
export async function backupDatabase(): Promise<false | string> {
const databasePathSplit = sunriseDB.split(/[/\\]/)
const backupDatabasePath = `${backupFolder}/${databasePathSplit.at(-1)}.${Date.now().toString()}`
const database = sqlite(sunriseDB)
try {
const result = await database.backup(backupDatabasePath)
if (result.remainingPages === 0) {
debug('Database backup completed successfully:', backupDatabasePath)
return backupDatabasePath
} else {
debug(
'Database backup incomplete:',
result.remainingPages,
'pages remaining'
)
return false
}
} catch (error) {
debug('Error backing up database:', error)
return false
} finally {
database.close()
}
}

View File

@ -122,7 +122,7 @@ export default function cleanupDatabase(user) {
.run(recordDeleteTimeMillisMin).changes;
/*
* Burial Site Contract Fees/Transactions
* - Maintain financials, do not delete related.
* - Maintain financial data, do not delete related.
*/
purgedRecordCount += database
.prepare('delete from ContractFees where recordDelete_timeMillis <= ?')

View File

@ -179,7 +179,7 @@ export default function cleanupDatabase(user: User): {
/*
* Burial Site Contract Fees/Transactions
* - Maintain financials, do not delete related.
* - Maintain financial data, do not delete related.
*/
purgedRecordCount += database

View File

@ -1,5 +1,6 @@
import { type DateString } from '@cityssm/utils-datetime';
export interface CloseWorkOrderForm {
workOrderId: number | string;
workOrderCloseDateString?: string;
workOrderCloseDateString?: '' | DateString;
}
export default function closeWorkOrder(workOrderForm: CloseWorkOrderForm, user: User): boolean;

View File

@ -1,4 +1,8 @@
import { dateStringToInteger, dateToInteger } from '@cityssm/utils-datetime'
import {
type DateString,
dateStringToInteger,
dateToInteger
} from '@cityssm/utils-datetime'
import sqlite from 'better-sqlite3'
import { sunriseDB } from '../helpers/database.helpers.js'
@ -6,7 +10,7 @@ import { sunriseDB } from '../helpers/database.helpers.js'
export interface CloseWorkOrderForm {
workOrderId: number | string
workOrderCloseDateString?: string
workOrderCloseDateString?: '' | DateString
}
export default function closeWorkOrder(

View File

@ -1,6 +1,7 @@
import { type DateString, type TimeString } from '@cityssm/utils-datetime';
export interface CompleteWorkOrderMilestoneForm {
workOrderMilestoneId: number | string;
workOrderMilestoneCompletionDateString?: string;
workOrderMilestoneCompletionTimeString?: string;
workOrderMilestoneCompletionDateString?: '' | DateString;
workOrderMilestoneCompletionTimeString?: '' | TimeString;
}
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) {
const rightNow = new Date();
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
.prepare(`update WorkOrderMilestones
set workOrderMilestoneCompletionDate = ?,
@ -11,11 +17,7 @@ export default function completeWorkOrderMilestone(milestoneForm, user) {
recordUpdate_userName = ?,
recordUpdate_timeMillis = ?
where workOrderMilestoneId = ?`)
.run((milestoneForm.workOrderMilestoneCompletionDateString ?? '') === ''
? dateToInteger(rightNow)
: dateStringToInteger(milestoneForm.workOrderMilestoneCompletionDateString), (milestoneForm.workOrderMilestoneCompletionTimeString ?? '') === ''
? dateToTimeInteger(rightNow)
: timeStringToInteger(milestoneForm.workOrderMilestoneCompletionTimeString), user.userName, rightNow.getTime(), milestoneForm.workOrderMilestoneId);
.run(completionDate, completionTime, user.userName, rightNow.getTime(), milestoneForm.workOrderMilestoneId);
database.close();
return result.changes > 0;
}

View File

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

View File

@ -29,6 +29,7 @@ export default async function copyContract(
funeralDirectorName: oldContract.funeralDirectorName,
funeralHomeId: oldContract.funeralHomeId ?? '',
funeralTimeString: oldContract.funeralTimeString ?? '',
purchaserAddress1: oldContract.purchaserAddress1,
purchaserAddress2: oldContract.purchaserAddress2,
purchaserCity: oldContract.purchaserCity,

View File

@ -30,23 +30,6 @@ export function deleteBurialSite(burialSiteId, user) {
where burialSiteId = ?
and recordDelete_timeMillis is null`)
.run(user.userName, rightNowMillis, burialSiteId);
/*
* Delete fields and comments
*/
database
.prepare(`update BurialSiteFields
set recordDelete_userName = ?,
recordDelete_timeMillis = ?
where burialSiteId = ?
and recordDelete_timeMillis is null`)
.run(user.userName, rightNowMillis, burialSiteId);
database
.prepare(`update BurialSiteComments
set recordDelete_userName = ?,
recordDelete_timeMillis = ?
where burialSiteId = ?
and recordDelete_timeMillis is null`)
.run(user.userName, rightNowMillis, burialSiteId);
database.close();
return true;
}

View File

@ -44,30 +44,6 @@ export function deleteBurialSite(burialSiteId: number, user: User): boolean {
)
.run(user.userName, rightNowMillis, burialSiteId)
/*
* Delete fields and comments
*/
database
.prepare(
`update BurialSiteFields
set recordDelete_userName = ?,
recordDelete_timeMillis = ?
where burialSiteId = ?
and recordDelete_timeMillis is null`
)
.run(user.userName, rightNowMillis, burialSiteId)
database
.prepare(
`update BurialSiteComments
set recordDelete_userName = ?,
recordDelete_timeMillis = ?
where burialSiteId = ?
and recordDelete_timeMillis is null`
)
.run(user.userName, rightNowMillis, burialSiteId)
database.close()
return true

View File

@ -1,6 +1,6 @@
import sqlite from 'better-sqlite3';
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([
['BurialSiteComments', 'burialSiteCommentId'],
['BurialSiteStatuses', 'burialSiteStatusId'],
@ -55,6 +55,9 @@ export function deleteRecord(recordTable, recordId, user) {
.run(user.userName, rightNowMillis, recordId);
}
database.close();
// Clear cache for tables that are cached
if (cacheTableNames.includes(recordTable)) {
clearCacheByTableName(recordTable);
}
return result.changes > 0;
}

View File

@ -1,7 +1,11 @@
import sqlite from 'better-sqlite3'
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 =
| 'BurialSiteComments'
@ -73,7 +77,7 @@ export function deleteRecord(
`update ${recordTable}
set recordDelete_userName = ?,
recordDelete_timeMillis = ?
where ${recordIdColumns.get(recordTable)!} = ?
where ${recordIdColumns.get(recordTable)} = ?
and recordDelete_timeMillis is null`
)
.run(user.userName, rightNowMillis, recordId)
@ -84,7 +88,7 @@ export function deleteRecord(
`update ${relatedTable}
set recordDelete_userName = ?,
recordDelete_timeMillis = ?
where ${recordIdColumns.get(recordTable)!} = ?
where ${recordIdColumns.get(recordTable)} = ?
and recordDelete_timeMillis is null`
)
.run(user.userName, rightNowMillis, recordId)
@ -92,7 +96,10 @@ export function deleteRecord(
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
}

View File

@ -1,3 +1,3 @@
import type { BurialSite } from '../types/record.types.js';
export default function getBurialSite(burialSiteId: number | string): Promise<BurialSite | undefined>;
export declare function getBurialSiteByBurialSiteName(burialSiteName: string): Promise<BurialSite | undefined>;
export default function getBurialSite(burialSiteId: number | string, includeDeleted?: boolean): Promise<BurialSite | undefined>;
export declare function getBurialSiteByBurialSiteName(burialSiteName: string, includeDeleted?: boolean): Promise<BurialSite | undefined>;

View File

@ -13,25 +13,31 @@ const baseSQL = `select l.burialSiteId,
l.burialSiteName,
l.burialSiteStatusId, s.burialSiteStatus,
l.bodyCapacity, l.crematedCapacity,
t.bodyCapacityMax, t.crematedCapacityMax,
l.cemeteryId, m.cemeteryName,
m.cemeteryLatitude, m.cemeteryLongitude,
m.cemeterySvg, l.cemeterySvgId, l.burialSiteImage,
l.burialSiteLatitude, l.burialSiteLongitude
l.burialSiteLatitude, l.burialSiteLongitude,
l.recordDelete_userName, l.recordDelete_timeMillis
from BurialSites l
left join BurialSiteTypes t on l.burialSiteTypeId = t.burialSiteTypeId
left join BurialSiteStatuses s on l.burialSiteStatusId = s.burialSiteStatusId
left join Cemeteries m on l.cemeteryId = m.cemeteryId
where l.recordDelete_timeMillis is null`;
export default async function getBurialSite(burialSiteId) {
return await _getBurialSite(`${baseSQL} and l.burialSiteId = ?`, burialSiteId);
left join Cemeteries m on l.cemeteryId = m.cemeteryId`;
export default async function getBurialSite(burialSiteId, includeDeleted = false) {
return await _getBurialSite(`l.burialSiteId = ?`, burialSiteId, includeDeleted);
}
export async function getBurialSiteByBurialSiteName(burialSiteName) {
return await _getBurialSite(`${baseSQL} and l.burialSiteName = ?`, burialSiteName);
export async function getBurialSiteByBurialSiteName(burialSiteName, includeDeleted = false) {
return await _getBurialSite(`l.burialSiteName = ?`, burialSiteName, includeDeleted);
}
async function _getBurialSite(sql, burialSiteIdOrLotName) {
async function _getBurialSite(whereClausePiece, burialSiteIdOrLotName, includeDeleted = false) {
const database = sqlite(sunriseDB, { readonly: true });
const burialSite = database.prepare(sql).get(burialSiteIdOrLotName);
const burialSite = database
.prepare(`${baseSQL} ${includeDeleted ? 'where' : 'where l.recordDelete_timeMillis is null and'} ${whereClausePiece}`)
.get(burialSiteIdOrLotName);
if (burialSite !== undefined) {
const contracts = await getContracts({
burialSiteId: burialSite.burialSiteId

View File

@ -17,41 +17,55 @@ const baseSQL = `select l.burialSiteId,
l.burialSiteName,
l.burialSiteStatusId, s.burialSiteStatus,
l.bodyCapacity, l.crematedCapacity,
t.bodyCapacityMax, t.crematedCapacityMax,
l.cemeteryId, m.cemeteryName,
m.cemeteryLatitude, m.cemeteryLongitude,
m.cemeterySvg, l.cemeterySvgId, l.burialSiteImage,
l.burialSiteLatitude, l.burialSiteLongitude
l.burialSiteLatitude, l.burialSiteLongitude,
l.recordDelete_userName, l.recordDelete_timeMillis
from BurialSites l
left join BurialSiteTypes t on l.burialSiteTypeId = t.burialSiteTypeId
left join BurialSiteStatuses s on l.burialSiteStatusId = s.burialSiteStatusId
left join Cemeteries m on l.cemeteryId = m.cemeteryId
where l.recordDelete_timeMillis is null`
left join Cemeteries m on l.cemeteryId = m.cemeteryId`
export default async function getBurialSite(
burialSiteId: number | string
burialSiteId: number | string,
includeDeleted = false
): Promise<BurialSite | undefined> {
return await _getBurialSite(`${baseSQL} and l.burialSiteId = ?`, burialSiteId)
return await _getBurialSite(
`l.burialSiteId = ?`,
burialSiteId,
includeDeleted
)
}
export async function getBurialSiteByBurialSiteName(
burialSiteName: string
burialSiteName: string,
includeDeleted = false
): Promise<BurialSite | undefined> {
return await _getBurialSite(
`${baseSQL} and l.burialSiteName = ?`,
burialSiteName
`l.burialSiteName = ?`,
burialSiteName,
includeDeleted
)
}
async function _getBurialSite(
sql: string,
burialSiteIdOrLotName: number | string
whereClausePiece: string,
burialSiteIdOrLotName: number | string,
includeDeleted = false
): Promise<BurialSite | undefined> {
const database = sqlite(sunriseDB, { readonly: true })
const burialSite = database.prepare(sql).get(burialSiteIdOrLotName) as
| BurialSite
| undefined
const burialSite = database
.prepare(
`${baseSQL} ${includeDeleted ? 'where' : 'where l.recordDelete_timeMillis is null and'} ${whereClausePiece}`
)
.get(burialSiteIdOrLotName) as BurialSite | undefined
if (burialSite !== undefined) {
const contracts = await getContracts(

View File

@ -1,2 +1,2 @@
import type { BurialSiteStatus } from '../types/record.types.js';
export default function getBurialSiteStatuses(): BurialSiteStatus[];
export default function getBurialSiteStatuses(includeDeleted?: boolean): BurialSiteStatus[];

View File

@ -1,14 +1,16 @@
import sqlite from 'better-sqlite3';
import { sunriseDB } from '../helpers/database.helpers.js';
import { updateRecordOrderNumber } from './updateRecordOrderNumber.js';
export default function getBurialSiteStatuses() {
export default function getBurialSiteStatuses(includeDeleted = false) {
const database = sqlite(sunriseDB);
const updateOrderNumbers = !includeDeleted;
const statuses = database
.prepare(`select burialSiteStatusId, burialSiteStatus, orderNumber
from BurialSiteStatuses
where recordDelete_timeMillis is null
${includeDeleted ? '' : ' where recordDelete_timeMillis is null '}
order by orderNumber, burialSiteStatus`)
.all();
if (updateOrderNumbers) {
let expectedOrderNumber = 0;
for (const status of statuses) {
if (status.orderNumber !== expectedOrderNumber) {
@ -17,6 +19,7 @@ export default function getBurialSiteStatuses() {
}
expectedOrderNumber += 1;
}
}
database.close();
return statuses;
}

View File

@ -5,18 +5,23 @@ import type { BurialSiteStatus } from '../types/record.types.js'
import { updateRecordOrderNumber } from './updateRecordOrderNumber.js'
export default function getBurialSiteStatuses(): BurialSiteStatus[] {
export default function getBurialSiteStatuses(
includeDeleted = false
): BurialSiteStatus[] {
const database = sqlite(sunriseDB)
const updateOrderNumbers = !includeDeleted
const statuses = database
.prepare(
`select burialSiteStatusId, burialSiteStatus, orderNumber
from BurialSiteStatuses
where recordDelete_timeMillis is null
${includeDeleted ? '' : ' where recordDelete_timeMillis is null '}
order by orderNumber, burialSiteStatus`
)
.all() as BurialSiteStatus[]
if (updateOrderNumbers) {
let expectedOrderNumber = 0
for (const status of statuses) {
@ -27,11 +32,13 @@ export default function getBurialSiteStatuses(): BurialSiteStatus[] {
expectedOrderNumber,
database
)
status.orderNumber = expectedOrderNumber
}
expectedOrderNumber += 1
}
}
database.close()

View File

@ -4,9 +4,11 @@ import getBurialSiteTypeFields from './getBurialSiteTypeFields.js';
import { updateRecordOrderNumber } from './updateRecordOrderNumber.js';
export default function getBurialSiteTypes(includeDeleted = false) {
const database = sqlite(sunriseDB);
const updateOrderNumbers = !database.readonly && !includeDeleted;
const updateOrderNumbers = !includeDeleted;
const burialSiteTypes = database
.prepare(`select burialSiteTypeId, burialSiteType, orderNumber
.prepare(`select burialSiteTypeId, burialSiteType,
bodyCapacityMax, crematedCapacityMax,
orderNumber
from BurialSiteTypes
${includeDeleted ? '' : ' where recordDelete_timeMillis is null '}
order by orderNumber, burialSiteType`)

View File

@ -11,11 +11,13 @@ export default function getBurialSiteTypes(
): BurialSiteType[] {
const database = sqlite(sunriseDB)
const updateOrderNumbers = !database.readonly && !includeDeleted
const updateOrderNumbers = !includeDeleted
const burialSiteTypes = database
.prepare(
`select burialSiteTypeId, burialSiteType, orderNumber
`select burialSiteTypeId, burialSiteType,
bodyCapacityMax, crematedCapacityMax,
orderNumber
from BurialSiteTypes
${includeDeleted ? '' : ' where recordDelete_timeMillis is null '}
order by orderNumber, burialSiteType`

View File

@ -4,8 +4,8 @@ export interface GetBurialSitesFilters {
burialSiteNameSearchType?: '' | 'endsWith' | 'startsWith';
burialSiteName?: string;
cemeteryId?: number | string;
burialSiteTypeId?: number | string;
burialSiteStatusId?: number | string;
burialSiteTypeId?: number | string;
contractStatus?: '' | 'occupied' | 'unoccupied';
workOrderId?: number | string;
}
@ -16,6 +16,6 @@ export interface GetBurialSitesOptions {
includeContractCount?: boolean;
}
export default function getBurialSites(filters: GetBurialSitesFilters, options: GetBurialSitesOptions, connectedDatabase?: sqlite.Database): {
count: number;
burialSites: BurialSite[];
count: number;
};

View File

@ -4,7 +4,7 @@ import { sunriseDB } from '../helpers/database.helpers.js';
import { getBurialSiteNameWhereClause } from '../helpers/functions.sqlFilters.js';
export default function getBurialSites(filters, options, connectedDatabase) {
const database = connectedDatabase ?? sqlite(sunriseDB, { readonly: true });
const { sqlWhereClause, sqlParameters } = buildWhereClause(filters);
const { sqlParameters, sqlWhereClause } = buildWhereClause(filters);
const currentDate = dateToInteger(new Date());
let count = 0;
if (options.limit !== -1) {
@ -20,7 +20,8 @@ export default function getBurialSites(filters, options, connectedDatabase) {
group by burialSiteId
) o on l.burialSiteId = o.burialSiteId
${sqlWhereClause}`)
.get(sqlParameters).recordCount;
.pluck()
.get(sqlParameters);
}
let burialSites = [];
if (options.limit === -1 || count > 0) {
@ -37,6 +38,7 @@ export default function getBurialSites(filters, options, connectedDatabase) {
l.burialSiteNameSegment5,
l.burialSiteName,
t.burialSiteType,
l.bodyCapacity, l.crematedCapacity,
l.cemeteryId, m.cemeteryName, l.cemeterySvgId,
l.burialSiteStatusId, s.burialSiteStatus
${includeContractCount
@ -70,8 +72,8 @@ export default function getBurialSites(filters, options, connectedDatabase) {
database.close();
}
return {
count,
burialSites
burialSites,
count
};
}
function buildWhereClause(filters) {

View File

@ -9,8 +9,9 @@ export interface GetBurialSitesFilters {
burialSiteNameSearchType?: '' | 'endsWith' | 'startsWith'
burialSiteName?: string
cemeteryId?: number | string
burialSiteTypeId?: number | string
burialSiteStatusId?: number | string
burialSiteTypeId?: number | string
contractStatus?: '' | 'occupied' | 'unoccupied'
workOrderId?: number | string
}
@ -27,18 +28,17 @@ export default function getBurialSites(
filters: GetBurialSitesFilters,
options: GetBurialSitesOptions,
connectedDatabase?: sqlite.Database
): { count: number; burialSites: BurialSite[] } {
): { burialSites: BurialSite[]; count: number } {
const database = connectedDatabase ?? sqlite(sunriseDB, { readonly: true })
const { sqlWhereClause, sqlParameters } = buildWhereClause(filters)
const { sqlParameters, sqlWhereClause } = buildWhereClause(filters)
const currentDate = dateToInteger(new Date())
let count = 0
if (options.limit !== -1) {
count = (
database
count = database
.prepare(
`select count(*) as recordCount
from BurialSites l
@ -52,8 +52,8 @@ export default function getBurialSites(
) o on l.burialSiteId = o.burialSiteId
${sqlWhereClause}`
)
.get(sqlParameters) as { recordCount: number }
).recordCount
.pluck()
.get(sqlParameters) as number
}
let burialSites: BurialSite[] = []
@ -75,6 +75,7 @@ export default function getBurialSites(
l.burialSiteNameSegment5,
l.burialSiteName,
t.burialSiteType,
l.bodyCapacity, l.crematedCapacity,
l.cemeteryId, m.cemeteryName, l.cemeterySvgId,
l.burialSiteStatusId, s.burialSiteStatus
${
@ -118,8 +119,8 @@ export default function getBurialSites(
}
return {
count,
burialSites
burialSites,
count
}
}

View File

@ -16,6 +16,7 @@ export default async function getContract(contractId, connectedDatabase) {
.prepare(`select o.contractId,
o.contractTypeId, t.contractType, t.isPreneed,
o.burialSiteId, l.burialSiteName, l.burialSiteTypeId,
case when l.recordDelete_timeMillis is null then 1 else 0 end as burialSiteIsActive,
l.cemeteryId, m.cemeteryName,
o.contractStartDate, userFn_dateIntegerToString(o.contractStartDate) as contractStartDateString,
o.contractEndDate, userFn_dateIntegerToString(o.contractEndDate) as contractEndDateString,

View File

@ -33,6 +33,7 @@ export default async function getContract(
`select o.contractId,
o.contractTypeId, t.contractType, t.isPreneed,
o.burialSiteId, l.burialSiteName, l.burialSiteTypeId,
case when l.recordDelete_timeMillis is null then 1 else 0 end as burialSiteIsActive,
l.cemeteryId, m.cemeteryName,
o.contractStartDate, userFn_dateIntegerToString(o.contractStartDate) as contractStartDateString,
o.contractEndDate, userFn_dateIntegerToString(o.contractEndDate) as contractEndDateString,

View File

@ -1,2 +1,2 @@
import type { ContractType } from '../types/record.types.js';
export default function getContractTypes(): ContractType[];
export default function getContractTypes(includeDeleted?: boolean): ContractType[];

View File

@ -3,18 +3,20 @@ import { sunriseDB } from '../helpers/database.helpers.js';
import getContractTypeFields from './getContractTypeFields.js';
import getContractTypePrints from './getContractTypePrints.js';
import { updateRecordOrderNumber } from './updateRecordOrderNumber.js';
export default function getContractTypes() {
export default function getContractTypes(includeDeleted = false) {
const database = sqlite(sunriseDB);
const updateOrderNumbers = !includeDeleted;
const contractTypes = database
.prepare(`select contractTypeId, contractType, isPreneed, orderNumber
from ContractTypes
where recordDelete_timeMillis is null
${includeDeleted ? '' : ' where recordDelete_timeMillis is null '}
order by orderNumber, contractType, contractTypeId`)
.all();
let expectedOrderNumber = -1;
for (const contractType of contractTypes) {
expectedOrderNumber += 1;
if (contractType.orderNumber !== expectedOrderNumber) {
if (updateOrderNumbers &&
contractType.orderNumber !== expectedOrderNumber) {
updateRecordOrderNumber('ContractTypes', contractType.contractTypeId, expectedOrderNumber, database);
contractType.orderNumber = expectedOrderNumber;
}

View File

@ -7,14 +7,18 @@ import getContractTypeFields from './getContractTypeFields.js'
import getContractTypePrints from './getContractTypePrints.js'
import { updateRecordOrderNumber } from './updateRecordOrderNumber.js'
export default function getContractTypes(): ContractType[] {
export default function getContractTypes(
includeDeleted = false
): ContractType[] {
const database = sqlite(sunriseDB)
const updateOrderNumbers = !includeDeleted
const contractTypes = database
.prepare(
`select contractTypeId, contractType, isPreneed, orderNumber
from ContractTypes
where recordDelete_timeMillis is null
${includeDeleted ? '' : ' where recordDelete_timeMillis is null '}
order by orderNumber, contractType, contractTypeId`
)
.all() as ContractType[]
@ -24,7 +28,10 @@ export default function getContractTypes(): ContractType[] {
for (const contractType of contractTypes) {
expectedOrderNumber += 1
if (contractType.orderNumber !== expectedOrderNumber) {
if (
updateOrderNumbers &&
contractType.orderNumber !== expectedOrderNumber
) {
updateRecordOrderNumber(
'ContractTypes',
contractType.contractTypeId,

View File

@ -6,13 +6,14 @@ export interface GetContractsFilters {
contractEffectiveDateString?: string;
contractStartDateString?: DateString;
contractTime?: '' | 'current' | 'future' | 'past';
deceasedName?: string;
contractTypeId?: number | string;
cemeteryId?: number | string;
contractTypeId?: number | string;
deceasedName?: string;
burialSiteName?: string;
burialSiteNameSearchType?: '' | 'endsWith' | 'startsWith';
burialSiteTypeId?: number | string;
funeralHomeId?: number | string;
funeralTime?: '' | 'upcoming';
notWorkOrderId?: number | string;
workOrderId?: number | string;
}
@ -20,6 +21,7 @@ export interface GetContractsOptions {
/** -1 for no limit */
limit: number | string;
offset: number | string;
orderBy?: string;
includeFees: boolean;
includeInterments: boolean;
includeTransactions: boolean;

View File

@ -1,4 +1,4 @@
import { dateIntegerToString, dateStringToInteger, timeIntegerToPeriodString, timeIntegerToString } from '@cityssm/utils-datetime';
import { dateIntegerToString, dateStringToInteger, dateToInteger, timeIntegerToPeriodString, timeIntegerToString } from '@cityssm/utils-datetime';
import sqlite from 'better-sqlite3';
import { getConfigProperty } from '../helpers/config.helpers.js';
import { sunriseDB } from '../helpers/database.helpers.js';
@ -20,48 +20,55 @@ export default async function getContracts(filters, options, connectedDatabase)
if (isLimited) {
count = database
.prepare(`select count(*) as recordCount
from Contracts o
left join BurialSites l on o.burialSiteId = l.burialSiteId
from Contracts c
left join BurialSites l on c.burialSiteId = l.burialSiteId
left join Cemeteries m on l.cemeteryId = m.cemeteryId
${sqlWhereClause}`)
.get(sqlParameters).recordCount;
.pluck()
.get(sqlParameters);
}
let contracts = [];
if (count !== 0) {
const sqlLimitClause = isLimited
? ` limit ${options.limit} offset ${options.offset}`
: '';
contracts = database
.prepare(`select o.contractId,
o.contractTypeId, t.contractType, t.isPreneed,
o.burialSiteId, lt.burialSiteType, l.burialSiteName,
.prepare(`select c.contractId,
c.contractTypeId, t.contractType, t.isPreneed,
c.burialSiteId, lt.burialSiteType, l.burialSiteName,
case when l.recordDelete_timeMillis is null then 1 else 0 end as burialSiteIsActive,
l.cemeteryId, m.cemeteryName,
o.contractStartDate, userFn_dateIntegerToString(o.contractStartDate) as contractStartDateString,
o.contractEndDate, userFn_dateIntegerToString(o.contractEndDate) as contractEndDateString,
o.purchaserName, o.purchaserAddress1, o.purchaserAddress2,
o.purchaserCity, o.purchaserProvince, o.purchaserPostalCode,
o.purchaserPhoneNumber, o.purchaserEmail, o.purchaserRelationship,
o.funeralHomeId, o.funeralDirectorName, f.funeralHomeName,
c.contractStartDate, userFn_dateIntegerToString(c.contractStartDate) as contractStartDateString,
c.contractEndDate, userFn_dateIntegerToString(c.contractEndDate) as contractEndDateString,
c.purchaserName, c.purchaserAddress1, c.purchaserAddress2,
c.purchaserCity, c.purchaserProvince, c.purchaserPostalCode,
c.purchaserPhoneNumber, c.purchaserEmail, c.purchaserRelationship,
c.funeralHomeId, c.funeralDirectorName, f.funeralHomeName,
o.funeralDate, userFn_dateIntegerToString(o.funeralDate) as funeralDateString,
o.funeralTime,
userFn_timeIntegerToString(o.funeralTime) as funeralTimeString,
userFn_timeIntegerToPeriodString(o.funeralTime) as funeralTimePeriodString,
o.directionOfArrival,
o.committalTypeId, c.committalType
from Contracts o
left join ContractTypes t on o.contractTypeId = t.contractTypeId
left join CommittalTypes c on o.committalTypeId = c.committalTypeId
left join BurialSites l on o.burialSiteId = l.burialSiteId
c.funeralDate, userFn_dateIntegerToString(c.funeralDate) as funeralDateString,
c.funeralTime,
userFn_timeIntegerToString(c.funeralTime) as funeralTimeString,
userFn_timeIntegerToPeriodString(c.funeralTime) as funeralTimePeriodString,
c.directionOfArrival,
c.committalTypeId, cm.committalType
from Contracts c
left join ContractTypes t on c.contractTypeId = t.contractTypeId
left join CommittalTypes cm on c.committalTypeId = cm.committalTypeId
left join BurialSites l on c.burialSiteId = l.burialSiteId
left join BurialSiteTypes lt on l.burialSiteTypeId = lt.burialSiteTypeId
left join Cemeteries m on l.cemeteryId = m.cemeteryId
left join FuneralHomes f on o.funeralHomeId = f.funeralHomeId
left join FuneralHomes f on c.funeralHomeId = f.funeralHomeId
${sqlWhereClause}
order by o.contractStartDate desc, ifnull(o.contractEndDate, 99999999) desc,
${options.orderBy !== undefined && options.orderBy !== ''
? ` order by ${options.orderBy}`
: ` order by c.contractStartDate desc, ifnull(c.contractEndDate, 99999999) desc,
l.burialSiteNameSegment1,
l.burialSiteNameSegment2,
l.burialSiteNameSegment3,
l.burialSiteNameSegment4,
l.burialSiteNameSegment5,
o.burialSiteId, o.contractId desc
${isLimited ? ` limit ${options.limit} offset ${options.offset}` : ''}`)
c.burialSiteId, c.contractId desc`}
${sqlLimitClause}`)
.all(sqlParameters);
if (!isLimited) {
count = contracts.length;
@ -98,38 +105,38 @@ async function addInclusions(contract, options, database) {
}
// eslint-disable-next-line complexity
function buildWhereClause(filters) {
let sqlWhereClause = ' where o.recordDelete_timeMillis is null';
let sqlWhereClause = ' where c.recordDelete_timeMillis is null';
const sqlParameters = [];
if ((filters.burialSiteId ?? '') !== '') {
sqlWhereClause += ' and o.burialSiteId = ?';
sqlWhereClause += ' and c.burialSiteId = ?';
sqlParameters.push(filters.burialSiteId);
}
const burialSiteNameFilters = getBurialSiteNameWhereClause(filters.burialSiteName, filters.burialSiteNameSearchType ?? '', 'l');
sqlWhereClause += burialSiteNameFilters.sqlWhereClause;
sqlParameters.push(...burialSiteNameFilters.sqlParameters);
const deceasedNameFilters = getDeceasedNameWhereClause(filters.deceasedName, 'o');
const deceasedNameFilters = getDeceasedNameWhereClause(filters.deceasedName, 'c');
if (deceasedNameFilters.sqlParameters.length > 0) {
sqlWhereClause += ` and o.contractId in (
select contractId from ContractInterments o
sqlWhereClause += ` and c.contractId in (
select contractId from ContractInterments c
where recordDelete_timeMillis is null
${deceasedNameFilters.sqlWhereClause})`;
sqlParameters.push(...deceasedNameFilters.sqlParameters);
}
if ((filters.contractTypeId ?? '') !== '') {
sqlWhereClause += ' and o.contractTypeId = ?';
sqlWhereClause += ' and c.contractTypeId = ?';
sqlParameters.push(filters.contractTypeId);
}
const contractTimeFilters = getContractTimeWhereClause(filters.contractTime ?? '', 'o');
const contractTimeFilters = getContractTimeWhereClause(filters.contractTime ?? '', 'c');
sqlWhereClause += contractTimeFilters.sqlWhereClause;
sqlParameters.push(...contractTimeFilters.sqlParameters);
if ((filters.contractStartDateString ?? '') !== '') {
sqlWhereClause += ' and o.contractStartDate = ?';
sqlWhereClause += ' and c.contractStartDate = ?';
sqlParameters.push(dateStringToInteger(filters.contractStartDateString));
}
if ((filters.contractEffectiveDateString ?? '') !== '') {
sqlWhereClause += ` and (
o.contractEndDate is null
or (o.contractStartDate <= ? and o.contractEndDate >= ?)
c.contractEndDate is null
or (c.contractStartDate <= ? and c.contractEndDate >= ?)
)`;
sqlParameters.push(dateStringToInteger(filters.contractEffectiveDateString), dateStringToInteger(filters.contractEffectiveDateString));
}
@ -142,17 +149,21 @@ function buildWhereClause(filters) {
sqlParameters.push(filters.burialSiteTypeId);
}
if ((filters.funeralHomeId ?? '') !== '') {
sqlWhereClause += ' and o.funeralHomeId = ?';
sqlWhereClause += ' and c.funeralHomeId = ?';
sqlParameters.push(filters.funeralHomeId);
}
if ((filters.funeralTime ?? '') === 'upcoming') {
sqlWhereClause += ' and c.funeralDate >= ?';
sqlParameters.push(dateToInteger(new Date()));
}
if ((filters.workOrderId ?? '') !== '') {
sqlWhereClause +=
' and o.contractId in (select contractId from WorkOrderContracts where recordDelete_timeMillis is null and workOrderId = ?)';
' and c.contractId in (select contractId from WorkOrderContracts where recordDelete_timeMillis is null and workOrderId = ?)';
sqlParameters.push(filters.workOrderId);
}
if ((filters.notWorkOrderId ?? '') !== '') {
sqlWhereClause +=
' and o.contractId not in (select contractId from WorkOrderContracts where recordDelete_timeMillis is null and workOrderId = ?)';
' and c.contractId not in (select contractId from WorkOrderContracts where recordDelete_timeMillis is null and workOrderId = ?)';
sqlParameters.push(filters.notWorkOrderId);
}
return {

View File

@ -2,6 +2,7 @@ import {
type DateString,
dateIntegerToString,
dateStringToInteger,
dateToInteger,
timeIntegerToPeriodString,
timeIntegerToString
} from '@cityssm/utils-datetime'
@ -28,15 +29,17 @@ export interface GetContractsFilters {
contractStartDateString?: DateString
contractTime?: '' | 'current' | 'future' | 'past'
deceasedName?: string
contractTypeId?: number | string
cemeteryId?: number | string
contractTypeId?: number | string
deceasedName?: string
burialSiteName?: string
burialSiteNameSearchType?: '' | 'endsWith' | 'startsWith'
burialSiteTypeId?: number | string
funeralHomeId?: number | string
funeralTime?: '' | 'upcoming'
notWorkOrderId?: number | string
workOrderId?: number | string
@ -47,6 +50,8 @@ export interface GetContractsOptions {
limit: number | string
offset: number | string
orderBy?: string
includeFees: boolean
includeInterments: boolean
includeTransactions: boolean
@ -62,7 +67,9 @@ export default async function getContracts(
database.function('userFn_dateIntegerToString', dateIntegerToString)
database.function('userFn_timeIntegerToString', timeIntegerToString)
database.function(
'userFn_timeIntegerToPeriodString', timeIntegerToPeriodString)
'userFn_timeIntegerToPeriodString',
timeIntegerToPeriodString
)
const { sqlParameters, sqlWhereClause } = buildWhereClause(filters)
@ -74,59 +81,65 @@ export default async function getContracts(
const isLimited = options.limit !== -1
if (isLimited) {
count = (
database
count = database
.prepare(
`select count(*) as recordCount
from Contracts o
left join BurialSites l on o.burialSiteId = l.burialSiteId
from Contracts c
left join BurialSites l on c.burialSiteId = l.burialSiteId
left join Cemeteries m on l.cemeteryId = m.cemeteryId
${sqlWhereClause}`
)
.get(sqlParameters) as { recordCount: number }
).recordCount
.pluck()
.get(sqlParameters) as number
}
let contracts: Contract[] = []
if (count !== 0) {
const sqlLimitClause = isLimited
? ` limit ${options.limit} offset ${options.offset}`
: ''
contracts = database
.prepare(
`select o.contractId,
o.contractTypeId, t.contractType, t.isPreneed,
o.burialSiteId, lt.burialSiteType, l.burialSiteName,
`select c.contractId,
c.contractTypeId, t.contractType, t.isPreneed,
c.burialSiteId, lt.burialSiteType, l.burialSiteName,
case when l.recordDelete_timeMillis is null then 1 else 0 end as burialSiteIsActive,
l.cemeteryId, m.cemeteryName,
o.contractStartDate, userFn_dateIntegerToString(o.contractStartDate) as contractStartDateString,
o.contractEndDate, userFn_dateIntegerToString(o.contractEndDate) as contractEndDateString,
o.purchaserName, o.purchaserAddress1, o.purchaserAddress2,
o.purchaserCity, o.purchaserProvince, o.purchaserPostalCode,
o.purchaserPhoneNumber, o.purchaserEmail, o.purchaserRelationship,
o.funeralHomeId, o.funeralDirectorName, f.funeralHomeName,
c.contractStartDate, userFn_dateIntegerToString(c.contractStartDate) as contractStartDateString,
c.contractEndDate, userFn_dateIntegerToString(c.contractEndDate) as contractEndDateString,
c.purchaserName, c.purchaserAddress1, c.purchaserAddress2,
c.purchaserCity, c.purchaserProvince, c.purchaserPostalCode,
c.purchaserPhoneNumber, c.purchaserEmail, c.purchaserRelationship,
c.funeralHomeId, c.funeralDirectorName, f.funeralHomeName,
o.funeralDate, userFn_dateIntegerToString(o.funeralDate) as funeralDateString,
o.funeralTime,
userFn_timeIntegerToString(o.funeralTime) as funeralTimeString,
userFn_timeIntegerToPeriodString(o.funeralTime) as funeralTimePeriodString,
o.directionOfArrival,
o.committalTypeId, c.committalType
from Contracts o
left join ContractTypes t on o.contractTypeId = t.contractTypeId
left join CommittalTypes c on o.committalTypeId = c.committalTypeId
left join BurialSites l on o.burialSiteId = l.burialSiteId
c.funeralDate, userFn_dateIntegerToString(c.funeralDate) as funeralDateString,
c.funeralTime,
userFn_timeIntegerToString(c.funeralTime) as funeralTimeString,
userFn_timeIntegerToPeriodString(c.funeralTime) as funeralTimePeriodString,
c.directionOfArrival,
c.committalTypeId, cm.committalType
from Contracts c
left join ContractTypes t on c.contractTypeId = t.contractTypeId
left join CommittalTypes cm on c.committalTypeId = cm.committalTypeId
left join BurialSites l on c.burialSiteId = l.burialSiteId
left join BurialSiteTypes lt on l.burialSiteTypeId = lt.burialSiteTypeId
left join Cemeteries m on l.cemeteryId = m.cemeteryId
left join FuneralHomes f on o.funeralHomeId = f.funeralHomeId
left join FuneralHomes f on c.funeralHomeId = f.funeralHomeId
${sqlWhereClause}
order by o.contractStartDate desc, ifnull(o.contractEndDate, 99999999) desc,
${
options.orderBy !== undefined && options.orderBy !== ''
? ` order by ${options.orderBy}`
: ` order by c.contractStartDate desc, ifnull(c.contractEndDate, 99999999) desc,
l.burialSiteNameSegment1,
l.burialSiteNameSegment2,
l.burialSiteNameSegment3,
l.burialSiteNameSegment4,
l.burialSiteNameSegment5,
o.burialSiteId, o.contractId desc
${
isLimited ? ` limit ${options.limit} offset ${options.offset}` : ''
}`
c.burialSiteId, c.contractId desc`
}
${sqlLimitClause}`
)
.all(sqlParameters) as Contract[]
@ -191,11 +204,11 @@ function buildWhereClause(filters: GetContractsFilters): {
sqlParameters: unknown[]
sqlWhereClause: string
} {
let sqlWhereClause = ' where o.recordDelete_timeMillis is null'
let sqlWhereClause = ' where c.recordDelete_timeMillis is null'
const sqlParameters: unknown[] = []
if ((filters.burialSiteId ?? '') !== '') {
sqlWhereClause += ' and o.burialSiteId = ?'
sqlWhereClause += ' and c.burialSiteId = ?'
sqlParameters.push(filters.burialSiteId)
}
@ -209,30 +222,30 @@ function buildWhereClause(filters: GetContractsFilters): {
const deceasedNameFilters = getDeceasedNameWhereClause(
filters.deceasedName,
'o'
'c'
)
if (deceasedNameFilters.sqlParameters.length > 0) {
sqlWhereClause += ` and o.contractId in (
select contractId from ContractInterments o
sqlWhereClause += ` and c.contractId in (
select contractId from ContractInterments c
where recordDelete_timeMillis is null
${deceasedNameFilters.sqlWhereClause})`
sqlParameters.push(...deceasedNameFilters.sqlParameters)
}
if ((filters.contractTypeId ?? '') !== '') {
sqlWhereClause += ' and o.contractTypeId = ?'
sqlWhereClause += ' and c.contractTypeId = ?'
sqlParameters.push(filters.contractTypeId)
}
const contractTimeFilters = getContractTimeWhereClause(
filters.contractTime ?? '',
'o'
'c'
)
sqlWhereClause += contractTimeFilters.sqlWhereClause
sqlParameters.push(...contractTimeFilters.sqlParameters)
if ((filters.contractStartDateString ?? '') !== '') {
sqlWhereClause += ' and o.contractStartDate = ?'
sqlWhereClause += ' and c.contractStartDate = ?'
sqlParameters.push(
dateStringToInteger(filters.contractStartDateString as DateString)
)
@ -240,8 +253,8 @@ function buildWhereClause(filters: GetContractsFilters): {
if ((filters.contractEffectiveDateString ?? '') !== '') {
sqlWhereClause += ` and (
o.contractEndDate is null
or (o.contractStartDate <= ? and o.contractEndDate >= ?)
c.contractEndDate is null
or (c.contractStartDate <= ? and c.contractEndDate >= ?)
)`
sqlParameters.push(
dateStringToInteger(filters.contractEffectiveDateString as DateString),
@ -260,19 +273,24 @@ function buildWhereClause(filters: GetContractsFilters): {
}
if ((filters.funeralHomeId ?? '') !== '') {
sqlWhereClause += ' and o.funeralHomeId = ?'
sqlWhereClause += ' and c.funeralHomeId = ?'
sqlParameters.push(filters.funeralHomeId)
}
if ((filters.funeralTime ?? '') === 'upcoming') {
sqlWhereClause += ' and c.funeralDate >= ?'
sqlParameters.push(dateToInteger(new Date()))
}
if ((filters.workOrderId ?? '') !== '') {
sqlWhereClause +=
' and o.contractId in (select contractId from WorkOrderContracts where recordDelete_timeMillis is null and workOrderId = ?)'
' and c.contractId in (select contractId from WorkOrderContracts where recordDelete_timeMillis is null and workOrderId = ?)'
sqlParameters.push(filters.workOrderId)
}
if ((filters.notWorkOrderId ?? '') !== '') {
sqlWhereClause +=
' and o.contractId not in (select contractId from WorkOrderContracts where recordDelete_timeMillis is null and workOrderId = ?)'
' and c.contractId not in (select contractId from WorkOrderContracts where recordDelete_timeMillis is null and workOrderId = ?)'
sqlParameters.push(filters.notWorkOrderId)
}

View File

@ -5,6 +5,7 @@ export default function getNextWorkOrderNumber(connectedDatabase) {
const database = connectedDatabase ?? sqlite(sunriseDB, { readonly: true });
const paddingLength = getConfigProperty('settings.workOrders.workOrderNumberLength');
const currentYearString = new Date().getFullYear().toString();
// eslint-disable-next-line security/detect-non-literal-regexp
const regex = new RegExp(`^${currentYearString}-\\d+$`);
database.function(
// eslint-disable-next-line no-secrets/no-secrets

View File

@ -13,6 +13,7 @@ export default function getNextWorkOrderNumber(
)
const currentYearString = new Date().getFullYear().toString()
// eslint-disable-next-line security/detect-non-literal-regexp
const regex = new RegExp(`^${currentYearString}-\\d+$`)
database.function(

View File

@ -1,2 +1,2 @@
import type { WorkOrderMilestoneType } from '../types/record.types.js';
export default function getWorkOrderMilestoneTypes(): WorkOrderMilestoneType[];
export default function getWorkOrderMilestoneTypes(includeDeleted?: boolean): WorkOrderMilestoneType[];

View File

@ -1,14 +1,16 @@
import sqlite from 'better-sqlite3';
import { sunriseDB } from '../helpers/database.helpers.js';
import { updateRecordOrderNumber } from './updateRecordOrderNumber.js';
export default function getWorkOrderMilestoneTypes() {
export default function getWorkOrderMilestoneTypes(includeDeleted = false) {
const database = sqlite(sunriseDB);
const updateOrderNumbers = !includeDeleted;
const workOrderMilestoneTypes = database
.prepare(`select workOrderMilestoneTypeId, workOrderMilestoneType, orderNumber
from WorkOrderMilestoneTypes
where recordDelete_timeMillis is null
${includeDeleted ? '' : ' where recordDelete_timeMillis is null '}
order by orderNumber, workOrderMilestoneType`)
.all();
if (updateOrderNumbers) {
let expectedOrderNumber = 0;
for (const workOrderMilestoneType of workOrderMilestoneTypes) {
if (workOrderMilestoneType.orderNumber !== expectedOrderNumber) {
@ -17,6 +19,7 @@ export default function getWorkOrderMilestoneTypes() {
}
expectedOrderNumber += 1;
}
}
database.close();
return workOrderMilestoneTypes;
}

View File

@ -5,18 +5,23 @@ import type { WorkOrderMilestoneType } from '../types/record.types.js'
import { updateRecordOrderNumber } from './updateRecordOrderNumber.js'
export default function getWorkOrderMilestoneTypes(): WorkOrderMilestoneType[] {
export default function getWorkOrderMilestoneTypes(
includeDeleted = false
): WorkOrderMilestoneType[] {
const database = sqlite(sunriseDB)
const updateOrderNumbers = !includeDeleted
const workOrderMilestoneTypes = database
.prepare(
`select workOrderMilestoneTypeId, workOrderMilestoneType, orderNumber
from WorkOrderMilestoneTypes
where recordDelete_timeMillis is null
${includeDeleted ? '' : ' where recordDelete_timeMillis is null '}
order by orderNumber, workOrderMilestoneType`
)
.all() as WorkOrderMilestoneType[]
if (updateOrderNumbers) {
let expectedOrderNumber = 0
for (const workOrderMilestoneType of workOrderMilestoneTypes) {
@ -33,6 +38,7 @@ export default function getWorkOrderMilestoneTypes(): WorkOrderMilestoneType[] {
expectedOrderNumber += 1
}
}
database.close()

View File

@ -14,7 +14,8 @@ export async function getWorkOrders(filters, options, connectedDatabase) {
.prepare(`select count(*) as recordCount
from WorkOrders w
${sqlWhereClause}`)
.get(sqlParameters).recordCount;
.pluck()
.get(sqlParameters);
let workOrders = [];
if (count > 0) {
workOrders = database

View File

@ -48,15 +48,14 @@ export async function getWorkOrders(
const { sqlParameters, sqlWhereClause } = buildWhereClause(filters)
const count: number = (
database
const count: number = database
.prepare(
`select count(*) as recordCount
from WorkOrders w
${sqlWhereClause}`
)
.get(sqlParameters) as { recordCount: number }
).recordCount
.pluck()
.get(sqlParameters) as number
let workOrders: WorkOrder[] = []

View File

@ -1,9 +1,10 @@
// eslint-disable-next-line @eslint-community/eslint-comments/disable-enable-pair
/* eslint-disable max-lines, no-secrets/no-secrets */
/* eslint-disable @typescript-eslint/no-magic-numbers, max-lines, no-secrets/no-secrets */
import sqlite from 'better-sqlite3';
import Debug from 'debug';
import { DEBUG_NAMESPACE } from '../debug.config.js';
import { sunriseDB as databasePath } from '../helpers/database.helpers.js';
import addBurialSiteType from './addBurialSiteType.js';
import addCommittalType from './addCommittalType.js';
import addContractType from './addContractType.js';
import addFeeCategory from './addFeeCategory.js';
@ -23,6 +24,8 @@ const createStatements = [
`create table if not exists BurialSiteTypes (
burialSiteTypeId integer not null primary key autoincrement,
burialSiteType varchar(100) not null,
bodyCapacityMax smallint,
crematedCapacityMax smallint,
orderNumber smallint not null default 0,
${recordColumns})`,
`create index if not exists idx_BurialSiteTypes_orderNumber
@ -94,6 +97,9 @@ const createStatements = [
burialSiteNameSegment5 varchar(20) not null,
burialSiteName varchar(200) not null,
bodyCapacity smallint,
crematedCapacity smallint,
cemeteryId integer,
cemeterySvgId varchar(100),
burialSiteImage varchar(100) not null default '',
@ -412,12 +418,42 @@ export function initializeDatabase() {
}
function initializeData() {
debug('Initializing data...');
addRecord('BurialSiteTypes', 'Casket Grave', 1, initializingUser);
addRecord('BurialSiteTypes', 'Columbarium', 2, initializingUser);
addRecord('BurialSiteTypes', 'Mausoleum', 2, initializingUser);
addRecord('BurialSiteTypes', 'Niche Wall', 2, initializingUser);
addRecord('BurialSiteTypes', 'Urn Garden', 2, initializingUser);
addRecord('BurialSiteTypes', 'Crematorium', 2, initializingUser);
addBurialSiteType({
burialSiteType: 'In-Ground Grave',
bodyCapacityMax: 2,
crematedCapacityMax: 6,
orderNumber: 1
}, initializingUser);
addBurialSiteType({
burialSiteType: 'Columbarium',
bodyCapacityMax: 0,
crematedCapacityMax: '',
orderNumber: 2
}, initializingUser);
addBurialSiteType({
burialSiteType: 'Mausoleum',
bodyCapacityMax: 2,
crematedCapacityMax: 0,
orderNumber: 2
}, initializingUser);
addBurialSiteType({
burialSiteType: 'Niche Wall',
bodyCapacityMax: 0,
crematedCapacityMax: 1,
orderNumber: 2
}, initializingUser);
addBurialSiteType({
burialSiteType: 'Urn Garden',
bodyCapacityMax: 0,
crematedCapacityMax: 1,
orderNumber: 2
}, initializingUser);
addBurialSiteType({
burialSiteType: 'Crematorium',
bodyCapacityMax: 0,
crematedCapacityMax: 1,
orderNumber: 2
}, initializingUser);
addRecord('BurialSiteStatuses', 'Available', 1, initializingUser);
addRecord('BurialSiteStatuses', 'Reserved', 2, initializingUser);
addRecord('BurialSiteStatuses', 'Taken', 3, initializingUser);

View File

@ -1,5 +1,5 @@
// eslint-disable-next-line @eslint-community/eslint-comments/disable-enable-pair
/* eslint-disable max-lines, no-secrets/no-secrets */
/* eslint-disable @typescript-eslint/no-magic-numbers, max-lines, no-secrets/no-secrets */
import sqlite from 'better-sqlite3'
import Debug from 'debug'
@ -7,6 +7,7 @@ import Debug from 'debug'
import { DEBUG_NAMESPACE } from '../debug.config.js'
import { sunriseDB as databasePath } from '../helpers/database.helpers.js'
import addBurialSiteType from './addBurialSiteType.js'
import addCommittalType from './addCommittalType.js'
import addContractType from './addContractType.js'
import addFeeCategory from './addFeeCategory.js'
@ -30,6 +31,8 @@ const createStatements = [
`create table if not exists BurialSiteTypes (
burialSiteTypeId integer not null primary key autoincrement,
burialSiteType varchar(100) not null,
bodyCapacityMax smallint,
crematedCapacityMax smallint,
orderNumber smallint not null default 0,
${recordColumns})`,
@ -112,6 +115,9 @@ const createStatements = [
burialSiteNameSegment5 varchar(20) not null,
burialSiteName varchar(200) not null,
bodyCapacity smallint,
crematedCapacity smallint,
cemeteryId integer,
cemeterySvgId varchar(100),
burialSiteImage varchar(100) not null default '',
@ -482,12 +488,71 @@ export function initializeDatabase(): boolean {
function initializeData(): void {
debug('Initializing data...')
addRecord('BurialSiteTypes', 'Casket Grave', 1, initializingUser)
addRecord('BurialSiteTypes', 'Columbarium', 2, initializingUser)
addRecord('BurialSiteTypes', 'Mausoleum', 2, initializingUser)
addRecord('BurialSiteTypes', 'Niche Wall', 2, initializingUser)
addRecord('BurialSiteTypes', 'Urn Garden', 2, initializingUser)
addRecord('BurialSiteTypes', 'Crematorium', 2, initializingUser)
addBurialSiteType(
{
burialSiteType: 'In-Ground Grave',
bodyCapacityMax: 2,
crematedCapacityMax: 6,
orderNumber: 1
},
initializingUser
)
addBurialSiteType(
{
burialSiteType: 'Columbarium',
bodyCapacityMax: 0,
crematedCapacityMax: '',
orderNumber: 2
},
initializingUser
)
addBurialSiteType(
{
burialSiteType: 'Mausoleum',
bodyCapacityMax: 2,
crematedCapacityMax: 0,
orderNumber: 2
},
initializingUser
)
addBurialSiteType(
{
burialSiteType: 'Niche Wall',
bodyCapacityMax: 0,
crematedCapacityMax: 1,
orderNumber: 2
},
initializingUser
)
addBurialSiteType(
{
burialSiteType: 'Urn Garden',
bodyCapacityMax: 0,
crematedCapacityMax: 1,
orderNumber: 2
},
initializingUser
)
addBurialSiteType(
{
burialSiteType: 'Crematorium',
bodyCapacityMax: 0,
crematedCapacityMax: 1,
orderNumber: 2
},
initializingUser
)
addRecord('BurialSiteStatuses', 'Available', 1, initializingUser)
addRecord('BurialSiteStatuses', 'Reserved', 2, initializingUser)

View File

@ -0,0 +1 @@
export declare function restoreBurialSite(burialSiteId: number, user: User): boolean;

View File

@ -0,0 +1,17 @@
import sqlite from 'better-sqlite3';
import { sunriseDB } from '../helpers/database.helpers.js';
export function restoreBurialSite(burialSiteId, user) {
const database = sqlite(sunriseDB);
const rightNowMillis = Date.now();
const result = database
.prepare(`update BurialSites
set recordDelete_userName = null,
recordDelete_timeMillis = null,
recordUpdate_userName = ?,
recordUpdate_timeMillis = ?
where burialSiteId = ?
and recordDelete_timeMillis is not null`)
.run(user.userName, rightNowMillis, burialSiteId);
database.close();
return result.changes > 0;
}

View File

@ -0,0 +1,25 @@
import sqlite from 'better-sqlite3'
import { sunriseDB } from '../helpers/database.helpers.js'
export function restoreBurialSite(burialSiteId: number, user: User): boolean {
const database = sqlite(sunriseDB)
const rightNowMillis = Date.now()
const result = database
.prepare(
`update BurialSites
set recordDelete_userName = null,
recordDelete_timeMillis = null,
recordUpdate_userName = ?,
recordUpdate_timeMillis = ?
where burialSiteId = ?
and recordDelete_timeMillis is not null`
)
.run(user.userName, rightNowMillis, burialSiteId)
database.close()
return result.changes > 0
}

View File

@ -7,6 +7,8 @@ export interface UpdateBurialSiteForm {
burialSiteNameSegment5?: string;
burialSiteStatusId: number | string;
burialSiteTypeId: number | string;
bodyCapacity?: number | string;
crematedCapacity?: number | string;
burialSiteImage: string;
cemeteryId: number | string;
cemeterySvgId: string;

View File

@ -11,6 +11,7 @@ import getCemetery from './getCemetery.js';
* @returns True if the burial site was updated.
* @throws If an active burial site with the same name already exists.
*/
// eslint-disable-next-line complexity
export default function updateBurialSite(updateForm, user) {
const database = sqlite(sunriseDB);
const cemetery = updateForm.cemeteryId === ''
@ -40,6 +41,8 @@ export default function updateBurialSite(updateForm, user) {
burialSiteName = ?,
burialSiteTypeId = ?,
burialSiteStatusId = ?,
bodyCapacity = ?,
crematedCapacity = ?,
cemeteryId = ?,
cemeterySvgId = ?,
burialSiteImage = ?,
@ -51,7 +54,9 @@ export default function updateBurialSite(updateForm, user) {
and recordDelete_timeMillis is null`)
.run(updateForm.burialSiteNameSegment1 ?? '', updateForm.burialSiteNameSegment2 ?? '', updateForm.burialSiteNameSegment3 ?? '', updateForm.burialSiteNameSegment4 ?? '', updateForm.burialSiteNameSegment5 ?? '', burialSiteName, updateForm.burialSiteTypeId, updateForm.burialSiteStatusId === ''
? undefined
: updateForm.burialSiteStatusId, updateForm.cemeteryId === '' ? undefined : updateForm.cemeteryId, updateForm.cemeterySvgId, updateForm.burialSiteImage, updateForm.burialSiteLatitude === ''
: updateForm.burialSiteStatusId, updateForm.bodyCapacity === '' ? undefined : updateForm.bodyCapacity, updateForm.crematedCapacity === ''
? undefined
: updateForm.crematedCapacity, updateForm.cemeteryId === '' ? undefined : updateForm.cemeteryId, updateForm.cemeterySvgId, updateForm.burialSiteImage, updateForm.burialSiteLatitude === ''
? undefined
: updateForm.burialSiteLatitude, updateForm.burialSiteLongitude === ''
? undefined

View File

@ -19,6 +19,9 @@ export interface UpdateBurialSiteForm {
burialSiteStatusId: number | string
burialSiteTypeId: number | string
bodyCapacity?: number | string
crematedCapacity?: number | string
burialSiteImage: string
cemeteryId: number | string
cemeterySvgId: string
@ -37,6 +40,7 @@ export interface UpdateBurialSiteForm {
* @returns True if the burial site was updated.
* @throws If an active burial site with the same name already exists.
*/
// eslint-disable-next-line complexity
export default function updateBurialSite(
updateForm: UpdateBurialSiteForm,
user: User
@ -79,6 +83,8 @@ export default function updateBurialSite(
burialSiteName = ?,
burialSiteTypeId = ?,
burialSiteStatusId = ?,
bodyCapacity = ?,
crematedCapacity = ?,
cemeteryId = ?,
cemeterySvgId = ?,
burialSiteImage = ?,
@ -100,6 +106,13 @@ export default function updateBurialSite(
updateForm.burialSiteStatusId === ''
? undefined
: updateForm.burialSiteStatusId,
updateForm.bodyCapacity === '' ? undefined : updateForm.bodyCapacity,
updateForm.crematedCapacity === ''
? undefined
: updateForm.crematedCapacity,
updateForm.cemeteryId === '' ? undefined : updateForm.cemeteryId,
updateForm.cemeterySvgId,
updateForm.burialSiteImage,

View File

@ -0,0 +1,7 @@
export interface UpdateBurialSiteTypeForm {
burialSiteTypeId: number | string;
burialSiteType: string;
bodyCapacityMax: number | string;
crematedCapacityMax: number | string;
}
export default function updateBurialSiteType(updateForm: UpdateBurialSiteTypeForm, user: User): boolean;

View File

@ -0,0 +1,23 @@
import sqlite from 'better-sqlite3';
import { sunriseDB } from '../helpers/database.helpers.js';
import { clearCacheByTableName } from '../helpers/functions.cache.js';
export default function updateBurialSiteType(updateForm, user) {
const database = sqlite(sunriseDB);
const rightNowMillis = Date.now();
const result = database
.prepare(`update BurialSiteTypes
set burialSiteType = ?,
bodyCapacityMax = ?,
crematedCapacityMax = ?,
recordUpdate_userName = ?, recordUpdate_timeMillis = ?
where recordDelete_timeMillis is null
and burialSiteTypeId = ?`)
.run(updateForm.burialSiteType, updateForm.bodyCapacityMax === ''
? undefined
: updateForm.bodyCapacityMax, updateForm.crematedCapacityMax === ''
? undefined
: updateForm.crematedCapacityMax, user.userName, rightNowMillis, updateForm.burialSiteTypeId);
database.close();
clearCacheByTableName('BurialSiteTypes');
return result.changes > 0;
}

View File

@ -0,0 +1,52 @@
import sqlite from 'better-sqlite3'
import { sunriseDB } from '../helpers/database.helpers.js'
import { clearCacheByTableName } from '../helpers/functions.cache.js'
export interface UpdateBurialSiteTypeForm {
burialSiteTypeId: number | string
burialSiteType: string
bodyCapacityMax: number | string
crematedCapacityMax: number | string
}
export default function updateBurialSiteType(
updateForm: UpdateBurialSiteTypeForm,
user: User
): boolean {
const database = sqlite(sunriseDB)
const rightNowMillis = Date.now()
const result = database
.prepare(
`update BurialSiteTypes
set burialSiteType = ?,
bodyCapacityMax = ?,
crematedCapacityMax = ?,
recordUpdate_userName = ?, recordUpdate_timeMillis = ?
where recordDelete_timeMillis is null
and burialSiteTypeId = ?`
)
.run(
updateForm.burialSiteType,
updateForm.bodyCapacityMax === ''
? undefined
: updateForm.bodyCapacityMax,
updateForm.crematedCapacityMax === ''
? undefined
: updateForm.crematedCapacityMax,
user.userName,
rightNowMillis,
updateForm.burialSiteTypeId
)
database.close()
clearCacheByTableName('BurialSiteTypes')
return result.changes > 0
}

View File

@ -5,6 +5,7 @@ import { clearCacheByTableName } from '../helpers/functions.cache.js'
export interface UpdateBurialSiteTypeFieldForm {
burialSiteTypeFieldId: number | string
burialSiteTypeField: string
isRequired: '0' | '1'

View File

@ -1,3 +1,3 @@
type RecordTable = 'BurialSiteStatuses' | 'BurialSiteTypes' | 'CommittalTypes' | 'WorkOrderMilestoneTypes' | 'WorkOrderTypes';
type RecordTable = 'BurialSiteStatuses' | 'CommittalTypes' | 'WorkOrderMilestoneTypes' | 'WorkOrderTypes';
export declare function updateRecord(recordTable: RecordTable, recordId: number | string, recordName: string, user: User): boolean;
export {};

View File

@ -3,7 +3,6 @@ import { sunriseDB } from '../helpers/database.helpers.js';
import { clearCacheByTableName } from '../helpers/functions.cache.js';
const recordNameIdColumns = new Map([
['BurialSiteStatuses', ['burialSiteStatus', 'burialSiteStatusId']],
['BurialSiteTypes', ['burialSiteType', 'burialSiteTypeId']],
['CommittalTypes', ['committalType', 'committalTypeId']],
[
'WorkOrderMilestoneTypes',
@ -13,13 +12,17 @@ const recordNameIdColumns = new Map([
]);
export function updateRecord(recordTable, recordId, recordName, user) {
const database = sqlite(sunriseDB);
const columnNames = recordNameIdColumns.get(recordTable);
if (columnNames === undefined) {
throw new Error(`Invalid record table: ${recordTable}`);
}
const result = database
.prepare(`update ${recordTable}
set ${recordNameIdColumns.get(recordTable)[0]} = ?,
set ${columnNames[0]} = ?,
recordUpdate_userName = ?,
recordUpdate_timeMillis = ?
where recordDelete_timeMillis is null
and ${recordNameIdColumns.get(recordTable)[1]} = ?`)
and ${columnNames[1]} = ?`)
.run(recordName, user.userName, Date.now(), recordId);
database.close();
clearCacheByTableName(recordTable);

View File

@ -5,14 +5,12 @@ import { clearCacheByTableName } from '../helpers/functions.cache.js'
type RecordTable =
| 'BurialSiteStatuses'
| 'BurialSiteTypes'
| 'CommittalTypes'
| 'WorkOrderMilestoneTypes'
| 'WorkOrderTypes'
const recordNameIdColumns = new Map<RecordTable, string[]>([
['BurialSiteStatuses', ['burialSiteStatus', 'burialSiteStatusId']],
['BurialSiteTypes', ['burialSiteType', 'burialSiteTypeId']],
['CommittalTypes', ['committalType', 'committalTypeId']],
[
'WorkOrderMilestoneTypes',
@ -29,14 +27,20 @@ export function updateRecord(
): boolean {
const database = sqlite(sunriseDB)
const columnNames = recordNameIdColumns.get(recordTable)
if (columnNames === undefined) {
throw new Error(`Invalid record table: ${recordTable}`)
}
const result = database
.prepare(
`update ${recordTable}
set ${recordNameIdColumns.get(recordTable)![0]} = ?,
set ${columnNames[0]} = ?,
recordUpdate_userName = ?,
recordUpdate_timeMillis = ?
where recordDelete_timeMillis is null
and ${recordNameIdColumns.get(recordTable)![1]} = ?`
and ${columnNames[1]} = ?`
)
.run(recordName, user.userName, Date.now(), recordId)

View File

@ -1,5 +1,3 @@
import type { Request, Response } from 'express';
export default function handler(request: Request<unknown, unknown, {
burialSiteType: string;
orderNumber?: number | string;
}>, response: Response): void;
import { type AddBurialSiteTypeForm } from '../../database/addBurialSiteType.js';
export default function handler(request: Request<unknown, unknown, AddBurialSiteTypeForm>, response: Response): void;

View File

@ -1,7 +1,7 @@
import addRecord from '../../database/addRecord.js';
import addBurialSiteType from '../../database/addBurialSiteType.js';
import { getBurialSiteTypes } from '../../helpers/functions.cache.js';
export default function handler(request, response) {
const burialSiteTypeId = addRecord('BurialSiteTypes', request.body.burialSiteType, request.body.orderNumber ?? -1, request.session.user);
const burialSiteTypeId = addBurialSiteType(request.body, request.session.user);
const burialSiteTypes = getBurialSiteTypes();
response.json({
success: true,

View File

@ -1,20 +1,16 @@
import type { Request, Response } from 'express'
import addRecord from '../../database/addRecord.js'
import addBurialSiteType, {
type AddBurialSiteTypeForm
} from '../../database/addBurialSiteType.js'
import { getBurialSiteTypes } from '../../helpers/functions.cache.js'
export default function handler(
request: Request<
unknown,
unknown,
{ burialSiteType: string; orderNumber?: number | string }
>,
request: Request<unknown, unknown, AddBurialSiteTypeForm>,
response: Response
): void {
const burialSiteTypeId = addRecord(
'BurialSiteTypes',
request.body.burialSiteType,
request.body.orderNumber ?? -1,
const burialSiteTypeId = addBurialSiteType(
request.body,
request.session.user as User
)

View File

@ -1,4 +1,4 @@
import { backupDatabase } from '../../helpers/database.helpers.js';
import { backupDatabase } from '../../database/backupDatabase.js';
export default async function handler(_request, response) {
const backupDatabasePath = await backupDatabase();
if (typeof backupDatabasePath === 'string') {

View File

@ -1,6 +1,6 @@
import type { Request, Response } from 'express'
import { backupDatabase } from '../../helpers/database.helpers.js'
import { backupDatabase } from '../../database/backupDatabase.js'
export default async function handler(
_request: Request,
@ -15,11 +15,13 @@ export default async function handler(
response.json({
success: true,
fileName
})
} else {
response.json({
success: false,
errorMessage: 'Unable to write backup file.'
})
}

Some files were not shown because too many files have changed in this diff Show More