@cityssm/worktech-api
Version:
Integrations with the WorkTech (Pearl) work order management system.
101 lines (76 loc) • 3.02 kB
text/typescript
import { NodeCache } from '@cacheable/node-cache'
import { type mssql, connect } from '@cityssm/mssql-multi-pool'
import { cacheTimeToLiveSeconds } from '../../apiConfig.js'
import type { WorkOrder } from './types.js'
const sql = `SELECT [SRQISysID] as serviceRequestSystemId,
[] as workOrderNumber,
coalesce([Proj_ID], '') as project,
[] as requestDateTime,
[] as dueDateTime,
[] as scheduledDateTime,
[] as doneDateTime,
[] as closedDateTime,
coalesce([ReqBy], '') as requestedBy,
coalesce([ReqPhone], '') as requestedByPhoneNumber,
coalesce([Add1], '') as address1,
[] as workOrderType,
coalesce([Series], '') as workOrderSeries,
coalesce([SubType], '') as workOrderSubType,
coalesce([Subject], '') as subject,
coalesce([Details], '') as details,
coalesce([Priority], '') as priority,
coalesce([Item_ID], '') as itemId,
coalesce([ExJob_ID], '') as jobId,
coalesce([Actv_ID], '') as activityId,
coalesce([ObjCode], '') as objectCode,
coalesce([ServiceClass], '') as serviceClass,
coalesce([ServiceType], '') as serviceType,
coalesce([Year], '') as fiscalYear,
coalesce([EvaluatedBy], '') as evaluatedBy,
coalesce([AssignTo], '') as assignedTo,
coalesce([Action], '') as action,
coalesce([ResponseNotes], '') as responseNotes,
coalesce([BillName], '') as billingName,
coalesce([UserDef1], '') as userDefined1,
coalesce([UserDef2], '') as userDefined2,
coalesce([UserDef3], '') as userDefined3,
coalesce([UserDef4], '') as userDefined4,
coalesce([UserDef5], '') as userDefined5
FROM [AMSRQI] WITH (NOLOCK)`
const cache = new NodeCache<WorkOrder>({
stdTTL: cacheTimeToLiveSeconds
})
/**
* Retrieves a work order.
* @param mssqlConfig - SQL Server configuration.
* @param workOrderNumber - The work order number.
* @param bypassCache - Whether to bypass the cache
* @returns - The work order, if available.
*/
export async function getWorkOrderByWorkOrderNumber(
mssqlConfig: mssql.config,
workOrderNumber: string,
bypassCache = false
): Promise<WorkOrder | undefined> {
const pool = await connect(mssqlConfig)
return await _getWorkOrderByWorkOrderNumber(pool.request(), workOrderNumber, bypassCache)
}
export async function _getWorkOrderByWorkOrderNumber(
request: mssql.Request,
workOrderNumber: string,
bypassCache = false
): Promise<WorkOrder | undefined> {
let workOrder = bypassCache ? undefined : cache.get(workOrderNumber)
if (workOrder !== undefined) {
return workOrder
}
const workOrderResult = (await request
.input('workOrderNumber', workOrderNumber)
.query(`${sql} where WONOs = @workOrderNumber`)) as mssql.IResult<WorkOrder>
if (workOrderResult.recordset.length === 0) {
return undefined
}
workOrder = workOrderResult.recordset[0]
cache.set(workOrderNumber, workOrder)
return workOrder
}