filter search by funeral home

pull/3/head
Dan Gowans 2025-03-24 12:21:55 -04:00
parent df44ab95f7
commit 92056cf6b7
6 changed files with 72 additions and 29 deletions

View File

@ -12,6 +12,7 @@ export interface GetContractsFilters {
burialSiteNameSearchType?: '' | 'startsWith' | 'endsWith'; burialSiteNameSearchType?: '' | 'startsWith' | 'endsWith';
burialSiteName?: string; burialSiteName?: string;
burialSiteTypeId?: number | string; burialSiteTypeId?: number | string;
funeralHomeId?: number | string;
workOrderId?: number | string; workOrderId?: number | string;
notWorkOrderId?: number | string; notWorkOrderId?: number | string;
} }

View File

@ -6,6 +6,7 @@ import getContractFees from './getContractFees.js';
import getContractInterments from './getContractInterments.js'; import getContractInterments from './getContractInterments.js';
import getContractTransactions from './getContractTransactions.js'; import getContractTransactions from './getContractTransactions.js';
import { acquireConnection } from './pool.js'; import { acquireConnection } from './pool.js';
// eslint-disable-next-line complexity
function buildWhereClause(filters) { function buildWhereClause(filters) {
let sqlWhereClause = ' where o.recordDelete_timeMillis is null'; let sqlWhereClause = ' where o.recordDelete_timeMillis is null';
const sqlParameters = []; const sqlParameters = [];
@ -50,6 +51,10 @@ function buildWhereClause(filters) {
sqlWhereClause += ' and l.burialSiteTypeId = ?'; sqlWhereClause += ' and l.burialSiteTypeId = ?';
sqlParameters.push(filters.burialSiteTypeId); sqlParameters.push(filters.burialSiteTypeId);
} }
if ((filters.funeralHomeId ?? '') !== '') {
sqlWhereClause += ' and o.funeralHomeId = ?';
sqlParameters.push(filters.funeralHomeId);
}
if ((filters.workOrderId ?? '') !== '') { if ((filters.workOrderId ?? '') !== '') {
sqlWhereClause += sqlWhereClause +=
' and o.contractId in (select contractId from WorkOrderContracts where recordDelete_timeMillis is null and workOrderId = ?)'; ' and o.contractId in (select contractId from WorkOrderContracts where recordDelete_timeMillis is null and workOrderId = ?)';

View File

@ -31,6 +31,7 @@ export interface GetContractsFilters {
burialSiteNameSearchType?: '' | 'startsWith' | 'endsWith' burialSiteNameSearchType?: '' | 'startsWith' | 'endsWith'
burialSiteName?: string burialSiteName?: string
burialSiteTypeId?: number | string burialSiteTypeId?: number | string
funeralHomeId?: number | string
workOrderId?: number | string workOrderId?: number | string
notWorkOrderId?: number | string notWorkOrderId?: number | string
} }
@ -44,6 +45,7 @@ export interface GetContractsOptions {
includeTransactions: boolean includeTransactions: boolean
} }
// eslint-disable-next-line complexity
function buildWhereClause(filters: GetContractsFilters): { function buildWhereClause(filters: GetContractsFilters): {
sqlWhereClause: string sqlWhereClause: string
sqlParameters: unknown[] sqlParameters: unknown[]
@ -116,6 +118,11 @@ function buildWhereClause(filters: GetContractsFilters): {
sqlParameters.push(filters.burialSiteTypeId) sqlParameters.push(filters.burialSiteTypeId)
} }
if ((filters.funeralHomeId ?? '') !== '') {
sqlWhereClause += ' and o.funeralHomeId = ?'
sqlParameters.push(filters.funeralHomeId)
}
if ((filters.workOrderId ?? '') !== '') { if ((filters.workOrderId ?? '') !== '') {
sqlWhereClause += sqlWhereClause +=
' and o.contractId in (select contractId from WorkOrderContracts where recordDelete_timeMillis is null and workOrderId = ?)' ' and o.contractId in (select contractId from WorkOrderContracts where recordDelete_timeMillis is null and workOrderId = ?)'

View File

@ -1,14 +1,17 @@
import getCemeteries from '../../database/getCemeteries.js'; import getCemeteries from '../../database/getCemeteries.js';
import getFuneralHomes from '../../database/getFuneralHomes.js';
import { getBurialSiteTypes, getContractTypes } from '../../helpers/functions.cache.js'; import { getBurialSiteTypes, getContractTypes } from '../../helpers/functions.cache.js';
export default async function handler(request, response) { export default async function handler(request, response) {
const cemeteries = await getCemeteries(); const cemeteries = await getCemeteries();
const burialSiteTypes = await getBurialSiteTypes(); const burialSiteTypes = await getBurialSiteTypes();
const contractTypes = await getContractTypes(); const contractTypes = await getContractTypes();
const funeralHomes = await getFuneralHomes();
response.render('contract-search', { response.render('contract-search', {
headTitle: "Contract Search", headTitle: "Contract Search",
cemeteries, cemeteries,
burialSiteTypes, burialSiteTypes,
contractTypes, contractTypes,
funeralHomes,
cemeteryId: request.query.cemeteryId cemeteryId: request.query.cemeteryId
}); });
} }

View File

@ -1,6 +1,7 @@
import type { Request, Response } from 'express' import type { Request, Response } from 'express'
import getCemeteries from '../../database/getCemeteries.js' import getCemeteries from '../../database/getCemeteries.js'
import getFuneralHomes from '../../database/getFuneralHomes.js'
import { import {
getBurialSiteTypes, getBurialSiteTypes,
getContractTypes getContractTypes
@ -13,12 +14,14 @@ export default async function handler(
const cemeteries = await getCemeteries() const cemeteries = await getCemeteries()
const burialSiteTypes = await getBurialSiteTypes() const burialSiteTypes = await getBurialSiteTypes()
const contractTypes = await getContractTypes() const contractTypes = await getContractTypes()
const funeralHomes = await getFuneralHomes()
response.render('contract-search', { response.render('contract-search', {
headTitle: "Contract Search", headTitle: "Contract Search",
cemeteries, cemeteries,
burialSiteTypes, burialSiteTypes,
contractTypes, contractTypes,
funeralHomes,
cemeteryId: request.query.cemeteryId cemeteryId: request.query.cemeteryId
}) })
} }

View File

@ -38,17 +38,6 @@
<input id="searchFilter--limit" name="limit" type="hidden" value="100" /> <input id="searchFilter--limit" name="limit" type="hidden" value="100" />
<input id="searchFilter--offset" name="offset" type="hidden" value="0" /> <input id="searchFilter--offset" name="offset" type="hidden" value="0" />
<div class="columns"> <div class="columns">
<div class="column">
<div class="field">
<label class="label" for="searchFilter--deceasedName">Deceased Name</label>
<div class="control has-icons-left">
<input class="input" id="searchFilter--deceasedName" name="deceasedName" accesskey="f" />
<span class="icon is-small is-left">
<i class="fas fa-search" aria-hidden="true"></i>
</span>
</div>
</div>
</div>
<div class="column"> <div class="column">
<div class="field"> <div class="field">
<label class="label" for="searchFilter--contractTypeId">Contract Type</label> <label class="label" for="searchFilter--contractTypeId">Contract Type</label>
@ -67,6 +56,17 @@
</div> </div>
</div> </div>
</div> </div>
<div class="column">
<div class="field">
<label class="label" for="searchFilter--deceasedName">Recipient / Deceased Name</label>
<div class="control has-icons-left">
<input class="input" id="searchFilter--deceasedName" name="deceasedName" accesskey="f" />
<span class="icon is-small is-left">
<i class="fas fa-search" aria-hidden="true"></i>
</span>
</div>
</div>
</div>
<div class="column"> <div class="column">
<div class="field"> <div class="field">
<label class="label" for="searchFilter--contractTime">Contract Time</label> <label class="label" for="searchFilter--contractTime">Contract Time</label>
@ -108,24 +108,6 @@
</div> </div>
</div> </div>
<div class="column"> <div class="column">
<div class="field">
<label class="label" for="searchFilter--burialSiteTypeId">Burial Site Type</label>
<div class="control has-icons-left">
<div class="select is-fullwidth">
<select id="searchFilter--burialSiteTypeId" name="burialSiteTypeId">
<option value="">(All Burial Site Types)</option>
<% for (const burialSiteType of burialSiteTypes) { %>
<option value="<%= burialSiteType.burialSiteTypeId %>"><%= burialSiteType.burialSiteType %></option>
<% } %>
</select>
</div>
<span class="icon is-small is-left">
<i class="fas fa-search" aria-hidden="true"></i>
</span>
</div>
</div>
</div>
</div>
<label class="label" for="searchFilter--burialSiteName">Burial Site</label> <label class="label" for="searchFilter--burialSiteName">Burial Site</label>
<div class="field has-addons"> <div class="field has-addons">
<div class="control has-icons-left"> <div class="control has-icons-left">
@ -144,6 +126,48 @@
<input class="input" id="searchFilter--burialSiteName" name="burialSiteName" /> <input class="input" id="searchFilter--burialSiteName" name="burialSiteName" />
</div> </div>
</div> </div>
</div>
</div>
<div class="columns">
<div class="column">
<div class="field">
<label class="label" for="searchFilter--funeralHomeId">Funeral Home</label>
<div class="control has-icons-left">
<div class="select is-fullwidth">
<select id="searchFilter--funeralHomeId" name="funeralHomeId">
<option value="">(All Funeral Homes)</option>
<% for (const funeralHome of funeralHomes) { %>
<option value="<%= funeralHome.funeralHomeId %>"><%= funeralHome.funeralHomeName %></option>
<% } %>
</select>
</div>
<span class="icon is-small is-left">
<i class="fas fa-search" aria-hidden="true"></i>
</span>
</div>
</div>
</div>
<div class="column">
<div class="field">
<label class="label" for="searchFilter--burialSiteTypeId">Burial Site Type</label>
<div class="control has-icons-left">
<div class="select is-fullwidth">
<select id="searchFilter--burialSiteTypeId" name="burialSiteTypeId">
<option value="">(All Burial Site Types)</option>
<% for (const burialSiteType of burialSiteTypes) { %>
<option value="<%= burialSiteType.burialSiteTypeId %>"><%= burialSiteType.burialSiteType %></option>
<% } %>
</select>
</div>
<span class="icon is-small is-left">
<i class="fas fa-search" aria-hidden="true"></i>
</span>
</div>
</div>
</div>
</div>
</form> </form>
</div> </div>