parent cemeteries, linting

pull/11/head
Dan Gowans 2025-04-11 14:50:00 -04:00
parent ed87174c19
commit 9bc85e6a8b
39 changed files with 385 additions and 362 deletions

View File

@ -2,6 +2,7 @@ export interface AddCemeteryForm {
cemeteryDescription: string;
cemeteryKey: string;
cemeteryName: string;
parentCemeteryId: string;
cemeteryLatitude: string;
cemeteryLongitude: string;
cemeterySvg: string;

View File

@ -9,10 +9,11 @@ export default async function addCemetery(addForm, user) {
cemeteryAddress1, cemeteryAddress2,
cemeteryCity, cemeteryProvince, cemeteryPostalCode,
cemeteryPhoneNumber,
parentCemeteryId,
recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
.run(addForm.cemeteryName, addForm.cemeteryKey, addForm.cemeteryDescription, addForm.cemeterySvg, addForm.cemeteryLatitude === '' ? undefined : addForm.cemeteryLatitude, addForm.cemeteryLongitude === '' ? undefined : addForm.cemeteryLongitude, addForm.cemeteryAddress1, addForm.cemeteryAddress2, addForm.cemeteryCity, addForm.cemeteryProvince, addForm.cemeteryPostalCode, addForm.cemeteryPhoneNumber, user.userName, rightNowMillis, user.userName, rightNowMillis);
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
.run(addForm.cemeteryName, addForm.cemeteryKey, addForm.cemeteryDescription, addForm.cemeterySvg, addForm.cemeteryLatitude === '' ? undefined : addForm.cemeteryLatitude, addForm.cemeteryLongitude === '' ? undefined : addForm.cemeteryLongitude, addForm.cemeteryAddress1, addForm.cemeteryAddress2, addForm.cemeteryCity, addForm.cemeteryProvince, addForm.cemeteryPostalCode, addForm.cemeteryPhoneNumber, addForm.parentCemeteryId === '' ? undefined : addForm.parentCemeteryId, user.userName, rightNowMillis, user.userName, rightNowMillis);
database.release();
return result.lastInsertRowid;
}

View File

@ -4,6 +4,7 @@ export interface AddCemeteryForm {
cemeteryDescription: string
cemeteryKey: string
cemeteryName: string
parentCemeteryId: string
cemeteryLatitude: string
cemeteryLongitude: string
@ -34,9 +35,10 @@ export default async function addCemetery(
cemeteryAddress1, cemeteryAddress2,
cemeteryCity, cemeteryProvince, cemeteryPostalCode,
cemeteryPhoneNumber,
parentCemeteryId,
recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
)
.run(
addForm.cemeteryName,
@ -51,6 +53,7 @@ export default async function addCemetery(
addForm.cemeteryProvince,
addForm.cemeteryPostalCode,
addForm.cemeteryPhoneNumber,
addForm.parentCemeteryId === '' ? undefined : addForm.parentCemeteryId,
user.userName,
rightNowMillis,
user.userName,

View File

@ -8,8 +8,8 @@ function buildWhereClause(filters) {
sqlWhereClause += burialSiteNameFilters.sqlWhereClause;
sqlParameters.push(...burialSiteNameFilters.sqlParameters);
if ((filters.cemeteryId ?? '') !== '') {
sqlWhereClause += ' and l.cemeteryId = ?';
sqlParameters.push(filters.cemeteryId);
sqlWhereClause += ' and (m.cemeteryId = ? or m.parentCemeteryId = ?)';
sqlParameters.push(filters.cemeteryId, filters.cemeteryId);
}
if ((filters.burialSiteTypeId ?? '') !== '') {
sqlWhereClause += ' and l.burialSiteTypeId = ?';
@ -47,6 +47,7 @@ export default async function getBurialSites(filters, options, connectedDatabase
count = database
.prepare(`select count(*) as recordCount
from BurialSites l
left join Cemeteries m on l.cemeteryId = m.cemeteryId
left join (
select burialSiteId, count(contractId) as contractCount from Contracts
where recordDelete_timeMillis is null

View File

@ -40,8 +40,8 @@ function buildWhereClause(filters: GetBurialSitesFilters): {
sqlParameters.push(...burialSiteNameFilters.sqlParameters)
if ((filters.cemeteryId ?? '') !== '') {
sqlWhereClause += ' and l.cemeteryId = ?'
sqlParameters.push(filters.cemeteryId)
sqlWhereClause += ' and (m.cemeteryId = ? or m.parentCemeteryId = ?)'
sqlParameters.push(filters.cemeteryId, filters.cemeteryId)
}
if ((filters.burialSiteTypeId ?? '') !== '') {
@ -94,6 +94,7 @@ export default async function getBurialSites(
.prepare(
`select count(*) as recordCount
from BurialSites l
left join Cemeteries m on l.cemeteryId = m.cemeteryId
left join (
select burialSiteId, count(contractId) as contractCount from Contracts
where recordDelete_timeMillis is null

View File

@ -6,14 +6,17 @@ export default async function getCemeteries() {
m.cemeteryLatitude, m.cemeteryLongitude, m.cemeterySvg,
m.cemeteryAddress1, m.cemeteryAddress2, m.cemeteryCity, m.cemeteryProvince, m.cemeteryPostalCode,
m.cemeteryPhoneNumber,
p.cemeteryId as parentCemeteryId, p.cemeteryName as parentCemeteryName,
count(b.burialSiteId) as burialSiteCount
from Cemeteries m
left join Cemeteries p on m.parentCemeteryId = p.cemeteryId and p.recordDelete_timeMillis is null
left join BurialSites b on m.cemeteryId = b.cemeteryId and b.recordDelete_timeMillis is null
where m.recordDelete_timeMillis is null
group by m.cemeteryId, m.cemeteryName, m.cemeteryDescription,
m.cemeteryLatitude, m.cemeteryLongitude, m.cemeterySvg,
m.cemeteryAddress1, m.cemeteryAddress2, m.cemeteryCity, m.cemeteryProvince, m.cemeteryPostalCode,
m.cemeteryPhoneNumber
m.cemeteryPhoneNumber,
p.cemeteryId, p.cemeteryName
order by m.cemeteryName, m.cemeteryId`)
.all();
database.release();

View File

@ -11,14 +11,17 @@ export default async function getCemeteries(): Promise<Cemetery[]> {
m.cemeteryLatitude, m.cemeteryLongitude, m.cemeterySvg,
m.cemeteryAddress1, m.cemeteryAddress2, m.cemeteryCity, m.cemeteryProvince, m.cemeteryPostalCode,
m.cemeteryPhoneNumber,
p.cemeteryId as parentCemeteryId, p.cemeteryName as parentCemeteryName,
count(b.burialSiteId) as burialSiteCount
from Cemeteries m
left join Cemeteries p on m.parentCemeteryId = p.cemeteryId and p.recordDelete_timeMillis is null
left join BurialSites b on m.cemeteryId = b.cemeteryId and b.recordDelete_timeMillis is null
where m.recordDelete_timeMillis is null
group by m.cemeteryId, m.cemeteryName, m.cemeteryDescription,
m.cemeteryLatitude, m.cemeteryLongitude, m.cemeterySvg,
m.cemeteryAddress1, m.cemeteryAddress2, m.cemeteryCity, m.cemeteryProvince, m.cemeteryPostalCode,
m.cemeteryPhoneNumber
m.cemeteryPhoneNumber,
p.cemeteryId, p.cemeteryName
order by m.cemeteryName, m.cemeteryId`
)
.all() as Cemetery[]

View File

@ -6,11 +6,13 @@ async function _getCemetery(keyColumn, cemeteryIdOrKey, connectedDatabase) {
m.cemeteryLatitude, m.cemeteryLongitude, m.cemeterySvg,
m.cemeteryAddress1, m.cemeteryAddress2, m.cemeteryCity, m.cemeteryProvince, m.cemeteryPostalCode,
m.cemeteryPhoneNumber,
p.cemeteryId as parentCemeteryId, p.cemeteryName as parentCemeteryName,
m.recordCreate_userName, m.recordCreate_timeMillis,
m.recordUpdate_userName, m.recordUpdate_timeMillis,
m.recordDelete_userName, m.recordDelete_timeMillis,
count(l.burialSiteId) as burialSiteCount
from Cemeteries m
left join Cemeteries p on m.parentCemeteryId = p.cemeteryId and p.recordDelete_timeMillis is null
left join BurialSites l on m.cemeteryId = l.cemeteryId and l.recordDelete_timeMillis is null
where m.${keyColumn} = ?
and m.recordDelete_timeMillis is null
@ -18,6 +20,7 @@ async function _getCemetery(keyColumn, cemeteryIdOrKey, connectedDatabase) {
m.cemeteryLatitude, m.cemeteryLongitude, m.cemeterySvg,
m.cemeteryAddress1, m.cemeteryAddress2, m.cemeteryCity, m.cemeteryProvince, m.cemeteryPostalCode,
m.cemeteryPhoneNumber,
p.cemeteryId, p.cemeteryName,
m.recordCreate_userName, m.recordCreate_timeMillis,
m.recordUpdate_userName, m.recordUpdate_timeMillis,
m.recordDelete_userName, m.recordDelete_timeMillis`)

View File

@ -17,11 +17,13 @@ async function _getCemetery(
m.cemeteryLatitude, m.cemeteryLongitude, m.cemeterySvg,
m.cemeteryAddress1, m.cemeteryAddress2, m.cemeteryCity, m.cemeteryProvince, m.cemeteryPostalCode,
m.cemeteryPhoneNumber,
p.cemeteryId as parentCemeteryId, p.cemeteryName as parentCemeteryName,
m.recordCreate_userName, m.recordCreate_timeMillis,
m.recordUpdate_userName, m.recordUpdate_timeMillis,
m.recordDelete_userName, m.recordDelete_timeMillis,
count(l.burialSiteId) as burialSiteCount
from Cemeteries m
left join Cemeteries p on m.parentCemeteryId = p.cemeteryId and p.recordDelete_timeMillis is null
left join BurialSites l on m.cemeteryId = l.cemeteryId and l.recordDelete_timeMillis is null
where m.${keyColumn} = ?
and m.recordDelete_timeMillis is null
@ -29,6 +31,7 @@ async function _getCemetery(
m.cemeteryLatitude, m.cemeteryLongitude, m.cemeterySvg,
m.cemeteryAddress1, m.cemeteryAddress2, m.cemeteryCity, m.cemeteryProvince, m.cemeteryPostalCode,
m.cemeteryPhoneNumber,
p.cemeteryId, p.cemeteryName,
m.recordCreate_userName, m.recordCreate_timeMillis,
m.recordUpdate_userName, m.recordUpdate_timeMillis,
m.recordDelete_userName, m.recordDelete_timeMillis`

View File

@ -1,6 +1,7 @@
import { dateIntegerToString, timeIntegerToPeriodString, timeIntegerToString } from '@cityssm/utils-datetime'
import type { PoolConnection } from 'better-sqlite-pool'
import { dateIntegerToString, timeIntegerToPeriodString, timeIntegerToString } from '@cityssm/utils-datetime'
import type { Contract } from '../types/recordTypes.js'
import getContractComments from './getContractComments.js'

View File

@ -1,9 +1,10 @@
import type { PoolConnection } from 'better-sqlite-pool'
import {
dateIntegerToString,
timeIntegerToPeriodString,
timeIntegerToString
} from '@cityssm/utils-datetime'
import type { PoolConnection } from 'better-sqlite-pool'
import type { ContractComment } from '../types/recordTypes.js'

View File

@ -1,7 +1,8 @@
import type { PoolConnection } from 'better-sqlite-pool'
import {
dateIntegerToString
} from '@cityssm/utils-datetime'
import type { PoolConnection } from 'better-sqlite-pool'
import type { ContractInterment } from '../types/recordTypes.js'

View File

@ -1,8 +1,9 @@
import type { PoolConnection } from 'better-sqlite-pool'
import {
dateIntegerToString,
timeIntegerToString
} from '@cityssm/utils-datetime'
import type { PoolConnection } from 'better-sqlite-pool'
import { getConfigProperty } from '../helpers/config.helpers.js'
import { getDynamicsGPDocument } from '../helpers/functions.dynamicsGP.js'

View File

@ -1,20 +1,20 @@
import { type DateString } from '@cityssm/utils-datetime';
import type { PoolConnection } from 'better-sqlite-pool';
import { type DateString } from '@cityssm/utils-datetime';
import type { Contract } from '../types/recordTypes.js';
export interface GetContractsFilters {
burialSiteId?: number | string;
contractTime?: '' | 'past' | 'current' | 'future';
contractTime?: '' | 'current' | 'future' | 'past';
contractStartDateString?: DateString;
contractEffectiveDateString?: string;
deceasedName?: string;
contractTypeId?: number | string;
cemeteryId?: number | string;
burialSiteNameSearchType?: '' | 'startsWith' | 'endsWith';
burialSiteName?: string;
burialSiteNameSearchType?: '' | 'startsWith' | 'endsWith';
burialSiteTypeId?: number | string;
funeralHomeId?: number | string;
workOrderId?: number | string;
notWorkOrderId?: number | string;
workOrderId?: number | string;
}
export interface GetContractsOptions {
/** -1 for no limit */

View File

@ -1,87 +1,11 @@
import { dateIntegerToString, dateStringToInteger, timeIntegerToString } from '@cityssm/utils-datetime';
import { getConfigProperty } from '../helpers/config.helpers.js';
import { getContractTypeById } from '../helpers/functions.cache.js';
import { getBurialSiteNameWhereClause, getContractTimeWhereClause, getDeceasedNameWhereClause, } from '../helpers/functions.sqlFilters.js';
import { getBurialSiteNameWhereClause, getContractTimeWhereClause, getDeceasedNameWhereClause } from '../helpers/functions.sqlFilters.js';
import getContractFees from './getContractFees.js';
import getContractInterments from './getContractInterments.js';
import getContractTransactions from './getContractTransactions.js';
import { acquireConnection } from './pool.js';
// eslint-disable-next-line complexity
function buildWhereClause(filters) {
let sqlWhereClause = ' where o.recordDelete_timeMillis is null';
const sqlParameters = [];
if ((filters.burialSiteId ?? '') !== '') {
sqlWhereClause += ' and o.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');
if (deceasedNameFilters.sqlParameters.length > 0) {
sqlWhereClause += ` and o.contractId in (
select contractId from ContractInterments o
where recordDelete_timeMillis is null
${deceasedNameFilters.sqlWhereClause})`;
sqlParameters.push(...deceasedNameFilters.sqlParameters);
}
if ((filters.contractTypeId ?? '') !== '') {
sqlWhereClause += ' and o.contractTypeId = ?';
sqlParameters.push(filters.contractTypeId);
}
const contractTimeFilters = getContractTimeWhereClause(filters.contractTime ?? '', 'o');
sqlWhereClause += contractTimeFilters.sqlWhereClause;
sqlParameters.push(...contractTimeFilters.sqlParameters);
if ((filters.contractStartDateString ?? '') !== '') {
sqlWhereClause += ' and o.contractStartDate = ?';
sqlParameters.push(dateStringToInteger(filters.contractStartDateString));
}
if ((filters.contractEffectiveDateString ?? '') !== '') {
sqlWhereClause += ` and (
o.contractEndDate is null
or (o.contractStartDate <= ? and o.contractEndDate >= ?)
)`;
sqlParameters.push(dateStringToInteger(filters.contractEffectiveDateString), dateStringToInteger(filters.contractEffectiveDateString));
}
if ((filters.cemeteryId ?? '') !== '') {
sqlWhereClause += ' and l.cemeteryId = ?';
sqlParameters.push(filters.cemeteryId);
}
if ((filters.burialSiteTypeId ?? '') !== '') {
sqlWhereClause += ' and l.burialSiteTypeId = ?';
sqlParameters.push(filters.burialSiteTypeId);
}
if ((filters.funeralHomeId ?? '') !== '') {
sqlWhereClause += ' and o.funeralHomeId = ?';
sqlParameters.push(filters.funeralHomeId);
}
if ((filters.workOrderId ?? '') !== '') {
sqlWhereClause +=
' and o.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 = ?)';
sqlParameters.push(filters.notWorkOrderId);
}
return {
sqlWhereClause,
sqlParameters
};
}
async function addInclusions(contract, options, database) {
if (options.includeFees) {
contract.contractFees = await getContractFees(contract.contractId, database);
}
if (options.includeTransactions) {
contract.contractTransactions = await getContractTransactions(contract.contractId, { includeIntegrations: false }, database);
}
if (options.includeInterments) {
contract.contractInterments = await getContractInterments(contract.contractId, database);
}
return contract;
}
export default async function getContracts(filters, options, connectedDatabase) {
const database = connectedDatabase ?? (await acquireConnection());
database.function('userFn_dateIntegerToString', dateIntegerToString);
@ -96,6 +20,7 @@ export default async function getContracts(filters, options, connectedDatabase)
.prepare(`select count(*) as recordCount
from Contracts o
left join BurialSites l on o.burialSiteId = l.burialSiteId
left join Cemeteries m on l.cemeteryId = m.cemeteryId
${sqlWhereClause}`)
.get(sqlParameters).recordCount;
}
@ -154,3 +79,79 @@ export default async function getContracts(filters, options, connectedDatabase)
contracts
};
}
async function addInclusions(contract, options, database) {
if (options.includeFees) {
contract.contractFees = await getContractFees(contract.contractId, database);
}
if (options.includeTransactions) {
contract.contractTransactions = await getContractTransactions(contract.contractId, { includeIntegrations: false }, database);
}
if (options.includeInterments) {
contract.contractInterments = await getContractInterments(contract.contractId, database);
}
return contract;
}
// eslint-disable-next-line complexity
function buildWhereClause(filters) {
let sqlWhereClause = ' where o.recordDelete_timeMillis is null';
const sqlParameters = [];
if ((filters.burialSiteId ?? '') !== '') {
sqlWhereClause += ' and o.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');
if (deceasedNameFilters.sqlParameters.length > 0) {
sqlWhereClause += ` and o.contractId in (
select contractId from ContractInterments o
where recordDelete_timeMillis is null
${deceasedNameFilters.sqlWhereClause})`;
sqlParameters.push(...deceasedNameFilters.sqlParameters);
}
if ((filters.contractTypeId ?? '') !== '') {
sqlWhereClause += ' and o.contractTypeId = ?';
sqlParameters.push(filters.contractTypeId);
}
const contractTimeFilters = getContractTimeWhereClause(filters.contractTime ?? '', 'o');
sqlWhereClause += contractTimeFilters.sqlWhereClause;
sqlParameters.push(...contractTimeFilters.sqlParameters);
if ((filters.contractStartDateString ?? '') !== '') {
sqlWhereClause += ' and o.contractStartDate = ?';
sqlParameters.push(dateStringToInteger(filters.contractStartDateString));
}
if ((filters.contractEffectiveDateString ?? '') !== '') {
sqlWhereClause += ` and (
o.contractEndDate is null
or (o.contractStartDate <= ? and o.contractEndDate >= ?)
)`;
sqlParameters.push(dateStringToInteger(filters.contractEffectiveDateString), dateStringToInteger(filters.contractEffectiveDateString));
}
if ((filters.cemeteryId ?? '') !== '') {
sqlWhereClause += ' and (m.cemeteryId = ? or m.parentCemeteryId = ?)';
sqlParameters.push(filters.cemeteryId, filters.cemeteryId);
}
if ((filters.burialSiteTypeId ?? '') !== '') {
sqlWhereClause += ' and l.burialSiteTypeId = ?';
sqlParameters.push(filters.burialSiteTypeId);
}
if ((filters.funeralHomeId ?? '') !== '') {
sqlWhereClause += ' and o.funeralHomeId = ?';
sqlParameters.push(filters.funeralHomeId);
}
if ((filters.workOrderId ?? '') !== '') {
sqlWhereClause +=
' and o.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 = ?)';
sqlParameters.push(filters.notWorkOrderId);
}
return {
sqlWhereClause,
sqlParameters
};
}

View File

@ -1,17 +1,18 @@
import type { PoolConnection } from 'better-sqlite-pool'
import {
type DateString,
dateIntegerToString,
dateStringToInteger,
timeIntegerToString
} from '@cityssm/utils-datetime'
import type { PoolConnection } from 'better-sqlite-pool'
import { getConfigProperty } from '../helpers/config.helpers.js'
import { getContractTypeById } from '../helpers/functions.cache.js'
import {
getBurialSiteNameWhereClause,
getContractTimeWhereClause,
getDeceasedNameWhereClause,
getDeceasedNameWhereClause
} from '../helpers/functions.sqlFilters.js'
import type { Contract } from '../types/recordTypes.js'
@ -22,18 +23,23 @@ import { acquireConnection } from './pool.js'
export interface GetContractsFilters {
burialSiteId?: number | string
contractTime?: '' | 'past' | 'current' | 'future'
contractTime?: '' | 'current' | 'future' | 'past'
contractStartDateString?: DateString
contractEffectiveDateString?: string
deceasedName?: string
contractTypeId?: number | string
cemeteryId?: number | string
burialSiteNameSearchType?: '' | 'startsWith' | 'endsWith'
burialSiteName?: string
burialSiteNameSearchType?: '' | 'startsWith' | 'endsWith'
burialSiteTypeId?: number | string
funeralHomeId?: number | string
workOrderId?: number | string
notWorkOrderId?: number | string
workOrderId?: number | string
}
export interface GetContractsOptions {
@ -45,129 +51,6 @@ export interface GetContractsOptions {
includeTransactions: boolean
}
// eslint-disable-next-line complexity
function buildWhereClause(filters: GetContractsFilters): {
sqlWhereClause: string
sqlParameters: unknown[]
} {
let sqlWhereClause = ' where o.recordDelete_timeMillis is null'
const sqlParameters: unknown[] = []
if ((filters.burialSiteId ?? '') !== '') {
sqlWhereClause += ' and o.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'
)
if (deceasedNameFilters.sqlParameters.length > 0) {
sqlWhereClause += ` and o.contractId in (
select contractId from ContractInterments o
where recordDelete_timeMillis is null
${deceasedNameFilters.sqlWhereClause})`
sqlParameters.push(...deceasedNameFilters.sqlParameters)
}
if ((filters.contractTypeId ?? '') !== '') {
sqlWhereClause += ' and o.contractTypeId = ?'
sqlParameters.push(filters.contractTypeId)
}
const contractTimeFilters = getContractTimeWhereClause(
filters.contractTime ?? '',
'o'
)
sqlWhereClause += contractTimeFilters.sqlWhereClause
sqlParameters.push(...contractTimeFilters.sqlParameters)
if ((filters.contractStartDateString ?? '') !== '') {
sqlWhereClause += ' and o.contractStartDate = ?'
sqlParameters.push(
dateStringToInteger(filters.contractStartDateString as DateString)
)
}
if ((filters.contractEffectiveDateString ?? '') !== '') {
sqlWhereClause += ` and (
o.contractEndDate is null
or (o.contractStartDate <= ? and o.contractEndDate >= ?)
)`
sqlParameters.push(
dateStringToInteger(filters.contractEffectiveDateString as DateString),
dateStringToInteger(filters.contractEffectiveDateString as DateString)
)
}
if ((filters.cemeteryId ?? '') !== '') {
sqlWhereClause += ' and l.cemeteryId = ?'
sqlParameters.push(filters.cemeteryId)
}
if ((filters.burialSiteTypeId ?? '') !== '') {
sqlWhereClause += ' and l.burialSiteTypeId = ?'
sqlParameters.push(filters.burialSiteTypeId)
}
if ((filters.funeralHomeId ?? '') !== '') {
sqlWhereClause += ' and o.funeralHomeId = ?'
sqlParameters.push(filters.funeralHomeId)
}
if ((filters.workOrderId ?? '') !== '') {
sqlWhereClause +=
' and o.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 = ?)'
sqlParameters.push(filters.notWorkOrderId)
}
return {
sqlWhereClause,
sqlParameters
}
}
async function addInclusions(
contract: Contract,
options: GetContractsOptions,
database: PoolConnection
): Promise<Contract> {
if (options.includeFees) {
contract.contractFees = await getContractFees(contract.contractId, database)
}
if (options.includeTransactions) {
contract.contractTransactions = await getContractTransactions(
contract.contractId,
{ includeIntegrations: false },
database
)
}
if (options.includeInterments) {
contract.contractInterments = await getContractInterments(
contract.contractId,
database
)
}
return contract
}
export default async function getContracts(
filters: GetContractsFilters,
options: GetContractsOptions,
@ -194,6 +77,7 @@ export default async function getContracts(
`select count(*) as recordCount
from Contracts o
left join BurialSites l on o.burialSiteId = l.burialSiteId
left join Cemeteries m on l.cemeteryId = m.cemeteryId
${sqlWhereClause}`
)
.get(sqlParameters) as { recordCount: number }
@ -268,3 +152,126 @@ export default async function getContracts(
contracts
}
}
async function addInclusions(
contract: Contract,
options: GetContractsOptions,
database: PoolConnection
): Promise<Contract> {
if (options.includeFees) {
contract.contractFees = await getContractFees(contract.contractId, database)
}
if (options.includeTransactions) {
contract.contractTransactions = await getContractTransactions(
contract.contractId,
{ includeIntegrations: false },
database
)
}
if (options.includeInterments) {
contract.contractInterments = await getContractInterments(
contract.contractId,
database
)
}
return contract
}
// eslint-disable-next-line complexity
function buildWhereClause(filters: GetContractsFilters): {
sqlWhereClause: string
sqlParameters: unknown[]
} {
let sqlWhereClause = ' where o.recordDelete_timeMillis is null'
const sqlParameters: unknown[] = []
if ((filters.burialSiteId ?? '') !== '') {
sqlWhereClause += ' and o.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'
)
if (deceasedNameFilters.sqlParameters.length > 0) {
sqlWhereClause += ` and o.contractId in (
select contractId from ContractInterments o
where recordDelete_timeMillis is null
${deceasedNameFilters.sqlWhereClause})`
sqlParameters.push(...deceasedNameFilters.sqlParameters)
}
if ((filters.contractTypeId ?? '') !== '') {
sqlWhereClause += ' and o.contractTypeId = ?'
sqlParameters.push(filters.contractTypeId)
}
const contractTimeFilters = getContractTimeWhereClause(
filters.contractTime ?? '',
'o'
)
sqlWhereClause += contractTimeFilters.sqlWhereClause
sqlParameters.push(...contractTimeFilters.sqlParameters)
if ((filters.contractStartDateString ?? '') !== '') {
sqlWhereClause += ' and o.contractStartDate = ?'
sqlParameters.push(
dateStringToInteger(filters.contractStartDateString as DateString)
)
}
if ((filters.contractEffectiveDateString ?? '') !== '') {
sqlWhereClause += ` and (
o.contractEndDate is null
or (o.contractStartDate <= ? and o.contractEndDate >= ?)
)`
sqlParameters.push(
dateStringToInteger(filters.contractEffectiveDateString as DateString),
dateStringToInteger(filters.contractEffectiveDateString as DateString)
)
}
if ((filters.cemeteryId ?? '') !== '') {
sqlWhereClause += ' and (m.cemeteryId = ? or m.parentCemeteryId = ?)'
sqlParameters.push(filters.cemeteryId, filters.cemeteryId)
}
if ((filters.burialSiteTypeId ?? '') !== '') {
sqlWhereClause += ' and l.burialSiteTypeId = ?'
sqlParameters.push(filters.burialSiteTypeId)
}
if ((filters.funeralHomeId ?? '') !== '') {
sqlWhereClause += ' and o.funeralHomeId = ?'
sqlParameters.push(filters.funeralHomeId)
}
if ((filters.workOrderId ?? '') !== '') {
sqlWhereClause +=
' and o.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 = ?)'
sqlParameters.push(filters.notWorkOrderId)
}
return {
sqlWhereClause,
sqlParameters
}
}

View File

@ -1,8 +1,8 @@
import type { PoolConnection } from 'better-sqlite-pool';
import type { FeeCategory } from '../types/recordTypes.js';
interface GetFeeCategoriesFilters {
contractTypeId?: number | string;
burialSiteTypeId?: number | string;
contractTypeId?: number | string;
feeCategoryId?: number | string;
}
interface GetFeeCategoriesOptions {

View File

@ -7,8 +7,8 @@ import { acquireConnection } from './pool.js'
import { updateRecordOrderNumber } from './updateRecordOrderNumber.js'
interface GetFeeCategoriesFilters {
contractTypeId?: number | string
burialSiteTypeId?: number | string
contractTypeId?: number | string
feeCategoryId?: number | string
}

View File

@ -1,4 +1,10 @@
import { acquireConnection } from './pool.js';
export default async function getFuneralHome(funeralHomeId) {
return await _getFuneralHome('funeralHomeId', funeralHomeId);
}
export async function getFuneralHomeByKey(funeralHomeKey) {
return await _getFuneralHome('funeralHomeKey', funeralHomeKey);
}
async function _getFuneralHome(keyColumn, funeralHomeIdOrKey) {
const database = await acquireConnection();
const funeralHome = database
@ -13,9 +19,3 @@ async function _getFuneralHome(keyColumn, funeralHomeIdOrKey) {
database.release();
return funeralHome;
}
export default async function getFuneralHome(funeralHomeId) {
return await _getFuneralHome('funeralHomeId', funeralHomeId);
}
export async function getFuneralHomeByKey(funeralHomeKey) {
return await _getFuneralHome('funeralHomeKey', funeralHomeKey);
}

View File

@ -2,6 +2,18 @@ import type { Cemetery, FuneralHome } from '../types/recordTypes.js'
import { acquireConnection } from './pool.js'
export default async function getFuneralHome(
funeralHomeId: number | string
): Promise<FuneralHome | undefined> {
return await _getFuneralHome('funeralHomeId', funeralHomeId)
}
export async function getFuneralHomeByKey(
funeralHomeKey: string
): Promise<FuneralHome | undefined> {
return await _getFuneralHome('funeralHomeKey', funeralHomeKey)
}
async function _getFuneralHome(
keyColumn: 'funeralHomeId' | 'funeralHomeKey',
funeralHomeIdOrKey: number | string
@ -24,15 +36,3 @@ async function _getFuneralHome(
return funeralHome
}
export default async function getFuneralHome(
funeralHomeId: number | string
): Promise<FuneralHome | undefined> {
return await _getFuneralHome('funeralHomeId', funeralHomeId)
}
export async function getFuneralHomeByKey(
funeralHomeKey: string
): Promise<FuneralHome | undefined> {
return await _getFuneralHome('funeralHomeKey', funeralHomeKey)
}

View File

@ -71,7 +71,9 @@ const createStatements = [
cemeteryProvince varchar(2),
cemeteryPostalCode varchar(7),
cemeteryPhoneNumber varchar(30),
${recordColumns})`,
parentCemeteryId integer,
${recordColumns},
foreign key (parentCemeteryId) references Cemeteries (cemeteryId))`,
/*
* Burial Sites
*/

View File

@ -86,7 +86,9 @@ const createStatements = [
cemeteryProvince varchar(2),
cemeteryPostalCode varchar(7),
cemeteryPhoneNumber varchar(30),
${recordColumns})`,
parentCemeteryId integer,
${recordColumns},
foreign key (parentCemeteryId) references Cemeteries (cemeteryId))`,
/*
* Burial Sites

View File

@ -3,6 +3,7 @@ export interface UpdateCemeteryForm {
cemeteryDescription: string;
cemeteryKey: string;
cemeteryName: string;
parentCemeteryId: string;
cemeteryAddress1: string;
cemeteryAddress2: string;
cemeteryCity: string;
@ -13,7 +14,4 @@ export interface UpdateCemeteryForm {
cemeteryLongitude: string;
cemeterySvg: string;
}
export default function updateCemetery(updateForm: UpdateCemeteryForm, user: User): Promise<{
doRebuildBurialSiteNames: boolean;
success: boolean;
}>;
export default function updateCemetery(updateForm: UpdateCemeteryForm, user: User): Promise<boolean>;

View File

@ -1,6 +1,3 @@
import { buildBurialSiteName } from '../helpers/burialSites.helpers.js';
import { getConfigProperty } from '../helpers/config.helpers.js';
import getBurialSites from './getBurialSites.js';
import { acquireConnection } from './pool.js';
export default async function updateCemetery(updateForm, user) {
const database = await acquireConnection();
@ -18,6 +15,7 @@ export default async function updateCemetery(updateForm, user) {
cemeteryProvince = ?,
cemeteryPostalCode = ?,
cemeteryPhoneNumber = ?,
parentCemeteryId = ?,
recordUpdate_userName = ?,
recordUpdate_timeMillis = ?
where cemeteryId = ?
@ -26,27 +24,9 @@ export default async function updateCemetery(updateForm, user) {
? undefined
: updateForm.cemeteryLatitude, updateForm.cemeteryLongitude === ''
? undefined
: updateForm.cemeteryLongitude, updateForm.cemeteryAddress1, updateForm.cemeteryAddress2, updateForm.cemeteryCity, updateForm.cemeteryProvince, updateForm.cemeteryPostalCode, updateForm.cemeteryPhoneNumber, user.userName, Date.now(), updateForm.cemeteryId);
/*
* Check if burial site names need to be updated
*/
let doRebuildBurialSiteNames = false;
if (getConfigProperty('settings.burialSites.burialSiteNameSegments.includeCemeteryKey')) {
const burialSites = await getBurialSites({ cemeteryId: updateForm.cemeteryId }, { limit: 1, offset: 0 }, database);
if (burialSites.count > 0 &&
buildBurialSiteName(updateForm.cemeteryKey, {
burialSiteNameSegment1: burialSites.burialSites[0].burialSiteNameSegment1,
burialSiteNameSegment2: burialSites.burialSites[0].burialSiteNameSegment2,
burialSiteNameSegment3: burialSites.burialSites[0].burialSiteNameSegment3,
burialSiteNameSegment4: burialSites.burialSites[0].burialSiteNameSegment4,
burialSiteNameSegment5: burialSites.burialSites[0].burialSiteNameSegment5
}) !== burialSites.burialSites[0].burialSiteName) {
doRebuildBurialSiteNames = true;
}
}
: updateForm.cemeteryLongitude, updateForm.cemeteryAddress1, updateForm.cemeteryAddress2, updateForm.cemeteryCity, updateForm.cemeteryProvince, updateForm.cemeteryPostalCode, updateForm.cemeteryPhoneNumber, updateForm.parentCemeteryId === ''
? undefined
: updateForm.parentCemeteryId, user.userName, Date.now(), updateForm.cemeteryId);
database.release();
return {
doRebuildBurialSiteNames,
success: result.changes > 0
};
return result.changes > 0;
}

View File

@ -1,7 +1,3 @@
import { buildBurialSiteName } from '../helpers/burialSites.helpers.js'
import { getConfigProperty } from '../helpers/config.helpers.js'
import getBurialSites from './getBurialSites.js'
import { acquireConnection } from './pool.js'
export interface UpdateCemeteryForm {
@ -10,6 +6,7 @@ export interface UpdateCemeteryForm {
cemeteryDescription: string
cemeteryKey: string
cemeteryName: string
parentCemeteryId: string
cemeteryAddress1: string
cemeteryAddress2: string
@ -27,7 +24,7 @@ export interface UpdateCemeteryForm {
export default async function updateCemetery(
updateForm: UpdateCemeteryForm,
user: User
): Promise<{ doRebuildBurialSiteNames: boolean; success: boolean; }> {
): Promise<boolean> {
const database = await acquireConnection()
const result = database
@ -45,6 +42,7 @@ export default async function updateCemetery(
cemeteryProvince = ?,
cemeteryPostalCode = ?,
cemeteryPhoneNumber = ?,
parentCemeteryId = ?,
recordUpdate_userName = ?,
recordUpdate_timeMillis = ?
where cemeteryId = ?
@ -67,51 +65,15 @@ export default async function updateCemetery(
updateForm.cemeteryProvince,
updateForm.cemeteryPostalCode,
updateForm.cemeteryPhoneNumber,
updateForm.parentCemeteryId === ''
? undefined
: updateForm.parentCemeteryId,
user.userName,
Date.now(),
updateForm.cemeteryId
)
/*
* Check if burial site names need to be updated
*/
let doRebuildBurialSiteNames = false
if (
getConfigProperty(
'settings.burialSites.burialSiteNameSegments.includeCemeteryKey'
)
) {
const burialSites = await getBurialSites(
{ cemeteryId: updateForm.cemeteryId },
{ limit: 1, offset: 0 },
database
)
if (
burialSites.count > 0 &&
buildBurialSiteName(updateForm.cemeteryKey, {
burialSiteNameSegment1:
burialSites.burialSites[0].burialSiteNameSegment1,
burialSiteNameSegment2:
burialSites.burialSites[0].burialSiteNameSegment2,
burialSiteNameSegment3:
burialSites.burialSites[0].burialSiteNameSegment3,
burialSiteNameSegment4:
burialSites.burialSites[0].burialSiteNameSegment4,
burialSiteNameSegment5:
burialSites.burialSites[0].burialSiteNameSegment5
}) !== burialSites.burialSites[0].burialSiteName
) {
doRebuildBurialSiteNames = true
}
}
database.release()
return {
doRebuildBurialSiteNames,
success: result.changes > 0
}
return result.changes > 0
}

View File

@ -1,5 +1,6 @@
import getBurialSiteStatusSummary from '../../database/getBurialSiteStatusSummary.js';
import getBurialSiteTypeSummary from '../../database/getBurialSiteTypeSummary.js';
import getCemeteries from '../../database/getCemeteries.js';
import getCemetery from '../../database/getCemetery.js';
import { getConfigProperty } from '../../helpers/config.helpers.js';
import { getCemeterySVGs } from '../../helpers/images.helpers.js';
@ -9,6 +10,7 @@ export default async function handler(request, response) {
response.redirect(`${getConfigProperty('reverseProxy.urlPrefix')}/cemeteries/?error=cemeteryIdNotFound`);
return;
}
const cemeteries = await getCemeteries();
const cemeterySVGs = await getCemeterySVGs();
const burialSiteTypeSummary = await getBurialSiteTypeSummary({
cemeteryId: cemetery.cemeteryId
@ -22,6 +24,7 @@ export default async function handler(request, response) {
cemeterySVGs,
isCreate: false,
burialSiteStatusSummary,
burialSiteTypeSummary
burialSiteTypeSummary,
cemeteries
});
}

View File

@ -2,6 +2,7 @@ import type { Request, Response } from 'express'
import getBurialSiteStatusSummary from '../../database/getBurialSiteStatusSummary.js'
import getBurialSiteTypeSummary from '../../database/getBurialSiteTypeSummary.js'
import getCemeteries from '../../database/getCemeteries.js'
import getCemetery from '../../database/getCemetery.js'
import { getConfigProperty } from '../../helpers/config.helpers.js'
import { getCemeterySVGs } from '../../helpers/images.helpers.js'
@ -19,6 +20,8 @@ export default async function handler(
return
}
const cemeteries = await getCemeteries()
const cemeterySVGs = await getCemeterySVGs()
const burialSiteTypeSummary = await getBurialSiteTypeSummary({
@ -37,6 +40,7 @@ export default async function handler(
isCreate: false,
burialSiteStatusSummary,
burialSiteTypeSummary
burialSiteTypeSummary,
cemeteries
})
}

View File

@ -2,13 +2,12 @@ import rebuildBurialSiteNames from '../../database/rebuildBurialSiteNames.js';
import updateCemetery from '../../database/updateCemetery.js';
import { clearNextPreviousBurialSiteIdCache } from '../../helpers/burialSites.helpers.js';
export default async function handler(request, response) {
const result = await updateCemetery(request.body, request.session.user);
const success = await updateCemetery(request.body, request.session.user);
response.json({
success: result.success,
cemeteryId: request.body.cemeteryId,
doRebuildBurialSiteNames: result.doRebuildBurialSiteNames
success,
cemeteryId: request.body.cemeteryId
});
if (result.doRebuildBurialSiteNames) {
if (success) {
response.on('finish', () => {
void rebuildBurialSiteNames(request.body.cemeteryId, request.session.user);
clearNextPreviousBurialSiteIdCache();

View File

@ -10,19 +10,18 @@ export default async function handler(
request: Request<unknown, unknown, UpdateCemeteryForm>,
response: Response
): Promise<void> {
const result = await updateCemetery(
const success = await updateCemetery(
request.body,
request.session.user as User
)
response.json({
success: result.success,
success,
cemeteryId: request.body.cemeteryId,
doRebuildBurialSiteNames: result.doRebuildBurialSiteNames
cemeteryId: request.body.cemeteryId
})
if (result.doRebuildBurialSiteNames) {
if (success) {
response.on('finish', () => {
void rebuildBurialSiteNames(
request.body.cemeteryId,

View File

@ -45,20 +45,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
globalThis.location.href = sunrise.getCemeteryURL(responseJSON.cemeteryId, true);
}
else {
if (responseJSON.doRebuildBurialSiteNames ?? false) {
bulmaJS.alert({
message: `<strong>Cemetery Updated Successfully</strong><br />
Note that rebuilding burial site names may take a few minutes.`,
messageIsHtml: true,
contextualColorName: 'warning'
});
}
else {
bulmaJS.alert({
message: 'Cemetery Updated Successfully',
contextualColorName: 'success'
});
}
bulmaJS.alert({
message: 'Cemetery Updated Successfully',
contextualColorName: 'success'
});
}
}
else {

View File

@ -71,7 +71,6 @@ declare const exports: Record<string, unknown>
const responseJSON = rawResponseJSON as {
success: boolean
cemeteryId?: number
doRebuildBurialSiteNames?: boolean
errorMessage?: string
}
@ -84,20 +83,10 @@ declare const exports: Record<string, unknown>
true
)
} else {
if (responseJSON.doRebuildBurialSiteNames ?? false) {
bulmaJS.alert({
message: `<strong>Cemetery Updated Successfully</strong><br />
Note that rebuilding burial site names may take a few minutes.`,
messageIsHtml: true,
contextualColorName: 'warning'
})
} else {
bulmaJS.alert({
message: 'Cemetery Updated Successfully',
contextualColorName: 'success'
})
}
bulmaJS.alert({
message: 'Cemetery Updated Successfully',
contextualColorName: 'success'
})
}
} else {
bulmaJS.alert({

View File

@ -42,6 +42,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
${cityssm.escapeHTML(cemetery.cemeteryName === ''
? '(No Name)'
: cemetery.cemeteryName)}
${cemetery.cemeteryName === ''
? `<span class="icon is-small has-text-danger">
<i class="fas fa-exclamation-triangle" aria-hidden="true"></i>
</span>`
: ''}
</a><br />
<span class="is-size-7">
${cityssm.escapeHTML(cemetery.cemeteryDescription)}
@ -62,6 +67,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
: ''}
</td><td>
${cityssm.escapeHTML(cemetery.cemeteryPhoneNumber)}
</td><td class="has-text-centered">
${cemetery.parentCemeteryId === null
? ''
: `<span data-tooltip="Parent: ${cemetery.parentCemeteryName ?? '(No Name)'}">
<i class="fas fa-turn-up" role="img" aria-label="Parent: ${cemetery.parentCemeteryName ?? '(No Name)'}"></i>
</span>`}
</td><td class="has-text-centered">
${cemetery.cemeteryLatitude && cemetery.cemeteryLongitude
? `<span data-tooltip="Has Geographic Coordinates">
@ -92,6 +103,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
<th>Key</th>
<th>Address</th>
<th>Phone Number</th>
<th class="has-text-centered">Parent</th>
<th class="has-text-centered">Coordinates</th>
<th class="has-text-centered">Image</th>
<th class="has-text-right">Burial Site Count</th>

View File

@ -71,6 +71,13 @@ declare const exports: Record<string, unknown>
? '(No Name)'
: cemetery.cemeteryName
)}
${
cemetery.cemeteryName === ''
? `<span class="icon is-small has-text-danger">
<i class="fas fa-exclamation-triangle" aria-hidden="true"></i>
</span>`
: ''
}
</a><br />
<span class="is-size-7">
${cityssm.escapeHTML(cemetery.cemeteryDescription)}
@ -97,6 +104,14 @@ declare const exports: Record<string, unknown>
}
</td><td>
${cityssm.escapeHTML(cemetery.cemeteryPhoneNumber)}
</td><td class="has-text-centered">
${
cemetery.parentCemeteryId === null
? ''
: `<span data-tooltip="Parent: ${cemetery.parentCemeteryName ?? '(No Name)'}">
<i class="fas fa-turn-up" role="img" aria-label="Parent: ${cemetery.parentCemeteryName ?? '(No Name)'}"></i>
</span>`
}
</td><td class="has-text-centered">
${
cemetery.cemeteryLatitude && cemetery.cemeteryLongitude
@ -135,6 +150,7 @@ declare const exports: Record<string, unknown>
<th>Key</th>
<th>Address</th>
<th>Phone Number</th>
<th class="has-text-centered">Parent</th>
<th class="has-text-centered">Coordinates</th>
<th class="has-text-centered">Image</th>
<th class="has-text-right">Burial Site Count</th>

View File

@ -44,7 +44,8 @@ export async function getCemeteryIdByKey(cemeteryKeyToSearch, user) {
cemeteryCity: 'Sault Ste. Marie',
cemeteryPostalCode: '',
cemeteryProvince: 'ON',
cemeteryPhoneNumber: ''
cemeteryPhoneNumber: '',
parentCemeteryId: '',
}, user);
cemeteryCache.set(cemeteryKey, cemeteryId);
}

View File

@ -62,7 +62,8 @@ export async function getCemeteryIdByKey(
cemeteryPostalCode: '',
cemeteryProvince: 'ON',
cemeteryPhoneNumber: ''
cemeteryPhoneNumber: '',
parentCemeteryId: '',
},
user
)

View File

@ -67,6 +67,8 @@ export interface Cemetery extends Record {
cemeteryDescription: string;
cemeteryKey: string;
cemeteryName: string;
parentCemeteryId?: number | null;
parentCemeteryName?: string | null;
cemeteryLatitude?: number;
cemeteryLongitude?: number;
cemeterySvg?: string;

View File

@ -94,6 +94,9 @@ export interface Cemetery extends Record {
cemeteryKey: string
cemeteryName: string
parentCemeteryId?: number | null
parentCemeteryName?: string | null
cemeteryLatitude?: number
cemeteryLongitude?: number
cemeterySvg?: string

View File

@ -127,6 +127,27 @@
<textarea class="textarea" id="cemetery--cemeteryDescription" name="cemeteryDescription"><%= cemetery.cemeteryDescription %></textarea>
</div>
</div>
<div class="field">
<label class="label" for="cemetery--parentCemeteryId">Parent Cemetery</label>
<div class="control">
<div class="select is-fullwidth">
<select id="cemetery--parentCemeteryId" name="parentCemeteryId">
<option value="">(No Parent Cemetery)</option>
<% for (const parentCemetery of cemeteries) { %>
<%
if (parentCemetery.cemeteryId === cemetery.cemeteryId || parentCemetery.parentCemeteryId !== null) {
// Skip the current cemetery and any cemeteries that are already a parent
continue;
}
%>
<option value="<%= parentCemetery.cemeteryId %>" <%= (cemetery.parentCemeteryId === parentCemetery.cemeteryId) ? " selected" : "" %>>
<%= parentCemetery.cemeteryName === '' ? '(No Name)' : parentCemetery.cemeteryName %>
</option>
<% } %>
</select>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -89,6 +89,14 @@
<%= cemetery.cemeteryPhoneNumber %>
</div>
<% } %>
<% if (cemetery.parentCemeteryId !== null) { %>
<div class="column">
<strong>Parent Cemetery</strong><br />
<a href="<%= urlPrefix %>/cemeteries/<%= cemetery.parentCemeteryId %>">
<%= (cemetery.parentCemeteryName ?? '') === '' ? "(No Name)" : cemetery.parentCemeteryName %>
</a>
</div>
<% } %>
</div>
</div>
</div>