UNPKG

@cityssm/worktech-api

Version:

Integrations with the WorkTech (Pearl) work order management system.

114 lines (94 loc) 3.36 kB
import { NodeCache } from '@cacheable/node-cache' import { type mssql, connect } from '@cityssm/mssql-multi-pool' import { cacheTimeToLiveSeconds } from '../../apiConfig.js' import type { Activity } from './types.js' const sql = `SELECT [ActvSysID] as activitySystemId, [Actv_ID] as activityId, coalesce([ActvType], '') as activityType, coalesce([DESC], '') as activityDescription, coalesce([ShortDesc], '') as activityShortDescription, coalesce([ActvClass], '') as activityClass, coalesce([AcctSeg], '') as accountSegment FROM [WMACD] WITH (NOLOCK)` const cache = new NodeCache<Activity>({ stdTTL: cacheTimeToLiveSeconds }) /** * Retrieves an activity. * @param mssqlConfig - SQL Server configuration. * @param activityId - The activity id * @param bypassCache - Whether to bypass the cache * @returns The activity, if available. */ export async function getActivityByActivityId( mssqlConfig: mssql.config, activityId: string, bypassCache = false ): Promise<Activity | undefined> { let activityObject = bypassCache ? undefined : cache.get(activityId) if (activityObject !== undefined) { return activityObject } const pool = await connect(mssqlConfig) const result = (await pool .request() .input('activityId', activityId) .query(`${sql} where Actv_ID = @activityId`)) as mssql.IResult<Activity> if (result.recordset.length === 0) { return undefined } activityObject = result.recordset[0] cache.set(activityId, activityObject) return activityObject } /** * Retrieves the activity associated with a given job and fiscal year. * @param mssqlConfig - SQL Server configuration * @param jobId - The job id * @param activityId - The activity id. * @param fiscalYear - The fiscal year * @returns - An array of activities. */ export async function getActivityAssignedToJobByActivityIdAndFiscalYear( mssqlConfig: mssql.config, jobId: string, activityId: string, fiscalYear: number | string ): Promise<Activity | undefined> { const pool = await connect(mssqlConfig) const result = (await pool .request() .input('jobId', jobId) .input('activityId', activityId) .input('fiscalYear', fiscalYear) .query( `${sql} where Actv_ID = @activityId and Actv_ID in (select Actv_ID from WMJACA with (nolock) where Job_ID = @jobId and Year = @fiscalYear)` )) as mssql.IResult<Activity> if (result.recordset.length === 0) { return undefined } return result.recordset[0] } /** * Retrieves the activities associated with a given job and fiscal year. * @param mssqlConfig - SQL Server configuration * @param jobId - The job id * @param fiscalYear - The fiscal year * @returns - An array of activities. */ export async function getActivitiesAssignedToJobByFiscalYear( mssqlConfig: mssql.config, jobId: string, fiscalYear: number | string ): Promise<Activity[]> { const pool = await connect(mssqlConfig) const result = (await pool .request() .input('jobId', jobId) .input('fiscalYear', fiscalYear) .query( `${sql} where Actv_ID in (select Actv_ID from WMJACA with (nolock) where Job_ID = @jobId and Year = @fiscalYear)` )) as mssql.IResult<Activity> return result.recordset }