From bfccb0a025162f3fa665c5c7f1c23ab16ef4a2cf Mon Sep 17 00:00:00 2001 From: ashish-egov <137176738+ashish-egov@users.noreply.github.com> Date: Fri, 3 Jan 2025 11:54:51 +0530 Subject: [PATCH] =?UTF-8?q?Optimized=20latitude=20and=20longitude=20valida?= =?UTF-8?q?tion=20logic=20for=20improved=20effici=E2=80=A6=20(#1310)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Optimized latitude and longitude validation logic for improved efficiency * facility capacity assignment to 0 for microplan * Facility capacity enrichment for microplan --- .../src/server/config/index.ts | 3 ++- .../src/server/utils/microplanUtils.ts | 6 +++++- .../server/validators/microplanValidators.ts | 19 +++++++++++++------ 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/health-services/project-factory/src/server/config/index.ts b/health-services/project-factory/src/server/config/index.ts index 6e2d2a86383..b8893d3f2ad 100644 --- a/health-services/project-factory/src/server/config/index.ts +++ b/health-services/project-factory/src/server/config/index.ts @@ -182,7 +182,8 @@ const config = { notCreateUserIfAlreadyThere: process.env.NOT_CREATE_USER_IF_ALREADY_THERE || false, maxHttpRetries: process.env.MAX_HTTP_RETRIES || "4", skipResourceCheckValidationBeforeCreateForLocalTesting:false, // can be set to true for local development - autoRetryIfHttpError: process.env.AUTO_RETRY_IF_HTTP_ERROR || "socket hang up" // can be retry if there is any error for which default retry can be set + autoRetryIfHttpError: process.env.AUTO_RETRY_IF_HTTP_ERROR || "socket hang up" /* can be retry if there is any error for which default retry can be set */, + latLongColumns: process.env.LAT_LONG_SUBSTRINGS || "HCM_ADMIN_CONSOLE_FACILITY_LATITUDE_OPTIONAL_MICROPLAN,HCM_ADMIN_CONSOLE_FACILITY_LONGITUDE_OPTIONAL_MICROPLAN,HCM_ADMIN_CONSOLE_TARGET_LAT_OPT,HCM_ADMIN_CONSOLE_TARGET_LONG_OPT" } }; // Exporting getErrorCodes function and config object diff --git a/health-services/project-factory/src/server/utils/microplanUtils.ts b/health-services/project-factory/src/server/utils/microplanUtils.ts index 3e0bc93ee37..52331faeeb5 100644 --- a/health-services/project-factory/src/server/utils/microplanUtils.ts +++ b/health-services/project-factory/src/server/utils/microplanUtils.ts @@ -289,7 +289,11 @@ export function changeCreateDataForMicroplan(request: any, element: any, rowData if (type == 'facility') { const projectType = request?.body?.projectTypeCode; const facilityCapacityColumn = getLocalizedName(`HCM_ADMIN_CONSOLE_FACILITY_CAPACITY_MICROPLAN_${projectType}`, localizationMap); - if (rowData[facilityCapacityColumn] >= 0) { + if(!rowData[facilityCapacityColumn]){ + rowData[facilityCapacityColumn] = 0 + element.storageCapacity = 0 + } + else if (rowData[facilityCapacityColumn] >= 0) { element.storageCapacity = rowData[facilityCapacityColumn] } if (activeColumnName && rowData[activeColumnName] == "Active") { diff --git a/health-services/project-factory/src/server/validators/microplanValidators.ts b/health-services/project-factory/src/server/validators/microplanValidators.ts index e435adadb9a..7b0911a0ed9 100644 --- a/health-services/project-factory/src/server/validators/microplanValidators.ts +++ b/health-services/project-factory/src/server/validators/microplanValidators.ts @@ -5,6 +5,7 @@ import { resourceDataStatuses } from "../config/constants"; import config from "../config"; import { isMicroplanRequest } from "../utils/microplanUtils"; import { throwError } from "../utils/genericUtils"; +import { logger } from "../utils/logger"; export function validatePhoneNumberSheetWise(datas: any[], localizationMap: any, rowMapping: any) { for (const data of datas) { @@ -191,11 +192,14 @@ export function validateRequiredTargetsForMicroplanCampaigns(data: any, errors: export function validateLatLongForMicroplanCampaigns(data: any, errors: any, localizationMap?: { [key: string]: string }) { for (const key in data) { if (key !== getLocalizedName(getBoundaryTabName(), localizationMap) && key !== getLocalizedName(config?.values?.readMeTab, localizationMap)) { + const latLongUnlocalisedColumns = config.values.latLongColumns?.split(',') || []; + const latLongColumns = latLongUnlocalisedColumns?.map((column: string) => getLocalizedName(column, localizationMap)); + const latLongColumnsSet = new Set(latLongColumns); if (Array.isArray(data[key])) { const boundaryData = data[key]; boundaryData.forEach((obj: any, index: number) => { for (const column of Object.keys(obj)) { - if (column.toLowerCase().includes('latitude') || column.toLowerCase().includes('longitude')) { + if (latLongColumnsSet.has(column)) { const value = obj[column]; if (typeof value !== 'number') { errors.push({ @@ -214,9 +218,12 @@ export function validateLatLongForMicroplanCampaigns(data: any, errors: any, loc } -function validateLatLongForFacility(data: any, errors: any) { +function validateLatLongForFacility(data: any, errors: any, localizationMap?: { [key: string]: string }) { + const latLongUnlocalisedColumns = config.values.latLongColumns?.split(',') || []; + const latLongColumns = latLongUnlocalisedColumns?.map((column: string) => getLocalizedName(column, localizationMap)); + const latLongColumnsSet = new Set(latLongColumns); for (const column of Object.keys(data)) { - if (column.toLowerCase().includes('latitude') || column.toLowerCase().includes('longitude')) { + if (latLongColumnsSet.has(column)) { const value = data[column]; if (typeof value !== 'number') { errors.push({ @@ -245,7 +252,7 @@ export function validateMicroplanFacility(request: any, data: any, localizationM const active = activeColumnName ? item[activeColumnName] : "Active"; if (active == "Active" || !item?.[uniqueIdentifierColumnName]) { enrichErrorForFcailityMicroplan(request, item, errors, localizationMap); - validateLatLongForFacility(item, errors); + validateLatLongForFacility(item, errors, localizationMap); } }); request.body.sheetErrorDetails = request?.body?.sheetErrorDetails ? [...request?.body?.sheetErrorDetails, ...errors] : errors; @@ -269,8 +276,8 @@ function enrichErrorForFcailityMicroplan(request: any, item: any, errors: any = errors.push({ status: "INVALID", rowNumber: item?.["!row#number!"], errorDetails: `Data in ${faciltyStatusColumn} column can’t be empty, please update the data and re-upload` }) } const facilityCapacityColumn = getLocalizedName(`HCM_ADMIN_CONSOLE_FACILITY_CAPACITY_MICROPLAN_${projectType}`, localizationMap); - if (!item?.[facilityCapacityColumn] && item?.[facilityCapacityColumn] != 0) { - errors.push({ status: "INVALID", rowNumber: item?.["!row#number!"], errorDetails: `Data in ${facilityCapacityColumn} column can’t be empty, please update the data and re-upload` }) + if (!item?.[facilityCapacityColumn]) { + logger.info(`Data in ${facilityCapacityColumn} column is empty, it will be ignored for microplan validation.`) } else if (typeof (item?.[facilityCapacityColumn]) != "number") { errors.push({ status: "INVALID", rowNumber: item?.["!row#number!"], errorDetails: `Data in ${facilityCapacityColumn} column must be a number from 0 to 100000000` })