major refactoring

deepsource-autofix-76c6eb20
Dan Gowans 2025-02-24 15:02:30 -05:00
parent 0ea7494b8c
commit 547c2e224f
505 changed files with 6296 additions and 6424 deletions

18
app.js
View File

@ -9,20 +9,20 @@ import rateLimit from 'express-rate-limit';
import session from 'express-session'; import session from 'express-session';
import createError from 'http-errors'; import createError from 'http-errors';
import FileStore from 'session-file-store'; import FileStore from 'session-file-store';
import { useTestDatabases } from './data/databasePaths.js'; import { initializeDatabase } from './database/initializeDatabase.js';
import { DEBUG_NAMESPACE } from './debug.config.js'; import { DEBUG_NAMESPACE } from './debug.config.js';
import * as permissionHandlers from './handlers/permissions.js'; import * as permissionHandlers from './handlers/permissions.js';
import { getSafeRedirectURL } from './helpers/functions.authentication.js';
import * as configFunctions from './helpers/config.helpers.js'; import * as configFunctions from './helpers/config.helpers.js';
import { useTestDatabases } from './helpers/database.helpers.js';
import { getSafeRedirectURL } from './helpers/functions.authentication.js';
import * as printFunctions from './helpers/functions.print.js'; import * as printFunctions from './helpers/functions.print.js';
import { initializeDatabase } from './helpers/helpers.database.js';
import routerAdmin from './routes/admin.js'; import routerAdmin from './routes/admin.js';
import routerApi from './routes/api.js'; import routerApi from './routes/api.js';
import routerBurialSites from './routes/burialSites.js';
import routerCemeteries from './routes/cemeteries.js';
import routerContracts from './routes/contracts.js';
import routerDashboard from './routes/dashboard.js'; import routerDashboard from './routes/dashboard.js';
import routerLogin from './routes/login.js'; import routerLogin from './routes/login.js';
import routerLotOccupancies from './routes/lotOccupancies.js';
import routerLots from './routes/lots.js';
import routerMaps from './routes/maps.js';
import routerPrint from './routes/print.js'; import routerPrint from './routes/print.js';
import routerReports from './routes/reports.js'; import routerReports from './routes/reports.js';
import routerWorkOrders from './routes/workOrders.js'; import routerWorkOrders from './routes/workOrders.js';
@ -140,9 +140,9 @@ app.get(`${urlPrefix}/`, sessionChecker, (_request, response) => {
app.use(`${urlPrefix}/dashboard`, sessionChecker, routerDashboard); app.use(`${urlPrefix}/dashboard`, sessionChecker, routerDashboard);
app.use(`${urlPrefix}/api/:apiKey`, permissionHandlers.apiGetHandler, routerApi); app.use(`${urlPrefix}/api/:apiKey`, permissionHandlers.apiGetHandler, routerApi);
app.use(`${urlPrefix}/print`, sessionChecker, routerPrint); app.use(`${urlPrefix}/print`, sessionChecker, routerPrint);
app.use(`${urlPrefix}/maps`, sessionChecker, routerMaps); app.use(`${urlPrefix}/cemeteries`, sessionChecker, routerCemeteries);
app.use(`${urlPrefix}/lots`, sessionChecker, routerLots); app.use(`${urlPrefix}/burialSites`, sessionChecker, routerBurialSites);
app.use(`${urlPrefix}/lotOccupancies`, sessionChecker, routerLotOccupancies); app.use(`${urlPrefix}/contracts`, sessionChecker, routerContracts);
app.use(`${urlPrefix}/workOrders`, sessionChecker, routerWorkOrders); app.use(`${urlPrefix}/workOrders`, sessionChecker, routerWorkOrders);
app.use(`${urlPrefix}/reports`, sessionChecker, routerReports); app.use(`${urlPrefix}/reports`, sessionChecker, routerReports);
app.use(`${urlPrefix}/admin`, sessionChecker, permissionHandlers.adminGetHandler, routerAdmin); app.use(`${urlPrefix}/admin`, sessionChecker, permissionHandlers.adminGetHandler, routerAdmin);

18
app.ts
View File

@ -11,20 +11,20 @@ import session from 'express-session'
import createError from 'http-errors' import createError from 'http-errors'
import FileStore from 'session-file-store' import FileStore from 'session-file-store'
import { useTestDatabases } from './data/databasePaths.js' import { initializeDatabase } from './database/initializeDatabase.js'
import { DEBUG_NAMESPACE } from './debug.config.js' import { DEBUG_NAMESPACE } from './debug.config.js'
import * as permissionHandlers from './handlers/permissions.js' import * as permissionHandlers from './handlers/permissions.js'
import { getSafeRedirectURL } from './helpers/functions.authentication.js'
import * as configFunctions from './helpers/config.helpers.js' import * as configFunctions from './helpers/config.helpers.js'
import { useTestDatabases } from './helpers/database.helpers.js'
import { getSafeRedirectURL } from './helpers/functions.authentication.js'
import * as printFunctions from './helpers/functions.print.js' import * as printFunctions from './helpers/functions.print.js'
import { initializeDatabase } from './helpers/helpers.database.js'
import routerAdmin from './routes/admin.js' import routerAdmin from './routes/admin.js'
import routerApi from './routes/api.js' import routerApi from './routes/api.js'
import routerBurialSites from './routes/burialSites.js'
import routerCemeteries from './routes/cemeteries.js'
import routerContracts from './routes/contracts.js'
import routerDashboard from './routes/dashboard.js' import routerDashboard from './routes/dashboard.js'
import routerLogin from './routes/login.js' import routerLogin from './routes/login.js'
import routerLotOccupancies from './routes/lotOccupancies.js'
import routerLots from './routes/lots.js'
import routerMaps from './routes/maps.js'
import routerPrint from './routes/print.js' import routerPrint from './routes/print.js'
import routerReports from './routes/reports.js' import routerReports from './routes/reports.js'
import routerWorkOrders from './routes/workOrders.js' import routerWorkOrders from './routes/workOrders.js'
@ -231,9 +231,9 @@ app.use(`${urlPrefix}/dashboard`, sessionChecker, routerDashboard)
app.use(`${urlPrefix}/api/:apiKey`, permissionHandlers.apiGetHandler, routerApi) app.use(`${urlPrefix}/api/:apiKey`, permissionHandlers.apiGetHandler, routerApi)
app.use(`${urlPrefix}/print`, sessionChecker, routerPrint) app.use(`${urlPrefix}/print`, sessionChecker, routerPrint)
app.use(`${urlPrefix}/maps`, sessionChecker, routerMaps) app.use(`${urlPrefix}/cemeteries`, sessionChecker, routerCemeteries)
app.use(`${urlPrefix}/lots`, sessionChecker, routerLots) app.use(`${urlPrefix}/burialSites`, sessionChecker, routerBurialSites)
app.use(`${urlPrefix}/lotOccupancies`, sessionChecker, routerLotOccupancies) app.use(`${urlPrefix}/contracts`, sessionChecker, routerContracts)
app.use(`${urlPrefix}/workOrders`, sessionChecker, routerWorkOrders) app.use(`${urlPrefix}/workOrders`, sessionChecker, routerWorkOrders)
app.use(`${urlPrefix}/reports`, sessionChecker, routerReports) app.use(`${urlPrefix}/reports`, sessionChecker, routerReports)

View File

@ -0,0 +1,69 @@
import { getConfigProperty } from '../../../helpers/config.helpers.js';
import { testUpdate } from '../../../test/_globals.js';
import { login, logout } from '../../support/index.js';
describe('Update - Cemeteries', () => {
beforeEach('Loads page', () => {
logout();
login(testUpdate);
});
afterEach(logout);
it('Has a "Create" link on the Cemetery Search', () => {
cy.visit('/cemeteries');
cy.location('pathname').should('equal', '/cemeteries');
cy.get("a[href$='/cemeteries/new']").should('exist');
});
it('Creates a new cemetery', () => {
cy.visit('/cemeteries/new');
cy.log('Check the accessibility');
cy.injectAxe();
cy.checkA11y();
cy.log('Populate the fields');
cy.fixture('cemetery.json').then((cemeteryData) => {
cy.get("input[name='cemeteryName']")
.clear()
.type(cemeteryData.cemeteryName ?? '');
cy.get("textarea[name='cemeteryDescription']")
.clear()
.type(cemeteryData.cemeteryDescription ?? '');
cy.get("input[name='cemeteryAddress1']")
.clear()
.type(cemeteryData.cemeteryAddress1 ?? '');
cy.get("input[name='cemeteryAddress2']")
.clear()
.type(cemeteryData.cemeteryAddress2 ?? '');
cy.get("input[name='cemeteryPostalCode']")
.clear()
.type(cemeteryData.cemeteryPostalCode ?? '');
cy.get("input[name='cemeteryPhoneNumber']")
.clear()
.type(cemeteryData.cemeteryPhoneNumber ?? '');
cy.get("input[name='cemeteryLatitude']")
.clear()
.type(cemeteryData.cemeteryLatitude?.toString() ?? '');
cy.get("input[name='cemeteryLongitude']")
.clear()
.type(cemeteryData.cemeteryLongitude?.toString() ?? '');
});
cy.log('Ensure the default city and province are used');
cy.get("input[name='cemeteryCity']").should('have.value', getConfigProperty('settings.cemeteries.cityDefault'));
cy.get("input[name='cemeteryProvince']").should('have.value', getConfigProperty('settings.cemeteries.provinceDefault'));
cy.log('Submit the form');
cy.get('#form--cemetery').submit();
cy.wait(1000);
cy.location('pathname')
.should('not.contain', '/new')
.should('contain', '/edit');
cy.fixture('cemetery.json').then((cemeteryData) => {
cy.get("input[name='cemeteryName']").should('have.value', cemeteryData.cemeteryName);
cy.get("textarea[name='cemeteryDescription']").should('have.value', cemeteryData.cemeteryDescription);
cy.get("input[name='cemeteryAddress1']").should('have.value', cemeteryData.cemeteryAddress1);
cy.get("input[name='cemeteryAddress2']").should('have.value', cemeteryData.cemeteryAddress2);
cy.get("input[name='cemeteryCity']").should('have.value', getConfigProperty('settings.cemeteries.cityDefault'));
cy.get("input[name='cemeteryProvince']").should('have.value', getConfigProperty('settings.cemeteries.provinceDefault'));
cy.get("input[name='cemeteryPostalCode']").should('have.value', cemeteryData.cemeteryPostalCode);
cy.get("input[name='cemeteryPhoneNumber']").should('have.value', cemeteryData.cemeteryPhoneNumber);
cy.get("input[name='cemeteryLatitude']").should('have.value', cemeteryData.cemeteryLatitude?.toString());
cy.get("input[name='cemeteryLongitude']").should('have.value', cemeteryData.cemeteryLongitude?.toString());
});
});
});

View File

@ -0,0 +1,138 @@
import { getConfigProperty } from '../../../helpers/config.helpers.js'
import { testUpdate } from '../../../test/_globals.js'
import type { Cemetery } from '../../../types/recordTypes.js'
import { login, logout } from '../../support/index.js'
describe('Update - Cemeteries', () => {
beforeEach('Loads page', () => {
logout()
login(testUpdate)
})
afterEach(logout)
it('Has a "Create" link on the Cemetery Search', () => {
cy.visit('/cemeteries')
cy.location('pathname').should('equal', '/cemeteries')
cy.get("a[href$='/cemeteries/new']").should('exist')
})
it('Creates a new cemetery', () => {
cy.visit('/cemeteries/new')
cy.log('Check the accessibility')
cy.injectAxe()
cy.checkA11y()
cy.log('Populate the fields')
cy.fixture('cemetery.json').then((cemeteryData: Cemetery) => {
cy.get("input[name='cemeteryName']")
.clear()
.type(cemeteryData.cemeteryName ?? '')
cy.get("textarea[name='cemeteryDescription']")
.clear()
.type(cemeteryData.cemeteryDescription ?? '')
cy.get("input[name='cemeteryAddress1']")
.clear()
.type(cemeteryData.cemeteryAddress1 ?? '')
cy.get("input[name='cemeteryAddress2']")
.clear()
.type(cemeteryData.cemeteryAddress2 ?? '')
cy.get("input[name='cemeteryPostalCode']")
.clear()
.type(cemeteryData.cemeteryPostalCode ?? '')
cy.get("input[name='cemeteryPhoneNumber']")
.clear()
.type(cemeteryData.cemeteryPhoneNumber ?? '')
cy.get("input[name='cemeteryLatitude']")
.clear()
.type(cemeteryData.cemeteryLatitude?.toString() ?? '')
cy.get("input[name='cemeteryLongitude']")
.clear()
.type(cemeteryData.cemeteryLongitude?.toString() ?? '')
})
cy.log('Ensure the default city and province are used')
cy.get("input[name='cemeteryCity']").should(
'have.value',
getConfigProperty('settings.cemeteries.cityDefault')
)
cy.get("input[name='cemeteryProvince']").should(
'have.value',
getConfigProperty('settings.cemeteries.provinceDefault')
)
cy.log('Submit the form')
cy.get('#form--cemetery').submit()
cy.wait(1000)
cy.location('pathname')
.should('not.contain', '/new')
.should('contain', '/edit')
cy.fixture('cemetery.json').then((cemeteryData: Cemetery) => {
cy.get("input[name='cemeteryName']").should(
'have.value',
cemeteryData.cemeteryName
)
cy.get("textarea[name='cemeteryDescription']").should(
'have.value',
cemeteryData.cemeteryDescription
)
cy.get("input[name='cemeteryAddress1']").should(
'have.value',
cemeteryData.cemeteryAddress1
)
cy.get("input[name='cemeteryAddress2']").should(
'have.value',
cemeteryData.cemeteryAddress2
)
cy.get("input[name='cemeteryCity']").should(
'have.value',
getConfigProperty('settings.cemeteries.cityDefault')
)
cy.get("input[name='cemeteryProvince']").should(
'have.value',
getConfigProperty('settings.cemeteries.provinceDefault')
)
cy.get("input[name='cemeteryPostalCode']").should(
'have.value',
cemeteryData.cemeteryPostalCode
)
cy.get("input[name='cemeteryPhoneNumber']").should(
'have.value',
cemeteryData.cemeteryPhoneNumber
)
cy.get("input[name='cemeteryLatitude']").should(
'have.value',
cemeteryData.cemeteryLatitude?.toString()
)
cy.get("input[name='cemeteryLongitude']").should(
'have.value',
cemeteryData.cemeteryLongitude?.toString()
)
})
})
})

View File

@ -1,71 +0,0 @@
import { getConfigProperty } from '../../../helpers/config.helpers.js';
import { testUpdate } from '../../../test/_globals.js';
import { login, logout } from '../../support/index.js';
describe('Update - Maps', () => {
beforeEach('Loads page', () => {
logout();
login(testUpdate);
});
afterEach(logout);
it('Has a "Create" link on the Map Search', () => {
cy.visit('/maps');
cy.location('pathname').should('equal', '/maps');
cy.get("a[href$='/maps/new']").should('exist');
});
it('Creates a new map', () => {
cy.visit('/maps/new');
cy.log('Check the accessibility');
cy.injectAxe();
cy.checkA11y();
cy.log('Populate the fields');
// eslint-disable-next-line promise/catch-or-return, promise/always-return
cy.fixture('map.json').then((mapJSON) => {
cy.get("input[name='mapName']")
.clear()
.type(mapJSON.mapName ?? '');
cy.get("textarea[name='mapDescription']")
.clear()
.type(mapJSON.mapDescription ?? '');
cy.get("input[name='mapAddress1']")
.clear()
.type(mapJSON.mapAddress1 ?? '');
cy.get("input[name='mapAddress2']")
.clear()
.type(mapJSON.mapAddress2 ?? '');
cy.get("input[name='mapPostalCode']")
.clear()
.type(mapJSON.mapPostalCode ?? '');
cy.get("input[name='mapPhoneNumber']")
.clear()
.type(mapJSON.mapPhoneNumber ?? '');
cy.get("input[name='mapLatitude']")
.clear()
.type(mapJSON.mapLatitude?.toString() ?? '');
cy.get("input[name='mapLongitude']")
.clear()
.type(mapJSON.mapLongitude?.toString() ?? '');
});
cy.log('Ensure the default city and province are used');
cy.get("input[name='mapCity']").should('have.value', getConfigProperty('settings.map.mapCityDefault'));
cy.get("input[name='mapProvince']").should('have.value', getConfigProperty('settings.map.mapProvinceDefault'));
cy.log('Submit the form');
cy.get('#form--map').submit();
cy.wait(1000);
cy.location('pathname')
.should('not.contain', '/new')
.should('contain', '/edit');
// eslint-disable-next-line promise/catch-or-return, promise/always-return
cy.fixture('map.json').then((mapJSON) => {
cy.get("input[name='mapName']").should('have.value', mapJSON.mapName);
cy.get("textarea[name='mapDescription']").should('have.value', mapJSON.mapDescription);
cy.get("input[name='mapAddress1']").should('have.value', mapJSON.mapAddress1);
cy.get("input[name='mapAddress2']").should('have.value', mapJSON.mapAddress2);
cy.get("input[name='mapCity']").should('have.value', getConfigProperty('settings.map.mapCityDefault'));
cy.get("input[name='mapProvince']").should('have.value', getConfigProperty('settings.map.mapProvinceDefault'));
cy.get("input[name='mapPostalCode']").should('have.value', mapJSON.mapPostalCode);
cy.get("input[name='mapPhoneNumber']").should('have.value', mapJSON.mapPhoneNumber);
cy.get("input[name='mapLatitude']").should('have.value', mapJSON.mapLatitude?.toString());
cy.get("input[name='mapLongitude']").should('have.value', mapJSON.mapLongitude?.toString());
});
});
});

View File

@ -1,127 +0,0 @@
import { getConfigProperty } from '../../../helpers/config.helpers.js'
import { testUpdate } from '../../../test/_globals.js'
import type { MapRecord } from '../../../types/recordTypes.js'
import { login, logout } from '../../support/index.js'
describe('Update - Maps', () => {
beforeEach('Loads page', () => {
logout()
login(testUpdate)
})
afterEach(logout)
it('Has a "Create" link on the Map Search', () => {
cy.visit('/maps')
cy.location('pathname').should('equal', '/maps')
cy.get("a[href$='/maps/new']").should('exist')
})
it('Creates a new map', () => {
cy.visit('/maps/new')
cy.log('Check the accessibility')
cy.injectAxe()
cy.checkA11y()
cy.log('Populate the fields')
// eslint-disable-next-line promise/catch-or-return, promise/always-return
cy.fixture('map.json').then((mapJSON: MapRecord) => {
cy.get("input[name='mapName']")
.clear()
.type(mapJSON.mapName ?? '')
cy.get("textarea[name='mapDescription']")
.clear()
.type(mapJSON.mapDescription ?? '')
cy.get("input[name='mapAddress1']")
.clear()
.type(mapJSON.mapAddress1 ?? '')
cy.get("input[name='mapAddress2']")
.clear()
.type(mapJSON.mapAddress2 ?? '')
cy.get("input[name='mapPostalCode']")
.clear()
.type(mapJSON.mapPostalCode ?? '')
cy.get("input[name='mapPhoneNumber']")
.clear()
.type(mapJSON.mapPhoneNumber ?? '')
cy.get("input[name='mapLatitude']")
.clear()
.type(mapJSON.mapLatitude?.toString() ?? '')
cy.get("input[name='mapLongitude']")
.clear()
.type(mapJSON.mapLongitude?.toString() ?? '')
})
cy.log('Ensure the default city and province are used')
cy.get("input[name='mapCity']").should(
'have.value',
getConfigProperty('settings.map.mapCityDefault')
)
cy.get("input[name='mapProvince']").should(
'have.value',
getConfigProperty('settings.map.mapProvinceDefault')
)
cy.log('Submit the form')
cy.get('#form--map').submit()
cy.wait(1000)
cy.location('pathname')
.should('not.contain', '/new')
.should('contain', '/edit')
// eslint-disable-next-line promise/catch-or-return, promise/always-return
cy.fixture('map.json').then((mapJSON: MapRecord) => {
cy.get("input[name='mapName']").should('have.value', mapJSON.mapName)
cy.get("textarea[name='mapDescription']").should(
'have.value',
mapJSON.mapDescription
)
cy.get("input[name='mapAddress1']").should(
'have.value',
mapJSON.mapAddress1
)
cy.get("input[name='mapAddress2']").should(
'have.value',
mapJSON.mapAddress2
)
cy.get("input[name='mapCity']").should(
'have.value',
getConfigProperty('settings.map.mapCityDefault')
)
cy.get("input[name='mapProvince']").should(
'have.value',
getConfigProperty('settings.map.mapProvinceDefault')
)
cy.get("input[name='mapPostalCode']").should(
'have.value',
mapJSON.mapPostalCode
)
cy.get("input[name='mapPhoneNumber']").should(
'have.value',
mapJSON.mapPhoneNumber
)
cy.get("input[name='mapLatitude']").should(
'have.value',
mapJSON.mapLatitude?.toString()
)
cy.get("input[name='mapLongitude']").should(
'have.value',
mapJSON.mapLongitude?.toString()
)
})
})
})

View File

@ -0,0 +1,10 @@
{
"cemeteryName": "Cypress Test - Holy Sepulchre",
"cemeteryDescription": "Operated by the City of Sault Ste. Marie",
"cemeteryAddress1": "Fourth Line and Peoples Road",
"cemeteryAddress2": "27 Fourth Line East",
"cemeteryPostalCode": "P6A 5K8",
"cemeteryPhoneNumber": "705-759-5336",
"cemeteryLatitude": 46.56874795,
"cemeteryLongitude": -84.34842824
}

View File

@ -1,10 +0,0 @@
{
"mapName": "Cypress Test - Holy Sepulchre",
"mapDescription": "Operated by the City of Sault Ste. Marie",
"mapAddress1": "Fourth Line and Peoples Road",
"mapAddress2": "27 Fourth Line East",
"mapPostalCode": "P6A 5K8",
"mapPhoneNumber": "705-759-5336",
"mapLatitude": 46.56874795,
"mapLongitude": -84.34842824
}

View File

@ -24,15 +24,12 @@ export declare const configDefaultValues: {
'aliases.externalReceiptNumber': string; 'aliases.externalReceiptNumber': string;
'aliases.workOrderOpenDate': string; 'aliases.workOrderOpenDate': string;
'aliases.workOrderCloseDate': string; 'aliases.workOrderCloseDate': string;
'settings.map.mapCityDefault': string; 'settings.cemeteries.cityDefault': string;
'settings.map.mapProvinceDefault': string; 'settings.cemeteries.provinceDefault': string;
'settings.lot.lotNamePattern': RegExp | undefined; 'settings.contracts.burialSiteIdIsRequired': boolean;
'settings.lot.lotNameHelpText': string; 'settings.contracts.cityDefault': string;
'settings.lot.lotNameSortNameFunction': (lotName: string) => string; 'settings.contracts.provinceDefault': string;
'settings.lotOccupancy.occupancyEndDateIsRequired': boolean; 'settings.contracts.prints': string[];
'settings.lotOccupancy.occupantCityDefault': string;
'settings.lotOccupancy.occupantProvinceDefault': string;
'settings.lotOccupancy.prints': string[];
'settings.fees.taxPercentageDefault': number; 'settings.fees.taxPercentageDefault': number;
'settings.workOrders.workOrderNumberLength': number; 'settings.workOrders.workOrderNumberLength': number;
'settings.workOrders.workOrderMilestoneDateRecentBeforeDays': number; 'settings.workOrders.workOrderMilestoneDateRecentBeforeDays': number;

View File

@ -23,16 +23,12 @@ export const configDefaultValues = {
'aliases.externalReceiptNumber': 'External Receipt Number', 'aliases.externalReceiptNumber': 'External Receipt Number',
'aliases.workOrderOpenDate': 'Order Date', 'aliases.workOrderOpenDate': 'Order Date',
'aliases.workOrderCloseDate': 'Completion Date', 'aliases.workOrderCloseDate': 'Completion Date',
'settings.map.mapCityDefault': '', 'settings.cemeteries.cityDefault': '',
'settings.map.mapProvinceDefault': '', 'settings.cemeteries.provinceDefault': '',
'settings.lot.lotNamePattern': undefined, 'settings.contracts.burialSiteIdIsRequired': true,
'settings.lot.lotNameHelpText': '', 'settings.contracts.cityDefault': '',
'settings.lot.lotNameSortNameFunction': (lotName) => lotName, 'settings.contracts.provinceDefault': '',
// eslint-disable-next-line no-secrets/no-secrets 'settings.contracts.prints': ['screen/contract'],
'settings.lotOccupancy.occupancyEndDateIsRequired': true,
'settings.lotOccupancy.occupantCityDefault': '',
'settings.lotOccupancy.occupantProvinceDefault': '',
'settings.lotOccupancy.prints': ['screen/lotOccupancy'],
'settings.fees.taxPercentageDefault': 0, 'settings.fees.taxPercentageDefault': 0,
'settings.workOrders.workOrderNumberLength': 6, 'settings.workOrders.workOrderNumberLength': 6,
'settings.workOrders.workOrderMilestoneDateRecentBeforeDays': 5, 'settings.workOrders.workOrderMilestoneDateRecentBeforeDays': 5,

View File

@ -38,17 +38,13 @@ export const configDefaultValues = {
'aliases.workOrderOpenDate': 'Order Date', 'aliases.workOrderOpenDate': 'Order Date',
'aliases.workOrderCloseDate': 'Completion Date', 'aliases.workOrderCloseDate': 'Completion Date',
'settings.map.mapCityDefault': '', 'settings.cemeteries.cityDefault': '',
'settings.map.mapProvinceDefault': '', 'settings.cemeteries.provinceDefault': '',
'settings.lot.lotNamePattern': undefined as RegExp | undefined, 'settings.contracts.burialSiteIdIsRequired': true,
'settings.lot.lotNameHelpText': '', 'settings.contracts.cityDefault': '',
'settings.lot.lotNameSortNameFunction': (lotName: string) => lotName, 'settings.contracts.provinceDefault': '',
// eslint-disable-next-line no-secrets/no-secrets 'settings.contracts.prints': ['screen/contract'],
'settings.lotOccupancy.occupancyEndDateIsRequired': true,
'settings.lotOccupancy.occupantCityDefault': '',
'settings.lotOccupancy.occupantProvinceDefault': '',
'settings.lotOccupancy.prints': ['screen/lotOccupancy'],
'settings.fees.taxPercentageDefault': 0, 'settings.fees.taxPercentageDefault': 0,

View File

@ -1,12 +1,16 @@
export interface AddLotForm { export interface AddBurialSiteForm {
lotName: string; burialSiteNameSegment1: string;
lotTypeId: string | number; burialSiteNameSegment2?: string;
lotStatusId: string | number; burialSiteNameSegment3?: string;
mapId: string | number; burialSiteNameSegment4?: string;
mapKey: string; burialSiteNameSegment5?: string;
lotLatitude: string; burialSiteTypeId: string | number;
lotLongitude: string; burialSiteStatusId: string | number;
lotTypeFieldIds?: string; cemeteryId: string | number;
[lotFieldValue_lotTypeFieldId: string]: unknown; cemeterySvgId: string;
burialSiteLatitude: string;
burialSiteLongitude: string;
burialSiteTypeFieldIds?: string;
[fieldValue_burialSiteTypeFieldId: string]: unknown;
} }
export default function addLot(lotForm: AddLotForm, user: User): Promise<number>; export default function addLot(burialSiteForm: AddBurialSiteForm, user: User): Promise<number>;

View File

@ -1,29 +1,37 @@
import addOrUpdateLotField from './addOrUpdateLotField.js'; import addOrUpdateBurialSiteField from './addOrUpdateBurialSiteField.js';
import { acquireConnection } from './pool.js'; import { acquireConnection } from './pool.js';
export default async function addLot(lotForm, user) { export default async function addLot(burialSiteForm, user) {
const database = await acquireConnection(); const database = await acquireConnection();
const rightNowMillis = Date.now(); const rightNowMillis = Date.now();
const result = database const result = database
.prepare(`insert into Lots ( .prepare(`insert into BurialSites (
lotName, lotTypeId, lotStatusId, burialSiteNameSegment1,
mapId, mapKey, burialSiteNameSegment2,
lotLatitude, lotLongitude, burialSiteNameSegment3,
burialSiteNameSegment4,
burialSiteNameSegment5,
burialSiteTypeId, burialSiteStatusId,
cemeteryId, cemeterySvgId,
burialSiteLatitude, burialSiteLongitude,
recordCreate_userName, recordCreate_timeMillis, recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis) recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`) values (?,
.run(lotForm.lotName, lotForm.lotTypeId, lotForm.lotStatusId === '' ? undefined : lotForm.lotStatusId, lotForm.mapId === '' ? undefined : lotForm.mapId, lotForm.mapKey, lotForm.lotLatitude === '' ? undefined : lotForm.lotLatitude, lotForm.lotLongitude === '' ? undefined : lotForm.lotLongitude, user.userName, rightNowMillis, user.userName, rightNowMillis); ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
const lotId = result.lastInsertRowid; ?, ?, ?, ?)`)
const lotTypeFieldIds = (lotForm.lotTypeFieldIds ?? '').split(','); .run(burialSiteForm.burialSiteNameSegment1, burialSiteForm.burialSiteNameSegment2 ?? '', burialSiteForm.burialSiteNameSegment3 ?? '', burialSiteForm.burialSiteNameSegment4 ?? '', burialSiteForm.burialSiteNameSegment5 ?? '', burialSiteForm.burialSiteTypeId, burialSiteForm.burialSiteStatusId === '' ? undefined : burialSiteForm.burialSiteStatusId, burialSiteForm.cemeteryId === '' ? undefined : burialSiteForm.cemeteryId, burialSiteForm.cemeterySvgId, burialSiteForm.burialSiteLatitude === '' ? undefined : burialSiteForm.burialSiteLatitude, burialSiteForm.burialSiteLongitude === '' ? undefined : burialSiteForm.burialSiteLongitude, user.userName, rightNowMillis, user.userName, rightNowMillis);
for (const lotTypeFieldId of lotTypeFieldIds) { const burialSiteId = result.lastInsertRowid;
const lotFieldValue = lotForm[`lotFieldValue_${lotTypeFieldId}`]; const burialSiteTypeFieldIds = (burialSiteForm.burialSiteTypeFieldIds ?? '').split(',');
if ((lotFieldValue ?? '') !== '') { for (const burialSiteTypeFieldId of burialSiteTypeFieldIds) {
await addOrUpdateLotField({ const fieldValue = burialSiteForm[`burialSiteFieldValue_${burialSiteTypeFieldId}`];
lotId, if ((fieldValue ?? '') !== '') {
lotTypeFieldId, await addOrUpdateBurialSiteField({
lotFieldValue: lotFieldValue ?? '' burialSiteId,
burialSiteTypeFieldId,
fieldValue: fieldValue ?? ''
}, user, database); }, user, database);
} }
} }
database.release(); database.release();
return lotId; return burialSiteId;
} }

View File

@ -1,23 +1,28 @@
import addOrUpdateLotField from './addOrUpdateLotField.js' import addOrUpdateBurialSiteField from './addOrUpdateBurialSiteField.js'
import { acquireConnection } from './pool.js' import { acquireConnection } from './pool.js'
export interface AddLotForm { export interface AddBurialSiteForm {
lotName: string burialSiteNameSegment1: string
lotTypeId: string | number burialSiteNameSegment2?: string
lotStatusId: string | number burialSiteNameSegment3?: string
burialSiteNameSegment4?: string
burialSiteNameSegment5?: string
mapId: string | number burialSiteTypeId: string | number
mapKey: string burialSiteStatusId: string | number
lotLatitude: string cemeteryId: string | number
lotLongitude: string cemeterySvgId: string
lotTypeFieldIds?: string burialSiteLatitude: string
[lotFieldValue_lotTypeFieldId: string]: unknown burialSiteLongitude: string
burialSiteTypeFieldIds?: string
[fieldValue_burialSiteTypeFieldId: string]: unknown
} }
export default async function addLot( export default async function addLot(
lotForm: AddLotForm, burialSiteForm: AddBurialSiteForm,
user: User user: User
): Promise<number> { ): Promise<number> {
const database = await acquireConnection() const database = await acquireConnection()
@ -26,41 +31,53 @@ export default async function addLot(
const result = database const result = database
.prepare( .prepare(
`insert into Lots ( `insert into BurialSites (
lotName, lotTypeId, lotStatusId, burialSiteNameSegment1,
mapId, mapKey, burialSiteNameSegment2,
lotLatitude, lotLongitude, burialSiteNameSegment3,
burialSiteNameSegment4,
burialSiteNameSegment5,
burialSiteTypeId, burialSiteStatusId,
cemeteryId, cemeterySvgId,
burialSiteLatitude, burialSiteLongitude,
recordCreate_userName, recordCreate_timeMillis, recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis) recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)` values (?,
?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?)`
) )
.run( .run(
lotForm.lotName, burialSiteForm.burialSiteNameSegment1,
lotForm.lotTypeId, burialSiteForm.burialSiteNameSegment2 ?? '',
lotForm.lotStatusId === '' ? undefined : lotForm.lotStatusId, burialSiteForm.burialSiteNameSegment3 ?? '',
lotForm.mapId === '' ? undefined : lotForm.mapId, burialSiteForm.burialSiteNameSegment4 ?? '',
lotForm.mapKey, burialSiteForm.burialSiteNameSegment5 ?? '',
lotForm.lotLatitude === '' ? undefined : lotForm.lotLatitude, burialSiteForm.burialSiteTypeId,
lotForm.lotLongitude === '' ? undefined : lotForm.lotLongitude, burialSiteForm.burialSiteStatusId === '' ? undefined : burialSiteForm.burialSiteStatusId,
burialSiteForm.cemeteryId === '' ? undefined : burialSiteForm.cemeteryId,
burialSiteForm.cemeterySvgId,
burialSiteForm.burialSiteLatitude === '' ? undefined : burialSiteForm.burialSiteLatitude,
burialSiteForm.burialSiteLongitude === '' ? undefined : burialSiteForm.burialSiteLongitude,
user.userName, user.userName,
rightNowMillis, rightNowMillis,
user.userName, user.userName,
rightNowMillis rightNowMillis
) )
const lotId = result.lastInsertRowid as number const burialSiteId = result.lastInsertRowid as number
const lotTypeFieldIds = (lotForm.lotTypeFieldIds ?? '').split(',') const burialSiteTypeFieldIds = (burialSiteForm.burialSiteTypeFieldIds ?? '').split(',')
for (const lotTypeFieldId of lotTypeFieldIds) { for (const burialSiteTypeFieldId of burialSiteTypeFieldIds) {
const lotFieldValue = lotForm[`lotFieldValue_${lotTypeFieldId}`] as string | undefined const fieldValue = burialSiteForm[`burialSiteFieldValue_${burialSiteTypeFieldId}`] as string | undefined
if ((lotFieldValue ?? '') !== '') { if ((fieldValue ?? '') !== '') {
await addOrUpdateLotField( await addOrUpdateBurialSiteField(
{ {
lotId, burialSiteId,
lotTypeFieldId, burialSiteTypeFieldId,
lotFieldValue: lotFieldValue ?? '' fieldValue: fieldValue ?? ''
}, },
user, user,
database database
@ -70,5 +87,5 @@ export default async function addLot(
database.release() database.release()
return lotId return burialSiteId
} }

View File

@ -0,0 +1,21 @@
import type { PoolConnection } from 'better-sqlite-pool';
export interface AddBurialSiteContractForm {
contractTypeId: string | number;
burialSiteId: string | number;
contractStartDateString: string;
contractEndDateString: string;
contractTypeFieldIds?: string;
[fieldValue_contractTypeFieldId: string]: unknown;
lotOccupantTypeId?: string;
occupantName?: string;
occupantFamilyName?: string;
occupantAddress1?: string;
occupantAddress2?: string;
occupantCity?: string;
occupantProvince?: string;
occupantPostalCode?: string;
occupantPhoneNumber?: string;
occupantEmailAddress?: string;
occupantComment?: string;
}
export default function addLotOccupancy(addForm: AddBurialSiteContractForm, user: User, connectedDatabase?: PoolConnection): Promise<number>;

View File

@ -0,0 +1,54 @@
import { dateStringToInteger } from '@cityssm/utils-datetime';
import addLotOccupancyOccupant from './addLotOccupancyOccupant.js';
import addOrUpdateBurialSiteContractField from './addOrUpdateBurialSiteContractField.js';
import { acquireConnection } from './pool.js';
export default async function addLotOccupancy(addForm, user, connectedDatabase) {
const database = connectedDatabase ?? (await acquireConnection());
const rightNowMillis = Date.now();
const contractStartDate = dateStringToInteger(addForm.contractStartDateString);
if (contractStartDate <= 0) {
console.error(addForm);
}
const result = database
.prepare(`insert into BurialSiteContracts (
contractTypeId, lotId,
contractStartDate, contractEndDate,
recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?, ?)`)
.run(addForm.contractTypeId, addForm.burialSiteId === '' ? undefined : addForm.burialSiteId, contractStartDate, addForm.contractEndDateString === ''
? undefined
: dateStringToInteger(addForm.contractEndDateString), user.userName, rightNowMillis, user.userName, rightNowMillis);
const burialSiteContractId = result.lastInsertRowid;
const contractTypeFieldIds = (addForm.contractTypeFieldIds ?? '').split(',');
for (const contractTypeFieldId of contractTypeFieldIds) {
const lotOccupancyFieldValue = addForm[`lotOccupancyFieldValue_${contractTypeFieldId}`];
if ((lotOccupancyFieldValue ?? '') !== '') {
await addOrUpdateBurialSiteContractField({
burialSiteContractId,
contractTypeFieldId,
lotOccupancyFieldValue: lotOccupancyFieldValue ?? ''
}, user, database);
}
}
if ((addForm.lotOccupantTypeId ?? '') !== '') {
await addLotOccupancyOccupant({
burialSiteContractId,
lotOccupantTypeId: addForm.lotOccupantTypeId ?? '',
occupantName: addForm.occupantName ?? '',
occupantFamilyName: addForm.occupantFamilyName ?? '',
occupantAddress1: addForm.occupantAddress1 ?? '',
occupantAddress2: addForm.occupantAddress2 ?? '',
occupantCity: addForm.occupantCity ?? '',
occupantProvince: addForm.occupantProvince ?? '',
occupantPostalCode: addForm.occupantPostalCode ?? '',
occupantPhoneNumber: addForm.occupantPhoneNumber ?? '',
occupantEmailAddress: addForm.occupantEmailAddress ?? '',
occupantComment: addForm.occupantComment ?? ''
}, user, database);
}
if (connectedDatabase === undefined) {
database.release();
}
return burialSiteContractId;
}

View File

@ -0,0 +1,122 @@
import { type DateString, dateStringToInteger } from '@cityssm/utils-datetime'
import type { PoolConnection } from 'better-sqlite-pool'
import addLotOccupancyOccupant from './addLotOccupancyOccupant.js'
import addOrUpdateBurialSiteContractField from './addOrUpdateBurialSiteContractField.js'
import { acquireConnection } from './pool.js'
export interface AddBurialSiteContractForm {
contractTypeId: string | number
burialSiteId: string | number
contractStartDateString: string
contractEndDateString: string
contractTypeFieldIds?: string
[fieldValue_contractTypeFieldId: string]: unknown
lotOccupantTypeId?: string
occupantName?: string
occupantFamilyName?: string
occupantAddress1?: string
occupantAddress2?: string
occupantCity?: string
occupantProvince?: string
occupantPostalCode?: string
occupantPhoneNumber?: string
occupantEmailAddress?: string
occupantComment?: string
}
export default async function addLotOccupancy(
addForm: AddBurialSiteContractForm,
user: User,
connectedDatabase?: PoolConnection
): Promise<number> {
const database = connectedDatabase ?? (await acquireConnection())
const rightNowMillis = Date.now()
const contractStartDate = dateStringToInteger(
addForm.contractStartDateString as DateString
)
if (contractStartDate <= 0) {
console.error(addForm)
}
const result = database
.prepare(
`insert into BurialSiteContracts (
contractTypeId, lotId,
contractStartDate, contractEndDate,
recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?, ?)`
)
.run(
addForm.contractTypeId,
addForm.burialSiteId === '' ? undefined : addForm.burialSiteId,
contractStartDate,
addForm.contractEndDateString === ''
? undefined
: dateStringToInteger(
addForm.contractEndDateString as DateString
),
user.userName,
rightNowMillis,
user.userName,
rightNowMillis
)
const burialSiteContractId = result.lastInsertRowid as number
const contractTypeFieldIds = (
addForm.contractTypeFieldIds ?? ''
).split(',')
for (const contractTypeFieldId of contractTypeFieldIds) {
const lotOccupancyFieldValue = addForm[
`lotOccupancyFieldValue_${contractTypeFieldId}`
] as string | undefined
if ((lotOccupancyFieldValue ?? '') !== '') {
await addOrUpdateBurialSiteContractField(
{
burialSiteContractId,
contractTypeFieldId,
lotOccupancyFieldValue: lotOccupancyFieldValue ?? ''
},
user,
database
)
}
}
if ((addForm.lotOccupantTypeId ?? '') !== '') {
await addLotOccupancyOccupant(
{
burialSiteContractId,
lotOccupantTypeId: addForm.lotOccupantTypeId ?? '',
occupantName: addForm.occupantName ?? '',
occupantFamilyName: addForm.occupantFamilyName ?? '',
occupantAddress1: addForm.occupantAddress1 ?? '',
occupantAddress2: addForm.occupantAddress2 ?? '',
occupantCity: addForm.occupantCity ?? '',
occupantProvince: addForm.occupantProvince ?? '',
occupantPostalCode: addForm.occupantPostalCode ?? '',
occupantPhoneNumber: addForm.occupantPhoneNumber ?? '',
occupantEmailAddress: addForm.occupantEmailAddress ?? '',
occupantComment: addForm.occupantComment ?? ''
},
user,
database
)
}
if (connectedDatabase === undefined) {
database.release()
}
return burialSiteContractId
}

View File

@ -0,0 +1,9 @@
import type { PoolConnection } from 'better-sqlite-pool';
export interface AddBurialSiteContractFeeForm {
burialSiteContractId: number | string;
feeId: number | string;
quantity: number | string;
feeAmount?: number | string;
taxAmount?: number | string;
}
export default function addBurialSiteContractFee(addFeeForm: AddBurialSiteContractFeeForm, user: User, connectedDatabase?: PoolConnection): Promise<boolean>;

View File

@ -1,84 +1,84 @@
import { calculateFeeAmount, calculateTaxAmount } from '../helpers/functions.fee.js'; import { calculateFeeAmount, calculateTaxAmount } from '../helpers/functions.fee.js';
import getBurialSiteContract from './getBurialSiteContract.js';
import getFee from './getFee.js'; import getFee from './getFee.js';
import getLotOccupancy from './getLotOccupancy.js';
import { acquireConnection } from './pool.js'; import { acquireConnection } from './pool.js';
export default async function addLotOccupancyFee(lotOccupancyFeeForm, user, connectedDatabase) { export default async function addBurialSiteContractFee(addFeeForm, user, connectedDatabase) {
const database = connectedDatabase ?? (await acquireConnection()); const database = connectedDatabase ?? (await acquireConnection());
const rightNowMillis = Date.now(); const rightNowMillis = Date.now();
// Calculate fee and tax (if not set) // Calculate fee and tax (if not set)
let feeAmount; let feeAmount;
let taxAmount; let taxAmount;
if ((lotOccupancyFeeForm.feeAmount ?? '') === '') { if ((addFeeForm.feeAmount ?? '') === '') {
const lotOccupancy = (await getLotOccupancy(lotOccupancyFeeForm.lotOccupancyId)); const lotOccupancy = (await getBurialSiteContract(addFeeForm.burialSiteContractId));
const fee = (await getFee(lotOccupancyFeeForm.feeId)); const fee = (await getFee(addFeeForm.feeId));
feeAmount = calculateFeeAmount(fee, lotOccupancy); feeAmount = calculateFeeAmount(fee, lotOccupancy);
taxAmount = calculateTaxAmount(fee, feeAmount); taxAmount = calculateTaxAmount(fee, feeAmount);
} }
else { else {
feeAmount = feeAmount =
typeof lotOccupancyFeeForm.feeAmount === 'string' typeof addFeeForm.feeAmount === 'string'
? Number.parseFloat(lotOccupancyFeeForm.feeAmount) ? Number.parseFloat(addFeeForm.feeAmount)
: 0; : 0;
taxAmount = taxAmount =
typeof lotOccupancyFeeForm.taxAmount === 'string' typeof addFeeForm.taxAmount === 'string'
? Number.parseFloat(lotOccupancyFeeForm.taxAmount) ? Number.parseFloat(addFeeForm.taxAmount)
: 0; : 0;
} }
try { try {
// Check if record already exists // Check if record already exists
const record = database const record = database
.prepare(`select feeAmount, taxAmount, recordDelete_timeMillis .prepare(`select feeAmount, taxAmount, recordDelete_timeMillis
from LotOccupancyFees from BurialSiteContractFees
where lotOccupancyId = ? where burialSiteContractId = ?
and feeId = ?`) and feeId = ?`)
.get(lotOccupancyFeeForm.lotOccupancyId, lotOccupancyFeeForm.feeId); .get(addFeeForm.burialSiteContractId, addFeeForm.feeId);
if (record !== undefined) { if (record !== undefined) {
if (record.recordDelete_timeMillis !== null) { if (record.recordDelete_timeMillis !== null) {
database database
.prepare(`delete from LotOccupancyFees .prepare(`delete from BurialSiteContractFees
where recordDelete_timeMillis is not null where recordDelete_timeMillis is not null
and lotOccupancyId = ? and burialSiteContractId = ?
and feeId = ?`) and feeId = ?`)
.run(lotOccupancyFeeForm.lotOccupancyId, lotOccupancyFeeForm.feeId); .run(addFeeForm.burialSiteContractId, addFeeForm.feeId);
} }
else if (record.feeAmount === feeAmount && else if (record.feeAmount === feeAmount &&
record.taxAmount === taxAmount) { record.taxAmount === taxAmount) {
database database
.prepare(`update LotOccupancyFees .prepare(`update BurialSiteContractFees
set quantity = quantity + ?, set quantity = quantity + ?,
recordUpdate_userName = ?, recordUpdate_userName = ?,
recordUpdate_timeMillis = ? recordUpdate_timeMillis = ?
where lotOccupancyId = ? where burialSiteContractId = ?
and feeId = ?`) and feeId = ?`)
.run(lotOccupancyFeeForm.quantity, user.userName, rightNowMillis, lotOccupancyFeeForm.lotOccupancyId, lotOccupancyFeeForm.feeId); .run(addFeeForm.quantity, user.userName, rightNowMillis, addFeeForm.burialSiteContractId, addFeeForm.feeId);
return true; return true;
} }
else { else {
const quantity = typeof lotOccupancyFeeForm.quantity === 'string' const quantity = typeof addFeeForm.quantity === 'string'
? Number.parseFloat(lotOccupancyFeeForm.quantity) ? Number.parseFloat(addFeeForm.quantity)
: lotOccupancyFeeForm.quantity; : addFeeForm.quantity;
database database
.prepare(`update LotOccupancyFees .prepare(`update BurialSiteContractFees
set feeAmount = (feeAmount * quantity) + ?, set feeAmount = (feeAmount * quantity) + ?,
taxAmount = (taxAmount * quantity) + ?, taxAmount = (taxAmount * quantity) + ?,
quantity = 1, quantity = 1,
recordUpdate_userName = ?, recordUpdate_userName = ?,
recordUpdate_timeMillis = ? recordUpdate_timeMillis = ?
where lotOccupancyId = ? where burialSiteContractId = ?
and feeId = ?`) and feeId = ?`)
.run(feeAmount * quantity, taxAmount * quantity, user.userName, rightNowMillis, lotOccupancyFeeForm.lotOccupancyId, lotOccupancyFeeForm.feeId); .run(feeAmount * quantity, taxAmount * quantity, user.userName, rightNowMillis, addFeeForm.burialSiteContractId, addFeeForm.feeId);
return true; return true;
} }
} }
// Create new record // Create new record
const result = database const result = database
.prepare(`insert into LotOccupancyFees ( .prepare(`insert into BurialSiteContractFees (
lotOccupancyId, feeId, burialSiteContractId, feeId,
quantity, feeAmount, taxAmount, quantity, feeAmount, taxAmount,
recordCreate_userName, recordCreate_timeMillis, recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis) recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?, ?, ?)`) values (?, ?, ?, ?, ?, ?, ?, ?, ?)`)
.run(lotOccupancyFeeForm.lotOccupancyId, lotOccupancyFeeForm.feeId, lotOccupancyFeeForm.quantity, feeAmount, taxAmount, user.userName, rightNowMillis, user.userName, rightNowMillis); .run(addFeeForm.burialSiteContractId, addFeeForm.feeId, addFeeForm.quantity, feeAmount, taxAmount, user.userName, rightNowMillis, user.userName, rightNowMillis);
return result.changes > 0; return result.changes > 0;
} }
finally { finally {

View File

@ -4,22 +4,22 @@ import {
calculateFeeAmount, calculateFeeAmount,
calculateTaxAmount calculateTaxAmount
} from '../helpers/functions.fee.js' } from '../helpers/functions.fee.js'
import type { Fee, LotOccupancy } from '../types/recordTypes.js' import type { BurialSiteContract, Fee } from '../types/recordTypes.js'
import getBurialSiteContract from './getBurialSiteContract.js'
import getFee from './getFee.js' import getFee from './getFee.js'
import getLotOccupancy from './getLotOccupancy.js'
import { acquireConnection } from './pool.js' import { acquireConnection } from './pool.js'
export interface AddLotOccupancyFeeForm { export interface AddBurialSiteContractFeeForm {
lotOccupancyId: number | string burialSiteContractId: number | string
feeId: number | string feeId: number | string
quantity: number | string quantity: number | string
feeAmount?: number | string feeAmount?: number | string
taxAmount?: number | string taxAmount?: number | string
} }
export default async function addLotOccupancyFee( export default async function addBurialSiteContractFee(
lotOccupancyFeeForm: AddLotOccupancyFeeForm, addFeeForm: AddBurialSiteContractFeeForm,
user: User, user: User,
connectedDatabase?: PoolConnection connectedDatabase?: PoolConnection
): Promise<boolean> { ): Promise<boolean> {
@ -31,23 +31,23 @@ export default async function addLotOccupancyFee(
let feeAmount: number let feeAmount: number
let taxAmount: number let taxAmount: number
if ((lotOccupancyFeeForm.feeAmount ?? '') === '') { if ((addFeeForm.feeAmount ?? '') === '') {
const lotOccupancy = (await getLotOccupancy( const lotOccupancy = (await getBurialSiteContract(
lotOccupancyFeeForm.lotOccupancyId addFeeForm.burialSiteContractId
)) as LotOccupancy )) as BurialSiteContract
const fee = (await getFee(lotOccupancyFeeForm.feeId)) as Fee const fee = (await getFee(addFeeForm.feeId)) as Fee
feeAmount = calculateFeeAmount(fee, lotOccupancy) feeAmount = calculateFeeAmount(fee, lotOccupancy)
taxAmount = calculateTaxAmount(fee, feeAmount) taxAmount = calculateTaxAmount(fee, feeAmount)
} else { } else {
feeAmount = feeAmount =
typeof lotOccupancyFeeForm.feeAmount === 'string' typeof addFeeForm.feeAmount === 'string'
? Number.parseFloat(lotOccupancyFeeForm.feeAmount) ? Number.parseFloat(addFeeForm.feeAmount)
: 0 : 0
taxAmount = taxAmount =
typeof lotOccupancyFeeForm.taxAmount === 'string' typeof addFeeForm.taxAmount === 'string'
? Number.parseFloat(lotOccupancyFeeForm.taxAmount) ? Number.parseFloat(addFeeForm.taxAmount)
: 0 : 0
} }
@ -56,11 +56,11 @@ export default async function addLotOccupancyFee(
const record = database const record = database
.prepare( .prepare(
`select feeAmount, taxAmount, recordDelete_timeMillis `select feeAmount, taxAmount, recordDelete_timeMillis
from LotOccupancyFees from BurialSiteContractFees
where lotOccupancyId = ? where burialSiteContractId = ?
and feeId = ?` and feeId = ?`
) )
.get(lotOccupancyFeeForm.lotOccupancyId, lotOccupancyFeeForm.feeId) as .get(addFeeForm.burialSiteContractId, addFeeForm.feeId) as
| { | {
feeAmount: number | null feeAmount: number | null
taxAmount: number | null taxAmount: number | null
@ -72,49 +72,49 @@ export default async function addLotOccupancyFee(
if (record.recordDelete_timeMillis !== null) { if (record.recordDelete_timeMillis !== null) {
database database
.prepare( .prepare(
`delete from LotOccupancyFees `delete from BurialSiteContractFees
where recordDelete_timeMillis is not null where recordDelete_timeMillis is not null
and lotOccupancyId = ? and burialSiteContractId = ?
and feeId = ?` and feeId = ?`
) )
.run(lotOccupancyFeeForm.lotOccupancyId, lotOccupancyFeeForm.feeId) .run(addFeeForm.burialSiteContractId, addFeeForm.feeId)
} else if ( } else if (
record.feeAmount === feeAmount && record.feeAmount === feeAmount &&
record.taxAmount === taxAmount record.taxAmount === taxAmount
) { ) {
database database
.prepare( .prepare(
`update LotOccupancyFees `update BurialSiteContractFees
set quantity = quantity + ?, set quantity = quantity + ?,
recordUpdate_userName = ?, recordUpdate_userName = ?,
recordUpdate_timeMillis = ? recordUpdate_timeMillis = ?
where lotOccupancyId = ? where burialSiteContractId = ?
and feeId = ?` and feeId = ?`
) )
.run( .run(
lotOccupancyFeeForm.quantity, addFeeForm.quantity,
user.userName, user.userName,
rightNowMillis, rightNowMillis,
lotOccupancyFeeForm.lotOccupancyId, addFeeForm.burialSiteContractId,
lotOccupancyFeeForm.feeId addFeeForm.feeId
) )
return true return true
} else { } else {
const quantity = const quantity =
typeof lotOccupancyFeeForm.quantity === 'string' typeof addFeeForm.quantity === 'string'
? Number.parseFloat(lotOccupancyFeeForm.quantity) ? Number.parseFloat(addFeeForm.quantity)
: lotOccupancyFeeForm.quantity : addFeeForm.quantity
database database
.prepare( .prepare(
`update LotOccupancyFees `update BurialSiteContractFees
set feeAmount = (feeAmount * quantity) + ?, set feeAmount = (feeAmount * quantity) + ?,
taxAmount = (taxAmount * quantity) + ?, taxAmount = (taxAmount * quantity) + ?,
quantity = 1, quantity = 1,
recordUpdate_userName = ?, recordUpdate_userName = ?,
recordUpdate_timeMillis = ? recordUpdate_timeMillis = ?
where lotOccupancyId = ? where burialSiteContractId = ?
and feeId = ?` and feeId = ?`
) )
.run( .run(
@ -122,8 +122,8 @@ export default async function addLotOccupancyFee(
taxAmount * quantity, taxAmount * quantity,
user.userName, user.userName,
rightNowMillis, rightNowMillis,
lotOccupancyFeeForm.lotOccupancyId, addFeeForm.burialSiteContractId,
lotOccupancyFeeForm.feeId addFeeForm.feeId
) )
return true return true
@ -133,17 +133,17 @@ export default async function addLotOccupancyFee(
// Create new record // Create new record
const result = database const result = database
.prepare( .prepare(
`insert into LotOccupancyFees ( `insert into BurialSiteContractFees (
lotOccupancyId, feeId, burialSiteContractId, feeId,
quantity, feeAmount, taxAmount, quantity, feeAmount, taxAmount,
recordCreate_userName, recordCreate_timeMillis, recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis) recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?, ?, ?)` values (?, ?, ?, ?, ?, ?, ?, ?, ?)`
) )
.run( .run(
lotOccupancyFeeForm.lotOccupancyId, addFeeForm.burialSiteContractId,
lotOccupancyFeeForm.feeId, addFeeForm.feeId,
lotOccupancyFeeForm.quantity, addFeeForm.quantity,
feeAmount, feeAmount,
taxAmount, taxAmount,
user.userName, user.userName,

View File

@ -0,0 +1,5 @@
export interface AddBurialSiteContractCategoryForm {
burialSiteContractId: number | string;
feeCategoryId: number | string;
}
export default function addLotOccupancyFeeCategory(addFeeCategoryForm: AddBurialSiteContractCategoryForm, user: User): Promise<number>;

View File

@ -1,13 +1,13 @@
import addLotOccupancyFee from './addLotOccupancyFee.js'; import addBurialSiteContractFee from './addBurialSiteContractFee.js';
import { getFeeCategory } from './getFeeCategories.js'; import { getFeeCategory } from './getFeeCategories.js';
import { acquireConnection } from './pool.js'; import { acquireConnection } from './pool.js';
export default async function addLotOccupancyFeeCategory(lotOccupancyFeeCategoryForm, user) { export default async function addLotOccupancyFeeCategory(addFeeCategoryForm, user) {
const database = await acquireConnection(); const database = await acquireConnection();
const feeCategory = await getFeeCategory(lotOccupancyFeeCategoryForm.feeCategoryId, database); const feeCategory = await getFeeCategory(addFeeCategoryForm.feeCategoryId, database);
let addedFeeCount = 0; let addedFeeCount = 0;
for (const fee of feeCategory?.fees ?? []) { for (const fee of feeCategory?.fees ?? []) {
const success = await addLotOccupancyFee({ const success = await addBurialSiteContractFee({
lotOccupancyId: lotOccupancyFeeCategoryForm.lotOccupancyId, burialSiteContractId: addFeeCategoryForm.burialSiteContractId,
feeId: fee.feeId, feeId: fee.feeId,
quantity: 1 quantity: 1
}, user, database); }, user, database);

View File

@ -1,29 +1,29 @@
import addLotOccupancyFee from './addLotOccupancyFee.js' import addBurialSiteContractFee from './addBurialSiteContractFee.js'
import { getFeeCategory } from './getFeeCategories.js' import { getFeeCategory } from './getFeeCategories.js'
import { acquireConnection } from './pool.js' import { acquireConnection } from './pool.js'
export interface AddLotOccupancyFeeCategoryForm { export interface AddBurialSiteContractCategoryForm {
lotOccupancyId: number | string burialSiteContractId: number | string
feeCategoryId: number | string feeCategoryId: number | string
} }
export default async function addLotOccupancyFeeCategory( export default async function addLotOccupancyFeeCategory(
lotOccupancyFeeCategoryForm: AddLotOccupancyFeeCategoryForm, addFeeCategoryForm: AddBurialSiteContractCategoryForm,
user: User user: User
): Promise<number> { ): Promise<number> {
const database = await acquireConnection() const database = await acquireConnection()
const feeCategory = await getFeeCategory( const feeCategory = await getFeeCategory(
lotOccupancyFeeCategoryForm.feeCategoryId, addFeeCategoryForm.feeCategoryId,
database database
) )
let addedFeeCount = 0 let addedFeeCount = 0
for (const fee of feeCategory?.fees ?? []) { for (const fee of feeCategory?.fees ?? []) {
const success = await addLotOccupancyFee( const success = await addBurialSiteContractFee(
{ {
lotOccupancyId: lotOccupancyFeeCategoryForm.lotOccupancyId, burialSiteContractId: addFeeCategoryForm.burialSiteContractId,
feeId: fee.feeId, feeId: fee.feeId,
quantity: 1 quantity: 1
}, },

View File

@ -14,6 +14,6 @@ export default async function addContractTypeField(addForm, user) {
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
.run(addForm.contractTypeId ?? undefined, addForm.contractTypeField, addForm.fieldType ?? 'text', addForm.fieldValues ?? '', addForm.isRequired === '' ? 0 : 1, addForm.pattern ?? '', addForm.minimumLength ?? 0, addForm.maximumLength ?? 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.minimumLength ?? 0, addForm.maximumLength ?? 100, addForm.orderNumber ?? -1, user.userName, rightNowMillis, user.userName, rightNowMillis);
database.release(); database.release();
clearCacheByTableName('OccupancyTypeFields'); clearCacheByTableName('ContractTypeFields');
return result.lastInsertRowid; return result.lastInsertRowid;
} }

View File

@ -51,7 +51,7 @@ export default async function addContractTypeField(
database.release() database.release()
clearCacheByTableName('OccupancyTypeFields') clearCacheByTableName('ContractTypeFields')
return result.lastInsertRowid as number return result.lastInsertRowid as number
} }

View File

@ -1,21 +0,0 @@
import type { PoolConnection } from 'better-sqlite-pool';
export interface AddLotOccupancyForm {
occupancyTypeId: string | number;
lotId: string | number;
occupancyStartDateString: string;
occupancyEndDateString: string;
occupancyTypeFieldIds?: string;
[lotOccupancyFieldValue_occupancyTypeFieldId: string]: unknown;
lotOccupantTypeId?: string;
occupantName?: string;
occupantFamilyName?: string;
occupantAddress1?: string;
occupantAddress2?: string;
occupantCity?: string;
occupantProvince?: string;
occupantPostalCode?: string;
occupantPhoneNumber?: string;
occupantEmailAddress?: string;
occupantComment?: string;
}
export default function addLotOccupancy(lotOccupancyForm: AddLotOccupancyForm, user: User, connectedDatabase?: PoolConnection): Promise<number>;

View File

@ -1,54 +0,0 @@
import { dateStringToInteger } from '@cityssm/utils-datetime';
import addLotOccupancyOccupant from './addLotOccupancyOccupant.js';
import addOrUpdateLotOccupancyField from './addOrUpdateLotOccupancyField.js';
import { acquireConnection } from './pool.js';
export default async function addLotOccupancy(lotOccupancyForm, user, connectedDatabase) {
const database = connectedDatabase ?? (await acquireConnection());
const rightNowMillis = Date.now();
const occupancyStartDate = dateStringToInteger(lotOccupancyForm.occupancyStartDateString);
if (occupancyStartDate <= 0) {
console.error(lotOccupancyForm);
}
const result = database
.prepare(`insert into LotOccupancies (
occupancyTypeId, lotId,
occupancyStartDate, occupancyEndDate,
recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?, ?)`)
.run(lotOccupancyForm.occupancyTypeId, lotOccupancyForm.lotId === '' ? undefined : lotOccupancyForm.lotId, occupancyStartDate, lotOccupancyForm.occupancyEndDateString === ''
? undefined
: dateStringToInteger(lotOccupancyForm.occupancyEndDateString), user.userName, rightNowMillis, user.userName, rightNowMillis);
const lotOccupancyId = result.lastInsertRowid;
const occupancyTypeFieldIds = (lotOccupancyForm.occupancyTypeFieldIds ?? '').split(',');
for (const occupancyTypeFieldId of occupancyTypeFieldIds) {
const lotOccupancyFieldValue = lotOccupancyForm[`lotOccupancyFieldValue_${occupancyTypeFieldId}`];
if ((lotOccupancyFieldValue ?? '') !== '') {
await addOrUpdateLotOccupancyField({
lotOccupancyId,
occupancyTypeFieldId,
lotOccupancyFieldValue: lotOccupancyFieldValue ?? ''
}, user, database);
}
}
if ((lotOccupancyForm.lotOccupantTypeId ?? '') !== '') {
await addLotOccupancyOccupant({
lotOccupancyId,
lotOccupantTypeId: lotOccupancyForm.lotOccupantTypeId ?? '',
occupantName: lotOccupancyForm.occupantName ?? '',
occupantFamilyName: lotOccupancyForm.occupantFamilyName ?? '',
occupantAddress1: lotOccupancyForm.occupantAddress1 ?? '',
occupantAddress2: lotOccupancyForm.occupantAddress2 ?? '',
occupantCity: lotOccupancyForm.occupantCity ?? '',
occupantProvince: lotOccupancyForm.occupantProvince ?? '',
occupantPostalCode: lotOccupancyForm.occupantPostalCode ?? '',
occupantPhoneNumber: lotOccupancyForm.occupantPhoneNumber ?? '',
occupantEmailAddress: lotOccupancyForm.occupantEmailAddress ?? '',
occupantComment: lotOccupancyForm.occupantComment ?? ''
}, user, database);
}
if (connectedDatabase === undefined) {
database.release();
}
return lotOccupancyId;
}

View File

@ -1,122 +0,0 @@
import { type DateString, dateStringToInteger } from '@cityssm/utils-datetime'
import type { PoolConnection } from 'better-sqlite-pool'
import addLotOccupancyOccupant from './addLotOccupancyOccupant.js'
import addOrUpdateLotOccupancyField from './addOrUpdateLotOccupancyField.js'
import { acquireConnection } from './pool.js'
export interface AddLotOccupancyForm {
occupancyTypeId: string | number
lotId: string | number
occupancyStartDateString: string
occupancyEndDateString: string
occupancyTypeFieldIds?: string
[lotOccupancyFieldValue_occupancyTypeFieldId: string]: unknown
lotOccupantTypeId?: string
occupantName?: string
occupantFamilyName?: string
occupantAddress1?: string
occupantAddress2?: string
occupantCity?: string
occupantProvince?: string
occupantPostalCode?: string
occupantPhoneNumber?: string
occupantEmailAddress?: string
occupantComment?: string
}
export default async function addLotOccupancy(
lotOccupancyForm: AddLotOccupancyForm,
user: User,
connectedDatabase?: PoolConnection
): Promise<number> {
const database = connectedDatabase ?? (await acquireConnection())
const rightNowMillis = Date.now()
const occupancyStartDate = dateStringToInteger(
lotOccupancyForm.occupancyStartDateString as DateString
)
if (occupancyStartDate <= 0) {
console.error(lotOccupancyForm)
}
const result = database
.prepare(
`insert into LotOccupancies (
occupancyTypeId, lotId,
occupancyStartDate, occupancyEndDate,
recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?, ?)`
)
.run(
lotOccupancyForm.occupancyTypeId,
lotOccupancyForm.lotId === '' ? undefined : lotOccupancyForm.lotId,
occupancyStartDate,
lotOccupancyForm.occupancyEndDateString === ''
? undefined
: dateStringToInteger(
lotOccupancyForm.occupancyEndDateString as DateString
),
user.userName,
rightNowMillis,
user.userName,
rightNowMillis
)
const lotOccupancyId = result.lastInsertRowid as number
const occupancyTypeFieldIds = (
lotOccupancyForm.occupancyTypeFieldIds ?? ''
).split(',')
for (const occupancyTypeFieldId of occupancyTypeFieldIds) {
const lotOccupancyFieldValue = lotOccupancyForm[
`lotOccupancyFieldValue_${occupancyTypeFieldId}`
] as string | undefined
if ((lotOccupancyFieldValue ?? '') !== '') {
await addOrUpdateLotOccupancyField(
{
lotOccupancyId,
occupancyTypeFieldId,
lotOccupancyFieldValue: lotOccupancyFieldValue ?? ''
},
user,
database
)
}
}
if ((lotOccupancyForm.lotOccupantTypeId ?? '') !== '') {
await addLotOccupancyOccupant(
{
lotOccupancyId,
lotOccupantTypeId: lotOccupancyForm.lotOccupantTypeId ?? '',
occupantName: lotOccupancyForm.occupantName ?? '',
occupantFamilyName: lotOccupancyForm.occupantFamilyName ?? '',
occupantAddress1: lotOccupancyForm.occupantAddress1 ?? '',
occupantAddress2: lotOccupancyForm.occupantAddress2 ?? '',
occupantCity: lotOccupancyForm.occupantCity ?? '',
occupantProvince: lotOccupancyForm.occupantProvince ?? '',
occupantPostalCode: lotOccupancyForm.occupantPostalCode ?? '',
occupantPhoneNumber: lotOccupancyForm.occupantPhoneNumber ?? '',
occupantEmailAddress: lotOccupancyForm.occupantEmailAddress ?? '',
occupantComment: lotOccupancyForm.occupantComment ?? ''
},
user,
database
)
}
if (connectedDatabase === undefined) {
database.release()
}
return lotOccupancyId
}

View File

@ -1,9 +0,0 @@
import type { PoolConnection } from 'better-sqlite-pool';
export interface AddLotOccupancyFeeForm {
lotOccupancyId: number | string;
feeId: number | string;
quantity: number | string;
feeAmount?: number | string;
taxAmount?: number | string;
}
export default function addLotOccupancyFee(lotOccupancyFeeForm: AddLotOccupancyFeeForm, user: User, connectedDatabase?: PoolConnection): Promise<boolean>;

View File

@ -1,5 +0,0 @@
export interface AddLotOccupancyFeeCategoryForm {
lotOccupancyId: number | string;
feeCategoryId: number | string;
}
export default function addLotOccupancyFeeCategory(lotOccupancyFeeCategoryForm: AddLotOccupancyFeeCategoryForm, user: User): Promise<number>;

View File

@ -1,5 +1,5 @@
export interface AddLotOccupancyTransactionForm { export interface AddLotOccupancyTransactionForm {
lotOccupancyId: string | number; burialSiteContractId: string | number;
transactionDateString?: string; transactionDateString?: string;
transactionTimeString?: string; transactionTimeString?: string;
transactionAmount: string | number; transactionAmount: string | number;

View File

@ -6,10 +6,10 @@ export default async function addLotOccupancyTransaction(lotOccupancyTransaction
const maxIndexResult = database const maxIndexResult = database
.prepare(`select transactionIndex .prepare(`select transactionIndex
from LotOccupancyTransactions from LotOccupancyTransactions
where lotOccupancyId = ? where burialSiteContractId = ?
order by transactionIndex desc order by transactionIndex desc
limit 1`) limit 1`)
.get(lotOccupancyTransactionForm.lotOccupancyId); .get(lotOccupancyTransactionForm.burialSiteContractId);
if (maxIndexResult !== undefined) { if (maxIndexResult !== undefined) {
transactionIndex = maxIndexResult.transactionIndex + 1; transactionIndex = maxIndexResult.transactionIndex + 1;
} }
@ -22,13 +22,13 @@ export default async function addLotOccupancyTransaction(lotOccupancyTransaction
: dateToTimeInteger(rightNow); : dateToTimeInteger(rightNow);
database database
.prepare(`insert into LotOccupancyTransactions ( .prepare(`insert into LotOccupancyTransactions (
lotOccupancyId, transactionIndex, burialSiteContractId, transactionIndex,
transactionDate, transactionTime, transactionDate, transactionTime,
transactionAmount, externalReceiptNumber, transactionNote, transactionAmount, externalReceiptNumber, transactionNote,
recordCreate_userName, recordCreate_timeMillis, recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis) recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
.run(lotOccupancyTransactionForm.lotOccupancyId, transactionIndex, transactionDate, transactionTime, lotOccupancyTransactionForm.transactionAmount, lotOccupancyTransactionForm.externalReceiptNumber, lotOccupancyTransactionForm.transactionNote, user.userName, rightNow.getTime(), user.userName, rightNow.getTime()); .run(lotOccupancyTransactionForm.burialSiteContractId, transactionIndex, transactionDate, transactionTime, lotOccupancyTransactionForm.transactionAmount, lotOccupancyTransactionForm.externalReceiptNumber, lotOccupancyTransactionForm.transactionNote, user.userName, rightNow.getTime(), user.userName, rightNow.getTime());
database.release(); database.release();
return transactionIndex; return transactionIndex;
} }

View File

@ -8,7 +8,7 @@ import {
import { acquireConnection } from './pool.js' import { acquireConnection } from './pool.js'
export interface AddLotOccupancyTransactionForm { export interface AddLotOccupancyTransactionForm {
lotOccupancyId: string | number burialSiteContractId: string | number
transactionDateString?: string transactionDateString?: string
transactionTimeString?: string transactionTimeString?: string
transactionAmount: string | number transactionAmount: string | number
@ -28,11 +28,11 @@ export default async function addLotOccupancyTransaction(
.prepare( .prepare(
`select transactionIndex `select transactionIndex
from LotOccupancyTransactions from LotOccupancyTransactions
where lotOccupancyId = ? where burialSiteContractId = ?
order by transactionIndex desc order by transactionIndex desc
limit 1` limit 1`
) )
.get(lotOccupancyTransactionForm.lotOccupancyId) as .get(lotOccupancyTransactionForm.burialSiteContractId) as
| { transactionIndex: number } | { transactionIndex: number }
| undefined | undefined
@ -53,7 +53,7 @@ export default async function addLotOccupancyTransaction(
database database
.prepare( .prepare(
`insert into LotOccupancyTransactions ( `insert into LotOccupancyTransactions (
lotOccupancyId, transactionIndex, burialSiteContractId, transactionIndex,
transactionDate, transactionTime, transactionDate, transactionTime,
transactionAmount, externalReceiptNumber, transactionNote, transactionAmount, externalReceiptNumber, transactionNote,
recordCreate_userName, recordCreate_timeMillis, recordCreate_userName, recordCreate_timeMillis,
@ -61,7 +61,7 @@ export default async function addLotOccupancyTransaction(
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)` values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
) )
.run( .run(
lotOccupancyTransactionForm.lotOccupancyId, lotOccupancyTransactionForm.burialSiteContractId,
transactionIndex, transactionIndex,
transactionDate, transactionDate,
transactionTime, transactionTime,

View File

@ -0,0 +1 @@
export default function copyBurialSiteContract(oldBurialSiteContractId: number | string, user: User): Promise<number>;

View File

@ -0,0 +1,62 @@
import { dateToString } from '@cityssm/utils-datetime';
import addBurialSiteContract from './addBurialSiteContract.js';
import addBurialSiteContractComment from './addBurialSiteContractComment.js';
// import addLotOccupancyOccupant from './addLotOccupancyOccupant.js'
import getBurialSiteContract from './getBurialSiteContract.js';
import { acquireConnection } from './pool.js';
export default async function copyBurialSiteContract(oldBurialSiteContractId, user) {
const database = await acquireConnection();
const oldBurialSiteContract = await getBurialSiteContract(oldBurialSiteContractId, database);
const newBurialSiteContractId = await addBurialSiteContract({
burialSiteId: oldBurialSiteContract.burialSiteId ?? '',
contractTypeId: oldBurialSiteContract.contractTypeId,
contractStartDateString: dateToString(new Date()),
contractEndDateString: ''
}, user, database);
/*
* Copy Fields
*/
const rightNowMillis = Date.now();
for (const field of oldBurialSiteContract.burialSiteContractFields ?? []) {
database
.prepare(`insert into BurialSiteContractFields (
burialSiteContractId, contractTypeFieldId, fieldValue,
recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?)`)
.run(newBurialSiteContractId, field.contractTypeFieldId, field.fieldValue, user.userName, rightNowMillis, user.userName, rightNowMillis);
}
/*
* Copy Occupants
*/
/*
for (const occupant of oldBurialSiteContract.lotOccupancyOccupants ?? []) {
await addLotOccupancyOccupant(
{
burialSiteContractId: newBurialSiteContractId,
lotOccupantTypeId: occupant.lotOccupantTypeId!,
occupantName: occupant.occupantName!,
occupantFamilyName: occupant.occupantFamilyName!,
occupantAddress1: occupant.occupantAddress1!,
occupantAddress2: occupant.occupantAddress2!,
occupantCity: occupant.occupantCity!,
occupantProvince: occupant.occupantProvince!,
occupantPostalCode: occupant.occupantPostalCode!,
occupantPhoneNumber: occupant.occupantPhoneNumber!,
occupantEmailAddress: occupant.occupantEmailAddress!
},
user,
database
)
}
*/
/*
* Add Comment
*/
await addBurialSiteContractComment({
burialSiteContractId: newBurialSiteContractId,
comment: `New record copied from #${oldBurialSiteContractId}.`
}, user);
database.release();
return newBurialSiteContractId;
}

View File

@ -0,0 +1,94 @@
import { dateToString } from '@cityssm/utils-datetime'
import type { BurialSiteContract } from '../types/recordTypes.js'
import addBurialSiteContract from './addBurialSiteContract.js'
import addBurialSiteContractComment from './addBurialSiteContractComment.js'
// import addLotOccupancyOccupant from './addLotOccupancyOccupant.js'
import getBurialSiteContract from './getBurialSiteContract.js'
import { acquireConnection } from './pool.js'
export default async function copyBurialSiteContract(
oldBurialSiteContractId: number | string,
user: User
): Promise<number> {
const database = await acquireConnection()
const oldBurialSiteContract = await getBurialSiteContract(oldBurialSiteContractId, database) as BurialSiteContract
const newBurialSiteContractId = await addBurialSiteContract(
{
burialSiteId: oldBurialSiteContract.burialSiteId ?? '',
contractTypeId: oldBurialSiteContract.contractTypeId,
contractStartDateString: dateToString(new Date()),
contractEndDateString: ''
},
user,
database
)
/*
* Copy Fields
*/
const rightNowMillis = Date.now()
for (const field of oldBurialSiteContract.burialSiteContractFields ?? []) {
database
.prepare(
`insert into BurialSiteContractFields (
burialSiteContractId, contractTypeFieldId, fieldValue,
recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?)`
)
.run(
newBurialSiteContractId,
field.contractTypeFieldId,
field.fieldValue,
user.userName,
rightNowMillis,
user.userName,
rightNowMillis
)
}
/*
* Copy Occupants
*/
/*
for (const occupant of oldBurialSiteContract.lotOccupancyOccupants ?? []) {
await addLotOccupancyOccupant(
{
burialSiteContractId: newBurialSiteContractId,
lotOccupantTypeId: occupant.lotOccupantTypeId!,
occupantName: occupant.occupantName!,
occupantFamilyName: occupant.occupantFamilyName!,
occupantAddress1: occupant.occupantAddress1!,
occupantAddress2: occupant.occupantAddress2!,
occupantCity: occupant.occupantCity!,
occupantProvince: occupant.occupantProvince!,
occupantPostalCode: occupant.occupantPostalCode!,
occupantPhoneNumber: occupant.occupantPhoneNumber!,
occupantEmailAddress: occupant.occupantEmailAddress!
},
user,
database
)
}
*/
/*
* Add Comment
*/
await addBurialSiteContractComment({
burialSiteContractId: newBurialSiteContractId,
comment: `New record copied from #${oldBurialSiteContractId}.`
}, user)
database.release()
return newBurialSiteContractId
}

View File

@ -1 +0,0 @@
export default function copyLotOccupancy(oldLotOccupancyId: number | string, user: User): Promise<number>;

View File

@ -1,56 +0,0 @@
import { dateToString } from '@cityssm/utils-datetime';
import addLotOccupancy from './addLotOccupancy.js';
import addLotOccupancyComment from './addLotOccupancyComment.js';
import addLotOccupancyOccupant from './addLotOccupancyOccupant.js';
import getLotOccupancy from './getLotOccupancy.js';
import { acquireConnection } from './pool.js';
export default async function copyLotOccupancy(oldLotOccupancyId, user) {
const database = await acquireConnection();
const oldLotOccupancy = await getLotOccupancy(oldLotOccupancyId, database);
const newLotOccupancyId = await addLotOccupancy({
lotId: oldLotOccupancy.lotId ?? '',
occupancyTypeId: oldLotOccupancy.occupancyTypeId,
occupancyStartDateString: dateToString(new Date()),
occupancyEndDateString: ''
}, user, database);
/*
* Copy Fields
*/
const rightNowMillis = Date.now();
for (const occupancyField of oldLotOccupancy.lotOccupancyFields ?? []) {
database
.prepare(`insert into LotOccupancyFields (
lotOccupancyId, occupancyTypeFieldId, lotOccupancyFieldValue,
recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?)`)
.run(newLotOccupancyId, occupancyField.occupancyTypeFieldId, occupancyField.lotOccupancyFieldValue, user.userName, rightNowMillis, user.userName, rightNowMillis);
}
/*
* Copy Occupants
*/
for (const occupant of oldLotOccupancy.lotOccupancyOccupants ?? []) {
await addLotOccupancyOccupant({
lotOccupancyId: newLotOccupancyId,
lotOccupantTypeId: occupant.lotOccupantTypeId,
occupantName: occupant.occupantName,
occupantFamilyName: occupant.occupantFamilyName,
occupantAddress1: occupant.occupantAddress1,
occupantAddress2: occupant.occupantAddress2,
occupantCity: occupant.occupantCity,
occupantProvince: occupant.occupantProvince,
occupantPostalCode: occupant.occupantPostalCode,
occupantPhoneNumber: occupant.occupantPhoneNumber,
occupantEmailAddress: occupant.occupantEmailAddress
}, user, database);
}
/*
* Add Comment
*/
await addLotOccupancyComment({
lotOccupancyId: newLotOccupancyId,
lotOccupancyComment: `New record copied from #${oldLotOccupancyId}.`
}, user);
database.release();
return newLotOccupancyId;
}

View File

@ -1,92 +0,0 @@
import { dateToString } from '@cityssm/utils-datetime'
import type { LotOccupancy } from '../types/recordTypes.js'
import addLotOccupancy from './addLotOccupancy.js'
import addLotOccupancyComment from './addLotOccupancyComment.js'
import addLotOccupancyOccupant from './addLotOccupancyOccupant.js'
import getLotOccupancy from './getLotOccupancy.js'
import { acquireConnection } from './pool.js'
export default async function copyLotOccupancy(
oldLotOccupancyId: number | string,
user: User
): Promise<number> {
const database = await acquireConnection()
const oldLotOccupancy = await getLotOccupancy(oldLotOccupancyId, database) as LotOccupancy
const newLotOccupancyId = await addLotOccupancy(
{
lotId: oldLotOccupancy.lotId ?? '',
occupancyTypeId: oldLotOccupancy.occupancyTypeId,
occupancyStartDateString: dateToString(new Date()),
occupancyEndDateString: ''
},
user,
database
)
/*
* Copy Fields
*/
const rightNowMillis = Date.now()
for (const occupancyField of oldLotOccupancy.lotOccupancyFields ?? []) {
database
.prepare(
`insert into LotOccupancyFields (
lotOccupancyId, occupancyTypeFieldId, lotOccupancyFieldValue,
recordCreate_userName, recordCreate_timeMillis,
recordUpdate_userName, recordUpdate_timeMillis)
values (?, ?, ?, ?, ?, ?, ?)`
)
.run(
newLotOccupancyId,
occupancyField.occupancyTypeFieldId,
occupancyField.lotOccupancyFieldValue,
user.userName,
rightNowMillis,
user.userName,
rightNowMillis
)
}
/*
* Copy Occupants
*/
for (const occupant of oldLotOccupancy.lotOccupancyOccupants ?? []) {
await addLotOccupancyOccupant(
{
lotOccupancyId: newLotOccupancyId,
lotOccupantTypeId: occupant.lotOccupantTypeId!,
occupantName: occupant.occupantName!,
occupantFamilyName: occupant.occupantFamilyName!,
occupantAddress1: occupant.occupantAddress1!,
occupantAddress2: occupant.occupantAddress2!,
occupantCity: occupant.occupantCity!,
occupantProvince: occupant.occupantProvince!,
occupantPostalCode: occupant.occupantPostalCode!,
occupantPhoneNumber: occupant.occupantPhoneNumber!,
occupantEmailAddress: occupant.occupantEmailAddress!
},
user,
database
)
}
/*
* Add Comment
*/
await addLotOccupancyComment({
lotOccupancyId: newLotOccupancyId,
lotOccupancyComment: `New record copied from #${oldLotOccupancyId}.`
}, user)
database.release()
return newLotOccupancyId
}

View File

@ -31,7 +31,7 @@ relatedTables.set('ContractTypes', ['ContractTypePrints', 'ContractTypeFields'])
relatedTables.set('WorkOrders', [ relatedTables.set('WorkOrders', [
'WorkOrderMilestones', 'WorkOrderMilestones',
'WorkOrderLots', 'WorkOrderLots',
'WorkOrderLotOccupancies', 'WorkOrderBurialSiteContracts',
'WorkOrderComments' 'WorkOrderComments'
]); ]);
export async function deleteRecord(recordTable, recordId, user) { export async function deleteRecord(recordTable, recordId, user) {

View File

@ -53,7 +53,7 @@ relatedTables.set('ContractTypes', ['ContractTypePrints', 'ContractTypeFields'])
relatedTables.set('WorkOrders', [ relatedTables.set('WorkOrders', [
'WorkOrderMilestones', 'WorkOrderMilestones',
'WorkOrderLots', 'WorkOrderLots',
'WorkOrderLotOccupancies', 'WorkOrderBurialSiteContracts',
'WorkOrderComments' 'WorkOrderComments'
]) ])

View File

@ -1,3 +1,2 @@
import type { Lot } from '../types/recordTypes.js';
export declare function getLotByLotName(lotName: string): Promise<Lot | undefined>; export declare function getLotByLotName(lotName: string): Promise<Lot | undefined>;
export default function getLot(burialSiteId: number | string): Promise<Lot | undefined>; export default function getLot(burialSiteId: number | string): Promise<Lot | undefined>;

View File

@ -1,6 +1,6 @@
import getLotComments from './getLotComments.js'; import getBurialSiteComments from './getBurialSiteComments.js';
import getLotFields from './getLotFields.js'; import getBurialSiteInterments from './getBurialSiteContracts.js';
import getBurialSiteInterments from './getLotOccupancies.js'; import getBurialSiteFields from './getBurialSiteFields.js';
import { acquireConnection } from './pool.js'; import { acquireConnection } from './pool.js';
const baseSQL = `select l.burialSiteId, const baseSQL = `select l.burialSiteId,
l.burialSiteTypeId, t.burialSiteType, l.burialSiteTypeId, t.burialSiteType,
@ -23,8 +23,8 @@ async function _getBurialSite(sql, burialSiteIdOrLotName) {
const database = await acquireConnection(); const database = await acquireConnection();
const burialSite = database.prepare(sql).get(burialSiteIdOrLotName); const burialSite = database.prepare(sql).get(burialSiteIdOrLotName);
if (burialSite !== undefined) { if (burialSite !== undefined) {
const lotOccupancies = await getBurialSiteInterments({ const BurialSiteContracts = await getBurialSiteInterments({
lotId: burialSite.lotId burialSiteId: burialSite.burialSiteId
}, { }, {
includeOccupants: true, includeOccupants: true,
includeFees: false, includeFees: false,
@ -32,9 +32,9 @@ async function _getBurialSite(sql, burialSiteIdOrLotName) {
limit: -1, limit: -1,
offset: 0 offset: 0
}, database); }, database);
burialSite.lotOccupancies = lotOccupancies.lotOccupancies; burialSite.burialSiteContracts = BurialSiteContracts.BurialSiteContracts;
burialSite.lotFields = await getLotFields(burialSite.lotId, database); burialSite.burialSiteFields = await getBurialSiteFields(burialSite.burialSiteId, database);
burialSite.lotComments = await getLotComments(burialSite.lotId, database); burialSite.burialSiteComments = await getBurialSiteComments(burialSite.burialSiteId, database);
} }
database.release(); database.release();
return burialSite; return burialSite;

View File

@ -1,8 +1,8 @@
import type { Lot } from '../types/recordTypes.js' import type { BurialSite } from '../types/recordTypes.js'
import getLotComments from './getLotComments.js' import getBurialSiteComments from './getBurialSiteComments.js'
import getLotFields from './getLotFields.js' import getBurialSiteInterments from './getBurialSiteContracts.js'
import getBurialSiteInterments from './getLotOccupancies.js' import getBurialSiteFields from './getBurialSiteFields.js'
import { acquireConnection } from './pool.js' import { acquireConnection } from './pool.js'
const baseSQL = `select l.burialSiteId, const baseSQL = `select l.burialSiteId,
@ -26,15 +26,15 @@ const baseSQL = `select l.burialSiteId,
async function _getBurialSite( async function _getBurialSite(
sql: string, sql: string,
burialSiteIdOrLotName: number | string burialSiteIdOrLotName: number | string
): Promise<Lot | undefined> { ): Promise<BurialSite | undefined> {
const database = await acquireConnection() const database = await acquireConnection()
const burialSite = database.prepare(sql).get(burialSiteIdOrLotName) as Lot | undefined const burialSite = database.prepare(sql).get(burialSiteIdOrLotName) as BurialSite | undefined
if (burialSite !== undefined) { if (burialSite !== undefined) {
const lotOccupancies = await getBurialSiteInterments( const BurialSiteContracts = await getBurialSiteInterments(
{ {
lotId: burialSite.lotId burialSiteId: burialSite.burialSiteId
}, },
{ {
includeOccupants: true, includeOccupants: true,
@ -46,11 +46,11 @@ async function _getBurialSite(
database database
) )
burialSite.lotOccupancies = lotOccupancies.lotOccupancies burialSite.burialSiteContracts = BurialSiteContracts.BurialSiteContracts
burialSite.lotFields = await getLotFields(burialSite.lotId, database) burialSite.burialSiteFields = await getBurialSiteFields(burialSite.burialSiteId, database)
burialSite.lotComments = await getLotComments(burialSite.lotId, database) burialSite.burialSiteComments = await getBurialSiteComments(burialSite.burialSiteId, database)
} }
database.release() database.release()

View File

@ -0,0 +1,3 @@
import type { PoolConnection } from 'better-sqlite-pool';
import type { BurialSiteComment } from '../types/recordTypes.js';
export default function getBurialSiteComments(burialSiteId: number | string, connectedDatabase?: PoolConnection): Promise<BurialSiteComment[]>;

View File

@ -1,25 +1,25 @@
import { dateIntegerToString, timeIntegerToPeriodString, timeIntegerToString } from '@cityssm/utils-datetime'; import { dateIntegerToString, timeIntegerToPeriodString, timeIntegerToString } from '@cityssm/utils-datetime';
import { acquireConnection } from './pool.js'; import { acquireConnection } from './pool.js';
export default async function getLotComments(lotId, connectedDatabase) { export default async function getBurialSiteComments(burialSiteId, connectedDatabase) {
const database = connectedDatabase ?? (await acquireConnection()); const database = connectedDatabase ?? (await acquireConnection());
database.function('userFn_dateIntegerToString', dateIntegerToString); database.function('userFn_dateIntegerToString', dateIntegerToString);
database.function('userFn_timeIntegerToString', timeIntegerToString); database.function('userFn_timeIntegerToString', timeIntegerToString);
database.function('userFn_timeIntegerToPeriodString', timeIntegerToPeriodString); database.function('userFn_timeIntegerToPeriodString', timeIntegerToPeriodString);
const lotComments = database const comments = database
.prepare(`select lotCommentId, .prepare(`select burialSiteCommentId,
lotCommentDate, userFn_dateIntegerToString(lotCommentDate) as lotCommentDateString, commentDate, userFn_dateIntegerToString(commentDate) as commentDateString,
lotCommentTime, commentTime,
userFn_timeIntegerToString(lotCommentTime) as lotCommentTimeString, userFn_timeIntegerToString(commentTime) as commentTimeString,
userFn_timeIntegerToPeriodString(lotCommentTime) as lotCommentTimePeriodString, userFn_timeIntegerToPeriodString(commentTime) as commentTimePeriodString,
lotComment, comment,
recordCreate_userName, recordUpdate_userName recordCreate_userName, recordUpdate_userName
from LotComments from BurialSiteComments
where recordDelete_timeMillis is null where recordDelete_timeMillis is null
and lotId = ? and burialSiteId = ?
order by lotCommentDate desc, lotCommentTime desc, lotCommentId desc`) order by commentDate desc, commentTime desc, burialSiteCommentId desc`)
.all(lotId); .all(burialSiteId);
if (connectedDatabase === undefined) { if (connectedDatabase === undefined) {
database.release(); database.release();
} }
return lotComments; return comments;
} }

View File

@ -5,14 +5,14 @@ import {
} from '@cityssm/utils-datetime' } from '@cityssm/utils-datetime'
import type { PoolConnection } from 'better-sqlite-pool' import type { PoolConnection } from 'better-sqlite-pool'
import type { LotComment } from '../types/recordTypes.js' import type { BurialSiteComment } from '../types/recordTypes.js'
import { acquireConnection } from './pool.js' import { acquireConnection } from './pool.js'
export default async function getLotComments( export default async function getBurialSiteComments(
lotId: number | string, burialSiteId: number | string,
connectedDatabase?: PoolConnection connectedDatabase?: PoolConnection
): Promise<LotComment[]> { ): Promise<BurialSiteComment[]> {
const database = connectedDatabase ?? (await acquireConnection()) const database = connectedDatabase ?? (await acquireConnection())
database.function('userFn_dateIntegerToString', dateIntegerToString) database.function('userFn_dateIntegerToString', dateIntegerToString)
@ -22,25 +22,25 @@ export default async function getLotComments(
timeIntegerToPeriodString timeIntegerToPeriodString
) )
const lotComments = database const comments = database
.prepare( .prepare(
`select lotCommentId, `select burialSiteCommentId,
lotCommentDate, userFn_dateIntegerToString(lotCommentDate) as lotCommentDateString, commentDate, userFn_dateIntegerToString(commentDate) as commentDateString,
lotCommentTime, commentTime,
userFn_timeIntegerToString(lotCommentTime) as lotCommentTimeString, userFn_timeIntegerToString(commentTime) as commentTimeString,
userFn_timeIntegerToPeriodString(lotCommentTime) as lotCommentTimePeriodString, userFn_timeIntegerToPeriodString(commentTime) as commentTimePeriodString,
lotComment, comment,
recordCreate_userName, recordUpdate_userName recordCreate_userName, recordUpdate_userName
from LotComments from BurialSiteComments
where recordDelete_timeMillis is null where recordDelete_timeMillis is null
and lotId = ? and burialSiteId = ?
order by lotCommentDate desc, lotCommentTime desc, lotCommentId desc` order by commentDate desc, commentTime desc, burialSiteCommentId desc`
) )
.all(lotId) as LotComment[] .all(burialSiteId) as BurialSiteComment[]
if (connectedDatabase === undefined) { if (connectedDatabase === undefined) {
database.release() database.release()
} }
return lotComments return comments
} }

View File

@ -0,0 +1,3 @@
import type { PoolConnection } from 'better-sqlite-pool';
import type { BurialSiteContract } from '../types/recordTypes.js';
export default function getLotOccupancy(burialSiteContractId: number | string, connectedDatabase?: PoolConnection): Promise<BurialSiteContract | undefined>;

View File

@ -0,0 +1,56 @@
import { dateIntegerToString } from '@cityssm/utils-datetime';
import getBurialSiteContractComments from './getBurialSiteContractComments.js';
import getBurialSiteContractFees from './getBurialSiteContractFees.js';
import getBurialSiteContractFields from './getBurialSiteContractFields.js';
// import getLotOccupancyOccupants from './getLotOccupancyOccupants.js'
import getBurialSiteContractTransactions from './getBurialSiteContractTransactions.js';
import { getWorkOrders } from './getWorkOrders.js';
import { acquireConnection } from './pool.js';
export default async function getLotOccupancy(burialSiteContractId, connectedDatabase) {
const database = connectedDatabase ?? (await acquireConnection());
database.function('userFn_dateIntegerToString', dateIntegerToString);
const contract = database
.prepare(`select o.burialSiteContractId,
o.contractTypeId, t.contractType,
o.burialSiteId,
l.burialSiteNameSegment1,
l.burialSiteNameSegment2,
l.burialSiteNameSegment3,
l.burialSiteNameSegment4,
l.burialSiteNameSegment5,
l.burialSiteTypeId,
l.cemeteryId, m.cemeteryName,
o.contractStartDate, userFn_dateIntegerToString(o.contractStartDate) as contractStartDateString,
o.contractEndDate, userFn_dateIntegerToString(o.contractEndDate) as contractEndDateString,
o.recordUpdate_timeMillis
from BurialSiteContracts o
left join ContractTypes t on o.contractTypeId = t.contractTypeId
left join BurialSites l on o.burialSiteId = l.burialSiteId
left join Maps m on l.cemeteryId = m.cemeteryId
where o.recordDelete_timeMillis is null
and o.burialSiteContractId = ?`)
.get(burialSiteContractId);
if (contract !== undefined) {
contract.burialSiteContractFields = await getBurialSiteContractFields(burialSiteContractId, database);
/*
contract.burialSiteContractInterments = await getLotOccupancyOccupants(
burialSiteContractId,
database
)
*/
contract.burialSiteContractComments = await getBurialSiteContractComments(burialSiteContractId, database);
contract.burialSiteContractFees = await getBurialSiteContractFees(burialSiteContractId, database);
contract.burialSiteContractTransactions = await getBurialSiteContractTransactions(burialSiteContractId, { includeIntegrations: true }, database);
const workOrdersResults = await getWorkOrders({
burialSiteContractId
}, {
limit: -1,
offset: 0
}, database);
contract.workOrders = workOrdersResults.workOrders;
}
if (connectedDatabase === undefined) {
database.release();
}
return contract;
}

View File

@ -0,0 +1,90 @@
import { dateIntegerToString } from '@cityssm/utils-datetime'
import type { PoolConnection } from 'better-sqlite-pool'
import type { BurialSiteContract } from '../types/recordTypes.js'
import getBurialSiteContractComments from './getBurialSiteContractComments.js'
import getBurialSiteContractFees from './getBurialSiteContractFees.js'
import getBurialSiteContractFields from './getBurialSiteContractFields.js'
// import getLotOccupancyOccupants from './getLotOccupancyOccupants.js'
import getBurialSiteContractTransactions from './getBurialSiteContractTransactions.js'
import { getWorkOrders } from './getWorkOrders.js'
import { acquireConnection } from './pool.js'
export default async function getLotOccupancy(
burialSiteContractId: number | string,
connectedDatabase?: PoolConnection
): Promise<BurialSiteContract | undefined> {
const database = connectedDatabase ?? (await acquireConnection())
database.function('userFn_dateIntegerToString', dateIntegerToString)
const contract = database
.prepare(
`select o.burialSiteContractId,
o.contractTypeId, t.contractType,
o.burialSiteId,
l.burialSiteNameSegment1,
l.burialSiteNameSegment2,
l.burialSiteNameSegment3,
l.burialSiteNameSegment4,
l.burialSiteNameSegment5,
l.burialSiteTypeId,
l.cemeteryId, m.cemeteryName,
o.contractStartDate, userFn_dateIntegerToString(o.contractStartDate) as contractStartDateString,
o.contractEndDate, userFn_dateIntegerToString(o.contractEndDate) as contractEndDateString,
o.recordUpdate_timeMillis
from BurialSiteContracts o
left join ContractTypes t on o.contractTypeId = t.contractTypeId
left join BurialSites l on o.burialSiteId = l.burialSiteId
left join Maps m on l.cemeteryId = m.cemeteryId
where o.recordDelete_timeMillis is null
and o.burialSiteContractId = ?`
)
.get(burialSiteContractId) as BurialSiteContract | undefined
if (contract !== undefined) {
contract.burialSiteContractFields = await getBurialSiteContractFields(
burialSiteContractId,
database
)
/*
contract.burialSiteContractInterments = await getLotOccupancyOccupants(
burialSiteContractId,
database
)
*/
contract.burialSiteContractComments = await getBurialSiteContractComments(
burialSiteContractId,
database
)
contract.burialSiteContractFees = await getBurialSiteContractFees(
burialSiteContractId,
database
)
contract.burialSiteContractTransactions = await getBurialSiteContractTransactions(
burialSiteContractId,
{ includeIntegrations: true },
database
)
const workOrdersResults = await getWorkOrders(
{
burialSiteContractId
},
{
limit: -1,
offset: 0
},
database
)
contract.workOrders = workOrdersResults.workOrders
}
if (connectedDatabase === undefined) {
database.release()
}
return contract
}

View File

@ -0,0 +1,3 @@
import type { PoolConnection } from 'better-sqlite-pool';
import type { BurialSiteContractComment } from '../types/recordTypes.js';
export default function getBurialSiteContractComments(burialSiteContractId: number | string, connectedDatabase?: PoolConnection): Promise<BurialSiteContractComment[]>;

View File

@ -0,0 +1,25 @@
import { dateIntegerToString, timeIntegerToPeriodString, timeIntegerToString } from '@cityssm/utils-datetime';
import { acquireConnection } from './pool.js';
export default async function getBurialSiteContractComments(burialSiteContractId, connectedDatabase) {
const database = connectedDatabase ?? (await acquireConnection());
database.function('userFn_dateIntegerToString', dateIntegerToString);
database.function('userFn_timeIntegerToString', timeIntegerToString);
database.function('userFn_timeIntegerToPeriodString', timeIntegerToPeriodString);
const comments = database
.prepare(`select burialSiteContractCommentId,
commentDate, userFn_dateIntegerToString(commentDate) as commentDateString,
commentTime,
userFn_timeIntegerToString(commentTime) as commentTimeString,
userFn_timeIntegerToPeriodString(commentTime) as commentTimePeriodString,
comment,
recordCreate_userName, recordUpdate_userName
from BurialSiteContractComments
where recordDelete_timeMillis is null
and burialSiteContractId = ?
order by commentDate desc, commentTime desc, burialSiteContractCommentId desc`)
.all(burialSiteContractId);
if (connectedDatabase === undefined) {
database.release();
}
return comments;
}

View File

@ -0,0 +1,46 @@
import {
dateIntegerToString,
timeIntegerToPeriodString,
timeIntegerToString
} from '@cityssm/utils-datetime'
import type { PoolConnection } from 'better-sqlite-pool'
import type { BurialSiteContractComment } from '../types/recordTypes.js'
import { acquireConnection } from './pool.js'
export default async function getBurialSiteContractComments(
burialSiteContractId: number | string,
connectedDatabase?: PoolConnection
): Promise<BurialSiteContractComment[]> {
const database = connectedDatabase ?? (await acquireConnection())
database.function('userFn_dateIntegerToString', dateIntegerToString)
database.function('userFn_timeIntegerToString', timeIntegerToString)
database.function(
'userFn_timeIntegerToPeriodString',
timeIntegerToPeriodString
)
const comments = database
.prepare(
`select burialSiteContractCommentId,
commentDate, userFn_dateIntegerToString(commentDate) as commentDateString,
commentTime,
userFn_timeIntegerToString(commentTime) as commentTimeString,
userFn_timeIntegerToPeriodString(commentTime) as commentTimePeriodString,
comment,
recordCreate_userName, recordUpdate_userName
from BurialSiteContractComments
where recordDelete_timeMillis is null
and burialSiteContractId = ?
order by commentDate desc, commentTime desc, burialSiteContractCommentId desc`
)
.all(burialSiteContractId) as BurialSiteContractComment[]
if (connectedDatabase === undefined) {
database.release()
}
return comments
}

View File

@ -0,0 +1,3 @@
import type { PoolConnection } from 'better-sqlite-pool';
import type { BurialSiteContractFee } from '../types/recordTypes.js';
export default function getBurialSiteContractFees(burialSiteContractId: number | string, connectedDatabase?: PoolConnection): Promise<BurialSiteContractFee[]>;

View File

@ -1,19 +1,19 @@
import { acquireConnection } from './pool.js'; import { acquireConnection } from './pool.js';
export default async function getLotOccupancyFees(lotOccupancyId, connectedDatabase) { export default async function getBurialSiteContractFees(burialSiteContractId, connectedDatabase) {
const database = connectedDatabase ?? (await acquireConnection()); const database = connectedDatabase ?? (await acquireConnection());
const lotOccupancyFees = database const fees = database
.prepare(`select o.lotOccupancyId, o.feeId, .prepare(`select o.burialSiteContractId, o.feeId,
c.feeCategory, f.feeName, c.feeCategory, f.feeName,
f.includeQuantity, o.feeAmount, o.taxAmount, o.quantity, f.quantityUnit f.includeQuantity, o.feeAmount, o.taxAmount, o.quantity, f.quantityUnit
from LotOccupancyFees o from BurialSiteContractFees o
left join Fees f on o.feeId = f.feeId left join Fees f on o.feeId = f.feeId
left join FeeCategories c on f.feeCategoryId = c.feeCategoryId left join FeeCategories c on f.feeCategoryId = c.feeCategoryId
where o.recordDelete_timeMillis is null where o.recordDelete_timeMillis is null
and o.lotOccupancyId = ? and o.burialSiteContractId = ?
order by o.recordCreate_timeMillis`) order by o.recordCreate_timeMillis`)
.all(lotOccupancyId); .all(burialSiteContractId);
if (connectedDatabase === undefined) { if (connectedDatabase === undefined) {
database.release(); database.release();
} }
return lotOccupancyFees; return fees;
} }

View File

@ -1,32 +1,32 @@
import type { PoolConnection } from 'better-sqlite-pool' import type { PoolConnection } from 'better-sqlite-pool'
import type { LotOccupancyFee } from '../types/recordTypes.js' import type { BurialSiteContractFee } from '../types/recordTypes.js'
import { acquireConnection } from './pool.js' import { acquireConnection } from './pool.js'
export default async function getLotOccupancyFees( export default async function getBurialSiteContractFees(
lotOccupancyId: number | string, burialSiteContractId: number | string,
connectedDatabase?: PoolConnection connectedDatabase?: PoolConnection
): Promise<LotOccupancyFee[]> { ): Promise<BurialSiteContractFee[]> {
const database = connectedDatabase ?? (await acquireConnection()) const database = connectedDatabase ?? (await acquireConnection())
const lotOccupancyFees = database const fees = database
.prepare( .prepare(
`select o.lotOccupancyId, o.feeId, `select o.burialSiteContractId, o.feeId,
c.feeCategory, f.feeName, c.feeCategory, f.feeName,
f.includeQuantity, o.feeAmount, o.taxAmount, o.quantity, f.quantityUnit f.includeQuantity, o.feeAmount, o.taxAmount, o.quantity, f.quantityUnit
from LotOccupancyFees o from BurialSiteContractFees o
left join Fees f on o.feeId = f.feeId left join Fees f on o.feeId = f.feeId
left join FeeCategories c on f.feeCategoryId = c.feeCategoryId left join FeeCategories c on f.feeCategoryId = c.feeCategoryId
where o.recordDelete_timeMillis is null where o.recordDelete_timeMillis is null
and o.lotOccupancyId = ? and o.burialSiteContractId = ?
order by o.recordCreate_timeMillis` order by o.recordCreate_timeMillis`
) )
.all(lotOccupancyId) as LotOccupancyFee[] .all(burialSiteContractId) as BurialSiteContractFee[]
if (connectedDatabase === undefined) { if (connectedDatabase === undefined) {
database.release() database.release()
} }
return lotOccupancyFees return fees
} }

View File

@ -0,0 +1,3 @@
import type { PoolConnection } from 'better-sqlite-pool';
import type { BurialSiteContractField } from '../types/recordTypes.js';
export default function getBurialSiteContractField(burialSiteContractId: number | string, connectedDatabase?: PoolConnection): Promise<BurialSiteContractField[]>;

View File

@ -0,0 +1,33 @@
import { acquireConnection } from './pool.js';
export default async function getBurialSiteContractField(burialSiteContractId, connectedDatabase) {
const database = connectedDatabase ?? (await acquireConnection());
const fields = database
.prepare(`select o.burialSiteContractId, o.contractTypeFieldId,
o.fieldValue, f.contractTypeField, f.fieldType, f.fieldValues,
f.isRequired, f.pattern, f.minimumLength, f.maximumLength,
f.orderNumber, t.orderNumber as contractTypeOrderNumber
from BurialSiteContractFields o
left join ContractTypeFields f on o.contractTypeFieldId = f.contractTypeFieldId
left join ContractTypes t on f.contractTypeId = t.contractTypeId
where o.recordDelete_timeMillis is null
and o.burialSiteContractId = ?
union
select ? as burialSiteContractId, f.contractTypeFieldId,
'' as fieldValue, f.contractTypeField, f.fieldType, f.fieldValues,
f.isRequired, f.pattern, f.minimumLength, f.maximumLength,
f.orderNumber, t.orderNumber as contractTypeOrderNumber
from ContractTypeFields f
left join ContractTypes t on f.contractTypeId = t.contractTypeId
where f.recordDelete_timeMillis is null and (
f.contractTypeId is null
or f.contractTypeId in (select contractTypeId from BurialSiteContracts where burialSiteContractId = ?))
and f.contractTypeFieldId not in (select contractTypeFieldId from BurialSiteContractFields where burialSiteContractId = ? and recordDelete_timeMillis is null)
order by contractTypeOrderNumber, f.orderNumber, f.contractTypeField`)
.all(burialSiteContractId, burialSiteContractId, burialSiteContractId, burialSiteContractId);
if (connectedDatabase === undefined) {
database.release();
}
return fields;
}

View File

@ -0,0 +1,51 @@
import type { PoolConnection } from 'better-sqlite-pool'
import type { BurialSiteContractField } from '../types/recordTypes.js'
import { acquireConnection } from './pool.js'
export default async function getBurialSiteContractField(
burialSiteContractId: number | string,
connectedDatabase?: PoolConnection
): Promise<BurialSiteContractField[]> {
const database = connectedDatabase ?? (await acquireConnection())
const fields = database
.prepare(
`select o.burialSiteContractId, o.contractTypeFieldId,
o.fieldValue, f.contractTypeField, f.fieldType, f.fieldValues,
f.isRequired, f.pattern, f.minimumLength, f.maximumLength,
f.orderNumber, t.orderNumber as contractTypeOrderNumber
from BurialSiteContractFields o
left join ContractTypeFields f on o.contractTypeFieldId = f.contractTypeFieldId
left join ContractTypes t on f.contractTypeId = t.contractTypeId
where o.recordDelete_timeMillis is null
and o.burialSiteContractId = ?
union
select ? as burialSiteContractId, f.contractTypeFieldId,
'' as fieldValue, f.contractTypeField, f.fieldType, f.fieldValues,
f.isRequired, f.pattern, f.minimumLength, f.maximumLength,
f.orderNumber, t.orderNumber as contractTypeOrderNumber
from ContractTypeFields f
left join ContractTypes t on f.contractTypeId = t.contractTypeId
where f.recordDelete_timeMillis is null and (
f.contractTypeId is null
or f.contractTypeId in (select contractTypeId from BurialSiteContracts where burialSiteContractId = ?))
and f.contractTypeFieldId not in (select contractTypeFieldId from BurialSiteContractFields where burialSiteContractId = ? and recordDelete_timeMillis is null)
order by contractTypeOrderNumber, f.orderNumber, f.contractTypeField`
)
.all(
burialSiteContractId,
burialSiteContractId,
burialSiteContractId,
burialSiteContractId
) as BurialSiteContractField[]
if (connectedDatabase === undefined) {
database.release()
}
return fields
}

View File

@ -0,0 +1,3 @@
import type { PoolConnection } from 'better-sqlite-pool';
import type { BurialSiteContractInterment } from '../types/recordTypes.js';
export default function getBurialSiteContractInterments(burialSiteContractId: number | string, connectedDatabase?: PoolConnection): Promise<BurialSiteContractInterment[]>;

View File

@ -0,0 +1,34 @@
import { dateIntegerToString, timeIntegerToString } from '@cityssm/utils-datetime';
import { acquireConnection } from './pool.js';
export default async function getBurialSiteContractInterments(burialSiteContractId, connectedDatabase) {
const database = connectedDatabase ?? (await acquireConnection());
database.function('userFn_dateIntegerToString', dateIntegerToString);
database.function('userFn_timeIntegerToString', timeIntegerToString);
const interments = database
.prepare(`select o.burialSiteContractId, o.intermentNumber,
o.isCremated,
o.deceasedName,
birthDate, userFn_dateIntegerToString(birthDate) as birthDateString,
birthPlace,
deathDate, userFn_dateIntegerToString(deathDate) as deathDateString,
deathPlace,
intermentDate, userFn_dateIntegerToString(intermentDate) as intermentDateString,
intermentTime, userFn_timeIntegerToString(intermentTime) as intermentTimeString,
intermentContainerTypeId, t.intermentContainerType,
intermentCommittalTypeId, c.intermentCommittalType
from BurialSiteContractInterments o
left join IntermentContainerTypes t on o.intermentContainerTypeId = t.intermentContainerTypeId
left join IntermentCommittalTypes c on o.intermentCommittalTypeId = c.intermentCommittalTypeId
where o.recordDelete_timeMillis is null
and o.burialSiteContractId = ?
order by t.orderNumber, o.deceasedName, o.intermentNumber`)
.all(burialSiteContractId);
if (connectedDatabase === undefined) {
database.release();
}
return interments;
}

View File

@ -0,0 +1,51 @@
import {
dateIntegerToString,
timeIntegerToString
} from '@cityssm/utils-datetime'
import type { PoolConnection } from 'better-sqlite-pool'
import type { BurialSiteContractInterment } from '../types/recordTypes.js'
import { acquireConnection } from './pool.js'
export default async function getBurialSiteContractInterments(
burialSiteContractId: number | string,
connectedDatabase?: PoolConnection
): Promise<BurialSiteContractInterment[]> {
const database = connectedDatabase ?? (await acquireConnection())
database.function('userFn_dateIntegerToString', dateIntegerToString)
database.function('userFn_timeIntegerToString', timeIntegerToString)
const interments = database
.prepare(
`select o.burialSiteContractId, o.intermentNumber,
o.isCremated,
o.deceasedName,
birthDate, userFn_dateIntegerToString(birthDate) as birthDateString,
birthPlace,
deathDate, userFn_dateIntegerToString(deathDate) as deathDateString,
deathPlace,
intermentDate, userFn_dateIntegerToString(intermentDate) as intermentDateString,
intermentTime, userFn_timeIntegerToString(intermentTime) as intermentTimeString,
intermentContainerTypeId, t.intermentContainerType,
intermentCommittalTypeId, c.intermentCommittalType
from BurialSiteContractInterments o
left join IntermentContainerTypes t on o.intermentContainerTypeId = t.intermentContainerTypeId
left join IntermentCommittalTypes c on o.intermentCommittalTypeId = c.intermentCommittalTypeId
where o.recordDelete_timeMillis is null
and o.burialSiteContractId = ?
order by t.orderNumber, o.deceasedName, o.intermentNumber`
)
.all(burialSiteContractId) as BurialSiteContractInterment[]
if (connectedDatabase === undefined) {
database.release()
}
return interments
}

View File

@ -0,0 +1,5 @@
import type { PoolConnection } from 'better-sqlite-pool';
import type { BurialSiteContractTransaction } from '../types/recordTypes.js';
export default function GetBurialSiteContractTransactions(burialSiteContractId: number | string, options: {
includeIntegrations: boolean;
}, connectedDatabase?: PoolConnection): Promise<BurialSiteContractTransaction[]>;

View File

@ -2,24 +2,24 @@ import { dateIntegerToString, timeIntegerToString } from '@cityssm/utils-datetim
import { getConfigProperty } from '../helpers/config.helpers.js'; import { getConfigProperty } from '../helpers/config.helpers.js';
import { getDynamicsGPDocument } from '../helpers/functions.dynamicsGP.js'; import { getDynamicsGPDocument } from '../helpers/functions.dynamicsGP.js';
import { acquireConnection } from './pool.js'; import { acquireConnection } from './pool.js';
export default async function getLotOccupancyTransactions(lotOccupancyId, options, connectedDatabase) { export default async function GetBurialSiteContractTransactions(burialSiteContractId, options, connectedDatabase) {
const database = connectedDatabase ?? (await acquireConnection()); const database = connectedDatabase ?? (await acquireConnection());
database.function('userFn_dateIntegerToString', dateIntegerToString); database.function('userFn_dateIntegerToString', dateIntegerToString);
database.function('userFn_timeIntegerToString', timeIntegerToString); database.function('userFn_timeIntegerToString', timeIntegerToString);
const lotOccupancyTransactions = database const lotOccupancyTransactions = database
.prepare(`select lotOccupancyId, transactionIndex, .prepare(`select burialSiteContractId, transactionIndex,
transactionDate, userFn_dateIntegerToString(transactionDate) as transactionDateString, transactionDate, userFn_dateIntegerToString(transactionDate) as transactionDateString,
transactionTime, userFn_timeIntegerToString(transactionTime) as transactionTimeString, transactionTime, userFn_timeIntegerToString(transactionTime) as transactionTimeString,
transactionAmount, externalReceiptNumber, transactionNote transactionAmount, externalReceiptNumber, transactionNote
from LotOccupancyTransactions from BurialSiteContractTransactions
where recordDelete_timeMillis is null where recordDelete_timeMillis is null
and lotOccupancyId = ? and burialSiteContractId = ?
order by transactionDate, transactionTime, transactionIndex`) order by transactionDate, transactionTime, transactionIndex`)
.all(lotOccupancyId); .all(burialSiteContractId);
if (connectedDatabase === undefined) { if (connectedDatabase === undefined) {
database.release(); database.release();
} }
if ((options?.includeIntegrations ?? false) && if (options.includeIntegrations &&
getConfigProperty('settings.dynamicsGP.integrationIsEnabled')) { getConfigProperty('settings.dynamicsGP.integrationIsEnabled')) {
for (const transaction of lotOccupancyTransactions) { for (const transaction of lotOccupancyTransactions) {
if ((transaction.externalReceiptNumber ?? '') !== '') { if ((transaction.externalReceiptNumber ?? '') !== '') {

View File

@ -6,17 +6,17 @@ import type { PoolConnection } from 'better-sqlite-pool'
import { getConfigProperty } from '../helpers/config.helpers.js' import { getConfigProperty } from '../helpers/config.helpers.js'
import { getDynamicsGPDocument } from '../helpers/functions.dynamicsGP.js' import { getDynamicsGPDocument } from '../helpers/functions.dynamicsGP.js'
import type { LotOccupancyTransaction } from '../types/recordTypes.js' import type { BurialSiteContractTransaction } from '../types/recordTypes.js'
import { acquireConnection } from './pool.js' import { acquireConnection } from './pool.js'
export default async function getLotOccupancyTransactions( export default async function GetBurialSiteContractTransactions(
lotOccupancyId: number | string, burialSiteContractId: number | string,
options: { options: {
includeIntegrations: boolean includeIntegrations: boolean
}, },
connectedDatabase?: PoolConnection connectedDatabase?: PoolConnection
): Promise<LotOccupancyTransaction[]> { ): Promise<BurialSiteContractTransaction[]> {
const database = connectedDatabase ?? (await acquireConnection()) const database = connectedDatabase ?? (await acquireConnection())
database.function('userFn_dateIntegerToString', dateIntegerToString) database.function('userFn_dateIntegerToString', dateIntegerToString)
@ -24,23 +24,23 @@ export default async function getLotOccupancyTransactions(
const lotOccupancyTransactions = database const lotOccupancyTransactions = database
.prepare( .prepare(
`select lotOccupancyId, transactionIndex, `select burialSiteContractId, transactionIndex,
transactionDate, userFn_dateIntegerToString(transactionDate) as transactionDateString, transactionDate, userFn_dateIntegerToString(transactionDate) as transactionDateString,
transactionTime, userFn_timeIntegerToString(transactionTime) as transactionTimeString, transactionTime, userFn_timeIntegerToString(transactionTime) as transactionTimeString,
transactionAmount, externalReceiptNumber, transactionNote transactionAmount, externalReceiptNumber, transactionNote
from LotOccupancyTransactions from BurialSiteContractTransactions
where recordDelete_timeMillis is null where recordDelete_timeMillis is null
and lotOccupancyId = ? and burialSiteContractId = ?
order by transactionDate, transactionTime, transactionIndex` order by transactionDate, transactionTime, transactionIndex`
) )
.all(lotOccupancyId) as LotOccupancyTransaction[] .all(burialSiteContractId) as BurialSiteContractTransaction[]
if (connectedDatabase === undefined) { if (connectedDatabase === undefined) {
database.release() database.release()
} }
if ( if (
(options?.includeIntegrations ?? false) && options.includeIntegrations &&
getConfigProperty('settings.dynamicsGP.integrationIsEnabled') getConfigProperty('settings.dynamicsGP.integrationIsEnabled')
) { ) {
for (const transaction of lotOccupancyTransactions) { for (const transaction of lotOccupancyTransactions) {

View File

@ -0,0 +1,30 @@
import { type DateString } from '@cityssm/utils-datetime';
import type { PoolConnection } from 'better-sqlite-pool';
import type { BurialSiteContract } from '../types/recordTypes.js';
interface GetBurialSiteContractsFilters {
burialSiteId?: number | string;
occupancyTime?: '' | 'past' | 'current' | 'future';
contractStartDateString?: DateString;
occupancyEffectiveDateString?: string;
occupantName?: string;
contractTypeId?: number | string;
cemeteryId?: number | string;
burialSiteNameSearchType?: '' | 'startsWith' | 'endsWith';
burialSiteName?: string;
burialSiteTypeId?: number | string;
workOrderId?: number | string;
notWorkOrderId?: number | string;
}
interface GetBurialSiteContractsOptions {
/** -1 for no limit */
limit: number;
offset: number;
includeInterments: boolean;
includeFees: boolean;
includeTransactions: boolean;
}
export default function getBurialSiteContracts(filters: GetBurialSiteContractsFilters, options: GetBurialSiteContractsOptions, connectedDatabase?: PoolConnection): Promise<{
count: number;
burialSiteContracts: BurialSiteContract[];
}>;
export {};

View File

@ -0,0 +1,150 @@
import { dateIntegerToString, dateStringToInteger } from '@cityssm/utils-datetime';
import { getConfigProperty } from '../helpers/config.helpers.js';
import { getContractTypeById } from '../helpers/functions.cache.js';
import { getLotNameWhereClause, getOccupancyTimeWhereClause, getOccupantNameWhereClause } from '../helpers/functions.sqlFilters.js';
import getBurialSiteContractFees from './getBurialSiteContractFees.js';
// import getLotOccupancyOccupants from './getLotOccupancyOccupants.js'
import getBurialSiteContractTransactions from './getBurialSiteContractTransactions.js';
import { acquireConnection } from './pool.js';
function buildWhereClause(filters) {
let sqlWhereClause = ' where o.recordDelete_timeMillis is null';
const sqlParameters = [];
if ((filters.burialSiteId ?? '') !== '') {
sqlWhereClause += ' and o.lotId = ?';
sqlParameters.push(filters.burialSiteId);
}
const lotNameFilters = getLotNameWhereClause(filters.burialSiteName, filters.burialSiteNameSearchType ?? '', 'l');
sqlWhereClause += lotNameFilters.sqlWhereClause;
sqlParameters.push(...lotNameFilters.sqlParameters);
const occupantNameFilters = getOccupantNameWhereClause(filters.occupantName, 'o');
if (occupantNameFilters.sqlParameters.length > 0) {
sqlWhereClause += ` and o.burialSiteContractId in (
select burialSiteContractId from LotOccupancyOccupants o
where recordDelete_timeMillis is null
${occupantNameFilters.sqlWhereClause})`;
sqlParameters.push(...occupantNameFilters.sqlParameters);
}
if ((filters.contractTypeId ?? '') !== '') {
sqlWhereClause += ' and o.contractTypeId = ?';
sqlParameters.push(filters.contractTypeId);
}
const occupancyTimeFilters = getOccupancyTimeWhereClause(filters.occupancyTime ?? '', 'o');
sqlWhereClause += occupancyTimeFilters.sqlWhereClause;
sqlParameters.push(...occupancyTimeFilters.sqlParameters);
if ((filters.contractStartDateString ?? '') !== '') {
sqlWhereClause += ' and o.contractStartDate = ?';
sqlParameters.push(dateStringToInteger(filters.contractStartDateString));
}
if ((filters.occupancyEffectiveDateString ?? '') !== '') {
sqlWhereClause += ` and (
o.contractEndDate is null
or (o.contractStartDate <= ? and o.contractEndDate >= ?)
)`;
sqlParameters.push(dateStringToInteger(filters.occupancyEffectiveDateString), dateStringToInteger(filters.occupancyEffectiveDateString));
}
if ((filters.cemeteryId ?? '') !== '') {
sqlWhereClause += ' and l.cemeteryId = ?';
sqlParameters.push(filters.cemeteryId);
}
if ((filters.burialSiteTypeId ?? '') !== '') {
sqlWhereClause += ' and l.burialSiteTypeId = ?';
sqlParameters.push(filters.burialSiteTypeId);
}
if ((filters.workOrderId ?? '') !== '') {
sqlWhereClause +=
' and o.burialSiteContractId in (select burialSiteContractId from WorkOrderBurialSiteContracts where recordDelete_timeMillis is null and workOrderId = ?)';
sqlParameters.push(filters.workOrderId);
}
if ((filters.notWorkOrderId ?? '') !== '') {
sqlWhereClause +=
' and o.burialSiteContractId not in (select burialSiteContractId from WorkOrderBurialSiteContracts where recordDelete_timeMillis is null and workOrderId = ?)';
sqlParameters.push(filters.notWorkOrderId);
}
return {
sqlWhereClause,
sqlParameters
};
}
async function addInclusions(burialSiteContract, options, database) {
if (options.includeFees) {
burialSiteContract.burialSiteContractFees = await getBurialSiteContractFees(burialSiteContract.burialSiteContractId, database);
}
if (options.includeTransactions) {
burialSiteContract.burialSiteContractTransactions =
await getBurialSiteContractTransactions(burialSiteContract.burialSiteContractId, { includeIntegrations: false }, database);
}
/*
if (options.includeInterments) {
burialSiteContract.burialSiteContractInterments =
await getLotOccupancyOccupants(
burialSiteContract.burialSiteContractId,
database
)
}
*/
return burialSiteContract;
}
export default async function getBurialSiteContracts(filters, options, connectedDatabase) {
const database = connectedDatabase ?? (await acquireConnection());
database.function('userFn_dateIntegerToString', dateIntegerToString);
const { sqlWhereClause, sqlParameters } = buildWhereClause(filters);
let count = options.limit;
const isLimited = options.limit !== -1;
if (isLimited) {
count = database
.prepare(`select count(*) as recordCount
from BurialSiteContracts o
left join BurialSites l on o.burialSiteId = l.burialSiteId
${sqlWhereClause}`)
.get(sqlParameters).recordCount;
}
let burialSiteContracts = [];
if (count !== 0) {
burialSiteContracts = database
.prepare(`select o.burialSiteContractId,
o.contractTypeId, t.contractType,
o.burialSiteId, lt.burialSiteType,
l.burialSiteNameSegment1,
l.burialSiteNameSegment2,
l.burialSiteNameSegment3,
l.burialSiteNameSegment4,
l.burialSiteNameSegment5,
l.cemeteryId, m.cemeteryName,
o.contractStartDate, userFn_dateIntegerToString(o.contractStartDate) as contractStartDateString,
o.contractEndDate, userFn_dateIntegerToString(o.contractEndDate) as contractEndDateString
from BurialSiteContracts o
left join ContractTypes t on o.contractTypeId = t.contractTypeId
left join BurialSites l on o.burialSiteId = l.burialSiteId
left join BurialSiteTypes lt on l.burialSiteTypeId = lt.burialSiteTypeId
left join Cemeteries m on l.cemeteryId = m.cemeteryId
${sqlWhereClause}
order by o.contractStartDate desc, ifnull(o.contractEndDate, 99999999) desc,
l.burialSiteNameSegment1,
l.burialSiteNameSegment2,
l.burialSiteNameSegment3,
l.burialSiteNameSegment4,
l.burialSiteNameSegment5,
o.burialSiteId, o.burialSiteContractId desc
${isLimited ? ` limit ${options.limit} offset ${options.offset}` : ''}`)
.all(sqlParameters);
if (!isLimited) {
count = burialSiteContracts.length;
}
for (const burialSiteContract of burialSiteContracts) {
const contractType = await getContractTypeById(burialSiteContract.contractTypeId);
if (contractType !== undefined) {
burialSiteContract.printEJS = (contractType.contractTypePrints ?? []).includes('*')
? getConfigProperty('settings.contracts.prints')[0]
: (contractType.contractTypePrints ?? [])[0];
}
await addInclusions(burialSiteContract, options, database);
}
}
if (connectedDatabase === undefined) {
database.release();
}
return {
count,
burialSiteContracts
};
}

View File

@ -0,0 +1,262 @@
import {
type DateString,
dateIntegerToString,
dateStringToInteger
} 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 {
getLotNameWhereClause,
getOccupancyTimeWhereClause,
getOccupantNameWhereClause
} from '../helpers/functions.sqlFilters.js'
import type { BurialSiteContract } from '../types/recordTypes.js'
import getBurialSiteContractFees from './getBurialSiteContractFees.js'
// import getLotOccupancyOccupants from './getLotOccupancyOccupants.js'
import getBurialSiteContractTransactions from './getBurialSiteContractTransactions.js'
import { acquireConnection } from './pool.js'
interface GetBurialSiteContractsFilters {
burialSiteId?: number | string
occupancyTime?: '' | 'past' | 'current' | 'future'
contractStartDateString?: DateString
occupancyEffectiveDateString?: string
occupantName?: string
contractTypeId?: number | string
cemeteryId?: number | string
burialSiteNameSearchType?: '' | 'startsWith' | 'endsWith'
burialSiteName?: string
burialSiteTypeId?: number | string
workOrderId?: number | string
notWorkOrderId?: number | string
}
interface GetBurialSiteContractsOptions {
/** -1 for no limit */
limit: number
offset: number
includeInterments: boolean
includeFees: boolean
includeTransactions: boolean
}
function buildWhereClause(filters: GetBurialSiteContractsFilters): {
sqlWhereClause: string
sqlParameters: unknown[]
} {
let sqlWhereClause = ' where o.recordDelete_timeMillis is null'
const sqlParameters: unknown[] = []
if ((filters.burialSiteId ?? '') !== '') {
sqlWhereClause += ' and o.lotId = ?'
sqlParameters.push(filters.burialSiteId)
}
const lotNameFilters = getLotNameWhereClause(
filters.burialSiteName,
filters.burialSiteNameSearchType ?? '',
'l'
)
sqlWhereClause += lotNameFilters.sqlWhereClause
sqlParameters.push(...lotNameFilters.sqlParameters)
const occupantNameFilters = getOccupantNameWhereClause(
filters.occupantName,
'o'
)
if (occupantNameFilters.sqlParameters.length > 0) {
sqlWhereClause += ` and o.burialSiteContractId in (
select burialSiteContractId from LotOccupancyOccupants o
where recordDelete_timeMillis is null
${occupantNameFilters.sqlWhereClause})`
sqlParameters.push(...occupantNameFilters.sqlParameters)
}
if ((filters.contractTypeId ?? '') !== '') {
sqlWhereClause += ' and o.contractTypeId = ?'
sqlParameters.push(filters.contractTypeId)
}
const occupancyTimeFilters = getOccupancyTimeWhereClause(
filters.occupancyTime ?? '',
'o'
)
sqlWhereClause += occupancyTimeFilters.sqlWhereClause
sqlParameters.push(...occupancyTimeFilters.sqlParameters)
if ((filters.contractStartDateString ?? '') !== '') {
sqlWhereClause += ' and o.contractStartDate = ?'
sqlParameters.push(
dateStringToInteger(filters.contractStartDateString as DateString)
)
}
if ((filters.occupancyEffectiveDateString ?? '') !== '') {
sqlWhereClause += ` and (
o.contractEndDate is null
or (o.contractStartDate <= ? and o.contractEndDate >= ?)
)`
sqlParameters.push(
dateStringToInteger(filters.occupancyEffectiveDateString as DateString),
dateStringToInteger(filters.occupancyEffectiveDateString 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.workOrderId ?? '') !== '') {
sqlWhereClause +=
' and o.burialSiteContractId in (select burialSiteContractId from WorkOrderBurialSiteContracts where recordDelete_timeMillis is null and workOrderId = ?)'
sqlParameters.push(filters.workOrderId)
}
if ((filters.notWorkOrderId ?? '') !== '') {
sqlWhereClause +=
' and o.burialSiteContractId not in (select burialSiteContractId from WorkOrderBurialSiteContracts where recordDelete_timeMillis is null and workOrderId = ?)'
sqlParameters.push(filters.notWorkOrderId)
}
return {
sqlWhereClause,
sqlParameters
}
}
async function addInclusions(
burialSiteContract: BurialSiteContract,
options: GetBurialSiteContractsOptions,
database: PoolConnection
): Promise<BurialSiteContract> {
if (options.includeFees) {
burialSiteContract.burialSiteContractFees = await getBurialSiteContractFees(
burialSiteContract.burialSiteContractId,
database
)
}
if (options.includeTransactions) {
burialSiteContract.burialSiteContractTransactions =
await getBurialSiteContractTransactions(
burialSiteContract.burialSiteContractId,
{ includeIntegrations: false },
database
)
}
/*
if (options.includeInterments) {
burialSiteContract.burialSiteContractInterments =
await getLotOccupancyOccupants(
burialSiteContract.burialSiteContractId,
database
)
}
*/
return burialSiteContract
}
export default async function getBurialSiteContracts(
filters: GetBurialSiteContractsFilters,
options: GetBurialSiteContractsOptions,
connectedDatabase?: PoolConnection
): Promise<{ count: number; burialSiteContracts: BurialSiteContract[] }> {
const database = connectedDatabase ?? (await acquireConnection())
database.function('userFn_dateIntegerToString', dateIntegerToString)
const { sqlWhereClause, sqlParameters } = buildWhereClause(filters)
let count = options.limit
const isLimited = options.limit !== -1
if (isLimited) {
count = (
database
.prepare(
`select count(*) as recordCount
from BurialSiteContracts o
left join BurialSites l on o.burialSiteId = l.burialSiteId
${sqlWhereClause}`
)
.get(sqlParameters) as { recordCount: number }
).recordCount
}
let burialSiteContracts: BurialSiteContract[] = []
if (count !== 0) {
burialSiteContracts = database
.prepare(
`select o.burialSiteContractId,
o.contractTypeId, t.contractType,
o.burialSiteId, lt.burialSiteType,
l.burialSiteNameSegment1,
l.burialSiteNameSegment2,
l.burialSiteNameSegment3,
l.burialSiteNameSegment4,
l.burialSiteNameSegment5,
l.cemeteryId, m.cemeteryName,
o.contractStartDate, userFn_dateIntegerToString(o.contractStartDate) as contractStartDateString,
o.contractEndDate, userFn_dateIntegerToString(o.contractEndDate) as contractEndDateString
from BurialSiteContracts o
left join ContractTypes t on o.contractTypeId = t.contractTypeId
left join BurialSites l on o.burialSiteId = l.burialSiteId
left join BurialSiteTypes lt on l.burialSiteTypeId = lt.burialSiteTypeId
left join Cemeteries m on l.cemeteryId = m.cemeteryId
${sqlWhereClause}
order by o.contractStartDate desc, ifnull(o.contractEndDate, 99999999) desc,
l.burialSiteNameSegment1,
l.burialSiteNameSegment2,
l.burialSiteNameSegment3,
l.burialSiteNameSegment4,
l.burialSiteNameSegment5,
o.burialSiteId, o.burialSiteContractId desc
${
isLimited ? ` limit ${options.limit} offset ${options.offset}` : ''
}`
)
.all(sqlParameters) as BurialSiteContract[]
if (!isLimited) {
count = burialSiteContracts.length
}
for (const burialSiteContract of burialSiteContracts) {
const contractType = await getContractTypeById(
burialSiteContract.contractTypeId!
)
if (contractType !== undefined) {
burialSiteContract.printEJS = (
contractType.contractTypePrints ?? []
).includes('*')
? getConfigProperty('settings.contracts.prints')[0]
: (contractType.contractTypePrints ?? [])[0]
}
await addInclusions(burialSiteContract, options, database)
}
}
if (connectedDatabase === undefined) {
database.release()
}
return {
count,
burialSiteContracts
}
}

View File

@ -0,0 +1,3 @@
import type { PoolConnection } from 'better-sqlite-pool';
import type { BurialSiteField } from '../types/recordTypes.js';
export default function getBurialSiteFields(burialSiteId: number | string, connectedDatabase?: PoolConnection): Promise<BurialSiteField[]>;

View File

@ -0,0 +1,36 @@
import { acquireConnection } from './pool.js';
export default async function getBurialSiteFields(burialSiteId, connectedDatabase) {
const database = connectedDatabase ?? (await acquireConnection());
const burialSiteFields = database
.prepare(`select l.burialSiteId, l.burialSiteTypeFieldId,
l.fieldValue,
f.burialSiteTypeField, f.fieldType, f.fieldValues,
f.isRequired, f.pattern, f.minimumLength, f.maximumLength,
f.orderNumber, t.orderNumber as burialSiteTypeOrderNumber
from BurialSiteFields l
left join BurialSiteTypeFields f on l.burialSiteTypeFieldId = f.burialSiteTypeFieldId
left join BurialSiteTypes t on f.burialSiteTypeId = t.burialSiteTypeId
where l.recordDelete_timeMillis is null
and l.burialSiteId = ?
union
select ? as burialSiteId, f.burialSiteTypeFieldId,
'' as fieldValue,
f.burialSiteTypeField, f.fieldType, f.fieldValues,
f.isRequired, f.pattern, f.minimumLength, f.maximumLength,
f.orderNumber, t.orderNumber as burialSiteTypeOrderNumber
from BurialSiteTypeFields f
left join BurialSiteTypes t on f.burialSiteTypeId = t.burialSiteTypeId
where f.recordDelete_timeMillis is null
and (
f.burialSiteTypeId is null
or f.burialSiteTypeId in (select burialSiteTypeId from BurialSites where burialSiteId = ?))
and f.burialSiteTypeFieldId not in (select burialSiteTypeFieldId from BurialSiteFields where burialSiteId = ? and recordDelete_timeMillis is null)
order by burialSiteTypeOrderNumber, f.orderNumber, f.burialSiteTypeField`)
.all(burialSiteId, burialSiteId, burialSiteId, burialSiteId);
if (connectedDatabase === undefined) {
database.release();
}
return burialSiteFields;
}

View File

@ -0,0 +1,54 @@
import type { PoolConnection } from 'better-sqlite-pool'
import type { BurialSiteField } from '../types/recordTypes.js'
import { acquireConnection } from './pool.js'
export default async function getBurialSiteFields(
burialSiteId: number | string,
connectedDatabase?: PoolConnection
): Promise<BurialSiteField[]> {
const database = connectedDatabase ?? (await acquireConnection())
const burialSiteFields = database
.prepare(
`select l.burialSiteId, l.burialSiteTypeFieldId,
l.fieldValue,
f.burialSiteTypeField, f.fieldType, f.fieldValues,
f.isRequired, f.pattern, f.minimumLength, f.maximumLength,
f.orderNumber, t.orderNumber as burialSiteTypeOrderNumber
from BurialSiteFields l
left join BurialSiteTypeFields f on l.burialSiteTypeFieldId = f.burialSiteTypeFieldId
left join BurialSiteTypes t on f.burialSiteTypeId = t.burialSiteTypeId
where l.recordDelete_timeMillis is null
and l.burialSiteId = ?
union
select ? as burialSiteId, f.burialSiteTypeFieldId,
'' as fieldValue,
f.burialSiteTypeField, f.fieldType, f.fieldValues,
f.isRequired, f.pattern, f.minimumLength, f.maximumLength,
f.orderNumber, t.orderNumber as burialSiteTypeOrderNumber
from BurialSiteTypeFields f
left join BurialSiteTypes t on f.burialSiteTypeId = t.burialSiteTypeId
where f.recordDelete_timeMillis is null
and (
f.burialSiteTypeId is null
or f.burialSiteTypeId in (select burialSiteTypeId from BurialSites where burialSiteId = ?))
and f.burialSiteTypeFieldId not in (select burialSiteTypeFieldId from BurialSiteFields where burialSiteId = ? and recordDelete_timeMillis is null)
order by burialSiteTypeOrderNumber, f.orderNumber, f.burialSiteTypeField`
)
.all(
burialSiteId,
burialSiteId,
burialSiteId,
burialSiteId
) as BurialSiteField[]
if (connectedDatabase === undefined) {
database.release()
}
return burialSiteFields
}

View File

@ -0,0 +1,9 @@
import type { BurialSiteStatus } from '../types/recordTypes.js';
interface GetFilters {
cemeteryId?: number | string;
}
interface BurialSiteStatusSummary extends BurialSiteStatus {
burialSiteCount: number;
}
export default function getBurialSiteStatusSummary(filters: GetFilters): Promise<BurialSiteStatusSummary[]>;
export {};

View File

@ -0,0 +1,21 @@
import { acquireConnection } from './pool.js';
export default async function getBurialSiteStatusSummary(filters) {
const database = await acquireConnection();
let sqlWhereClause = ' where l.recordDelete_timeMillis is null';
const sqlParameters = [];
if ((filters.cemeteryId ?? '') !== '') {
sqlWhereClause += ' and l.cemeteryId = ?';
sqlParameters.push(filters.cemeteryId);
}
const statuses = database
.prepare(`select s.burialSiteStatusId, s.burialSiteStatus,
count(l.burialSiteId) as burialSiteCount
from BurialSites l
left join BurialSiteStatuses s on l.burialSiteStatusId = s.burialSiteStatusId
${sqlWhereClause}
group by s.burialSiteStatusId, s.burialSiteStatus, s.orderNumber
order by s.orderNumber`)
.all(sqlParameters);
database.release();
return statuses;
}

View File

@ -0,0 +1,41 @@
import type { BurialSiteStatus } from '../types/recordTypes.js'
import { acquireConnection } from './pool.js'
interface GetFilters {
cemeteryId?: number | string
}
interface BurialSiteStatusSummary extends BurialSiteStatus {
burialSiteCount: number
}
export default async function getBurialSiteStatusSummary(
filters: GetFilters
): Promise<BurialSiteStatusSummary[]> {
const database = await acquireConnection()
let sqlWhereClause = ' where l.recordDelete_timeMillis is null'
const sqlParameters: unknown[] = []
if ((filters.cemeteryId ?? '') !== '') {
sqlWhereClause += ' and l.cemeteryId = ?'
sqlParameters.push(filters.cemeteryId)
}
const statuses = database
.prepare(
`select s.burialSiteStatusId, s.burialSiteStatus,
count(l.burialSiteId) as burialSiteCount
from BurialSites l
left join BurialSiteStatuses s on l.burialSiteStatusId = s.burialSiteStatusId
${sqlWhereClause}
group by s.burialSiteStatusId, s.burialSiteStatus, s.orderNumber
order by s.orderNumber`
)
.all(sqlParameters) as BurialSiteStatusSummary[]
database.release()
return statuses
}

View File

@ -0,0 +1,2 @@
import type { BurialSiteStatus } from '../types/recordTypes.js';
export default function getBurialSiteStatuses(): Promise<BurialSiteStatus[]>;

View File

@ -0,0 +1,21 @@
import { acquireConnection } from './pool.js';
import { updateRecordOrderNumber } from './updateRecordOrderNumber.js';
export default async function getBurialSiteStatuses() {
const database = await acquireConnection();
const statuses = database
.prepare(`select burialSiteStatusId, burialSiteStatus, orderNumber
from BurialSiteStatuses
where recordDelete_timeMillis is null
order by orderNumber, burialSiteStatus`)
.all();
let expectedOrderNumber = 0;
for (const status of statuses) {
if (status.orderNumber !== expectedOrderNumber) {
updateRecordOrderNumber('BurialSiteStatuses', status.burialSiteStatusId, expectedOrderNumber, database);
status.orderNumber = expectedOrderNumber;
}
expectedOrderNumber += 1;
}
database.release();
return statuses;
}

View File

@ -0,0 +1,37 @@
import type { BurialSiteStatus } from '../types/recordTypes.js'
import { acquireConnection } from './pool.js'
import { updateRecordOrderNumber } from './updateRecordOrderNumber.js'
export default async function getBurialSiteStatuses(): Promise<BurialSiteStatus[]> {
const database = await acquireConnection()
const statuses = database
.prepare(
`select burialSiteStatusId, burialSiteStatus, orderNumber
from BurialSiteStatuses
where recordDelete_timeMillis is null
order by orderNumber, burialSiteStatus`
)
.all() as BurialSiteStatus[]
let expectedOrderNumber = 0
for (const status of statuses) {
if (status.orderNumber !== expectedOrderNumber) {
updateRecordOrderNumber(
'BurialSiteStatuses',
status.burialSiteStatusId,
expectedOrderNumber,
database
)
status.orderNumber = expectedOrderNumber
}
expectedOrderNumber += 1
}
database.release()
return statuses
}

View File

@ -0,0 +1,3 @@
import type { PoolConnection } from 'better-sqlite-pool';
import type { BurialSiteTypeField } from '../types/recordTypes.js';
export default function getBurialSiteTypeFields(burialSiteTypeId: number, connectedDatabase?: PoolConnection): Promise<BurialSiteTypeField[]>;

View File

@ -0,0 +1,26 @@
import { acquireConnection } from './pool.js';
import { updateRecordOrderNumber } from './updateRecordOrderNumber.js';
export default async function getBurialSiteTypeFields(burialSiteTypeId, connectedDatabase) {
const database = connectedDatabase ?? (await acquireConnection());
const typeFields = database
.prepare(`select burialSiteTypeFieldId,
burialSiteTypeField, fieldType, fieldValues,
isRequired, pattern, minimumLength, maximumLength, orderNumber
from BurialSiteTypeFields
where recordDelete_timeMillis is null
and burialSiteTypeId = ?
order by orderNumber, burialSiteTypeField`)
.all(burialSiteTypeId);
let expectedOrderNumber = 0;
for (const typeField of typeFields) {
if (typeField.orderNumber !== expectedOrderNumber) {
updateRecordOrderNumber('BurialSiteTypeFields', typeField.burialSiteTypeFieldId, expectedOrderNumber, database);
typeField.orderNumber = expectedOrderNumber;
}
expectedOrderNumber += 1;
}
if (connectedDatabase === undefined) {
database.release();
}
return typeFields;
}

View File

@ -0,0 +1,48 @@
import type { PoolConnection } from 'better-sqlite-pool'
import type { BurialSiteTypeField } from '../types/recordTypes.js'
import { acquireConnection } from './pool.js'
import { updateRecordOrderNumber } from './updateRecordOrderNumber.js'
export default async function getBurialSiteTypeFields(
burialSiteTypeId: number,
connectedDatabase?: PoolConnection
): Promise<BurialSiteTypeField[]> {
const database = connectedDatabase ?? (await acquireConnection())
const typeFields = database
.prepare(
`select burialSiteTypeFieldId,
burialSiteTypeField, fieldType, fieldValues,
isRequired, pattern, minimumLength, maximumLength, orderNumber
from BurialSiteTypeFields
where recordDelete_timeMillis is null
and burialSiteTypeId = ?
order by orderNumber, burialSiteTypeField`
)
.all(burialSiteTypeId) as BurialSiteTypeField[]
let expectedOrderNumber = 0
for (const typeField of typeFields) {
if (typeField.orderNumber !== expectedOrderNumber) {
updateRecordOrderNumber(
'BurialSiteTypeFields',
typeField.burialSiteTypeFieldId,
expectedOrderNumber,
database
)
typeField.orderNumber = expectedOrderNumber
}
expectedOrderNumber += 1
}
if (connectedDatabase === undefined) {
database.release()
}
return typeFields
}

View File

@ -0,0 +1,9 @@
import type { BurialSiteType } from '../types/recordTypes.js';
interface GetFilters {
cemeteryId?: number | string;
}
interface BurialSiteTypeSummary extends BurialSiteType {
lotCount: number;
}
export default function getBurialSiteTypeSummary(filters: GetFilters): Promise<BurialSiteTypeSummary[]>;
export {};

View File

@ -0,0 +1,21 @@
import { acquireConnection } from './pool.js';
export default async function getBurialSiteTypeSummary(filters) {
const database = await acquireConnection();
let sqlWhereClause = ' where l.recordDelete_timeMillis is null';
const sqlParameters = [];
if ((filters.cemeteryId ?? '') !== '') {
sqlWhereClause += ' and l.cemeteryId = ?';
sqlParameters.push(filters.cemeteryId);
}
const burialSiteTypes = database
.prepare(`select t.burialSiteTypeId, t.burialSiteType,
count(l.burialSiteId) as burialSiteCount
from BurialSites l
left join BurialSiteTypes t on l.burialSiteTypeId = t.burialSiteTypeId
${sqlWhereClause}
group by t.burialSiteTypeId, t.burialSiteType, t.orderNumber
order by t.orderNumber`)
.all(sqlParameters);
database.release();
return burialSiteTypes;
}

View File

@ -0,0 +1,41 @@
import type { BurialSiteType } from '../types/recordTypes.js'
import { acquireConnection } from './pool.js'
interface GetFilters {
cemeteryId?: number | string
}
interface BurialSiteTypeSummary extends BurialSiteType {
lotCount: number
}
export default async function getBurialSiteTypeSummary(
filters: GetFilters
): Promise<BurialSiteTypeSummary[]> {
const database = await acquireConnection()
let sqlWhereClause = ' where l.recordDelete_timeMillis is null'
const sqlParameters: unknown[] = []
if ((filters.cemeteryId ?? '') !== '') {
sqlWhereClause += ' and l.cemeteryId = ?'
sqlParameters.push(filters.cemeteryId)
}
const burialSiteTypes = database
.prepare(
`select t.burialSiteTypeId, t.burialSiteType,
count(l.burialSiteId) as burialSiteCount
from BurialSites l
left join BurialSiteTypes t on l.burialSiteTypeId = t.burialSiteTypeId
${sqlWhereClause}
group by t.burialSiteTypeId, t.burialSiteType, t.orderNumber
order by t.orderNumber`
)
.all(sqlParameters) as BurialSiteTypeSummary[]
database.release()
return burialSiteTypes
}

View File

@ -0,0 +1,2 @@
import type { BurialSiteType } from '../types/recordTypes.js';
export default function getBurialSiteTypes(): Promise<BurialSiteType[]>;

View File

@ -0,0 +1,23 @@
import getBurialSiteTypeFields from './getBurialSiteTypeFields.js';
import { acquireConnection } from './pool.js';
import { updateRecordOrderNumber } from './updateRecordOrderNumber.js';
export default async function getBurialSiteTypes() {
const database = await acquireConnection();
const burialSiteTypes = database
.prepare(`select burialSiteTypeId, burialSiteType, orderNumber
from BurialSiteTypes
where recordDelete_timeMillis is null
order by orderNumber, burialSiteType`)
.all();
let expectedOrderNumber = -1;
for (const burialSiteType of burialSiteTypes) {
expectedOrderNumber += 1;
if (burialSiteType.orderNumber !== expectedOrderNumber) {
updateRecordOrderNumber('BurialSiteTypes', burialSiteType.burialSiteTypeId, expectedOrderNumber, database);
burialSiteType.orderNumber = expectedOrderNumber;
}
burialSiteType.burialSiteTypeFields = await getBurialSiteTypeFields(burialSiteType.burialSiteTypeId, database);
}
database.release();
return burialSiteTypes;
}

View File

@ -0,0 +1,44 @@
import type { BurialSiteType } from '../types/recordTypes.js'
import getBurialSiteTypeFields from './getBurialSiteTypeFields.js'
import { acquireConnection } from './pool.js'
import { updateRecordOrderNumber } from './updateRecordOrderNumber.js'
export default async function getBurialSiteTypes(): Promise<BurialSiteType[]> {
const database = await acquireConnection()
const burialSiteTypes = database
.prepare(
`select burialSiteTypeId, burialSiteType, orderNumber
from BurialSiteTypes
where recordDelete_timeMillis is null
order by orderNumber, burialSiteType`
)
.all() as BurialSiteType[]
let expectedOrderNumber = -1
for (const burialSiteType of burialSiteTypes) {
expectedOrderNumber += 1
if (burialSiteType.orderNumber !== expectedOrderNumber) {
updateRecordOrderNumber(
'BurialSiteTypes',
burialSiteType.burialSiteTypeId,
expectedOrderNumber,
database
)
burialSiteType.orderNumber = expectedOrderNumber
}
burialSiteType.burialSiteTypeFields = await getBurialSiteTypeFields(
burialSiteType.burialSiteTypeId,
database
)
}
database.release()
return burialSiteTypes
}

22
database/getBurialSites.d.ts vendored 100644
View File

@ -0,0 +1,22 @@
import type { PoolConnection } from 'better-sqlite-pool';
import type { BurialSite } from '../types/recordTypes.js';
interface GetBurialSitesFilters {
burialSiteNameSearchType?: '' | 'startsWith' | 'endsWith';
burialSiteName?: string;
cemeteryId?: number | string;
burialSiteTypeId?: number | string;
burialSiteStatusId?: number | string;
contractStatus?: '' | 'occupied' | 'unoccupied';
workOrderId?: number | string;
}
interface GetBurialSitesOptions {
/** -1 for no limit */
limit: number;
offset: number;
includeBurialSiteContractCount?: boolean;
}
export default function getBurialSites(filters: GetBurialSitesFilters, options: GetBurialSitesOptions, connectedDatabase?: PoolConnection): Promise<{
count: number;
burialSites: BurialSite[];
}>;
export {};

View File

@ -0,0 +1,114 @@
import { dateToInteger } from '@cityssm/utils-datetime';
import { getLotNameWhereClause } from '../helpers/functions.sqlFilters.js';
import { acquireConnection } from './pool.js';
function buildWhereClause(filters) {
let sqlWhereClause = ' where l.recordDelete_timeMillis is null';
const sqlParameters = [];
const lotNameFilters = getLotNameWhereClause(filters.burialSiteName, filters.burialSiteNameSearchType ?? '', 'l');
sqlWhereClause += lotNameFilters.sqlWhereClause;
sqlParameters.push(...lotNameFilters.sqlParameters);
if ((filters.cemeteryId ?? '') !== '') {
sqlWhereClause += ' and l.cemeteryId = ?';
sqlParameters.push(filters.cemeteryId);
}
if ((filters.burialSiteTypeId ?? '') !== '') {
sqlWhereClause += ' and l.burialSiteTypeId = ?';
sqlParameters.push(filters.burialSiteTypeId);
}
if ((filters.burialSiteStatusId ?? '') !== '') {
sqlWhereClause += ' and l.burialSiteStatusId = ?';
sqlParameters.push(filters.burialSiteStatusId);
}
if ((filters.contractStatus ?? '') !== '') {
if (filters.contractStatus === 'occupied') {
sqlWhereClause += ' and lotOccupancyCount > 0';
}
else if (filters.contractStatus === 'unoccupied') {
sqlWhereClause +=
' and (lotOccupancyCount is null or lotOccupancyCount = 0)';
}
}
if ((filters.workOrderId ?? '') !== '') {
sqlWhereClause +=
' and l.lotId in (select lotId from WorkOrderLots where recordDelete_timeMillis is null and workOrderId = ?)';
sqlParameters.push(filters.workOrderId);
}
return {
sqlWhereClause,
sqlParameters
};
}
export default async function getBurialSites(filters, options, connectedDatabase) {
const database = connectedDatabase ?? (await acquireConnection());
const { sqlWhereClause, sqlParameters } = buildWhereClause(filters);
const currentDate = dateToInteger(new Date());
let count = 0;
if (options.limit !== -1) {
count = database
.prepare(`select count(*) as recordCount
from BurialSites l
left join (
select burialSiteId, count(burialSiteContractId) as burialSiteContractCount from BurialSiteContracts
where recordDelete_timeMillis is null
and contractStartDate <= ${currentDate.toString()}
and (contractEndDate is null or contractEndDate >= ${currentDate.toString()})
group by burialSiteId
) o on l.burialSiteId = o.burialSiteId
${sqlWhereClause}`)
.get(sqlParameters).recordCount;
}
let burialSites = [];
if (options.limit === -1 || count > 0) {
const includeBurialSiteContractCount = options.includeBurialSiteContractCount ?? true;
if (includeBurialSiteContractCount) {
sqlParameters.unshift(currentDate, currentDate);
}
burialSites = database
.prepare(`select l.burialSiteId,
l.burialSiteNameSegment1,
l.burialSiteNameSegment2,
l.burialSiteNameSegment3,
l.burialSiteNameSegment4,
l.burialSiteNameSegment5,
t.burialSiteType,
l.cemeteryId, m.cemeteryName, l.cemeterySvgId,
l.burialSiteStatusId, s.burialSiteStatus
${includeBurialSiteContractCount
? ', ifnull(o.burialSiteContractCount, 0) as burialSiteContractCount'
: ''}
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
${includeBurialSiteContractCount
? `left join (
select burialSiteId, count(burialSiteContractId) as burialSiteContractCount
from BurialSiteContracts
where recordDelete_timeMillis is null
and contractStartDate <= ?
and (contractEndDate is null or contractEndDate >= ?)
group by burialSiteId) o on l.burialSiteId = o.burialSiteId`
: ''}
${sqlWhereClause}
order by l.burialSiteNameSegment1,
l.burialSiteNameSegment2,
l.burialSiteNameSegment3,
l.burialSiteNameSegment4,
l.burialSiteNameSegment5,
l.burialSiteId
${options.limit === -1
? ''
: ` limit ${options.limit.toString()} offset ${options.offset.toString()}`}`)
.all(sqlParameters);
if (options.limit === -1) {
count = burialSites.length;
}
}
if (connectedDatabase === undefined) {
database.release();
}
return {
count,
burialSites
};
}

View File

@ -0,0 +1,177 @@
import { dateToInteger } from '@cityssm/utils-datetime'
import type { PoolConnection } from 'better-sqlite-pool'
import { getLotNameWhereClause } from '../helpers/functions.sqlFilters.js'
import type { BurialSite } from '../types/recordTypes.js'
import { acquireConnection } from './pool.js'
interface GetBurialSitesFilters {
burialSiteNameSearchType?: '' | 'startsWith' | 'endsWith'
burialSiteName?: string
cemeteryId?: number | string
burialSiteTypeId?: number | string
burialSiteStatusId?: number | string
contractStatus?: '' | 'occupied' | 'unoccupied'
workOrderId?: number | string
}
interface GetBurialSitesOptions {
/** -1 for no limit */
limit: number
offset: number
includeBurialSiteContractCount?: boolean
}
function buildWhereClause(filters: GetBurialSitesFilters): {
sqlWhereClause: string
sqlParameters: unknown[]
} {
let sqlWhereClause = ' where l.recordDelete_timeMillis is null'
const sqlParameters: unknown[] = []
const lotNameFilters = getLotNameWhereClause(
filters.burialSiteName,
filters.burialSiteNameSearchType ?? '',
'l'
)
sqlWhereClause += lotNameFilters.sqlWhereClause
sqlParameters.push(...lotNameFilters.sqlParameters)
if ((filters.cemeteryId ?? '') !== '') {
sqlWhereClause += ' and l.cemeteryId = ?'
sqlParameters.push(filters.cemeteryId)
}
if ((filters.burialSiteTypeId ?? '') !== '') {
sqlWhereClause += ' and l.burialSiteTypeId = ?'
sqlParameters.push(filters.burialSiteTypeId)
}
if ((filters.burialSiteStatusId ?? '') !== '') {
sqlWhereClause += ' and l.burialSiteStatusId = ?'
sqlParameters.push(filters.burialSiteStatusId)
}
if ((filters.contractStatus ?? '') !== '') {
if (filters.contractStatus === 'occupied') {
sqlWhereClause += ' and lotOccupancyCount > 0'
} else if (filters.contractStatus === 'unoccupied') {
sqlWhereClause +=
' and (lotOccupancyCount is null or lotOccupancyCount = 0)'
}
}
if ((filters.workOrderId ?? '') !== '') {
sqlWhereClause +=
' and l.lotId in (select lotId from WorkOrderLots where recordDelete_timeMillis is null and workOrderId = ?)'
sqlParameters.push(filters.workOrderId)
}
return {
sqlWhereClause,
sqlParameters
}
}
export default async function getBurialSites(
filters: GetBurialSitesFilters,
options: GetBurialSitesOptions,
connectedDatabase?: PoolConnection
): Promise<{ count: number; burialSites: BurialSite[] }> {
const database = connectedDatabase ?? (await acquireConnection())
const { sqlWhereClause, sqlParameters } = buildWhereClause(filters)
const currentDate = dateToInteger(new Date())
let count = 0
if (options.limit !== -1) {
count = (
database
.prepare(
`select count(*) as recordCount
from BurialSites l
left join (
select burialSiteId, count(burialSiteContractId) as burialSiteContractCount from BurialSiteContracts
where recordDelete_timeMillis is null
and contractStartDate <= ${currentDate.toString()}
and (contractEndDate is null or contractEndDate >= ${currentDate.toString()})
group by burialSiteId
) o on l.burialSiteId = o.burialSiteId
${sqlWhereClause}`
)
.get(sqlParameters) as { recordCount: number }
).recordCount
}
let burialSites: BurialSite[] = []
if (options.limit === -1 || count > 0) {
const includeBurialSiteContractCount = options.includeBurialSiteContractCount ?? true
if (includeBurialSiteContractCount) {
sqlParameters.unshift(currentDate, currentDate)
}
burialSites = database
.prepare(
`select l.burialSiteId,
l.burialSiteNameSegment1,
l.burialSiteNameSegment2,
l.burialSiteNameSegment3,
l.burialSiteNameSegment4,
l.burialSiteNameSegment5,
t.burialSiteType,
l.cemeteryId, m.cemeteryName, l.cemeterySvgId,
l.burialSiteStatusId, s.burialSiteStatus
${
includeBurialSiteContractCount
? ', ifnull(o.burialSiteContractCount, 0) as burialSiteContractCount'
: ''
}
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
${
includeBurialSiteContractCount
? `left join (
select burialSiteId, count(burialSiteContractId) as burialSiteContractCount
from BurialSiteContracts
where recordDelete_timeMillis is null
and contractStartDate <= ?
and (contractEndDate is null or contractEndDate >= ?)
group by burialSiteId) o on l.burialSiteId = o.burialSiteId`
: ''
}
${sqlWhereClause}
order by l.burialSiteNameSegment1,
l.burialSiteNameSegment2,
l.burialSiteNameSegment3,
l.burialSiteNameSegment4,
l.burialSiteNameSegment5,
l.burialSiteId
${
options.limit === -1
? ''
: ` limit ${options.limit.toString()} offset ${options.offset.toString()}`
}`
)
.all(sqlParameters) as BurialSite[]
if (options.limit === -1) {
count = burialSites.length
}
}
if (connectedDatabase === undefined) {
database.release()
}
return {
count,
burialSites
}
}

2
database/getCemeteries.d.ts vendored 100644
View File

@ -0,0 +1,2 @@
import type { Cemetery } from '../types/recordTypes.js';
export default function getCemeteries(): Promise<Cemetery[]>;

View File

@ -0,0 +1,22 @@
import { acquireConnection } from './pool.js';
export default async function getCemeteries() {
const database = await acquireConnection();
const cemeteries = database
.prepare(`select m.cemeteryId, m.cemeteryName, m.cemeteryDescription,
m.cemeteryLatitude, m.cemeteryLongitude, m.cemeterySvg,
m.cemeteryAddress1, m.cemeteryAddress2, m.cemeteryCity, m.cemeteryProvince, m.cemeteryPostalCode,
m.cemeteryPhoneNumber,
ifnull(l.burialSiteCount, 0) as burialSiteCount
from Cemeteries m
left join (
select cemeteryId, count(burialSiteId) as burialSiteCount
from BurialSites
where recordDelete_timeMillis is null
group by cemeteryId
) l on m.cemeteryId = l.cemeteryId
where m.recordDelete_timeMillis is null
order by m.cemeteryName, m.cemeteryId`)
.all();
database.release();
return cemeteries;
}

View File

@ -0,0 +1,30 @@
import type { Cemetery } from '../types/recordTypes.js'
import { acquireConnection } from './pool.js'
export default async function getCemeteries(): Promise<Cemetery[]> {
const database = await acquireConnection()
const cemeteries = database
.prepare(
`select m.cemeteryId, m.cemeteryName, m.cemeteryDescription,
m.cemeteryLatitude, m.cemeteryLongitude, m.cemeterySvg,
m.cemeteryAddress1, m.cemeteryAddress2, m.cemeteryCity, m.cemeteryProvince, m.cemeteryPostalCode,
m.cemeteryPhoneNumber,
ifnull(l.burialSiteCount, 0) as burialSiteCount
from Cemeteries m
left join (
select cemeteryId, count(burialSiteId) as burialSiteCount
from BurialSites
where recordDelete_timeMillis is null
group by cemeteryId
) l on m.cemeteryId = l.cemeteryId
where m.recordDelete_timeMillis is null
order by m.cemeteryName, m.cemeteryId`
)
.all() as Cemetery[]
database.release()
return cemeteries
}

2
database/getCemetery.d.ts vendored 100644
View File

@ -0,0 +1,2 @@
import type { Cemetery } from '../types/recordTypes.js';
export default function getMap(cemeteryId: number | string): Promise<Cemetery | undefined>;

View File

@ -0,0 +1,27 @@
import { acquireConnection } from './pool.js';
export default async function getMap(cemeteryId) {
const database = await acquireConnection();
const map = database
.prepare(`select 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.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 BurialSites l on m.cemeteryId = l.cemeteryId and l.recordDelete_timeMillis is null
where m.cemeteryId = ?
and 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.recordCreate_userName, m.recordCreate_timeMillis,
m.recordUpdate_userName, m.recordUpdate_timeMillis,
m.recordDelete_userName, m.recordDelete_timeMillis`)
.get(cemeteryId);
database.release();
return map;
}

View File

@ -0,0 +1,37 @@
import type { Cemetery } from '../types/recordTypes.js'
import { acquireConnection } from './pool.js'
export default async function getMap(
cemeteryId: number | string
): Promise<Cemetery | undefined> {
const database = await acquireConnection()
const map = database
.prepare(
`select 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.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 BurialSites l on m.cemeteryId = l.cemeteryId and l.recordDelete_timeMillis is null
where m.cemeteryId = ?
and 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.recordCreate_userName, m.recordCreate_timeMillis,
m.recordUpdate_userName, m.recordUpdate_timeMillis,
m.recordDelete_userName, m.recordDelete_timeMillis`
)
.get(cemeteryId) as Cemetery | undefined
database.release()
return map
}

View File

@ -0,0 +1,3 @@
import type { PoolConnection } from 'better-sqlite-pool';
import type { ContractTypeField } from '../types/recordTypes.js';
export default function getContractTypeFields(contractTypeId?: number, connectedDatabase?: PoolConnection): Promise<ContractTypeField[]>;

View File

@ -0,0 +1,31 @@
import { acquireConnection } from './pool.js';
import { updateRecordOrderNumber } from './updateRecordOrderNumber.js';
export default async function getContractTypeFields(contractTypeId, connectedDatabase) {
const database = connectedDatabase ?? (await acquireConnection());
const sqlParameters = [];
if ((contractTypeId ?? -1) !== -1) {
sqlParameters.push(contractTypeId);
}
const contractTypeFields = database
.prepare(`select contractTypeFieldId, contractTypeField, fieldType,
fieldValues, isRequired, pattern, minimumLength, maximumLength, orderNumber
from ContractTypeFields
where recordDelete_timeMillis is null
${(contractTypeId ?? -1) === -1
? ' and contractTypeId is null'
: ' and contractTypeId = ?'}
order by orderNumber, contractTypeField`)
.all(sqlParameters);
let expectedOrderNumber = 0;
for (const contractTypeField of contractTypeFields) {
if (contractTypeField.orderNumber !== expectedOrderNumber) {
updateRecordOrderNumber('ContractTypeFields', contractTypeField.contractTypeFieldId, expectedOrderNumber, database);
contractTypeField.orderNumber = expectedOrderNumber;
}
expectedOrderNumber += 1;
}
if (connectedDatabase === undefined) {
database.release();
}
return contractTypeFields;
}

View File

@ -0,0 +1,57 @@
import type { PoolConnection } from 'better-sqlite-pool'
import type { ContractTypeField } from '../types/recordTypes.js'
import { acquireConnection } from './pool.js'
import { updateRecordOrderNumber } from './updateRecordOrderNumber.js'
export default async function getContractTypeFields(
contractTypeId?: number,
connectedDatabase?: PoolConnection
): Promise<ContractTypeField[]> {
const database = connectedDatabase ?? (await acquireConnection())
const sqlParameters: unknown[] = []
if ((contractTypeId ?? -1) !== -1) {
sqlParameters.push(contractTypeId)
}
const contractTypeFields = database
.prepare(
`select contractTypeFieldId, contractTypeField, fieldType,
fieldValues, isRequired, pattern, minimumLength, maximumLength, orderNumber
from ContractTypeFields
where recordDelete_timeMillis is null
${
(contractTypeId ?? -1) === -1
? ' and contractTypeId is null'
: ' and contractTypeId = ?'
}
order by orderNumber, contractTypeField`
)
.all(sqlParameters) as ContractTypeField[]
let expectedOrderNumber = 0
for (const contractTypeField of contractTypeFields) {
if (contractTypeField.orderNumber !== expectedOrderNumber) {
updateRecordOrderNumber(
'ContractTypeFields',
contractTypeField.contractTypeFieldId,
expectedOrderNumber,
database
)
contractTypeField.orderNumber = expectedOrderNumber
}
expectedOrderNumber += 1
}
if (connectedDatabase === undefined) {
database.release()
}
return contractTypeFields
}

View File

@ -0,0 +1,2 @@
import type { PoolConnection } from 'better-sqlite-pool';
export default function getContractTypePrints(contractTypeId: number, connectedDatabase?: PoolConnection): Promise<string[]>;

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