diff --git a/helpers/lotOccupancyDB/getFeeCategories.js b/helpers/lotOccupancyDB/getFeeCategories.js index e9e989d2..c95c966e 100644 --- a/helpers/lotOccupancyDB/getFeeCategories.js +++ b/helpers/lotOccupancyDB/getFeeCategories.js @@ -1,16 +1,10 @@ import sqlite from "better-sqlite3"; import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; -export const getFeeCategories = (filters, options) => { - const updateOrderNumbers = !(filters.lotTypeId || filters.occupancyTypeId) && options.includeFees; - const database = sqlite(databasePath, { - readonly: !updateOrderNumbers - }); - let sql = "select feeCategoryId, feeCategory, orderNumber" + - " from FeeCategories" + - " where recordDelete_timeMillis is null"; - let sqlParameters = []; +const buildFeeCategoryWhereClause = (filters) => { + let sqlWhereClause = " where recordDelete_timeMillis is null"; + const sqlParameters = []; if (filters.occupancyTypeId) { - sql += + sqlWhereClause += " and feeCategoryId in (" + "select feeCategoryId from Fees" + " where recordDelete_timeMillis is null" + @@ -18,64 +12,79 @@ export const getFeeCategories = (filters, options) => { sqlParameters.push(filters.occupancyTypeId); } if (filters.lotTypeId) { - sql += + sqlWhereClause += " and feeCategoryId in (" + "select feeCategoryId from Fees" + " where recordDelete_timeMillis is null" + " and (lotTypeId is null or lotTypeId = ?))"; sqlParameters.push(filters.lotTypeId); } + return { + sqlWhereClause, + sqlParameters + }; +}; +const buildFeeWhereClause = (filters, feeCategoryId) => { + let sqlWhereClause = " where f.recordDelete_timeMillis is null" + " and f.feeCategoryId = ?"; + const sqlParameters = []; + sqlParameters.push(feeCategoryId); + if (filters.occupancyTypeId) { + sqlWhereClause += " and (f.occupancyTypeId is null or f.occupancyTypeId = ?)"; + sqlParameters.push(filters.occupancyTypeId); + } + if (filters.lotTypeId) { + sqlWhereClause += " and (f.lotTypeId is null or f.lotTypeId = ?)"; + sqlParameters.push(filters.lotTypeId); + } + return { + sqlWhereClause, + sqlParameters + }; +}; +export const getFeeCategories = (filters, options) => { + const updateOrderNumbers = !(filters.lotTypeId || filters.occupancyTypeId) && options.includeFees; + const database = sqlite(databasePath, { + readonly: !updateOrderNumbers + }); + const feeCategorySqlFilter = buildFeeCategoryWhereClause(filters); const feeCategories = database - .prepare(sql + " order by orderNumber, feeCategory") - .all(sqlParameters); + .prepare("select feeCategoryId, feeCategory, orderNumber" + + " from FeeCategories" + + feeCategorySqlFilter.sqlWhereClause + + " order by orderNumber, feeCategory") + .all(feeCategorySqlFilter.sqlParameters); if (options.includeFees) { let expectedFeeCategoryOrderNumber = -1; for (const feeCategory of feeCategories) { expectedFeeCategoryOrderNumber += 1; if (updateOrderNumbers && feeCategory.orderNumber !== expectedFeeCategoryOrderNumber) { database - .prepare("update FeeCategories" + - " set orderNumber = ?" + - " where feeCategoryId = ?") + .prepare("update FeeCategories" + " set orderNumber = ?" + " where feeCategoryId = ?") .run(expectedFeeCategoryOrderNumber, feeCategory.feeCategoryId); feeCategory.orderNumber = expectedFeeCategoryOrderNumber; } - sql = - "select f.feeId, f.feeName, f.feeDescription," + - " f.occupancyTypeId, o.occupancyType," + - " f.lotTypeId, l.lotType," + - " ifnull(f.feeAmount, 0) as feeAmount, f.feeFunction," + - " f.taxAmount, f.taxPercentage," + - " f.includeQuantity, f.quantityUnit," + - " f.isRequired, f.orderNumber" + - " from Fees f" + - " left join OccupancyTypes o on f.occupancyTypeId = o.occupancyTypeId" + - " left join LotTypes l on f.lotTypeId = l.lotTypeId" + - " where f.recordDelete_timeMillis is null" + - " and f.feeCategoryId = ?"; - sqlParameters = []; - sqlParameters.push(feeCategory.feeCategoryId); - if (filters.occupancyTypeId) { - sql += - " and (f.occupancyTypeId is null or f.occupancyTypeId = ?)"; - sqlParameters.push(filters.occupancyTypeId); - } - if (filters.lotTypeId) { - sql += " and (f.lotTypeId is null or f.lotTypeId = ?)"; - sqlParameters.push(filters.lotTypeId); - } + const feeSqlFilter = buildFeeWhereClause(filters, feeCategory.feeCategoryId); feeCategory.fees = database - .prepare(sql + " order by f.orderNumber, f.feeName") - .all(sqlParameters); + .prepare("select f.feeId, f.feeName, f.feeDescription," + + " f.occupancyTypeId, o.occupancyType," + + " f.lotTypeId, l.lotType," + + " ifnull(f.feeAmount, 0) as feeAmount, f.feeFunction," + + " f.taxAmount, f.taxPercentage," + + " f.includeQuantity, f.quantityUnit," + + " f.isRequired, f.orderNumber" + + " from Fees f" + + " left join OccupancyTypes o on f.occupancyTypeId = o.occupancyTypeId" + + " left join LotTypes l on f.lotTypeId = l.lotTypeId" + + feeSqlFilter.sqlWhereClause + + " order by f.orderNumber, f.feeName") + .all(feeSqlFilter.sqlParameters); if (updateOrderNumbers) { let expectedFeeOrderNumber = -1; for (const fee of feeCategory.fees) { expectedFeeOrderNumber += 1; if (fee.orderNumber !== expectedFeeOrderNumber) { database - .prepare("update Fees" + - " set orderNumber = ?" + - " where feeId = ?") + .prepare("update Fees" + " set orderNumber = ?" + " where feeId = ?") .run(expectedFeeOrderNumber, fee.feeId); fee.orderNumber = expectedFeeOrderNumber; } diff --git a/helpers/lotOccupancyDB/getFeeCategories.ts b/helpers/lotOccupancyDB/getFeeCategories.ts index 74c39792..6398399e 100644 --- a/helpers/lotOccupancyDB/getFeeCategories.ts +++ b/helpers/lotOccupancyDB/getFeeCategories.ts @@ -13,6 +13,66 @@ interface GetFeeCategoriesOptions { includeFees?: boolean; } +const buildFeeCategoryWhereClause = ( + filters: GetFeeCategoriesFilters +): { sqlWhereClause: string; sqlParameters: unknown[] } => { + let sqlWhereClause = " where recordDelete_timeMillis is null"; + const sqlParameters: unknown[] = []; + + if (filters.occupancyTypeId) { + sqlWhereClause += + " and feeCategoryId in (" + + "select feeCategoryId from Fees" + + " where recordDelete_timeMillis is null" + + " and (occupancyTypeId is null or occupancyTypeId = ?))"; + + sqlParameters.push(filters.occupancyTypeId); + } + + if (filters.lotTypeId) { + sqlWhereClause += + " and feeCategoryId in (" + + "select feeCategoryId from Fees" + + " where recordDelete_timeMillis is null" + + " and (lotTypeId is null or lotTypeId = ?))"; + + sqlParameters.push(filters.lotTypeId); + } + + return { + sqlWhereClause, + sqlParameters + }; +}; + +const buildFeeWhereClause = ( + filters: GetFeeCategoriesFilters, + feeCategoryId: number +): { sqlWhereClause: string; sqlParameters: unknown[] } => { + let sqlWhereClause = " where f.recordDelete_timeMillis is null" + " and f.feeCategoryId = ?"; + + const sqlParameters: unknown[] = []; + + sqlParameters.push(feeCategoryId); + + if (filters.occupancyTypeId) { + sqlWhereClause += " and (f.occupancyTypeId is null or f.occupancyTypeId = ?)"; + + sqlParameters.push(filters.occupancyTypeId); + } + + if (filters.lotTypeId) { + sqlWhereClause += " and (f.lotTypeId is null or f.lotTypeId = ?)"; + + sqlParameters.push(filters.lotTypeId); + } + + return { + sqlWhereClause, + sqlParameters + }; +}; + export const getFeeCategories = ( filters: GetFeeCategoriesFilters, options: GetFeeCategoriesOptions @@ -24,36 +84,16 @@ export const getFeeCategories = ( readonly: !updateOrderNumbers }); - let sql = - "select feeCategoryId, feeCategory, orderNumber" + - " from FeeCategories" + - " where recordDelete_timeMillis is null"; - - let sqlParameters = []; - - if (filters.occupancyTypeId) { - sql += - " and feeCategoryId in (" + - "select feeCategoryId from Fees" + - " where recordDelete_timeMillis is null" + - " and (occupancyTypeId is null or occupancyTypeId = ?))"; - - sqlParameters.push(filters.occupancyTypeId); - } - - if (filters.lotTypeId) { - sql += - " and feeCategoryId in (" + - "select feeCategoryId from Fees" + - " where recordDelete_timeMillis is null" + - " and (lotTypeId is null or lotTypeId = ?))"; - - sqlParameters.push(filters.lotTypeId); - } + const feeCategorySqlFilter = buildFeeCategoryWhereClause(filters); const feeCategories: recordTypes.FeeCategory[] = database - .prepare(sql + " order by orderNumber, feeCategory") - .all(sqlParameters); + .prepare( + "select feeCategoryId, feeCategory, orderNumber" + + " from FeeCategories" + + feeCategorySqlFilter.sqlWhereClause + + " order by orderNumber, feeCategory" + ) + .all(feeCategorySqlFilter.sqlParameters); if (options.includeFees) { let expectedFeeCategoryOrderNumber = -1; @@ -64,52 +104,31 @@ export const getFeeCategories = ( if (updateOrderNumbers && feeCategory.orderNumber !== expectedFeeCategoryOrderNumber) { database .prepare( - "update FeeCategories" + - " set orderNumber = ?" + - " where feeCategoryId = ?" + "update FeeCategories" + " set orderNumber = ?" + " where feeCategoryId = ?" ) - .run( - expectedFeeCategoryOrderNumber, - feeCategory.feeCategoryId - ); + .run(expectedFeeCategoryOrderNumber, feeCategory.feeCategoryId); feeCategory.orderNumber = expectedFeeCategoryOrderNumber; } - sql = - "select f.feeId, f.feeName, f.feeDescription," + - " f.occupancyTypeId, o.occupancyType," + - " f.lotTypeId, l.lotType," + - " ifnull(f.feeAmount, 0) as feeAmount, f.feeFunction," + - " f.taxAmount, f.taxPercentage," + - " f.includeQuantity, f.quantityUnit," + - " f.isRequired, f.orderNumber" + - " from Fees f" + - " left join OccupancyTypes o on f.occupancyTypeId = o.occupancyTypeId" + - " left join LotTypes l on f.lotTypeId = l.lotTypeId" + - " where f.recordDelete_timeMillis is null" + - " and f.feeCategoryId = ?"; - - sqlParameters = []; - - sqlParameters.push(feeCategory.feeCategoryId); - - if (filters.occupancyTypeId) { - sql += - " and (f.occupancyTypeId is null or f.occupancyTypeId = ?)"; - - sqlParameters.push(filters.occupancyTypeId); - } - - if (filters.lotTypeId) { - sql += " and (f.lotTypeId is null or f.lotTypeId = ?)"; - - sqlParameters.push(filters.lotTypeId); - } + const feeSqlFilter = buildFeeWhereClause(filters, feeCategory.feeCategoryId as number); feeCategory.fees = database - .prepare(sql + " order by f.orderNumber, f.feeName") - .all(sqlParameters); + .prepare( + "select f.feeId, f.feeName, f.feeDescription," + + " f.occupancyTypeId, o.occupancyType," + + " f.lotTypeId, l.lotType," + + " ifnull(f.feeAmount, 0) as feeAmount, f.feeFunction," + + " f.taxAmount, f.taxPercentage," + + " f.includeQuantity, f.quantityUnit," + + " f.isRequired, f.orderNumber" + + " from Fees f" + + " left join OccupancyTypes o on f.occupancyTypeId = o.occupancyTypeId" + + " left join LotTypes l on f.lotTypeId = l.lotTypeId" + + feeSqlFilter.sqlWhereClause + + " order by f.orderNumber, f.feeName" + ) + .all(feeSqlFilter.sqlParameters); if (updateOrderNumbers) { let expectedFeeOrderNumber = -1; @@ -119,11 +138,7 @@ export const getFeeCategories = ( if (fee.orderNumber !== expectedFeeOrderNumber) { database - .prepare( - "update Fees" + - " set orderNumber = ?" + - " where feeId = ?" - ) + .prepare("update Fees" + " set orderNumber = ?" + " where feeId = ?") .run(expectedFeeOrderNumber, fee.feeId); fee.orderNumber = expectedFeeOrderNumber;