sunrise-cms/database/getReportData.ts

304 lines
8.3 KiB
TypeScript

import {
type DateString,
dateIntegerToString,
dateStringToInteger,
dateToInteger,
timeIntegerToString
} from '@cityssm/utils-datetime'
import { acquireConnection } from './pool.js'
export type ReportParameters = Record<string, string | number>
// eslint-disable-next-line complexity
export default async function getReportData(
reportName: string,
reportParameters: ReportParameters = {}
): Promise<unknown[] | undefined> {
let sql = ''
const sqlParameters: unknown[] = []
switch (reportName) {
case 'cemeteries-all': {
sql = 'select * from Maps'
break
}
case 'cemeteries-formatted': {
sql = `select cemeteryName,
cemeteryDescription,
cemeteryAddress1, cemeteryAddress2,
cemeteryCity, cemeteryProvince,
cemeteryPostalCode,
cemeteryPhoneNumber
from Cemeteries
where recordDelete_timeMillis is null
order by cemeteryName`
break
}
case 'burialSites-all': {
sql = 'select * from BurialSites'
break
}
case 'burialSites-byBurialSiteTypeId': {
sql = `select l.burialSiteId,
m.cemeteryName,
l.burialSiteNameSegment1,
l.burialSiteNameSegment2,
l.burialSiteNameSegment3,
l.burialSiteNameSegment4,
l.burialSiteNameSegment5,
t.burialSiteType,
s.burialSiteStatus
from BurialSites l
left join BurialSiteTypes t on l.burialSiteTypeId = t.burialSiteTypeId
left join BurialSiteStatuses s on l.burialSiteStatusId = s.burialSiteStatusId
left join Cemeteries m on l.cemeteryId = m.cemeteryId
where l.recordDelete_timeMillis is null
and l.burialSiteTypeId = ?`
sqlParameters.push(reportParameters.burialSiteTypeId)
break
}
case 'burialSites-byBurialSiteStatusId': {
sql = `select l.burialSiteId,
m.cemeteryName,
l.burialSiteNameSegment1,
l.burialSiteNameSegment2,
l.burialSiteNameSegment3,
l.burialSiteNameSegment4,
l.burialSiteNameSegment5,
t.burialSiteType,
s.burialSiteStatus
from BurialSites l
left join BurialSiteTypes t on l.burialSiteTypeId = t.burialSiteTypeId
left join BurialSiteStatuses s on l.burialSiteStatusId = s.burialSiteStatusId
left join Cemeteries m on l.cemeteryId = m.cemeteryId
where l.recordDelete_timeMillis is null
and l.burialSiteStatusId = ?`
sqlParameters.push(reportParameters.burialSiteStatusId)
break
}
case 'burialSites-byCemeteryId': {
sql = `select l.burialSiteId,
m.cemeteryName,
l.burialSiteNameSegment1,
l.burialSiteNameSegment2,
l.burialSiteNameSegment3,
l.burialSiteNameSegment4,
l.burialSiteNameSegment5,
t.burialSiteType,
s.burialSiteStatus
from BurialSites l
left join BurialSiteTypes t on l.burialSiteTypeId = t.burialSiteTypeId
left join BurialSiteStatuses s on l.burialSiteStatusId = s.burialSiteStatusId
left join Cemeteries m on l.cemeteryId = m.cemeteryId
where l.recordDelete_timeMillis is null
and l.cemeteryId = ?`
sqlParameters.push(reportParameters.cemeteryId)
break
}
case 'burialSiteComments-all': {
sql = 'select * from BurialSiteComments'
break
}
case 'burialSiteFields-all': {
sql = 'select * from BurialSiteFields'
break
}
case 'burialSiteContracts-all': {
sql = 'select * from BurialSiteContracts'
break
}
case 'burialSiteContracts-current-byCemeteryId': {
sql = `select o.burialSiteContractId,
l.burialSiteNameSegment1,
l.burialSiteNameSegment2,
l.burialSiteNameSegment3,
l.burialSiteNameSegment4,
l.burialSiteNameSegment5,
m.cemeteryName,
ot.contractType,
o.contractStartDate,
o.contractEndDate
from BurialSiteContracts o
left join ContractTypes ot on o.contractTypeId = ot.contractTypeId
left join BurialSites l on o.burialSiteId = l.burialSiteId
left join Cemeteries m on l.cemeteryId = m.cemeteryId
where o.recordDelete_timeMillis is null
and (o.contractEndDate is null or o.contractEndDate >= ?)
and l.cemeteryId = ?`
sqlParameters.push(dateToInteger(new Date()), reportParameters.cemeteryId)
break
}
case 'burialSiteContractComments-all': {
sql = 'select * from BurialSiteContractComments'
break
}
case 'burialSiteContractFees-all': {
sql = 'select * from BurialSiteContractFees'
break
}
case 'burialSiteContractFields-all': {
sql = 'select * from BurialSiteContractFields'
break
}
case 'burialSiteContractTransactions-all': {
sql = 'select * from BurialSiteContractTransactions'
break
}
case 'burialSiteContractTransactions-byTransactionDateString': {
sql = `select t.burialSiteContractId, t.transactionIndex,
t.transactionDate, t.transactionTime,
t.transactionAmount,
t.externalReceiptNumber, t.transactionNote
from BurialSiteContractTransactions t
where t.recordDelete_timeMillis is null
and t.transactionDate = ?`
sqlParameters.push(
dateStringToInteger(
reportParameters.transactionDateString as DateString
)
)
break
}
case 'workOrders-all': {
sql = 'select * from WorkOrders'
break
}
case 'workOrders-open': {
sql = `select w.workOrderId, w.workOrderNumber,
t.workOrderType, w.workOrderDescription,
w.workOrderOpenDate,
m.workOrderMilestoneCount, m.workOrderMilestoneCompletionCount
from WorkOrders w
left join WorkOrderTypes t on w.workOrderTypeId = t.workOrderTypeId
left join (
select m.workOrderId,
count(m.workOrderMilestoneId) as workOrderMilestoneCount,
sum(case when m.workOrderMilestoneCompletionDate is null then 0 else 1 end) as workOrderMilestoneCompletionCount
from WorkOrderMilestones m
where m.recordDelete_timeMillis is null
group by m.workOrderId
) m on w.workOrderId = m.workOrderId
where w.recordDelete_timeMillis is null
and w.workOrderCloseDate is null`
break
}
case 'workOrderComments-all': {
sql = 'select * from WorkOrderComments'
break
}
case 'workOrderLots-all': {
sql = 'select * from WorkOrderLots'
break
}
case 'workOrderMilestones-all': {
sql = 'select * from WorkOrderMilestones'
break
}
case 'workOrderMilestones-byWorkOrderId': {
sql = `select t.workOrderMilestoneType,
m.workOrderMilestoneDate,
m.workOrderMilestoneTime,
m.workOrderMilestoneDescription,
m.workOrderMilestoneCompletionDate,
m.workOrderMilestoneCompletionTime
from WorkOrderMilestones m
left join WorkOrderMilestoneTypes t on m.workOrderMilestoneTypeId = t.workOrderMilestoneTypeId
where m.recordDelete_timeMillis is null
and m.workOrderId = ?`
sqlParameters.push(reportParameters.workOrderId)
break
}
case 'fees-all': {
sql = 'select * from Fees'
break
}
case 'feeCategories-all': {
sql = 'select * from FeeCategories'
break
}
case 'burialSiteTypes-all': {
sql = 'select * from BurialSiteTypes'
break
}
case 'burialSiteTypeFields-all': {
sql = 'select * from BurialSiteTypeFields'
break
}
case 'burialSiteStatuses-all': {
sql = 'select * from BurialSiteStatuses'
break
}
case 'contractTypes-all': {
sql = 'select * from ContractTypes'
break
}
case 'contractTypeFields-all': {
sql = 'select * from ContractTypeFields'
break
}
case 'workOrderTypes-all': {
sql = 'select * from WorkOrderTypes'
break
}
case 'workOrderMilestoneTypes-all': {
sql = 'select * from WorkOrderMilestoneTypes'
break
}
default: {
return undefined
}
}
const database = await acquireConnection()
database.function('userFn_dateIntegerToString', dateIntegerToString)
database.function('userFn_timeIntegerToString', timeIntegerToString)
const rows = database.prepare(sql).all(sqlParameters)
database.release()
return rows
}