From 2e8be47ae8ebd7641fc99d8989059a2f8dcca2ce Mon Sep 17 00:00:00 2001 From: Priyanka-eGov Date: Tue, 16 Jul 2024 14:31:05 +0530 Subject: [PATCH 1/3] HLM-6407 adding changes for facility template --- .../project-factory/src/server/utils/genericUtils.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/utilities/project-factory/src/server/utils/genericUtils.ts b/utilities/project-factory/src/server/utils/genericUtils.ts index 6c276c37092..cadf686227d 100644 --- a/utilities/project-factory/src/server/utils/genericUtils.ts +++ b/utilities/project-factory/src/server/utils/genericUtils.ts @@ -1084,10 +1084,18 @@ function getDifferentDistrictTabs(boundaryData: any, differentTabsBasedOnLevel: async function getConfigurableColumnHeadersFromSchemaForTargetSheet(request: any, hierarchy: any, boundaryData: any, differentTabsBasedOnLevel: any, campaignObject: any, localizationMap?: any) { const districtIndex = hierarchy.indexOf(differentTabsBasedOnLevel); - var headers = getLocalizedHeaders(hierarchy.slice(districtIndex), localizationMap); + let headers: any; + const isSourceMicroplan = checkIfSourceIsMicroplan(campaignObject); + if (isSourceMicroplan) { + logger.info(`Source is Microplan.`); + headers = getLocalizedHeaders(hierarchy, localizationMap); + } + else { + headers = getLocalizedHeaders(hierarchy.slice(districtIndex), localizationMap); const headerColumnsAfterHierarchy = await generateDynamicTargetHeaders(request, campaignObject, localizationMap); const localizedHeadersAfterHierarchy = getLocalizedHeaders(headerColumnsAfterHierarchy, localizationMap); headers = [...headers, getLocalizedName(config?.boundary?.boundaryCode, localizationMap), ...localizedHeadersAfterHierarchy] + } return getLocalizedHeaders(headers, localizationMap); } From 15ca5887be90c7e29d215caf12f57ade7618047f Mon Sep 17 00:00:00 2001 From: Priyanka-eGov Date: Mon, 22 Jul 2024 11:38:31 +0530 Subject: [PATCH 2/3] HLM-6407 adding changes for facility template --- .../src/server/api/campaignApis.ts | 28 +++- .../src/server/api/genericApis.ts | 7 +- .../src/server/config/createAndSearch.ts | 132 ++++++++++++++++++ .../config/models/createRequestSchema.ts | 2 +- .../src/server/utils/campaignUtils.ts | 8 +- .../src/server/utils/genericUtils.ts | 35 ++++- 6 files changed, 196 insertions(+), 16 deletions(-) diff --git a/utilities/project-factory/src/server/api/campaignApis.ts b/utilities/project-factory/src/server/api/campaignApis.ts index 616b836d5b3..439af9774a0 100644 --- a/utilities/project-factory/src/server/api/campaignApis.ts +++ b/utilities/project-factory/src/server/api/campaignApis.ts @@ -6,7 +6,7 @@ import createAndSearch from '../config/createAndSearch'; import { getDataFromSheet, generateActivityMessage, throwError, translateSchema, replicateRequest } from "../utils/genericUtils"; import { immediateValidationForTargetSheet, validateSheetData, validateTargetSheetData } from '../validators/campaignValidators'; import { callMdmsTypeSchema, getCampaignNumber } from "./genericApis"; -import { boundaryBulkUpload, convertToTypeData, generateHierarchy, generateProcessedFileAndPersist, getBoundaryOnWhichWeSplit, getLocalizedName, reorderBoundariesOfDataAndValidate } from "../utils/campaignUtils"; +import { boundaryBulkUpload, convertToTypeData, generateHierarchy, generateProcessedFileAndPersist, getBoundaryOnWhichWeSplit, getLocalizedName, reorderBoundariesOfDataAndValidate, checkIfSourceIsMicroplan } from "../utils/campaignUtils"; const _ = require('lodash'); import { produceModifiedMessages } from "../kafka/Listener"; import { createDataService } from "../service/dataManageService"; @@ -843,7 +843,31 @@ async function processCreate(request: any, localizationMap?: any) { boundaryBulkUpload(request, localizationMap); } else { - const createAndSearchConfig = createAndSearch[type] + const source = request?.body?.ResourceDetails?.additionalDetails?.source; + // console.log(`Source is MICROPLAN -->`, source); + let createAndSearchConfig: any; + createAndSearchConfig = createAndSearch[type]; + + if (checkIfSourceIsMicroplan(source)) { + const responseFromCampaignSearch = await getCampaignSearchResponse(request); + const campaignType = responseFromCampaignSearch?.CampaignDetails[0]?.projectType; + logger.info(`Data create Source is MICROPLAN --> ${source}`); + if ( + createAndSearchConfig && + createAndSearchConfig.parseArrayConfig && + createAndSearchConfig.parseArrayConfig.parseLogic + ) { + createAndSearchConfig.parseArrayConfig.parseLogic = createAndSearchConfig.parseArrayConfig.parseLogic.map( + (item: any) => { + if (item.sheetColumn === "E") { + item.sheetColumnName += `_${campaignType}`; + } + return item; + } + ); + } + } + const dataFromSheet = await getDataFromSheet(request, request?.body?.ResourceDetails?.fileStoreId, request?.body?.ResourceDetails?.tenantId, createAndSearchConfig, undefined, localizationMap) let schema: any; if (type == "facility") { diff --git a/utilities/project-factory/src/server/api/genericApis.ts b/utilities/project-factory/src/server/api/genericApis.ts index 1b275d4e0e5..fe9814f2a27 100644 --- a/utilities/project-factory/src/server/api/genericApis.ts +++ b/utilities/project-factory/src/server/api/genericApis.ts @@ -1205,9 +1205,12 @@ async function callMdmsTypeSchema( request: any, tenantId: string, type: any, - campaignType = "all" + campaignType: string = "all", + additionalParam?: string ) { const { RequestInfo = {} } = request?.body || {}; + const schemaCode = additionalParam && additionalParam.trim() !== "" ? additionalParam : "HCM-ADMIN-CONSOLE.adminSchema"; + const requestBody = { RequestInfo, MdmsCriteria: { @@ -1215,7 +1218,7 @@ async function callMdmsTypeSchema( uniqueIdentifiers: [ `${type}.${campaignType}` ], - schemaCode: "HCM-ADMIN-CONSOLE.adminSchema" + schemaCode: schemaCode } }; const url = config.host.mdmsV2 + config.paths.mdms_v2_search; diff --git a/utilities/project-factory/src/server/config/createAndSearch.ts b/utilities/project-factory/src/server/config/createAndSearch.ts index d89c45b7606..c29bb90fc57 100644 --- a/utilities/project-factory/src/server/config/createAndSearch.ts +++ b/utilities/project-factory/src/server/config/createAndSearch.ts @@ -132,6 +132,138 @@ const createAndSearch: any = { searchPath: "Facilities" } }, + "facilityMicroplan": { + requiresToSearchFromSheet: [ + { + sheetColumnName: "HCM_ADMIN_CONSOLE_FACILITY_CODE", + searchPath: "Facility.id" + } + ], + boundaryValidation: { + column: "HCM_ADMIN_CONSOLE_BOUNDARY_CODE_MANDATORY" + }, + sheetSchema: { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "FacilityTemplateSchema", + "type": "object", + "properties": { + "Facility Name": { + "type": "string", + "maxLength": 2000, + "minLength": 1 + }, + "Facility Type": { + // "type": "string", + "enum": ["Warehouse", "Health Facility", "Storing Resource"] + }, + "Facility Status": { + // "type": "string", + "enum": ["Temporary", "Permanent"] + }, + "Capacity": { + "type": "number", + "minimum": 1, + "maximum": 100000000 + } + }, + "required": [ + "Facility Name", + "Facility Type", + "Facility Status", + "Capacity" + ], + "unique": [ + "Facility Name" + ] + }, + uniqueIdentifier: "id", + uniqueIdentifierColumn: "A", + activeColumn: "F", + activeColumnName: "HCM_ADMIN_CONSOLE_FACILITY_USAGE", + uniqueIdentifierColumnName: "HCM_ADMIN_CONSOLE_FACILITY_CODE", + matchEachKey: true, + parseArrayConfig: { + sheetName: "HCM_ADMIN_CONSOLE_FACILITIES", + parseLogic: [ + { + sheetColumn: "A", + sheetColumnName: "HCM_ADMIN_CONSOLE_FACILITY_CODE", + resultantPath: "id", + type: "string" + }, + { + sheetColumn: "B", + sheetColumnName: "HCM_ADMIN_CONSOLE_FACILITY_NAME_MICROPLAN", + resultantPath: "name", + type: "string" + }, + { + sheetColumn: "C", + sheetColumnName: "HCM_ADMIN_CONSOLE_FACILITY_TYPE_MICROPLAN", + resultantPath: "usage", + type: "string" + }, + { + sheetColumn: "D", + sheetColumnName: "HCM_ADMIN_CONSOLE_FACILITY_STATUS_MICROPLAN", + resultantPath: "isPermanent", + type: "boolean", + conversionCondition: { + "Permanent": "true", + "Temporary": "" + } + }, + { + sheetColumn: "E", + sheetColumnName: "HCM_ADMIN_CONSOLE_FACILITY_CAPACITY_MICROPLAN", + resultantPath: "storageCapacity", + type: "number" + }, + { + sheetColumn: "J", + sheetColumnName: "HCM_ADMIN_CONSOLE_RESIDING_BOUNDARY_CODE_MICROPLAN" + } + ], + tenantId: { + getValueViaPath: "ResourceDetails.tenantId", + resultantPath: "tenantId" + } + }, + createBulkDetails: { + limit: 50, + createPath: "Facilities", + url: config.host.facilityHost + "facility/v1/bulk/_create" + }, + searchDetails: { + searchElements: [ + { + keyPath: "tenantId", + getValueViaPath: "ResourceDetails.tenantId", + isInParams: true, + isInBody: false, + }, + { + keyPath: "Facility", + isInParams: false, + isInBody: true, + } + ], + searchLimit: { + keyPath: "limit", + value: "200", + isInParams: true, + isInBody: false, + }, + searchOffset: { + keyPath: "offset", + value: "0", + isInParams: true, + isInBody: false, + }, + url: config.host.facilityHost + "facility/v1/_search", + searchPath: "Facilities" + } + }, "boundary": { parseArrayConfig: { sheetName: "HCM_ADMIN_CONSOLE_BOUNDARY_CODE", diff --git a/utilities/project-factory/src/server/config/models/createRequestSchema.ts b/utilities/project-factory/src/server/config/models/createRequestSchema.ts index ed56e706d16..18a96101fbd 100644 --- a/utilities/project-factory/src/server/config/models/createRequestSchema.ts +++ b/utilities/project-factory/src/server/config/models/createRequestSchema.ts @@ -4,7 +4,7 @@ export const createRequestSchema = { "properties": { "type": { "type": "string", - "enum": ["boundary", "facility", "user", "boundaryWithTarget"] + "enum": ["boundary", "facility", "user", "boundaryWithTarget","facilityMicroplan"] }, "tenantId": { "type": "string", diff --git a/utilities/project-factory/src/server/utils/campaignUtils.ts b/utilities/project-factory/src/server/utils/campaignUtils.ts index ecefcee6c79..2e865589abc 100644 --- a/utilities/project-factory/src/server/utils/campaignUtils.ts +++ b/utilities/project-factory/src/server/utils/campaignUtils.ts @@ -1398,7 +1398,7 @@ async function appendSheetsToWorkbook(request: any, boundaryData: any[], differe const [mainSheetData, uniqueDistrictsForMainSheet, districtLevelRowBoundaryCodeMap] = createBoundaryDataMainSheet(request, boundaryData, differentTabsBasedOnLevel, hierarchy, localizationMap) const responseFromCampaignSearch = await getCampaignSearchResponse(request); const campaignObject = responseFromCampaignSearch?.CampaignDetails?.[0]; - const isSourceMicroplan = checkIfSourceIsMicroplan(campaignObject); + const isSourceMicroplan = checkIfSourceIsMicroplan(campaignObject?.additionalDetails?.source); if (!(isSourceMicroplan)) { const mainSheet = workbook.addWorksheet(getLocalizedName(getBoundaryTabName(), localizationMap)); const columnWidths = Array(12).fill(30); @@ -1777,7 +1777,7 @@ const getConfigurableColumnHeadersBasedOnCampaignType = async (request: any, loc const responseFromCampaignSearch = await getCampaignSearchResponse(request); const campaignObject = responseFromCampaignSearch?.CampaignDetails?.[0]; let campaignType = campaignObject?.projectType; - const isSourceMicroplan = checkIfSourceIsMicroplan(campaignObject); + const isSourceMicroplan = checkIfSourceIsMicroplan(campaignObject?.additionalDetails?.source); campaignType = (isSourceMicroplan) ? `${config?.prefixForMicroplanCampaigns}-${campaignType}` : campaignType; const mdmsResponse = await callMdmsTypeSchema(request, request?.query?.tenantId || request?.body?.ResourceDetails?.tenantId, request?.query?.type || request?.body?.ResourceDetails?.type, campaignType) if (!mdmsResponse || mdmsResponse?.columns.length === 0) { @@ -1838,8 +1838,8 @@ async function getBoundaryOnWhichWeSplit(request: any) { } -function checkIfSourceIsMicroplan(campaignObject: any): boolean { - return campaignObject?.additionalDetails?.source === 'microplan'; +function checkIfSourceIsMicroplan(inputString: any): boolean { + return inputString === 'microplan'; } diff --git a/utilities/project-factory/src/server/utils/genericUtils.ts b/utilities/project-factory/src/server/utils/genericUtils.ts index cadf686227d..3b65b766aa1 100644 --- a/utilities/project-factory/src/server/utils/genericUtils.ts +++ b/utilities/project-factory/src/server/utils/genericUtils.ts @@ -465,18 +465,24 @@ function setDropdownFromSchema(request: any, schema: any, localizationMap?: { [k async function createFacilitySheet(request: any, allFacilities: any[], localizationMap?: { [key: string]: string }) { const tenantId = request?.query?.tenantId; const responseFromCampaignSearch = await getCampaignSearchResponse(request); - const isSourceMicroplan = checkIfSourceIsMicroplan(responseFromCampaignSearch?.CampaignDetails?.[0]); - let schema: any; + const isSourceMicroplan = checkIfSourceIsMicroplan(responseFromCampaignSearch?.CampaignDetails?.[0]?.additionalDetails?.source); + let schema; if (isSourceMicroplan) { - schema = await callMdmsTypeSchema(request, tenantId, "facility", "microplan"); + schema = await callMdmsTypeSchema(request, tenantId, "facility", "microplan", "HCM-ADMIN-CONSOLE.adminSchemaMicroplan"); } else { - schema = await callMdmsTypeSchema(request, tenantId, "facility"); + schema = await callMdmsTypeSchema(request, tenantId, "facility", "all"); } const keys = schema?.columns; setDropdownFromSchema(request, schema, localizationMap); const headers = ["HCM_ADMIN_CONSOLE_FACILITY_CODE", ...keys] - const localizedHeaders = getLocalizedHeaders(headers, localizationMap); + let localizedHeaders; + if (isSourceMicroplan) { + localizedHeaders = getLocalizedHeadersForMicroplan(responseFromCampaignSearch, headers, localizationMap); + } + else { + localizedHeaders = getLocalizedHeaders(headers, localizationMap); + } const facilities = allFacilities.map((facility: any) => { return [ facility?.id, @@ -575,6 +581,21 @@ function getLocalizedHeaders(headers: any, localizationMap?: { [key: string]: st return messages; } +function getLocalizedHeadersForMicroplan(responseFromCampaignSearch: any, headers: any, localizationMap?: { [key: string]: string }) { + + const projectType = responseFromCampaignSearch?.CampaignDetails?.[0]?.projectType; + + headers = headers.map((header: string) => { + if (header === 'HCM_ADMIN_CONSOLE_FACILITY_CAPACITY_MICROPLAN') { + return `${header}_${projectType}`; + } + return header; + }); + + const messages = headers.map((header: any) => (localizationMap ? localizationMap[header] || header : header)); + return messages; +} + function modifyRequestForLocalisation(request: any, tenantId: string) { @@ -1085,7 +1106,7 @@ function getDifferentDistrictTabs(boundaryData: any, differentTabsBasedOnLevel: async function getConfigurableColumnHeadersFromSchemaForTargetSheet(request: any, hierarchy: any, boundaryData: any, differentTabsBasedOnLevel: any, campaignObject: any, localizationMap?: any) { const districtIndex = hierarchy.indexOf(differentTabsBasedOnLevel); let headers: any; - const isSourceMicroplan = checkIfSourceIsMicroplan(campaignObject); + const isSourceMicroplan = checkIfSourceIsMicroplan(campaignObject?.additionalDetails?.source); if (isSourceMicroplan) { logger.info(`Source is Microplan.`); headers = getLocalizedHeaders(hierarchy, localizationMap); @@ -1104,7 +1125,7 @@ async function getMdmsDataBasedOnCampaignType(request: any, localizationMap?: an const responseFromCampaignSearch = await getCampaignSearchResponse(request); const campaignObject = responseFromCampaignSearch?.CampaignDetails?.[0]; let campaignType = campaignObject.projectType; - const isSourceMicroplan = checkIfSourceIsMicroplan(campaignObject); + const isSourceMicroplan = checkIfSourceIsMicroplan(campaignObject?.additionalDetails?.source); campaignType = (isSourceMicroplan) ? `${config?.prefixForMicroplanCampaigns}-${campaignType}` : campaignType; const mdmsResponse = await callMdmsTypeSchema(request, request?.query?.tenantId || request?.body?.ResourceDetails?.tenantId, request?.query?.type || request?.body?.ResourceDetails?.type, campaignType) return mdmsResponse; From c72c7d7df7bca9902aada00723e0a0095d6624b6 Mon Sep 17 00:00:00 2001 From: Priyanka-eGov Date: Mon, 22 Jul 2024 17:05:38 +0530 Subject: [PATCH 3/3] HLM-6407 adding changes for facility template --- .../src/server/api/campaignApis.ts | 16 +++++-- .../src/server/config/createAndSearch.ts | 2 +- .../src/server/utils/genericUtils.ts | 46 ++++++++++++++++++- 3 files changed, 57 insertions(+), 7 deletions(-) diff --git a/utilities/project-factory/src/server/api/campaignApis.ts b/utilities/project-factory/src/server/api/campaignApis.ts index 439af9774a0..b33d4e3c354 100644 --- a/utilities/project-factory/src/server/api/campaignApis.ts +++ b/utilities/project-factory/src/server/api/campaignApis.ts @@ -3,7 +3,7 @@ import { v4 as uuidv4 } from 'uuid'; import { httpRequest } from "../utils/request"; import { getFormattedStringForDebug, logger } from "../utils/logger"; import createAndSearch from '../config/createAndSearch'; -import { getDataFromSheet, generateActivityMessage, throwError, translateSchema, replicateRequest } from "../utils/genericUtils"; +import { getDataFromSheet, generateActivityMessage, throwError, translateSchema, replicateRequest, appendProjectTypeToCapacity } from "../utils/genericUtils"; import { immediateValidationForTargetSheet, validateSheetData, validateTargetSheetData } from '../validators/campaignValidators'; import { callMdmsTypeSchema, getCampaignNumber } from "./genericApis"; import { boundaryBulkUpload, convertToTypeData, generateHierarchy, generateProcessedFileAndPersist, getBoundaryOnWhichWeSplit, getLocalizedName, reorderBoundariesOfDataAndValidate, checkIfSourceIsMicroplan } from "../utils/campaignUtils"; @@ -730,7 +730,7 @@ async function performAndSaveResourceActivity(request: any, createAndSearchConfi } _.set(newRequestBody, createAndSearchConfig?.createBulkDetails?.createPath, chunkData); creationTime = Date.now(); - if (type == "facility") { + if (type == "facility" || type == "facilityMicroplan") { await handeFacilityProcess(request, createAndSearchConfig, params, activities, newRequestBody); } else if (type == "user") { @@ -847,10 +847,9 @@ async function processCreate(request: any, localizationMap?: any) { // console.log(`Source is MICROPLAN -->`, source); let createAndSearchConfig: any; createAndSearchConfig = createAndSearch[type]; - + const responseFromCampaignSearch = await getCampaignSearchResponse(request); + const campaignType = responseFromCampaignSearch?.CampaignDetails[0]?.projectType; if (checkIfSourceIsMicroplan(source)) { - const responseFromCampaignSearch = await getCampaignSearchResponse(request); - const campaignType = responseFromCampaignSearch?.CampaignDetails[0]?.projectType; logger.info(`Data create Source is MICROPLAN --> ${source}`); if ( createAndSearchConfig && @@ -870,11 +869,18 @@ async function processCreate(request: any, localizationMap?: any) { const dataFromSheet = await getDataFromSheet(request, request?.body?.ResourceDetails?.fileStoreId, request?.body?.ResourceDetails?.tenantId, createAndSearchConfig, undefined, localizationMap) let schema: any; + if (type == "facility") { logger.info("Fetching schema to validate the created data for type: " + type); const mdmsResponse = await callMdmsTypeSchema(request, tenantId, type); schema = mdmsResponse } + else if(type == "facilityMicroplan") { + const mdmsResponse = await callMdmsTypeSchema(request, tenantId, "facility", "microplan", "HCM-ADMIN-CONSOLE.adminSchemaMicroplan"); + schema = mdmsResponse + logger.info("Appending project type to capacity for microplan " + campaignType); + schema = await appendProjectTypeToCapacity(schema, campaignType); + } else if (type == "user") { logger.info("Fetching schema to validate the created data for type: " + type); const mdmsResponse = await callMdmsTypeSchema(request, tenantId, type); diff --git a/utilities/project-factory/src/server/config/createAndSearch.ts b/utilities/project-factory/src/server/config/createAndSearch.ts index c29bb90fc57..8fb63b1be9f 100644 --- a/utilities/project-factory/src/server/config/createAndSearch.ts +++ b/utilities/project-factory/src/server/config/createAndSearch.ts @@ -179,7 +179,7 @@ const createAndSearch: any = { uniqueIdentifier: "id", uniqueIdentifierColumn: "A", activeColumn: "F", - activeColumnName: "HCM_ADMIN_CONSOLE_FACILITY_USAGE", + activeColumnName: "HCM_ADMIN_CONSOLE_FACILITY_USAGE_MICROPLAN", uniqueIdentifierColumnName: "HCM_ADMIN_CONSOLE_FACILITY_CODE", matchEachKey: true, parseArrayConfig: { diff --git a/utilities/project-factory/src/server/utils/genericUtils.ts b/utilities/project-factory/src/server/utils/genericUtils.ts index 3b65b766aa1..aa38c8c60b3 100644 --- a/utilities/project-factory/src/server/utils/genericUtils.ts +++ b/utilities/project-factory/src/server/utils/genericUtils.ts @@ -1132,6 +1132,49 @@ async function getMdmsDataBasedOnCampaignType(request: any, localizationMap?: an } +function appendProjectTypeToCapacity(schema: any, projectType: string): any { + const updatedSchema = JSON.parse(JSON.stringify(schema)); // Deep clone the schema + + const capacityKey = 'HCM_ADMIN_CONSOLE_FACILITY_CAPACITY_MICROPLAN'; + const newCapacityKey = `${capacityKey}_${projectType}`; + + // Update properties + if (updatedSchema.properties[capacityKey]) { + updatedSchema.properties[newCapacityKey] = { + ...updatedSchema.properties[capacityKey], + name: `${updatedSchema.properties[capacityKey].name}_${projectType}` + }; + delete updatedSchema.properties[capacityKey]; + } + + // Update required + updatedSchema.required = updatedSchema.required.map((item: string) => + item === capacityKey ? newCapacityKey : item + ); + + // Update columns + updatedSchema.columns = updatedSchema.columns.map((item: string) => + item === capacityKey ? newCapacityKey : item + ); + + // Update unique + updatedSchema.unique = updatedSchema.unique.map((item: string) => + item === capacityKey ? newCapacityKey : item + ); + + // Update errorMessage + if (updatedSchema.errorMessage[capacityKey]) { + updatedSchema.errorMessage[newCapacityKey] = updatedSchema.errorMessage[capacityKey]; + delete updatedSchema.errorMessage[capacityKey]; + } + + // Update columnsNotToBeFreezed + updatedSchema.columnsNotToBeFreezed = updatedSchema.columnsNotToBeFreezed.map((item: string) => + item === capacityKey ? newCapacityKey : item + ); + + return updatedSchema; +} export { @@ -1179,7 +1222,8 @@ export { getConfigurableColumnHeadersFromSchemaForTargetSheet, createBoundaryDataMainSheet, getMdmsDataBasedOnCampaignType, - shutdownGracefully + shutdownGracefully, + appendProjectTypeToCapacity };