import { acquireConnection } from './pool.js'; import { dateToInteger } from '@cityssm/expressjs-server-js/dateTimeFns.js'; import * as configFunctions from '../functions.config.js'; import { getLotNameWhereClause } from '../functions.sqlFilters.js'; function buildWhereClause(filters) { let sqlWhereClause = ' where l.recordDelete_timeMillis is null'; const sqlParameters = []; const lotNameFilters = getLotNameWhereClause(filters.lotName, filters.lotNameSearchType ?? '', 'l'); sqlWhereClause += lotNameFilters.sqlWhereClause; sqlParameters.push(...lotNameFilters.sqlParameters); if ((filters.mapId ?? '') !== '') { sqlWhereClause += ' and l.mapId = ?'; sqlParameters.push(filters.mapId); } if ((filters.lotTypeId ?? '') !== '') { sqlWhereClause += ' and l.lotTypeId = ?'; sqlParameters.push(filters.lotTypeId); } if ((filters.lotStatusId ?? '') !== '') { sqlWhereClause += ' and l.lotStatusId = ?'; sqlParameters.push(filters.lotStatusId); } if ((filters.occupancyStatus ?? '') !== '') { if (filters.occupancyStatus === 'occupied') { sqlWhereClause += ' and lotOccupancyCount > 0'; } else if (filters.occupancyStatus === '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 async function getLots(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 Lots l left join ( select lotId, count(lotOccupancyId) as lotOccupancyCount from LotOccupancies where recordDelete_timeMillis is null and occupancyStartDate <= ${currentDate.toString()} and (occupancyEndDate is null or occupancyEndDate >= ${currentDate.toString()}) group by lotId ) o on l.lotId = o.lotId ${sqlWhereClause}`) .get(sqlParameters).recordCount; } let lots = []; if (options.limit === -1 || count > 0) { database.function('userFn_lotNameSortName', configFunctions.getProperty('settings.lot.lotNameSortNameFunction')); sqlParameters.unshift(currentDate, currentDate); lots = database .prepare('select l.lotId, l.lotName,' + ' t.lotType,' + ' l.mapId, m.mapName, l.mapKey,' + ' l.lotStatusId, s.lotStatus,' + ' ifnull(o.lotOccupancyCount, 0) as lotOccupancyCount' + ' from Lots l' + ' left join LotTypes t on l.lotTypeId = t.lotTypeId' + ' left join LotStatuses s on l.lotStatusId = s.lotStatusId' + ' left join Maps m on l.mapId = m.mapId' + (' left join (' + 'select lotId, count(lotOccupancyId) as lotOccupancyCount' + ' from LotOccupancies' + ' where recordDelete_timeMillis is null' + ' and occupancyStartDate <= ?' + ' and (occupancyEndDate is null or occupancyEndDate >= ?)' + ' group by lotId' + ') o on l.lotId = o.lotId') + sqlWhereClause + ' order by userFn_lotNameSortName(l.lotName), l.lotId' + (options.limit === -1 ? '' : ` limit ${options.limit.toString()} offset ${options.offset.toString()}`)) .all(sqlParameters); if (options.limit === -1) { count = lots.length; } } if (connectedDatabase === undefined) { database.release(); } return { count, lots }; } export default getLots;