add "direction of arrival"

database update:

create table if not exists CemeteryDirectionsOfArrival (
cemeteryId integer not null,
directionOfArrival varchar(2) not null,
directionOfArrivalDescription varchar(100) not null,
primary key (cemeteryId, directionOfArrival),
foreign key (cemeteryId) references Cemeteries (cemeteryId)) without rowid

alter table Contracts
add directionOfArrival varchar(2)
pull/11/head
Dan Gowans 2025-04-28 11:59:09 -04:00
parent 96a41862bf
commit 556a6a71b6
42 changed files with 677 additions and 103 deletions

2
data/dataLists.d.ts vendored
View File

@ -1,7 +1,9 @@
export declare const deathAgePeriods: readonly ["Years", "Months", "Days", "Stillborn"];
export declare const purchaserRelationships: readonly ["Spouse", "Husband", "Wife", "Child", "Parent", "Sibling", "Friend", "Self"];
export declare const directionsOfArrival: readonly ["N", "NE", "E", "SE", "S", "SW", "W", "NW"];
declare const _default: {
deathAgePeriods: readonly ["Years", "Months", "Days", "Stillborn"];
directionsOfArrival: readonly ["N", "NE", "E", "SE", "S", "SW", "W", "NW"];
purchaserRelationships: readonly ["Spouse", "Husband", "Wife", "Child", "Parent", "Sibling", "Friend", "Self"];
};
export default _default;

View File

@ -1,9 +1,4 @@
export const deathAgePeriods = [
'Years',
'Months',
'Days',
'Stillborn'
];
export const deathAgePeriods = ['Years', 'Months', 'Days', 'Stillborn'];
export const purchaserRelationships = [
'Spouse',
'Husband',
@ -14,7 +9,18 @@ export const purchaserRelationships = [
'Friend',
'Self'
];
export const directionsOfArrival = [
'N',
'NE',
'E',
'SE',
'S',
'SW',
'W',
'NW'
];
export default {
deathAgePeriods,
directionsOfArrival,
purchaserRelationships
};

View File

@ -1,9 +1,4 @@
export const deathAgePeriods = [
'Years',
'Months',
'Days',
'Stillborn'
] as const
export const deathAgePeriods = ['Years', 'Months', 'Days', 'Stillborn'] as const
export const purchaserRelationships = [
'Spouse',
@ -16,7 +11,19 @@ export const purchaserRelationships = [
'Self'
] as const
export const directionsOfArrival = [
'N',
'NE',
'E',
'SE',
'S',
'SW',
'W',
'NW'
] as const
export default {
deathAgePeriods,
directionsOfArrival,
purchaserRelationships
}

View File

@ -8,6 +8,7 @@ export interface AddContractForm {
[fieldValue_contractTypeFieldId: `fieldValue_${string}`]: unknown;
contractTypeFieldIds?: string;
committalTypeId?: number | string;
directionOfArrival?: string;
funeralDateString?: '' | DateString;
funeralDirectorName?: string;
funeralHomeId?: number | string;

View File

@ -16,17 +16,17 @@ export default function addContract(addForm, user, connectedDatabase) {
purchaserPhoneNumber, purchaserEmail, purchaserRelationship,
funeralHomeId, funeralDirectorName,
funeralDate, funeralTime,
committalTypeId,
directionOfArrival, committalTypeId,
recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
.run(addForm.contractTypeId, addForm.burialSiteId === '' ? undefined : addForm.burialSiteId, contractStartDate, addForm.contractEndDateString === ''
? undefined
: dateStringToInteger(addForm.contractEndDateString), addForm.purchaserName ?? '', addForm.purchaserAddress1 ?? '', addForm.purchaserAddress2 ?? '', addForm.purchaserCity ?? '', addForm.purchaserProvince ?? '', addForm.purchaserPostalCode ?? '', addForm.purchaserPhoneNumber ?? '', addForm.purchaserEmail ?? '', addForm.purchaserRelationship ?? '', addForm.funeralHomeId === '' ? undefined : addForm.funeralHomeId, addForm.funeralDirectorName ?? '', addForm.funeralDateString === ''
? undefined
: dateStringToInteger(addForm.funeralDateString), addForm.funeralTimeString === ''
? undefined
: timeStringToInteger(addForm.funeralTimeString), addForm.committalTypeId === '' ? undefined : addForm.committalTypeId, user.userName, rightNowMillis, user.userName, rightNowMillis);
: timeStringToInteger(addForm.funeralTimeString), addForm.directionOfArrival ?? '', addForm.committalTypeId === '' ? undefined : addForm.committalTypeId, user.userName, rightNowMillis, user.userName, rightNowMillis);
const contractId = result.lastInsertRowid;
/*
* Add contract fields

View File

@ -20,6 +20,7 @@ export interface AddContractForm {
contractTypeFieldIds?: string
committalTypeId?: number | string
directionOfArrival?: string
funeralDateString?: '' | DateString
funeralDirectorName?: string
funeralHomeId?: number | string
@ -74,10 +75,10 @@ export default function addContract(
purchaserPhoneNumber, purchaserEmail, purchaserRelationship,
funeralHomeId, funeralDirectorName,
funeralDate, funeralTime,
committalTypeId,
directionOfArrival, committalTypeId,
recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
)
.run(
addForm.contractTypeId,
@ -103,6 +104,7 @@ export default function addContract(
addForm.funeralTimeString === ''
? undefined
: timeStringToInteger(addForm.funeralTimeString as TimeString),
addForm.directionOfArrival ?? '',
addForm.committalTypeId === '' ? undefined : addForm.committalTypeId,
user.userName,
rightNowMillis,

View File

@ -0,0 +1,9 @@
import sqlite from 'better-sqlite3';
import type { directionsOfArrival } from '../data/dataLists.js';
export declare const defaultDirectionsOfArrival: {
E: string;
N: string;
S: string;
W: string;
};
export default function getBurialSiteDirectionsOfArrival(burialSiteId: number | string, connectedDatabase?: sqlite.Database): Partial<Record<(typeof directionsOfArrival)[number], string>>;

View File

@ -0,0 +1,39 @@
import sqlite from 'better-sqlite3';
import { sunriseDB } from '../helpers/database.helpers.js';
import getCemeteryDirectionsOfArrival from './getCemeteryDirectionsOfArrival.js';
export const defaultDirectionsOfArrival = {
E: 'East',
N: 'North',
S: 'South',
W: 'West'
};
export default function getBurialSiteDirectionsOfArrival(burialSiteId, connectedDatabase) {
const database = connectedDatabase ?? sqlite(sunriseDB, { readonly: true });
const directionsList = database
.prepare(`select c.parentCemeteryId,
d.directionOfArrival, d.directionOfArrivalDescription
from BurialSites b
left join Cemeteries c on b.cemeteryId = c.cemeteryId
left join CemeteryDirectionsOfArrival d on c.cemeteryId = d.cemeteryId
where b.burialSiteId = ?`)
.all(burialSiteId);
let directions = {};
if (directionsList.length === 1 &&
directionsList[0].directionOfArrival === null &&
directionsList[0].parentCemeteryId !== null) {
directions = getCemeteryDirectionsOfArrival(directionsList[0].parentCemeteryId, connectedDatabase);
}
else if (directionsList.length > 0 && directionsList[0].directionOfArrival !== null) {
for (const direction of directionsList) {
directions[direction.directionOfArrival] =
direction.directionOfArrivalDescription ?? '';
}
}
if (Object.keys(directions).length === 0) {
directions = defaultDirectionsOfArrival;
}
if (connectedDatabase === undefined) {
database.close();
}
return directions;
}

View File

@ -0,0 +1,65 @@
import sqlite from 'better-sqlite3'
import type { directionsOfArrival } from '../data/dataLists.js'
import { sunriseDB } from '../helpers/database.helpers.js'
import getCemeteryDirectionsOfArrival from './getCemeteryDirectionsOfArrival.js'
export const defaultDirectionsOfArrival = {
E: 'East',
N: 'North',
S: 'South',
W: 'West'
}
export default function getBurialSiteDirectionsOfArrival(
burialSiteId: number | string,
connectedDatabase?: sqlite.Database
): Partial<Record<(typeof directionsOfArrival)[number], string>> {
const database = connectedDatabase ?? sqlite(sunriseDB, { readonly: true })
const directionsList = database
.prepare(
`select c.parentCemeteryId,
d.directionOfArrival, d.directionOfArrivalDescription
from BurialSites b
left join Cemeteries c on b.cemeteryId = c.cemeteryId
left join CemeteryDirectionsOfArrival d on c.cemeteryId = d.cemeteryId
where b.burialSiteId = ?`
)
.all(burialSiteId) as Array<{
directionOfArrival: (typeof directionsOfArrival)[number] | null
directionOfArrivalDescription: string | null
parentCemeteryId: number | null
}>
let directions: Partial<
Record<(typeof directionsOfArrival)[number], string>
> = {}
if (
directionsList.length === 1 &&
directionsList[0].directionOfArrival === null &&
directionsList[0].parentCemeteryId !== null
) {
directions = getCemeteryDirectionsOfArrival(
directionsList[0].parentCemeteryId,
connectedDatabase
)
} else if (directionsList.length > 0 && directionsList[0].directionOfArrival !== null) {
for (const direction of directionsList) {
directions[direction.directionOfArrival as string] =
direction.directionOfArrivalDescription ?? ''
}
}
if (Object.keys(directions).length === 0) {
directions = defaultDirectionsOfArrival
}
if (connectedDatabase === undefined) {
database.close()
}
return directions
}

View File

@ -1,6 +1,7 @@
import sqlite from 'better-sqlite3';
import { sunriseDB } from '../helpers/database.helpers.js';
import getCemeteries from './getCemeteries.js';
import getCemeteryDirectionsOfArrival from './getCemeteryDirectionsOfArrival.js';
export default function getCemetery(cemeteryId, connectedDatabase) {
return _getCemetery('cemeteryId', cemeteryId, connectedDatabase);
}
@ -42,6 +43,7 @@ function _getCemetery(keyColumn, cemeteryIdOrKey, connectedDatabase) {
cemetery.parentCemeteryId === null
? getCemeteries({ parentCemeteryId: cemetery.cemeteryId }, connectedDatabase)
: [];
cemetery.directionsOfArrival = getCemeteryDirectionsOfArrival(cemetery.cemeteryId, connectedDatabase);
}
if (connectedDatabase === undefined) {
database.close();

View File

@ -4,6 +4,7 @@ import { sunriseDB } from '../helpers/database.helpers.js'
import type { Cemetery } from '../types/record.types.js'
import getCemeteries from './getCemeteries.js'
import getCemeteryDirectionsOfArrival from './getCemeteryDirectionsOfArrival.js'
export default function getCemetery(
cemeteryId: number | string,
@ -65,6 +66,11 @@ function _getCemetery(
connectedDatabase
)
: []
cemetery.directionsOfArrival = getCemeteryDirectionsOfArrival(
cemetery.cemeteryId as number,
connectedDatabase
)
}
if (connectedDatabase === undefined) {

View File

@ -0,0 +1,3 @@
import sqlite from 'better-sqlite3';
import type { directionsOfArrival } from '../data/dataLists.js';
export default function getCemeteryDirectionsOfArrival(cemeteryId: number | string, connectedDatabase?: sqlite.Database): Partial<Record<(typeof directionsOfArrival)[number], string>>;

View File

@ -0,0 +1,19 @@
import sqlite from 'better-sqlite3';
import { sunriseDB } from '../helpers/database.helpers.js';
export default function getCemeteryDirectionsOfArrival(cemeteryId, connectedDatabase) {
const database = connectedDatabase ?? sqlite(sunriseDB, { readonly: true });
const directionsList = database
.prepare(`select directionOfArrival, directionOfArrivalDescription
from CemeteryDirectionsOfArrival
where cemeteryId = ?`)
.all(cemeteryId);
const directions = {};
for (const direction of directionsList) {
directions[direction.directionOfArrival] =
direction.directionOfArrivalDescription;
}
if (connectedDatabase === undefined) {
database.close();
}
return directions;
}

View File

@ -0,0 +1,37 @@
import sqlite from 'better-sqlite3'
import type { directionsOfArrival } from '../data/dataLists.js'
import { sunriseDB } from '../helpers/database.helpers.js'
export default function getCemeteryDirectionsOfArrival(
cemeteryId: number | string,
connectedDatabase?: sqlite.Database
): Partial<Record<(typeof directionsOfArrival)[number], string>> {
const database = connectedDatabase ?? sqlite(sunriseDB, { readonly: true })
const directionsList = database
.prepare(
`select directionOfArrival, directionOfArrivalDescription
from CemeteryDirectionsOfArrival
where cemeteryId = ?`
)
.all(cemeteryId) as Array<{
directionOfArrival: (typeof directionsOfArrival)[number]
directionOfArrivalDescription: string
}>
const directions: Partial<
Record<(typeof directionsOfArrival)[number], string>
> = {}
for (const direction of directionsList) {
directions[direction.directionOfArrival] =
direction.directionOfArrivalDescription
}
if (connectedDatabase === undefined) {
database.close()
}
return directions
}

View File

@ -29,6 +29,7 @@ export default async function getContract(contractId, connectedDatabase) {
o.funeralTime,
userFn_timeIntegerToString(o.funeralTime) as funeralTimeString,
userFn_timeIntegerToPeriodString(o.funeralTime) as funeralTimePeriodString,
o.directionOfArrival,
o.committalTypeId, c.committalType,
o.recordUpdate_timeMillis
from Contracts o

View File

@ -46,6 +46,7 @@ export default async function getContract(
o.funeralTime,
userFn_timeIntegerToString(o.funeralTime) as funeralTimeString,
userFn_timeIntegerToPeriodString(o.funeralTime) as funeralTimePeriodString,
o.directionOfArrival,
o.committalTypeId, c.committalType,
o.recordUpdate_timeMillis
from Contracts o

View File

@ -74,6 +74,12 @@ const createStatements = [
parentCemeteryId integer,
${recordColumns},
foreign key (parentCemeteryId) references Cemeteries (cemeteryId))`,
`create table if not exists CemeteryDirectionsOfArrival (
cemeteryId integer not null,
directionOfArrival varchar(2) not null,
directionOfArrivalDescription varchar(100) not null,
primary key (cemeteryId, directionOfArrival),
foreign key (cemeteryId) references Cemeteries (cemeteryId)) without rowid`,
/*
* Burial Sites
*/
@ -199,6 +205,7 @@ const createStatements = [
funeralDate integer check (funeralDate > 0),
funeralTime integer check (funeralTime >= 0),
committalTypeId integer,
directionOfArrival varchar(2),
${recordColumns},
foreign key (burialSiteId) references BurialSites (burialSiteId),

View File

@ -90,6 +90,13 @@ const createStatements = [
${recordColumns},
foreign key (parentCemeteryId) references Cemeteries (cemeteryId))`,
`create table if not exists CemeteryDirectionsOfArrival (
cemeteryId integer not null,
directionOfArrival varchar(2) not null,
directionOfArrivalDescription varchar(100) not null,
primary key (cemeteryId, directionOfArrival),
foreign key (cemeteryId) references Cemeteries (cemeteryId)) without rowid`,
/*
* Burial Sites
*/
@ -231,6 +238,7 @@ const createStatements = [
funeralDate integer check (funeralDate > 0),
funeralTime integer check (funeralTime >= 0),
committalTypeId integer,
directionOfArrival varchar(2),
${recordColumns},
foreign key (burialSiteId) references BurialSites (burialSiteId),

View File

@ -1,4 +1,5 @@
export interface UpdateCemeteryForm {
import { directionsOfArrival } from '../data/dataLists.js';
export type UpdateCemeteryForm = Partial<Record<`directionOfArrival_${(typeof directionsOfArrival)[number]}`, (typeof directionsOfArrival)[number]>> & Partial<Record<`directionOfArrivalDescription_${(typeof directionsOfArrival)[number]}`, string>> & {
cemeteryId: string;
cemeteryDescription: string;
cemeteryKey: string;
@ -13,7 +14,7 @@ export interface UpdateCemeteryForm {
cemeteryLatitude: string;
cemeteryLongitude: string;
cemeterySvg: string;
}
};
/**
* Updates a cemetery in the database.
* Be sure to rebuild burial site names after updating a cemetery.

View File

@ -1,4 +1,5 @@
import sqlite from 'better-sqlite3';
import { directionsOfArrival } from '../data/dataLists.js';
import { sunriseDB } from '../helpers/database.helpers.js';
/**
* Updates a cemetery in the database.
@ -35,6 +36,20 @@ export default function updateCemetery(updateForm, user) {
: 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
.prepare(`delete from CemeteryDirectionsOfArrival
where cemeteryId = ?`)
.run(updateForm.cemeteryId);
for (const direction of directionsOfArrival) {
const directionDescriptionName = `directionOfArrivalDescription_${direction}`;
if (directionDescriptionName in updateForm) {
database
.prepare(`insert into CemeteryDirectionsOfArrival (
cemeteryId, directionOfArrival, directionOfArrivalDescription)
values (?, ?, ?)`)
.run(updateForm.cemeteryId, direction, updateForm[directionDescriptionName] ?? '');
}
}
database.close();
return result.changes > 0;
}

View File

@ -1,8 +1,20 @@
import sqlite from 'better-sqlite3'
import { directionsOfArrival } from '../data/dataLists.js'
import { sunriseDB } from '../helpers/database.helpers.js'
export interface UpdateCemeteryForm {
export type UpdateCemeteryForm = Partial<
Record<
`directionOfArrival_${(typeof directionsOfArrival)[number]}`,
(typeof directionsOfArrival)[number]
>
> &
Partial<
Record<
`directionOfArrivalDescription_${(typeof directionsOfArrival)[number]}`,
string
>
> & {
cemeteryId: string
cemeteryDescription: string
@ -21,7 +33,7 @@ export interface UpdateCemeteryForm {
cemeteryLatitude: string
cemeteryLongitude: string
cemeterySvg: string
}
}
/**
* Updates a cemetery in the database.
@ -82,6 +94,31 @@ export default function updateCemetery(
updateForm.cemeteryId
)
database
.prepare(
`delete from CemeteryDirectionsOfArrival
where cemeteryId = ?`
)
.run(updateForm.cemeteryId)
for (const direction of directionsOfArrival) {
const directionDescriptionName = `directionOfArrivalDescription_${direction}`
if (directionDescriptionName in updateForm) {
database
.prepare(
`insert into CemeteryDirectionsOfArrival (
cemeteryId, directionOfArrival, directionOfArrivalDescription)
values (?, ?, ?)`
)
.run(
updateForm.cemeteryId,
direction,
updateForm[directionDescriptionName] ?? ''
)
}
}
database.close()
return result.changes > 0

View File

@ -7,6 +7,7 @@ export interface UpdateContractForm {
contractStartDateString: DateString;
funeralHomeId?: number | string;
committalTypeId?: number | string;
directionOfArrival?: string;
funeralDateString: '' | DateString;
funeralDirectorName: string;
funeralTimeString: '' | TimeString;

View File

@ -16,6 +16,7 @@ export default function updateContract(updateForm, user) {
funeralDirectorName = ?,
funeralDate = ?,
funeralTime = ?,
directionOfArrival = ?,
committalTypeId = ?,
purchaserName = ?,
purchaserAddress1 = ?,
@ -36,7 +37,7 @@ export default function updateContract(updateForm, user) {
? undefined
: dateStringToInteger(updateForm.funeralDateString), updateForm.funeralTimeString === ''
? undefined
: timeStringToInteger(updateForm.funeralTimeString), updateForm.committalTypeId === ''
: timeStringToInteger(updateForm.funeralTimeString), updateForm.directionOfArrival ?? '', updateForm.committalTypeId === ''
? undefined
: updateForm.committalTypeId, updateForm.purchaserName ?? '', updateForm.purchaserAddress1 ?? '', updateForm.purchaserAddress2 ?? '', updateForm.purchaserCity ?? '', updateForm.purchaserProvince ?? '', updateForm.purchaserPostalCode ?? '', updateForm.purchaserPhoneNumber ?? '', updateForm.purchaserEmail ?? '', updateForm.purchaserRelationship ?? '', user.userName, Date.now(), updateForm.contractId);
if (result.changes > 0) {

View File

@ -23,6 +23,7 @@ export interface UpdateContractForm {
funeralHomeId?: number | string
committalTypeId?: number | string
directionOfArrival?: string
funeralDateString: '' | DateString
funeralDirectorName: string
funeralTimeString: '' | TimeString
@ -61,6 +62,7 @@ export default function updateContract(
funeralDirectorName = ?,
funeralDate = ?,
funeralTime = ?,
directionOfArrival = ?,
committalTypeId = ?,
purchaserName = ?,
purchaserAddress1 = ?,
@ -91,6 +93,7 @@ export default function updateContract(
updateForm.funeralTimeString === ''
? undefined
: timeStringToInteger(updateForm.funeralTimeString),
updateForm.directionOfArrival ?? '',
updateForm.committalTypeId === ''
? undefined
: updateForm.committalTypeId,

View File

@ -3,6 +3,7 @@ import getContract from '../../database/getContract.js';
import getFuneralHomes from '../../database/getFuneralHomes.js';
import { getConfigProperty } from '../../helpers/config.helpers.js';
import { getBurialSiteStatuses, getBurialSiteTypes, getCommittalTypes, getContractTypePrintsById, getContractTypes, getIntermentContainerTypes, getWorkOrderTypes } from '../../helpers/functions.cache.js';
import getBurialSiteDirectionsOfArrival, { defaultDirectionsOfArrival } from '../../database/getBurialSiteDirectionsOfArrival.js';
export default async function handler(request, response) {
const contract = await getContract(request.params.contractId);
if (contract === undefined) {
@ -23,6 +24,9 @@ export default async function handler(request, response) {
const burialSiteStatuses = getBurialSiteStatuses();
const burialSiteTypes = getBurialSiteTypes();
const cemeteries = getCemeteries();
const burialSiteDirectionsOfArrival = contract.burialSiteId === undefined
? defaultDirectionsOfArrival
: getBurialSiteDirectionsOfArrival(contract.burialSiteId);
/*
* Work Order Drop Lists
*/
@ -38,6 +42,7 @@ export default async function handler(request, response) {
burialSiteStatuses,
burialSiteTypes,
cemeteries,
burialSiteDirectionsOfArrival,
workOrderTypes,
isCreate: false
});

View File

@ -13,6 +13,9 @@ import {
getIntermentContainerTypes,
getWorkOrderTypes
} from '../../helpers/functions.cache.js'
import getBurialSiteDirectionsOfArrival, {
defaultDirectionsOfArrival
} from '../../database/getBurialSiteDirectionsOfArrival.js'
export default async function handler(
request: Request,
@ -48,6 +51,11 @@ export default async function handler(
const burialSiteTypes = getBurialSiteTypes()
const cemeteries = getCemeteries()
const burialSiteDirectionsOfArrival =
contract.burialSiteId === undefined
? defaultDirectionsOfArrival
: getBurialSiteDirectionsOfArrival(contract.burialSiteId)
/*
* Work Order Drop Lists
*/
@ -69,6 +77,8 @@ export default async function handler(
burialSiteTypes,
cemeteries,
burialSiteDirectionsOfArrival,
workOrderTypes,
isCreate: false

View File

@ -1,5 +1,6 @@
import { dateToInteger, dateToString } from '@cityssm/utils-datetime';
import getBurialSite from '../../database/getBurialSite.js';
import getBurialSiteDirectionsOfArrival, { defaultDirectionsOfArrival } from '../../database/getBurialSiteDirectionsOfArrival.js';
import getCemeteries from '../../database/getCemeteries.js';
import getFuneralHomes from '../../database/getFuneralHomes.js';
import { getConfigProperty } from '../../helpers/config.helpers.js';
@ -35,6 +36,9 @@ export default async function handler(request, response) {
const burialSiteStatuses = getBurialSiteStatuses();
const burialSiteTypes = getBurialSiteTypes();
const cemeteries = getCemeteries();
const burialSiteDirectionsOfArrival = contract.burialSiteId === undefined
? defaultDirectionsOfArrival
: getBurialSiteDirectionsOfArrival(contract.burialSiteId);
response.render('contract-edit', {
headTitle: 'Create a New Contract',
contract,
@ -45,6 +49,7 @@ export default async function handler(request, response) {
burialSiteStatuses,
burialSiteTypes,
cemeteries,
burialSiteDirectionsOfArrival,
isCreate: true
});
}

View File

@ -3,6 +3,7 @@ import type { Request, Response } from 'express'
import { dateToInteger, dateToString } from '@cityssm/utils-datetime'
import getBurialSite from '../../database/getBurialSite.js'
import getBurialSiteDirectionsOfArrival, { defaultDirectionsOfArrival } from '../../database/getBurialSiteDirectionsOfArrival.js'
import getCemeteries from '../../database/getCemeteries.js'
import getFuneralHomes from '../../database/getFuneralHomes.js'
import { getConfigProperty } from '../../helpers/config.helpers.js'
@ -58,6 +59,11 @@ export default async function handler(
const burialSiteTypes = getBurialSiteTypes()
const cemeteries = getCemeteries()
const burialSiteDirectionsOfArrival =
contract.burialSiteId === undefined
? defaultDirectionsOfArrival
: getBurialSiteDirectionsOfArrival(contract.burialSiteId)
response.render('contract-edit', {
headTitle: 'Create a New Contract',
@ -72,6 +78,8 @@ export default async function handler(
burialSiteTypes,
cemeteries,
burialSiteDirectionsOfArrival,
isCreate: true
})
}

View File

@ -0,0 +1,4 @@
import type { Request, Response } from 'express';
export default function handler(request: Request<unknown, unknown, {
burialSiteId: string;
}>, response: Response): void;

View File

@ -0,0 +1,9 @@
import getBurialSiteDirectionsOfArrival, { defaultDirectionsOfArrival } from '../../database/getBurialSiteDirectionsOfArrival.js';
export default function handler(request, response) {
const directionsOfArrival = request.body.burialSiteId === ''
? defaultDirectionsOfArrival
: getBurialSiteDirectionsOfArrival(request.body.burialSiteId);
response.json({
directionsOfArrival
});
}

View File

@ -0,0 +1,19 @@
import type { Request, Response } from 'express'
import getBurialSiteDirectionsOfArrival, {
defaultDirectionsOfArrival
} from '../../database/getBurialSiteDirectionsOfArrival.js'
export default function handler(
request: Request<unknown, unknown, { burialSiteId: string }>,
response: Response
): void {
const directionsOfArrival =
request.body.burialSiteId === ''
? defaultDirectionsOfArrival
: getBurialSiteDirectionsOfArrival(request.body.burialSiteId)
response.json({
directionsOfArrival
})
}

View File

@ -96,4 +96,26 @@ Object.defineProperty(exports, "__esModule", { value: true });
}
});
});
/*
* Directions of Arrival
*/
function toggleDirectionOfArrivalDescription(clickEvent) {
const checkboxElement = clickEvent.currentTarget;
const descriptionElement = document.querySelector(`#cemetery--directionOfArrivalDescription_${checkboxElement.value}`);
if (checkboxElement.checked) {
descriptionElement.removeAttribute('disabled');
descriptionElement.focus();
}
else {
descriptionElement.setAttribute('disabled', 'disabled');
// descriptionElement.value = ''
}
setUnsavedChanges();
}
const directionOfArrivalCheckboxElements =
// eslint-disable-next-line no-secrets/no-secrets
document.querySelectorAll('input[name^="directionOfArrival_"]');
for (const checkboxElement of directionOfArrivalCheckboxElements) {
checkboxElement.addEventListener('change', toggleDirectionOfArrivalDescription);
}
})();

View File

@ -149,4 +149,37 @@ declare const exports: Record<string, unknown>
}
})
})
/*
* Directions of Arrival
*/
function toggleDirectionOfArrivalDescription(clickEvent: Event): void {
const checkboxElement = clickEvent.currentTarget as HTMLInputElement
const descriptionElement = document.querySelector(
`#cemetery--directionOfArrivalDescription_${checkboxElement.value}`
) as HTMLInputElement
if (checkboxElement.checked) {
descriptionElement.removeAttribute('disabled')
descriptionElement.focus()
} else {
descriptionElement.setAttribute('disabled', 'disabled')
// descriptionElement.value = ''
}
setUnsavedChanges()
}
const directionOfArrivalCheckboxElements: NodeListOf<HTMLInputElement> =
// eslint-disable-next-line no-secrets/no-secrets
document.querySelectorAll('input[name^="directionOfArrival_"]')
for (const checkboxElement of directionOfArrivalCheckboxElements) {
checkboxElement.addEventListener(
'change',
toggleDirectionOfArrivalDescription
)
}
})()

View File

@ -231,7 +231,37 @@ Object.defineProperty(exports, "__esModule", { value: true });
});
}
// Burial Site Selector
const burialSiteIdElement = document.querySelector('#contract--burialSiteId');
const burialSiteNameElement = document.querySelector('#contract--burialSiteName');
const directionOfArrivalElement = document.querySelector('#contract--directionOfArrival');
function refreshDirectionsOfArrival() {
const burialSiteId = burialSiteIdElement.value;
cityssm.postJSON(`${sunrise.urlPrefix}/contracts/doGetBurialSiteDirectionsOfArrival`, {
burialSiteId
}, (rawResponseJSON) => {
const responseJSON = rawResponseJSON;
const currentDirectionOfArrival = directionOfArrivalElement.value;
directionOfArrivalElement.value = '';
directionOfArrivalElement.innerHTML =
'<option value="">(No Direction)</option>';
for (const direction of exports.directionsOfArrival) {
// eslint-disable-next-line security/detect-object-injection
if (responseJSON.directionsOfArrival[direction] !== undefined) {
const optionElement = document.createElement('option');
optionElement.value = direction;
optionElement.textContent =
direction +
(responseJSON.directionsOfArrival[direction] === ''
? ''
: ` - ${responseJSON.directionsOfArrival[direction]}`);
if (currentDirectionOfArrival === direction) {
optionElement.selected = true;
}
directionOfArrivalElement.append(optionElement);
}
}
});
}
burialSiteNameElement.addEventListener('click', (clickEvent) => {
const currentBurialSiteName = clickEvent.currentTarget
.value;
@ -240,11 +270,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
let burialSiteSelectResultsElement;
let burialSiteCreateFormElement;
function renderSelectedBurialSiteAndClose(burialSiteId, burialSiteName) {
;
document.querySelector('#contract--burialSiteId').value = burialSiteId.toString();
document.querySelector('#contract--burialSiteName').value = burialSiteName;
burialSiteIdElement.value = burialSiteId.toString();
burialSiteNameElement.value = burialSiteName;
setUnsavedChanges();
burialSiteSelectCloseModalFunction();
refreshDirectionsOfArrival();
}
function selectExistingBurialSite(selectClickEvent) {
selectClickEvent.preventDefault();
@ -401,6 +431,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
else {
burialSiteNameElement.value = '(No Burial Site)';
document.querySelector('#contract--burialSiteId').value = '';
refreshDirectionsOfArrival();
setUnsavedChanges();
}
});

View File

@ -4,6 +4,7 @@
import type { BulmaJS } from '@cityssm/bulma-js/types.js'
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types.js'
import type { directionsOfArrival } from '../../data/dataLists.js'
import type {
BurialSite,
BurialSiteStatus,
@ -13,6 +14,7 @@ import type {
} from '../../types/record.types.js'
import type { Sunrise } from './types.js'
import { ref } from 'process'
declare const cityssm: cityssmGlobal
declare const bulmaJS: BulmaJS
@ -22,6 +24,8 @@ declare const exports: {
burialSiteStatuses: BurialSiteStatus[]
burialSiteTypes: BurialSiteType[]
cemeteries: Cemetery[]
directionsOfArrival: typeof directionsOfArrival
}
;(() => {
const sunrise = exports.sunrise
@ -362,10 +366,60 @@ declare const exports: {
// Burial Site Selector
const burialSiteIdElement = document.querySelector(
'#contract--burialSiteId'
) as HTMLInputElement
const burialSiteNameElement = document.querySelector(
'#contract--burialSiteName'
) as HTMLInputElement
const directionOfArrivalElement = document.querySelector(
'#contract--directionOfArrival'
) as HTMLSelectElement
function refreshDirectionsOfArrival(): void {
const burialSiteId = burialSiteIdElement.value
cityssm.postJSON(
`${sunrise.urlPrefix}/contracts/doGetBurialSiteDirectionsOfArrival`,
{
burialSiteId
},
(rawResponseJSON) => {
const responseJSON = rawResponseJSON as {
directionsOfArrival: Partial<Record<string, string>>
}
const currentDirectionOfArrival = directionOfArrivalElement.value
directionOfArrivalElement.value = ''
directionOfArrivalElement.innerHTML =
'<option value="">(No Direction)</option>'
for (const direction of exports.directionsOfArrival) {
// eslint-disable-next-line security/detect-object-injection
if (responseJSON.directionsOfArrival[direction] !== undefined) {
const optionElement = document.createElement('option')
optionElement.value = direction
optionElement.textContent =
direction +
(responseJSON.directionsOfArrival[direction] === ''
? ''
: ` - ${responseJSON.directionsOfArrival[direction]}`)
if (currentDirectionOfArrival === direction) {
optionElement.selected = true
}
directionOfArrivalElement.append(optionElement)
}
}
}
)
}
burialSiteNameElement.addEventListener('click', (clickEvent) => {
const currentBurialSiteName = (clickEvent.currentTarget as HTMLInputElement)
.value
@ -381,15 +435,13 @@ declare const exports: {
burialSiteId: number | string,
burialSiteName: string
): void {
;(
document.querySelector('#contract--burialSiteId') as HTMLInputElement
).value = burialSiteId.toString()
;(
document.querySelector('#contract--burialSiteName') as HTMLInputElement
).value = burialSiteName
burialSiteIdElement.value = burialSiteId.toString()
burialSiteNameElement.value = burialSiteName
setUnsavedChanges()
burialSiteSelectCloseModalFunction()
refreshDirectionsOfArrival()
}
function selectExistingBurialSite(selectClickEvent: Event): void {
@ -661,6 +713,7 @@ declare const exports: {
document.querySelector('#contract--burialSiteId') as HTMLInputElement
).value = ''
refreshDirectionsOfArrival()
setUnsavedChanges()
}
})

View File

@ -17,6 +17,7 @@ import handler_doDeleteContractComment from '../handlers/contracts-post/doDelete
import handler_doDeleteContractFee from '../handlers/contracts-post/doDeleteContractFee.js';
import handler_doDeleteContractInterment from '../handlers/contracts-post/doDeleteContractInterment.js';
import handler_doDeleteContractTransaction from '../handlers/contracts-post/doDeleteContractTransaction.js';
import handler_doGetBurialSiteDirectionsOfArrival from '../handlers/contracts-post/doGetBurialSiteDirectionsOfArrival.js';
import handler_doGetContractTypeFields from '../handlers/contracts-post/doGetContractTypeFields.js';
import handler_doGetDynamicsGPDocument from '../handlers/contracts-post/doGetDynamicsGPDocument.js';
import handler_doGetFees from '../handlers/contracts-post/doGetFees.js';
@ -45,6 +46,7 @@ router.get('/:contractId/edit', updateGetHandler, handler_edit);
router.post('/doUpdateContract', updatePostHandler, handler_doUpdateContract);
router.post('/doCopyContract', updatePostHandler, handler_doCopyContract);
router.post('/doDeleteContract', updatePostHandler, handler_doDeleteContract);
router.post('/doGetBurialSiteDirectionsOfArrival', updatePostHandler, handler_doGetBurialSiteDirectionsOfArrival);
// Interments
router.post('/doAddContractInterment', updatePostHandler, handler_doAddContractInterment);
router.post('/doUpdateContractInterment', updatePostHandler, handler_doUpdateContractInterment);

View File

@ -18,6 +18,7 @@ import handler_doDeleteContractComment from '../handlers/contracts-post/doDelete
import handler_doDeleteContractFee from '../handlers/contracts-post/doDeleteContractFee.js'
import handler_doDeleteContractInterment from '../handlers/contracts-post/doDeleteContractInterment.js'
import handler_doDeleteContractTransaction from '../handlers/contracts-post/doDeleteContractTransaction.js'
import handler_doGetBurialSiteDirectionsOfArrival from '../handlers/contracts-post/doGetBurialSiteDirectionsOfArrival.js'
import handler_doGetContractTypeFields from '../handlers/contracts-post/doGetContractTypeFields.js'
import handler_doGetDynamicsGPDocument from '../handlers/contracts-post/doGetDynamicsGPDocument.js'
import handler_doGetFees from '../handlers/contracts-post/doGetFees.js'
@ -68,6 +69,12 @@ router.post('/doCopyContract', updatePostHandler, handler_doCopyContract)
router.post('/doDeleteContract', updatePostHandler, handler_doDeleteContract)
router.post(
'/doGetBurialSiteDirectionsOfArrival',
updatePostHandler,
handler_doGetBurialSiteDirectionsOfArrival
)
// Interments
router.post(

View File

@ -1,4 +1,5 @@
import type { DateString, TimeString } from '@cityssm/utils-datetime';
import type { directionsOfArrival } from '../data/dataLists.js';
export interface BurialSite extends Record {
burialSiteId: number;
burialSiteName?: string;
@ -85,6 +86,7 @@ export interface Cemetery extends Record {
cemeteryPhoneNumber: string;
burialSiteCount?: number;
childCemeteries?: Cemetery[];
directionsOfArrival?: Partial<globalThis.Record<(typeof directionsOfArrival)[number], string>>;
}
export interface CommittalType extends Record {
committalTypeId: number;
@ -133,6 +135,7 @@ export interface Contract extends Record {
funeralTimeString?: TimeString;
committalType?: string;
committalTypeId?: number;
directionOfArrival?: string;
contractComments?: ContractComment[];
contractFees?: ContractFee[];
contractFields?: ContractField[];

View File

@ -1,5 +1,7 @@
import type { DateString, TimeString } from '@cityssm/utils-datetime'
import type { directionsOfArrival } from '../data/dataLists.js'
export interface BurialSite extends Record {
burialSiteId: number
@ -118,6 +120,9 @@ export interface Cemetery extends Record {
burialSiteCount?: number
childCemeteries?: Cemetery[]
directionsOfArrival?: Partial<
globalThis.Record<(typeof directionsOfArrival)[number], string>
>
}
export interface CommittalType extends Record {
@ -186,6 +191,8 @@ export interface Contract extends Record {
committalType?: string
committalTypeId?: number
directionOfArrival?: string
contractComments?: ContractComment[]
contractFees?: ContractFee[]
contractFields?: ContractField[]

View File

@ -260,8 +260,6 @@
</div>
</div>
</div>
</div>
<div class="column">
<div class="panel">
<div class="panel-heading">
<div class="level is-mobile">
@ -296,6 +294,64 @@
</div>
</div>
</div>
<div class="column">
<div class="panel">
<div class="panel-heading">
<div class="level is-mobile">
<div class="level-left">
<div class="level-item">
<h2 class="title is-5 has-text-weight-bold has-text-white">Directions of Arrival</h2>
</div>
</div>
</div>
</div>
<div class="panel-block is-block">
<table class="table is-fullwidth is-striped is-hoverable">
<thead>
<tr>
<th class="has-width-1">
<span class="is-sr-only">Selected</span>
</th>
<th>Direction</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<% for (const direction of dataLists.directionsOfArrival) { %>
<%
const directionIsSelected = cemetery.directionsOfArrival[direction] || false;
%>
<tr>
<td class="is-vcentered">
<div class="control">
<input id="cemetery--directionOfArrival_<%= direction %>" name="directionOfArrival_<%= direction %>"
type="checkbox" value="<%= direction %>"
<%= directionIsSelected ? " checked" : "" %> />
</div>
</td>
<td class="is-vcentered">
<label for="cemetery--directionOfArrival_<%= direction %>">
<span><%= direction %></span>
</label>
</td>
<td>
<div class="control">
<input class="input" id="cemetery--directionOfArrivalDescription_<%= direction %>"
name="directionOfArrivalDescription_<%= direction %>"
type="text"
value="<%= cemetery.directionsOfArrival[direction] || "" %>"
maxlength="100"
placeholder="Description"
<%= directionIsSelected ? "" : "disabled" %>
/>
</div>
</tr>
<% } %>
</tbody>
</table>
</div>
</div>
</div>
</div>
</form>

View File

@ -66,13 +66,14 @@
<div class="panel">
<div class="panel-block is-block">
<div class="columns">
<% if (cemetery.cemeteryDescription && cemetery.cemeteryDescription !== "") { %>
<div class="column">
<% if (cemetery.cemeteryDescription && cemetery.cemeteryDescription !== "") { %>
<p class="mb-2">
<strong>Description</strong><br />
<%= cemetery.cemeteryDescription %>
</div>
</p>
<% } %>
<div class="column">
<p class="mb-2">
<strong>Address</strong><br />
<% if (cemetery.cemeteryAddress1 !== "") { %>
<%= cemetery.cemeteryAddress1 %><br />
@ -82,13 +83,14 @@
<% } %>
<%= cemetery.cemeteryCity %>, <%= cemetery.cemeteryProvince %><br />
<%= cemetery.cemeteryPostalCode %>
</div>
</p>
<% if (cemetery.cemeteryPhoneNumber !== "") { %>
<div class="column">
<p>
<strong>Phone Number</strong><br />
<%= cemetery.cemeteryPhoneNumber %>
</div>
</p>
<% } %>
</div>
<% if (cemetery.parentCemeteryId !== null) { %>
<div class="column">
<strong>Parent Cemetery</strong><br />

View File

@ -391,6 +391,30 @@
</div>
</div>
</div>
<div class="field">
<label class="label" for="contract--directionOfArrival">Direction of Arrival</label>
<div class="control">
<div class="select is-fullwidth">
<select id="contract--directionOfArrival" name="directionOfArrival">
<option value="">(No Direction)</option>
<% for (const direction of dataLists.directionsOfArrival) { %>
<%
if (burialSiteDirectionsOfArrival[direction] === undefined) {
continue
}
%>
<option value="<%= direction %>"
<%= (contract.directionOfArrival === direction ? " selected" : "") %>>
<%= direction %>
<% if (burialSiteDirectionsOfArrival[direction] !== '') { %>
- <%= burialSiteDirectionsOfArrival[direction] %>
<% } %>
</option>
<% } %>
</select>
</div>
</div>
</div>
<div class="field">
<label class="label" for="contract--committalTypeId">Committal Type</label>
<div class="control">
@ -997,6 +1021,7 @@
exports.burialSiteStatuses = <%- JSON.stringify(burialSiteStatuses) %>;
exports.burialSiteTypes = <%- JSON.stringify(burialSiteTypes) %>;
exports.cemeteries = <%- JSON.stringify(cemeteries) %>;
exports.directionsOfArrival = <%- JSON.stringify(dataLists.directionsOfArrival) %>;
</script>
<script src="<%= urlPrefix %>/javascripts/contract.edit.js"></script>