Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Project-factory assists users in generating the seed data essential for the campaign creation process in DIGIT HCM and in establishing relationships between all resources. The Project Factory Service manages project-type campaigns by handling the creation, updating, searching, and campaign setup processes. This documentation details the available APIs, their endpoints, request and response structures, and internal processing flows.
Knowledge of JavaScript (preferably ES6).
Knowledge of Git or any version control system.
Knowledge of RESTful web services.
Knowledge of the Kafka and Postgres.
Knowledge of eGov-mdms service, eGov-persister, eGov-idgen, eGov-indexer, and eGov-user will be helpful.
project-factory/v1/
TO DO add other information
Swagger :
Configure the role CAMPAIGN_MANAGER for project-factory in the ‘ACCESSCONTROL-ROLES’ module.
Configure the action id(s) with the corresponding role code ‘ACCESSCONTROL-ROLEACTIONS’ module.
For Project Factory Service Role-Action mappings are as follows in the Dev environment.
Additional APIs being used are:
Configure all the MDMS data for project factory service as done in the QA environment.
Data to configure :
Attribute Config
Boundary Schema
Delivery Config
Facility Schema
Gender Config
Mail Config
Operator Config
Product Type
User Schema
Refer to the following:
https://github.com/egovernments/egov-mdms-data/tree/UNIFIED-QA/data/mz/health/hcm-admin-console
Make sure the id format is configured in the ‘IdFormat.json’ file of the ‘common-masters’ module.
Below is what is currently configured in the QA environment.
Environment variables Below are the variables that should be configured well before deployment of the project factory service build image.
Add these ‘db-host’,’db-name’,’db-url’,’domain’ and all the digit core platform services configurations (Idgen ,persister, filestore, etc.) in respective environments yaml file.
Add project factory service related environment variables’ value like the way it's done in the QA environment yaml file. (Search for project-factory)
Heath-hrms, health-project, health-individual and facility should have specified heap and memory limits as mentioned below
Make sure to add the DB(Postgres and flyway) username & password in the respective environment secret yaml file the way it's done here.
Make sure to add the digit core services related secrets are configured in the respective environment secret file the way it's done here.
Click here for localisation details.
Click here to get the Postman Collection
API EndPoints
Roles
/project-factory/v1/project-type/create
CAMPAIGN_MANAGER
/project-factory/v1/project-type/update
CAMPAIGN_MANAGER
/project-factory/v1/project-type/search
CAMPAIGN_MANAGER
/project-factory/v1/data/_create
CAMPAIGN_MANAGER
/project-factory/v1/data/_search
CAMPAIGN_MANAGER
/project-factory/v1/data/_generate
CAMPAIGN_MANAGER
/project-factory/v1/data/_download
CAMPAIGN_MANAGER
API EndPoints
Roles
/boundary-service/boundary-hierarchy-definition/_search
CAMPAIGN_MANAGER
boundary-service/boundary-relationships/_search
CAMPAIGN_MANAGER
/product/variant/v1/_search
CAMPAIGN_MANAGER
/product/v1/_search
CAMPAIGN_MANAGER
/product/v1/_create
CAMPAIGN_MANAGER
/product/variant/v1/_create
CAMPAIGN_MANAGER
Target Upload API
Base URL: project-factory/v1/
Endpoint: /data/_create
Method: POST
Request Structure:
Body Parameters:
RequestInfo: Object Containing RequestInfo
ResourceDetails: Details of a given Resource
type: Type of resource to create (e.g., boundarywithTarget)
tenantId: Tenant
fileStoreId: FileStoreId of Target Upload Sheet
action: Action to perform (e.g., validate for target upload)
hierarchyType: Name of Boundary Hierarchy
campaignId: CampaignId
additionalDetails: Additional details (optional)
Response Structure:
Success Response:
ResponseInfo: Object Containing ResponseInfo
ResourceDetails: Details of the created resource
Flow:
Client Initiates Request:
The client sends a POST request to /data/_create endpoint with action: validate.
Validation of Request:
Resource Details Validation:
Check if request.body.ResourceDetails exists and is not empty.
Throw a validation error if missing or empty with the message "ResourceDetails is missing or empty or null".
Schema Validation:
Validate request.body.ResourceDetails against createRequestSchema.
Hierarchy Type Validation:
Validate hierarchyType in request.body.ResourceDetails using validateHierarchyType function.
Tenant ID Validation:
Ensure that request.body.ResourceDetails.tenantId matches request.body.RequestInfo.userInfo.tenantId.
Throw a validation error if they do not match with the message "tenantId is not matching with userInfo".
Different Tab Headers Validation:
Validate whether headers are according to the template across all tabs of different districts.
Target Sheet Validation:
All validations will be on Sheets other than the ReadMe Sheet and Boundary Data Sheet.
Immediate validations:
District Tabs Validation:
Validate whether all district tabs are present in the Target Sheet uploaded.
Empty Sheet Validation:
Throw a validation error if any Target Sheet is empty.
Root (District) level boundary validation:
Throw a validation error if the root column (District) is empty in any row.
Validations for each row:
Boundary Codes Validation:
Check for missing or empty boundary codes in any row of any sheet.
Check for boundary code columns to be of type string.
Check for the presence of more than one boundary code in a given row of a given Target Sheet.
Check for duplicacy of the boundary code within the given Target Sheet.
Boundary Targets Validation:
Ensure that Target values are not missing and are positive numbers less than 1 Million.
Generate API for Boundary
Base URL: project-factory/v1/
Endpoint: /data/_generate
Method: POST
Request Structure:
Body Parameters:
RequestInfo: Object containing RequestInfo
Query Parameters:
tenantId: Tenant
type: Type of Resource (e.g., boundary)
forceUpdate: Boolean type (either true or false)
hierarchyType: Name of Boundary Hierarchy
campaignId: CampaignId
Response Structure:
Success Response:
Client Initiates Request:
The client initiates a dataGenerate request to the Project Factory Service.
Validation of Request:
Schema Validation: Validate against generateRequestSchema.
Tenant ID Validation: Ensure tenantId matches in query and RequestInfo.userInfo.
Force Update: Default to "false" if missing.
Hierarchy Type Validation: Validate hierarchyType for the tenantId.
Processing of Generate Request:
Fetch Data from DB:
Retrieve data using getResponseFromDb(request).
Modify Response Data:
Modify the fetched data with getModifiedResponse(responseData).
Generate New Entry:
Create a new entry with getNewEntryResponse(request).
Expire Old Data:
Update the status of old data to expired using getOldEntryResponse(modifiedResponse, request).
Persist Data Changes:
Call updateAndPersistGenerateRequest(newEntryResponse, oldEntryResponse, responseData, request).
Purpose:
If forceUpdate is true and data exists: Mark existing data as expired and create new data.
No data exists or force update is true: Generate new data.
If forceUpdate is false and data exists: Return the old data.
Boundary Data Processing:
Generate new Boundary Data:
Fetch Boundary Relationships.
If no boundary is found, generate an empty boundary sheet.
Fetch Filters from CampaignId and generate Boundary Data based on those Filters.
If Filters is null, it will generate the whole Boundary Data.
After the Boundary Sheet has been generated, append the ReadMeSheet.
Generate different tabs based on any boundary level configured (here District).
Generating Different Boundary Templates based on Campaign Type
Based on environment variable enableDynamicTemplateFor (which will have campaign types for which u want boundary target columns to be dynamic based on the number of unique delivery conditions and not default from mdms ). i.e. ( if SMC is configured then it will have target columns based on unique delivery conditions).
Otherwise it will fetch configurable columns from mdms present for each campaign type from schema -[HCM-ADMIN-CONSOLE.adminSchema].
Here is a sample data from the given schema having configurable columns for Campaign SMC-
Handle Error:
Update status to failed, add error details, log the error, and produce a message to the update topic.
Downloading the generated boundary template through /data/_generate API:
One can get the filestoreId through the /data/_download API which will fetch from db using the id from the response of /data/_generate API.
Note:
Downloaded Template will have one ReadMe sheet, one Boundary Data Tab, and all other tabs on a number of unique districts(or whichever level configured).
The documentation details APIs for creating, searching, generating, and downloading data, including request/response structures, flows, and error handling.
Endpoint: /data/_create
Method: POST
Body Parameters:
RequestInfo: Object containing request information.
Resource Details: Object containing the details of the resource to be created or validated.
type: Type of resource (boundary, facility, user, boundaryWithTarget).
tenantId: Tenant identifier.
fileStoreId: File store identifier.
action: Action type (create or validate).
hierarchyType: Type of hierarchy.
campaignId: Campaign identifier.
additionalDetails: Additional details object (optional).
Success Response:
- ResponseInfo: Object containing response information.
- ResourceDetails: Array containing the detail objects of the created or validated resource.
Client Initiates Request: The client sends a createData request to the Project Factory service.
Validation of Request: The Project Factory service validates the request schema and the provided resource details.
Processing the Request:
If action is 'create':
Enrich resource details, set status to "data-accepted", and persist in the database.
Further creation process happens in the background.
After successful creation, set the status to 'completed' and persist resource details in the database.
If action is 'validate':
Enrich resource details, set the status to "validation-started", and persist in the database.
Further creation process happens in the background.
If file data is invalid, set the status to 'invalid' and persist in the database.
After successful creation, set the status to 'completed' and persist resource details in the database.
Fail case: If validation or creation fails, set the status to 'failed' and persist in the database with the error cause in additional details.
Response: The Project Factory service sends the response back to the client containing the resource details and status.
The getSheetData function retrieves and processes data from an Excel sheet, validating the structure according to the configuration provided in createAndSearchConfig. The key part of this process is the parseArrayConfig.parseLogic configuration, which specifies how to parse and validate the columns in the sheet. Here's a detailed explanation of how the function works, including the parsing logic:
The parseArrayConfig.parseLogic configuration specifies how each column in the sheet should be processed. Here's how the parsing logic works:
Each column configuration specifies:
sheetColumn
: The column letter in the sheet.
sheetColumnName
: The expected name of the column in the sheet.
resultantPath
: The path where the value will be stored in the resultant JSON.
type
: The expected type of the value (e.g., string, number, boolean).
conversionCondition
: Optional conditions for converting values.
During the validation step, the function checks that the first-row value matches the expected column name.
When mapping the rows to JSON, the function uses the resultantPath
to place the values in the correct location in the JSON object. It converts values according to the specified type
and conversionCondition
.
For a column configuration with type: "boolean"
and conversionCondition
, the function would convert "Permanent" to true and "Temporary" to an empty string.
In summary, the getSheetData function retrieves and processes data from an Excel sheet, validating the structure and content according to the createAndSearchConfig configuration. The parseArrayConfig.parseLogic configuration specifies how each column should be validated and processed into the resultant JSON format.
Endpoint: /data/_search
Method: POST
RequestInfo: Object containing request information.
SearchCriteria: Object containing search criteria.
id: (Optional) ID of the resource.
tenantId: Tenant identifier.
type: (Optional) Type of the resource (boundary, facility, user, boundaryWithTarget).
status: (Optional) Status of the resource.
ResponseInfo: Object containing response information.
ResourceDetails: Array containing the details object of the searched resource.
Client Request: The client sends a POST request to /data/_search.
Request Content: Includes RequestInfo and SearchCriteria.
Validation: The server validates request structure and content.
Response Creation: The server creates a response with info and resource details.
Response Dispatch: Sends response back to client.
Error Handling: If errors occur, generate an error response and send it.
Endpoint: /data/_generate
Method: POST
RequestInfo: Object containing request information.
Query Parameters:
type: Type of the resource for which data needs to be generated.
tenantId: Tenant identifier.
hierarchyType: Type of hierarchy.
forceUpdate: (Optional) Boolean indicating whether to force update existing data.
ResponseInfo: Object containing response information.
GeneratedResource: Array containing the details object of the generated resource.
Client Request: The client sends a POST request to /v1/data/_generate.
Request Validation: Aftern receiving the request, the server validates the request structure and parameters.
Generate Data Process:
Validation: The server validates the generated request.
Data Processing:
Fetch Data: Fetches existing data from the database.
Modify Data: Modify the retrieved data as necessary.
Generate New ID: Generates a new random ID and sets the file store ID to null.
Expire Old Data: Marks existing data status as expired.
Generate New Data: Generates new data based on the request parameters.
Update and Persist: Updates and persists the generated request along with the new data.
Force Update Logic:
If the forceUpdate parameter is set to true:
Search and Update: Searches for existing data of the specified type and updates the existing data information.
If the forceUpdate parameter is not provided or set to false:
Fetch Existing Data: Retrieves already persisted data from the database of the specified type.
Response Creation: After processing the request, the server creates a response containing the details of the generated resource.
Response Dispatch: The server sends the generated response back to the client.
Error Handling: If errors occur, generate an error response and send it.
Fetch Required Columns from MDMS:
Use callMdmsData
to get type schema columns in the correct order.
Define Headers:
MDMS schema required columns are headers and ensures column orders.
Localise Headers:
Use getLocalizedHeaders
with localizationMap
.
Localise Sheet Name:
Use getLocalizedName
with localizationMap
and generate a sheet.
To add a new column to the Generated sheet, follow these steps:
Search Schema Details
Locate the type schema from the HCM-ADMIN-CONSOLE.adminSchema
schema in the workbench.
Identify Column Type
Determine the column type based on the properties defined in the schema:
stringProperties
for string-based columns.
numberProperties
for numeric-based columns.
enumProperties
for enumerated columns.
Define New Column
Add the new column to the schema under the appropriate properties section:
String Column: Include attributes such as name
, type
, maxLength
, minLength
, isUnique
, isRequired
, description
, and orderNumber
.
Number Column: Include attributes such as name
, type
, maximum
, minimum
, isRequired
, description
, orderNumber
, and errorMessage
.
Enum Column: Include attributes such as name
, enum
, isRequired
, description
, and orderNumber
.
Ensure Column Uniqueness
Ensure that the isUnique
property is correctly set for string columns to enforce uniqueness.
Column Visibility (Future Implementation)
Note that hideColumn
and freezeColumn
features will be implemented in the next version.
This process is sufficient for validating the new column in the generated sheet.
If there's a need to reflect the column in APIs, follow these additional steps:
Update createAndSearch.ts
File
Modify the createAndSearch.ts
file under the defined type parseLogic
object.
Integrate the new column into the appropriate data structures used for API operations.
Example :
sheetColumn: A
sheetColumnName: HCM_ADMIN_CONSOLE_FACILITY_CODE
resultantPath: id
type: string
Mapping: Data from column A (HCM_ADMIN_CONSOLE_FACILITY_CODE) in the sheet will be mapped to id
in the API data.
By following these steps, you can successfully add and validate a new column in the generated sheet and ensure its reflection in the associated APIs.
General Rules
Locked Headers: The headers in the templates for each data type (user, facility, target) are locked and cannot be changed.
Sheet Protection: Certain sheets within the templates will have specific locked areas to ensure data integrity.
README Sheet: Each type of template includes a README sheet which is read-only and locked.
Target Template
Editable Columns: You can only modify the 'Target' column. All other columns are locked and cannot be edited.
Facility Template
Adding Rows: You are allowed to add new rows to create new facilities.
Editable Columns: You can modify the "Boundary Code" and 'Usage' columns.
Locked Sheets: The boundary data sheet within the facility template is locked and cannot be modified.
Dropdown Columns: The following columns are dropdowns:
Facility Type
Facility Status
Facility Usage
Facility Usage: Facility usage can be 'Active' or 'Inactive'. Active facilities are used in the campaign and require a boundary code to map.
User Template
Adding Rows: You are allowed to add new rows.
Locked Sheets: The boundary data sheet within the user template is locked and cannot be modified.
Dropdown Columns: The following columns are dropdowns:
Role
Employment Type
Data for Dropdowns
The data for the dropdown columns comes from the mdms
(Master Data Management System) under the adminSchema
master.
Endpoint: /data/_download
Method: POST
RequestInfo: Object containing request information.
Type: (Optional) Type of the resource being downloaded.
TenantId: Tenant identifier.
HierarchyType: Type of hierarchy.
Id: (Optional) ID of the resource being downloaded.
Filters: (Optional) Additional filters for the download request.
ResponseInfo: Object containing response information.
ResourceDetails: Array containing the details object of the downloaded resource.
Client Request: The client sends a POST request to download data.
Request Validation: Upon receiving the request, the server validates the request structure and parameters.
Data Download Process:
Validation: Validate the download request.
Fetch Data: Fetch existing data of the specified type from the data host service.
Processing: Process the retrieved data as necessary.
Response Creation: After processing the request, the server creates a response containing the details of the latest resource, ensuring that only one result is fetched.
Response Dispatch: The server sends the generated response back to the client.
Error Handling: If errors occur during the process, an error response is generated and sent.
The documentation details the API endpoints for creating, updating, and searching project type campaigns. It includes request and response structures, validation steps, and flow diagrams.
POST /project-type/create
RequestInfo: Object containing RequestInfo.
CampaignDetails: Object containing the details of the campaign to be created.
tenantId: Tenant identifier.
hierarchyType: Type of hierarchy.
action: Action type (create
or draft
).
boundaries: Array of boundaries.
resources: Array of resources.
projectType: Type of the project.
deliveryRules: Array of delivery rules.
Additional request info
ResponseInfo: Object containing ResponseInfo.
CampaignDetails: The created campaign details.
The client initiates a createCampaign request to the Project Factory Service.
If the action is 'create':
The Project Factory Service validates the request schema.
It also validates the uniqueness of the campaign name in the database.
If the campaign name exists, an error is thrown.
If the action is 'draft':
The Project Factory Service validates the request schema.
It also validates the uniqueness of the campaign name in the database.
If the campaign name exists, an error is thrown.
For both 'create' and 'draft' actions:
The Project Factory Service validates the request for hierarchy type and boundaries with the Boundary Service.
If the action is 'create':
The Project Factory Service validates the request for data resources.
It enriches the CampaignDetails and sets the status to 'creating'.
The CampaignDetails are persisted in the database.
For each resource data, the Project Factory Service creates resources through the /project-factory/v1/data/_create
API.
It enriches boundaries for project creation and creates projects for each boundary with the Health Project Service.
The enriched CampaignDetails are persisted in the database.
The CampaignDetails object is sent to a Kafka topic for project mappings.
If the campaign status is not "created", project mappings are performed through the /project-factory/v1/project-type/createCampaign
API and the status is updated to 'created'.
If the campaign status is already 'created', an error is thrown, and the status is updated to 'failed'.
If the action is 'draft':
The CampaignDetails are enriched, and the status is set to 'drafted;.
The enriched CampaignDetails are persisted in the database.
The Project Factory Service sends the response back to the client.
POST /project-type/update
RequestInfo: Object containing RequestInfo.
CampaignDetails: Object containing the details of the campaign to be updated.
id: Unique identifier of the campaign.
tenantId: Tenant identifier.
hierarchyType: Type of hierarchy.
action: Action type (create
or draft
).
boundaries: Array of boundaries.
resources: Array of resources.
projectType: Type of the project.
deliveryRules: Array of delivery rules.
ResponseInfo: Object containing ResponseInfo.
CampaignDetails: The updated campaign details.
The ProjectFactoryService receives an updateCampaign request from the Client.
The received request schema is validated to ensure it matches the expected format.
The system checks if the campaign specified in the request exists in the database.
If boundaries are different from campaign in db, call:
Facility template generate
User template generate
Target template generate
If delivery conditions are different, call:
Target template generate
If the campaign exists, the system checks its status in the database.
If the campaign status is 'drafted':
Validate Boundaries: Validate the request for hierarchyType and boundaries.
Enrich Campaign Details: Enrich the campaign details and set the status to 'updating'.
Update Campaign Details: Update the campaign details in the database.
Update Resource Data: Update each resource data associated with the campaign through the /project-factory/v1/data/_update
API.
Enrich Boundaries: Enrich the boundaries for the project update.
Update Projects: Update projects associated with each boundary.
Persist Changes: Persist the updated campaign details in the database.
Send to Kafka Topic: Send the updated CampaignDetails object to the Kafka topic for project mappings.
Listen to Kafka: Listen for updates from the Kafka topic to get the updated CampaignDetails object for project mappings.
If the campaign status is not 'created':
Do project mapping through /project-factory/v1/project-type/createCampaign
API.
Enrich the CampaignDetails and set the status to 'created'.
Update the CampaignDetail in the database.
If the campaign status is 'created':
Throw an error indicating that the project is already mapped for this campaign.
Enrich the CampaignDetails and set the status to 'failed'.
Update the CampaignDetail in the database.
If the campaign status is not 'drafted', the system throws an error indicating that only drafted campaigns can be updated.
The ProjectFactoryService sends a response to the Client based on the outcome of the update operation.
POST /project-type/search
RequestInfo: Object containing RequestInfo.
CampaignDetails: Object containing the search criteria for campaigns.
tenantId: Tenant identifier.
ids: Array of campaign IDs to search for.
startDate: The start date for the search.
endDate: End date for the search.
projectType: Type of the project.
campaignName: Name of the campaign.
status: Status of the campaign.
createdBy: Creator of the campaign.
campaignNumber: Number of the campaign.
campaignsIncludeDates: Flag to include campaigns based on dates.
pagination: Object containing pagination settings.
limit: Maximum number of results to return.
offset: Offset for paginated results.
sortOrder: Sort order for results (asc/desc).
sortBy: Field to sort results by.
ResponseInfo: Object containing ResponseInfo details.
CampaignDetails: Array containing details of matching campaigns.
totalCount: Total number of matching campaigns.
The client sends a searchCampaign request to the Project Factory Service.
The Project Factory Service validates the request schema and search criteria.
The Project Factory Service constructs a search query based on the provided criteria.
It checks if there are specific search fields like start date, end date, campaign name, etc.
Depending on the campaignsIncludeDates
flag, the service adjusts the search conditions accordingly.
If campaignsIncludeDates
is true:
It shows only those campaigns whose start date is on or before the provided start date and whose end date is on or after the provided end date.
If campaignsIncludeDates
is false:
It shows only those campaigns whose start date is on or after the provided start date and whose end date is on or before the provided end date.
The service executes the constructed query to retrieve matching campaign details from the database.
The Project Factory Service sends the response back to the client.
The response contains the matching campaign details along with the total count, if applicable.
POST /project-type/getProcessTrack
campaignId: Unique ID of the campaign.
Success Response:
ResponseInfo: Object containing ResponseInfo details.
processTrack: Array containing process tracks of the matching campaign.
Client Initiates Request
The client sends a request to retrieve process tracks for a specific campaign by providing the campaignId
.
Validation of Request
The Project Factory Service validates the provided campaignId
to ensure it meets the expected format and constraints.
Fetch Process Tracks
The Project Factory Service constructs a query to fetch process tracks associated with the provided campaignId
.
The service executes the query against the database to retrieve the process tracks.
Response
The Project Factory Service formats the retrieved process tracks and packages them into the response.
The response includes the ResponseInfo
and an array of processTrack
details.
Send Response to Client
The Project Factory Service sends the response back to the client containing the process track details for the specified campaign.
processTrackTypes
(Steps)This defines various types of process tracks, each representing a specific stage or action in the campaign creation process. These types can be used to categorize and identify different steps or activities within the campaign workflow. Here's what each type represents:
validation: Represents the validation stage of the campaign creation process, where data or conditions are checked for correctness.
triggerResourceCreation: Indicates the step where resources are created based on triggers or conditions.
facilityCreation: Refers to the creation of facilities or resources required for the campaign.
staffCreation: Involves the creation of staff members necessary for the campaign.
targetAndDeliveryRulesCreation: Represents the creation of rules related to targets and delivery mechanisms (project creation step).
confirmingResourceCreation: Involves confirming that resources have been successfully created.
prepareResourceForMapping: The stage where resources are prepared for mapping to projects.
validateMappingResource: Represents the validation of resources after they have been mapped.
staffMapping: Involves mapping staff to projects.
resourceMapping: Represents the mapping of various resources to projects.
facilityMapping: Refers to mapping facilities to projects.
campaignCreation: Represents the creation of the campaign itself (final step).
error: Indicates that an error occurred during the campaign creation process.
processTrackStatuses
This object defines different statuses that a process track can have, reflecting the state or progress of a particular step in the campaign creation process. Here are the statuses and their meanings:
inprogress: Indicates that the process or task within the campaign creation process is currently ongoing and has not yet been completed.
completed: Represents that the process or task within the campaign creation process has been successfully finished.
toBeCompleted: Refers to processes or tasks within the campaign creation process that are scheduled or pending completion in the future.
failed: Signifies that the process or task within the campaign creation process encountered an error or failed to execute as intended.
Boundary Bulk Upload Overview:
This documentation outlines the process and components of bulk uploading boundaries for a campaign. It covers the proper format of the Excel sheet, unique code generation, functions for boundary entity creation, boundary relationship creation, localisation, and API details.
The Excel sheet should be formatted as follows:
Unique codes are auto-generated for each boundary level as follows:
If there are two districts (boundaries at the same level) with the same name (for example, BLR) under different parent-level boundary, the names will be updated to BLR, BLR-01, and so on.
Purpose:
Generate auto-generated boundary codes based on boundary list, child-parent mapping, element codes map, count map, and request information.
Parameters:
boundaryList
: List of boundary data.
childParentMap
: Map of child-parent relationships.
elementCodesMap
: Map of boundaries to its corresponding auto generated unique codes.
countMap
: Map of counts for each boundaries.
request
: HTTP request object.
Returns:
Updated element codes map.
Steps:
Initialise Column Data:
Initialise an array to store column data.
Extract Unique Elements:
Iterate through each row of the boundary list.
Extract unique elements from each column.
Generate Boundary Codes:
Iterate over columns to generate boundary codes.
Check if the element code exists in the element codes map.
If not, generate a new code based on parent-child mapping and sequence.
Store the code of the element in the element codes map.
Default Code Generation:
Generate default code if parent code is not found.
Updated Element Codes Map
Return Updated Boundary Data - Auto-Generated Code Map.
Boundary entities are created chunk-wise, with each chunk consisting of 200 codes.
Purpose:
To create new boundary entities in the system from provided boundary codes.
Steps:
Convert Boundary Map:
Change the boundary map to a list of objects with key
and value
.
Prepare Request:
Set up the request details and initialise lists for boundaries and existing codes.
Chunk Boundary Codes:
Divide the boundary codes into smaller groups.
Fetch Existing Boundaries:
Check the system for existing boundary codes and collect them.
Identify New Boundaries:
Determine which boundary codes are new and add them to the list of boundaries to create.
Create New Boundaries:
If there are new boundaries, send them to the system in groups and log the results.
Handle Existing Boundaries:
Log a message if all boundaries already exist.
Error Handling:
Manage any errors that occur and provide a relevant error message.
Create Boundary Relationship
Purpose:
To create boundary relationships in the system from provided boundary codes and their parent-child mappings.
Steps:
Convert Boundary Map:
Transform the boundary map to a list of {key, value}
objects.
Initialise Request:
Prepare the request details and activity messages array.
Fetch Existing Relationships:
Retrieve existing boundary relationships and extract their codes.
Identify and Create Relationships:
For each boundary code, check if it exists. If not:
Prepare the boundary relationship data.
Confirm the parent boundary creation.
Create the boundary relationship.
Handle Existing Relationships:
If all relationships already exist, log a validation error.
Attach Activity Messages:
Add activity messages to the request body.
Error Handling:
Catch, log, and handle errors appropriately.
Boundary codes are localised to their corresponding names as specified in the uploaded Excel sheet.
To add more boundaries after the initial upload, use an Excel sheet that includes existing boundary codes. New boundaries without codes will be created in the same way as the first upload.
API request for boundary bulk upload:
Note: Ensure the API endpoint, headers, and payload are customised as per your environment and requirements.
Here are the articles in this section:
Overview
In the Campaign Details stepper, there are 2 screens:
Campaign Type
Campaign Name
This is the first screen when the user clicks on the set-up campaign. In this screen, a user can select the campaign type and the beneficiary will be prepopulated from the MDMS. It is a mandatory field to set up a campaign.
Here, the dropdown will show the list of campaign types that are present in the MDMS. We will fetch the MDMS data from:
This screen comes after the campaign type. This step is crucial for saving your campaign as a draft, as the name serves as a unique identifier. After clicking on 'Next', the name will be saved and the user can check from the draft.
This screen asks a user to fill in the start and end date of the campaign.
This allows users to fill in all the campaign details and create a new campaign.
Click on the following links to learn more:
Below are the configurations needed for successfully setting up the campaign module:
citymodule needed to run campaign module in an environment:
Link:
roleactions config needed for the user for all campaign access
Link:
actionTest config needed for sidebar action and user access for services
LINK:
To enable action in the sidebar, add navigationUrl and path to the object
Refer to the below id's link in QA:
roles need to be added in roles
Boundary Schema config needs to be added for boundary sheet validation:
Facility Schema config needs to be added for facility sheet validation:
User schema config needs to be added for user sheet validation:
Hierarchy config needs to be added to define lowset hierarchy in boundary selection:
Global configuratio needs to be added to environments.
Helm chart needs to be added in devops.
In the 'Delivery Details' step, users encounter 3 screens:
Delivery Dates
Cycle Configuration
Delivery
This screen asks a user to fill in the start and end date of the campaign.
On this screen, users specify the number of cycles and deliveries. The number of cycles must be at least 1 and can be up to 5. Once the user has defined the number of cycles and deliveries, they can proceed to enter the start and end dates for each cycle.
The number of cycles and deliveries are configurable based on project type. We can configure it in MDMS:
If data is configured, a user will see the number of cycles and deliveries as per the configuration. A user, however, can increase or decrease if they find it necessary.
The validations added for the start date and the end date of the cycles should not overlap to each other.
After filling in all the cycle details, a user can click on 'Next' and move to the Delivery rules screen. Clicking on 'Next' enables a user to store the cycle data in the local storage.
On this screen, users fill in all the delivery details (adding delivery rules, adding conditions in delivery rules, adding products in the delivery rules) of each cycle and delivery which the user has selected in the cycle details screen.
The delivery screen can also be configured based on project type. A user can configure the number of delivery conditions, their attributes, and products. If the data is configured correctly, a user can see the data preloaded in delivery rules and the user can change, remove, or add, if they find it necessary.
A user can add delivery rules up to 5. A user can add conditions in each delivery rule with attribute options having height, weight, gender, and age. For Project type, LLIN-mz configuration is passed in delivery rules in which two fixed attributes are present for the bednet campaign.
After filling in all the delivery rules details, when a user clicks on next, the data will be stored in the localStorage as well as in the draft API. The delivery rules data will be validated in the preview screen.
Reference files:
If you click on configure resources on the delivery screen, a pop-up appears where a user can either select or create a product:
Product Screen: When a user clicks on "Add Products to be delivered", a pop-up screen will appear with a list of product variants where a user can add the products and the number of counts in the delivery rules.
A user can add multiple products to the product screen after clicking on "add more resources" When the user clicks on confirm resources, products will be added to the delivery rules. The user can remove the products as well.
If the product is not present, a user can click on "Add New Product" to create a new product and variant, and subsequently add delivery rules. Clicking on "Add New Product" will open the create product screen.
Users can enter product names, product variants, and product types which are sourced from MDMS data. Additionally, a user can create multiple products using the "Add Products" button. After clicking on 'Confirm,' the product will be created, followed by the creation of product variants.
After successful creation, users will be directed to a success response screen.
Here you can find the config of delivery based on project type.
The following is the structure of the delivery configuration:
projectType: This will be the type of the project. If the selected project type is present in the MDMS, then we use that config.
attrAddDisable: if this is true, we are restricting a user that they cannot add any attribute.
deliveryAddDisable: if this is true, a user cannot add any further delivery rule conditions.
cycleConfig: This will be an object containing cycles and deliveries. This refers to the number of cycles and deliveries that will be shown in the cycle screen.
deliveryConfig: This will be an array of objects, each object representing one delivery condition.
Adding product config is a careful job, adding the wrong product in the config will cause issues while creating a product.
In Value, the product variant ID should be added in the value which will be getting in the below API:product/variant/v1/_search
The name will consist of the name of the product and the variant of the product separated with "-"
for name: product/v1/_search
for variant: product/variant/v1/_search
FilePath:
MDMS:
HOOKS:
We have added Delivery type at each delivery conditions showing the delivery type of the campaign.
It is configurable in mdms for the SMC project type. We can add default delivery type at each conditions.
deliveryConfig: It will contain default data of all deliveries.
conditionConfig: It will contain default data of each delivery condition of each deliveries
deliveryType: Default value of delivery type.
A info card is been added in both the screens in the delivery details. Which states the criteria of delivery as recommended by WHO.
It validates the request for project type code from .
Validate Project Type: It validates the request for project type code from .
Country | Província | Distrito | Posto Administrativo | Localidade | Aldeia |
---|---|---|---|---|---|
Boundary | Code |
---|---|
MDMS:
File Path:
File Path:
FilePath:
End Point | Method | Payload |
---|
Link:
Link:
Link:
Link:
Link:
Link:
Link:
Refer to learn more about the setup environment.
Module | Use |
---|
FilePath:
Link:
File Path:
File Path:
Delivery rule's screen file path:
API call file path:
Attribute:
Operator:
Bednet config:
Product Type:
End Point | Method | Payload |
---|
INDIA
INDIA
KARNATAKA
INDIA
KARNATAKA
BLR
INDIA
KARNATAKA
BLR
KORAMANGALA
INDIA
KARNATAKA
BLR
KORAMANGALA
3RD BLOCK
INDIA
KARNATAKA
BLR
KORAMANGALA
3RD BLOCK
EGOV
INDIA
BIHAR
INDIA
BIHAR
PATNA
INDIA
ADMIN_IN
KARNATAKA
ADMIN_IN_01_KARNATAKA
BLR
ADMIN_IN_01_01_BLR
KORAMANGALA
ADMIN_IN_01_01_01_KORMANGALA
BIHAR
ADMIN_IN_02_BIHAR
PATNA
ADMIN_IN_02_01_PATNA
project-factory/v1/project-type/create | POST | { "hierarchyType": "ADMIN", "tenantId": "mz", "action": "draft", "campaignName": "test90", "resources": [], "projectType": "MR-DN", "additionalDetails": { "beneficiaryType": "INDIVIDUAL", "key": 2 } } |
project-factory/v1/project-type/search | POST | { "tenantId": "mz", "ids": [ "2a2491a7-c52d-4305-8b5b-9aa10ae44168" ], "pagination": {} } |
/project-factory/v1/project-type/search | POST | { "tenantId": "mz", "ids": [ "2a2491a7-c52d-4305-8b5b-9aa10ae44168" ], "pagination": {} } |
/project-factory/v1/project-type/update | POST | { "id": "2a2491a7-c52d-4305-8b5b-9aa10ae44168", "tenantId": "mz", "status": "drafted", "action": "draft", "campaignNumber": "CMP-2024-05-15-000496", "campaignName": "test90", "projectType": "MR-DN", "hierarchyType": "ADMIN", "boundaryCode": "", "projectId": null, "startDate": 1715970599000, "endDate": 1717180199000, "additionalDetails": { "beneficiaryType": "INDIVIDUAL", "key": 3 }, "resources": [], "boundaries": [], "deliveryRules": [], "auditDetails": { "createdBy": "21fed2bc-6a73-41b2-b9ae-0996f5b5ede5", "lastModifiedBy": "21fed2bc-6a73-41b2-b9ae-0996f5b5ede5", "createdTime": 1715762971435, "lastModifiedTime": 1715762971519 } } |
rainmaker-common | For all common screen localisation messages like login, homepage, sidebar |
rainmaker-campaignmanager | For all admin console related screens localisation messages |
rainmaker-hcm-admin-schemas | For all upload schemas like target, facility, user |
boundary-${BOUNDARY_HIERARCHY_TYPE} | For boundary type localisations, we are getting this BOUNDARY_HIERARCHY_TYPE from the mdms |
product/variant/v1/_search | POST | { "ProductVariant": {}, "RequestInfo": { } } |
product/v1/_search | POST | { "Product": { "id": [ "P-2024-01-04-000094", "P-2024-01-04-000094", "P-2024-01-04-000095", "P-2024-01-04-000095", "P-2024-01-04-000096", "P-2024-01-04-000094", "P-2024-01-04-000094", "P-2024-01-04-000095", "P-2024-01-04-000095",] }, "RequestInfo": { } } |
product/v1/_create | POST | { "Product": [ { "tenantId": "mz", "type": "BEDNET", "name": "CHECKTHEONE" } ], "apiOperation": "CREATE", "RequestInfo": { } } |
product/variant/v1/_create | POST | { "ProductVariant": [ { "tenantId": "mz", "productId": "P-2024-05-09-000322", "variation": "1000" } ], "apiOperation": "CREATE", "RequestInfo": { } } |
project-factory/v1/project-type/update | POST | { "CampaignDetails": { "id": "76e7f371-1f85-4739-97dc-feb4ee10fa6b", "tenantId": "mz", "status": "drafted", "action": "draft", "campaignNumber": "CMP-2024-05-09-001413", "campaignName": "TheNewOne", "projectType": "LLIN-mz", "hierarchyType": "ADMIN", "boundaryCode": "", "projectId": null, "startDate": 1716056999000, "endDate": 1716488999000, "additionalDetails": { "beneficiaryType": "HOUSEHOLD", "key": 5 }, "resources": [], "boundaries": [], "deliveryRules": [ { "cycleNumber": 1, "deliveryNumber": 1, "deliveryRuleNumber": 1, "products": [ { "value": "PVAR-2024-01-24-000076", "name": "SP - 500mg", "count": 1 } ], "conditions": [ { "attribute": "CAMPAIGN_BEDNET_INDIVIDUAL_LABEL", "operator": null, "value": null }, { "attribute": "CAMPAIGN_BEDNET_HOUSEHOLD_LABEL", "operator": null, "value": null } ] } ], "auditDetails": { "createdBy": "63a21269-d40d-4c26-878f-4f4486b1f44b", "lastModifiedBy": "63a21269-d40d-4c26-878f-4f4486b1f44b", "createdTime": 1715270852152, "lastModifiedTime": 1715273123616 } }, "RequestInfo": { } } |
The logic for the step-by-step screens, stepper functionality, storing data in localStorage, creating/updating campaigns, and restructuring API data back into localStorage is all managed within SetupCampaign.js.
All screens are present in the given configuration. Link: https://github.com/egovernments/DIGIT-Frontend/blob/campaign/micro-ui/web/micro-ui-internals/packages/modules/campaign-manager/src/configs/CampaignConfig.js
In the configuration:
stepCount
represents the step number. Multiple configuration objects can share the same stepCount
.
skipAPICall
: If this is set to true, the API call for the screen is skipped.
sessionData
: Local storage data is passed in custom props, allowing for custom logic to be added to the screens as needed.
In setup campaign, we have functions to perform specific logic.
loopAndReturn
:
This function takes the delivery rule conditions coming from API response and restructure the data in local storage format.
cycleDataRemap
:
This function takes the delivery rules data coming from API response and return array of object of start date and end date based on cycles.
reverseDeliveryRemap
:
This function take the deliveryConditions from API response and return the structure of delivery data.
groupByTypeRemap
:
This function create the local structure of boundaries.
updateUrlParams
:
This function is using to update the url.
In a new campaign, we update the total form when a user clicks on next after entering the data.
After updating the total form data, we store the data in localStorage.
We also call the API to draft the data in case a user wants to come back and resume the campaign.
Refer to the following link:
When a user clicks on the draft campaign, he/she can fetch campaign data from the response.
After getting a response, one can restructure the data in screen format and store in the local storage.
After updating, the user is redirected to the last screen where additional details are stored in response.
Refer to the following link:
Based on screens, a user can filter the configuration and show the the stepper based on the configuration.
Refer to the following link:
This screen allows a user to select different boundary details required for the campaign creation. Here, we show the boundary types based on the hierarchy type which is present in the MDMS, MDMS file path : https://github.com/egovernments/egov-mdms-data/blob/UNIFIED-DEV/data/mz/health/hcm-admin-console/hierarchyConfig.json
If we want to fetch the hierarchy type from the MDMS, use the following API:
To fetch the hierarchy definition, this is mentioned in the setUpCampaign page: https://github.com/egovernments/DIGIT-Frontend/blob/campaign/micro-ui/web/micro-ui-internals/packages/modules/campaign-manager/src/pages/employee/SetupCampaign.js
After calling the hierarchy, the response is stored in the session storage under the name:
After it is stored, we can use it in the "Selecting Boundaries" component to show the different boundary types present: The FilePath for it is the following: https://github.com/egovernments/DIGIT-Frontend/blob/campaign/micro-ui/web/micro-ui-internals/packages/modules/campaign-manager/src/components/SelectingBoundaries.js The boundary type in the screen is shown upto the lowest hierarchy level which is also configured from the MDMS. The options in the hierarchy is shown using the following:
In the selection boundary screen, we show options according to parent boundary type using the above API. Some validations for this screen:
All the boundary types in the screen are mandatory.
Lower level boundary type is mandatory if a user has selected the above levels
After the boundaries are selected, the Generate API is called with a delay of 3 seconds when the user clicks on next, using the following hook: https://github.com/egovernments/DIGIT-Frontend/blob/campaign/micro-ui/web/micro-ui-internals/packages/modules/campaign-manager/src/hooks/useGenerateIdCampaign.js
We have impemented Parallel API calls have been implemented for boundary data search to optimise the performance better. We have added all the API search from the loop and calling parallel calls at once and storing the respective data in respective boundaryType.
For the next time when we are making boundary search api calls, we are checking locally whether data is present otherwise calling the API search only for the required data to optimise it better.
All the above mentioned logic have been added in useParallelSearch.js hook.
The resource upload details consists of 3 types of uploads:
Upload Target Data
Facility Upload
User Upload
This screen will come after a user selects the boundaries.
When a user clicks on the download template button, an Excel will get downloaded which will contain readMe, Boundary Data sheet along with the sheets with districts, where the user has to fill the target at the lowest level. After the file is uploaded, it will go for validation. Once validated, a user can go to the next page, where the user can delete the file and move to the next page to upload facility date.
This screen will come after the target upload screen.
In this screen, when a user clicks on the download template, an Excel get downloaded that contains readMe, Facility sheet, and BoundaryData sheet. A user has to fill in the boundary codes and from that sheet, the user has to fill in the facility sheet.
This screen will appear after the facility Details screen.
When a user clicks on the download template, an Excel gets downloaded that consists of with readMe, User Sheet and BoundaryData. The user has to fill the user sheet only.
All the 3 downloads are happening through the Generate and Download APIs. For the Generate API, the following hook is used: https://github.com/egovernments/DIGIT-Frontend/blob/campaign/micro-ui/web/micro-ui-internals/packages/modules/campaign-manager/src/hooks/useGenerateIdCampaign.js
This hook will return the ID which is stored in the local storage according to the type:
Next, /project-factory/v1/data/_download is used to download the template.
After uploading the templates, UI validation is done through schema stored in the MDMS: Schema Data link : https://github.com/egovernments/egov-mdms-data/blob/UNIFIED-DEV/data/mz/health/hcm-admin-console/adminSchema.json
Schema Module = adminSchema Below is the admin schema-
By using AJV Validation , we are validating the headers of the facility sheet. We are also doing some basic validations for the data such as-
Facility Type can only be Warehouse/Health Facility
Facility Name can only be string
Facility Status can only be Temporary or Permanent etc.
Apart from this, we are also validating sheet names in all the 3 uploads.
For target validation, we use schema only for validating the header of the target and boundary codes. Here, we also validate the target at the lowest level, where the value should be between:
Before calling we are using base time out which is fetched from the MDMS
For the backend validation, we use the following hook: https://github.com/egovernments/DIGIT-Frontend/blob/campaign/micro-ui/web/micro-ui-internals/packages/modules/campaign-manager/src/hooks/useResourceData.js
The screens are using the given below components for upload and validation-
Preview component: https://github.com/egovernments/DIGIT-Frontend/blob/campaign/micro-ui/web/micro-ui-internals/packages/modules/campaign-manager/src/components/XlsPreview.js
A new popup has been added which display the option to download the template in all the three upload screens.
Use Case :
when the user comes after clicking next on the delivery screen and the file is not uploaded then this pop up is displayed.
The Summary screen provides users with a comprehensive view of all campaign details entered.
Users can review the entirety of their campaign information. If the campaign status is marked as 'drafted,' users can either edit the existing data or submit it. After submission, the campaign is created, initiating the 'create' action.
For campaigns in a 'draft' status, the summary screen serves as the final step of the campaign setup process, giving users the option to edit or submit the details before finalisation.
If the campaign is successfully created while in the 'draft' status, users are directed to a success screen.
After the API call, the data undergoes restructuring to present delivery rules based on the cycle and delivery details.
If campaign data is incomplete and user tries to create a campaign, then we are showing all the erros in the respective card specifyig the error to the user. User can make the change by using errors button or clicking on edit button showing in the card.
Errors card Implementation:
We are adding all the errors as per screen name in an array and passing the erros as a props in ViewComposer component.
For draft status only:
My campaign screen allows users to see the list of campaigns that are in Ongoing, Completed, or Draft status. Users can search campaign by using the campaign name or campaign type. Users can also see a summary of the campaign and complete the campaign creation if it is draft status.
The list of statuses showing in "My Campaign" screen are:
Ongoing
Completed
Drafts
Failed
Upcoming
After clicking on the My Campaign link from the HCM Campaign module card, the user lands on the My Campaign screens where the user can see all the lists of campaigns of each action in the tab.
On my campaign screen, we are sending the payload:
Campaigns with an end date that has passed the current date are marked as 'Completed'.
Campaigns with a status of 'Started' and no end date, or with an end date in the future, are labeled as 'Ongoing'."
The logic is written in UICustomizations.js
Clicking on campaigns other than draft status will redirect to the summary page of the campaign where the user can see the complete details of the respective campaign.
For the ongoing campaign filtering functionality, we are utilizing the campaignsIncludeDates parameter set to true. The startDate and endDate parameters are both set to the current date. This configuration ensures that the API will return any campaign where the specified startDate or endDate falls within the campaign's defined start and end dates. Additionally, the campaign status is filtered to include campaigns with statuses of created or creating.
campaignsIncludeDates: This boolean parameter is set to true to enable date range filtering.
startDate: The start date for the filter, set to today's date.
endDate: The end date for the filter, also set to today's date.
status: The campaign status filter, including the statuses created and creating.
To filter the ongoing campaigns based on the criteria mentioned above, ensure that your request payload includes the following parameters:
campaignsIncludeDates = true: This activates the date range filtering feature.
startDate and endDate = today: By setting both the start and end dates to today's date, the filter will capture any campaigns that are active today.
status = ["created", "creating"]: Filters the campaigns to only include those that are currently in the created or creating status.
For filtering completed campaigns, we use a similar approach with a slight modification to the date parameters and status. Specifically, we will set the endDate
parameter to yesterday's date. This configuration ensures that the API returns campaigns that have ended as of yesterday. The statuses to filter will remain creating
and created
.
endDate: The end date for the filter, is set to yesterday's date.
status: The campaign status filter, including the statuses creating
and created
.
To filter the ongoing campaigns based on the criteria mentioned above, ensure that your request payload includes the following parameters:
endDate = yesterday: By setting the end date to yesterday's date, the filter will capture any campaigns that have ended by the end of the previous day.
status = ["created", "creating"]: Filters the campaigns to include only those that were in the created
or creating
status when they ended.
When a user clicks on completed campaign, they will be redirected to the summary page displaying the campaign details. The success toast message will appear If user credential sheet is generated successfully. User can view or download the sheet from the user credential card or download button which appears at the top.
For filtering upcoming campaigns, we use a different approach by setting the campaignsIncludeDates
parameter to false
and specifying the startDate
parameter to tomorrow's date in epoch format. This configuration ensures that the API returns campaigns scheduled to start tomorrow. The statuses to filter will remain creating
and created
.
campaignsIncludeDates: This boolean parameter is set to false
as we are not filtering based on a date range but rather a specific start date.
startDate: The start date for the filter, set to tomorrow's date in epoch format.
status: The campaign status filter, including the statuses creating
and created
.
To filter the upcoming campaigns based on the criteria mentioned above, ensure that your request payload includes the following parameters:
campaignsIncludeDates = false: This deactivates the date range filtering feature, focusing the filter on a specific start date.
startDate = tomorrow (epoch date): By setting the start date to tomorrow's date in epoch format, the filter will capture any campaigns scheduled to start tomorrow.
status = ["created", "creating"]: Filters the campaigns to include only those that are in the created
or creating
status and scheduled to start tomorrow.
When a user clicks on upcoming campaign, they will be redirected to the summary page displaying the campaign details.
For the drafts campaign, we are passing the status as drafted. It will return all the drafts which are in drafted status
For failed campaigns, we are passing the status as failed. It will return all the drafts which are in failed status
When a user clicks on a failed campaign, they will be redirected to the summary page displaying the campaign details. Additionally, a toast message will appear, showing the error that caused the campaign to fail.
Path: https://github.com/egovernments/egov-mdms-data/blob/UNIFIED-DEV/data/mz/health/project-types.json
This screen enables users to update the start date, end date, and cycle dates for both ongoing and upcoming campaigns. Additionally, an 'Actions' column has been added to the "My Campaign" screen, providing more options for managing the campaigns.
When a user clicks on 'Actions', they will see the "Update Dates" option. Selecting "Update Dates" redirects the user to the update date screen.
We have added an MDMS configuration flag to determine whether the dates can be updated with or without boundaries. Depending on the MDMS flag, the appropriate screen will be rendered.
If the MDMS flag for updating dates with a boundary is set to true, the corresponding screen for updating dates will be rendered.
If the MDMS flag for updating with a boundary is set to true, the corresponding screen will be rendered. On this screen, the user first selects the hierarchy level and boundary they wish to update. After making their selection, the user clicks the 'Confirm' button.
Based on the selected boundaries, the corresponding dates are displayed. The user can then change the dates and cycle dates as needed. Fields with dates that have already passed (relative to today) are made non-editable.
After making the desired changes, the user clicks the 'Confirm' button to update the dates. Once the update is successful, a success response screen is shown, and the user is redirected back to the "My Campaign" screen.
If the MDMS flag is set to false, the corresponding screen is rendered to update the dates without considering boundaries, at the root level.
When the user clicks on "Update Date" for the respective campaign, the update date screen is shown with all the prefilled start and end dates. The user can then make the necessary changes.
The user can change the editable dates. Any date fields that have passed the current date are non-editable. Once the user confirms the date change, the data is updated. After a successful update, the user is redirected to a success screen.
MDMS configuration to check whether the update date is at the root level or boundary level: https://github.com/egovernments/egov-mdms-data/blob/UNIFIED-DEV/data/mz/health/hcm-admin-console/dateWithBoundary.json
MDMS Link:
The timeline provides a visual representation of the campaign creation process. It can be accessed from the summary or through the action button on the "My Campaign" screen. The timeline will be shown for ongoing, upcoming, completed, and failed campaigns.
This timeline shows all the stages of the campaign that are successfully created. A user can download the user credentials as soon as the campaign is created successfully.
The above images show all three timeline steps: upcoming, current, and completed.
A user can also access the timeline from the "My Campaign" screen by clicking on the action button present in the search result.
The timeline will be shown in the form of a pop-up from the "My Campaign" screen. Similar to the summary, while the campaign creation is in progress, it will display all the steps such as upcoming, current, and completed. User credentials will be downloaded once the campaign is successfully created.
A new "Actions" column has been added to the "My Campaign" screen, allowing users to perform some task in a handy way.
Users can click on "Actions" to choose from the available action options in the menu.
We've added config for column actions in myCampaignConfig.js
In UICustomization.js, We've added component which needs to be render for the action column under additionalCustomizations.
We have added onActionSelect function which perform action based on selected option.
File Path:
Config:
UICustomisation:
This screen allows the user to create a new hierarchy and then upload the boundary data in bulk.
Upload Boundary Screen
This screen allows the user to select the hierarchy. According to that, a template is downloaded in which the user needs to fill in the boundary data. If the hierarchy type is not present, then the user can make a new hierarchy using this screen.
Create Boundary Hierarchy
The user needs to give a hierarchy name, and levels according to the hierarchy.
UI Validation: Headers should be according to the template downloaded.
API Details
EndPoint | Method | Payload |
---|---|---|
End Point | Method | Payload |
---|---|---|
End point | Method | Payload |
---|---|---|
End Point | Method | Payload |
---|---|---|
End Point | Method | Payload |
---|---|---|
End point | Method | Params |
---|
EndPoint | MDMS Roles | Method | Payload |
---|
/project-factory/v1/data/_generate
POST
Params will be different for different types- 1) facilityWithBoundary
tenantId:mz
type:facilityWithBoundary
forceUpdate:true
hierarchyType:ADMIN
campaignId:13175791-db53-4d10-be90-2dba1c138756 2) boundary tenantId:mz
type:boundary
forceUpdate:true
hierarchyType:ADMIN
campaignId:13175791-db53-4d10-be90-2dba1c138756 3)userWithBoundary tenantId:mz
type:userWithBoundary
forceUpdate:true
hierarchyType:ADMIN
campaignId:13175791-db53-4d10-be90-2dba1c138756
/project-factory/v1/data/_download
POST
Params will be different for different types- 1)boundary tenantId:mz
type:boundary
hierarchyType:ADMIN
id:987eadc3-55a0-4553-925d-bf8087f57e5a 2)facilityWithBoundary tenantId:mz
type:facilityWithBoundary
hierarchyType:ADMIN
id:052f59fc-18a7-4e07-816a-f5d8062b56b5 3)userWithBoundary tenantId:mz
type:userWithBoundary
hierarchyType:ADMIN
id:fbfbd393-d053-4f51-9e12-1068b97da292
/project-factory/v1/data/_create
POST
1) type: boundaryWithTarget { "type": "boundaryWithTarget", "hierarchyType": "ADMIN", "tenantId": "mz", "fileStoreId": "ad9efbdb-b2c5-434e-b86e-1cb02d61e758", "action": "validate", "campaignId": "13175791-db53-4d10-be90-2dba1c138756", "additionalDetails": {} } 2) type: facility { "type": "facility", "hierarchyType": "ADMIN", "tenantId": "mz", "fileStoreId": "a5ca723c-e463-4428-86b4-e0f706973857", "action": "validate", "campaignId": "13175791-db53-4d10-be90-2dba1c138756", "additionalDetails": {} } 3) type: user { "type": "user", "hierarchyType": "ADMIN", "tenantId": "mz", "fileStoreId": "3f6348b0-7e10-4f1a-8f48-dcfb0c9afdff", "action": "validate", "campaignId": "13175791-db53-4d10-be90-2dba1c138756", "additionalDetails": {} }
boundary-service/boundary-relationships/_search
POST
Params tenantId=mz
hierarchyType=ADMIN
boundaryType=Provincia
parent=ADMIN_MO
/boundary-service/boundary-hierarchy-definition/_search
POST
{ "tenantId": "mz", "limit": 2, "offset": 0, "hierarchyType": "ADMIN" }
/project-factory/v1/project-type/update
POST
{ "CampaignDetails": { "id": "eacb77b9-0bcd-4939-88a6-ca9456eb7bc4", "tenantId": "mz", "status": "drafted", "action": "create", "campaignNumber": "CMP-2024-05-09-001425", "campaignName": "checkte", "projectType": "LLIN-Moz", "hierarchyType": "ADMIN", "boundaryCode": "mz", "projectId": null, "startDate": 1715538599000, "endDate": 1717266599000, "additionalDetails": { "beneficiaryType": "HOUSEHOLD", "key": 10 }, "resources": [ { "type": "facility", "filename": "fac.xlsx", "filestoreId": "19be64bc-5a03-4932-9b88-90feb16e642a" }, { "type": "boundaryWithTarget", "filename": "TR.xlsx", "filestoreId": "8821993e-339b-4af5-9263-337276891065" } ], "boundaries": [ { "code": "mz", "type": "Country", "isRoot": true, "includeAllChildren": true }], "deliveryRules": [ { "startDate": 1715711399000, "endDate": 1716661799000, "cycleNumber": 1, "deliveryNumber": 1, "deliveryRuleNumber": 1, "products": [ { "value": "PVAR-2024-01-24-000076", "name": "SP - 500mg", "count": 1 } ], "conditions": [ { "attribute": "Age", "operator": "LESS_THAN", "value": 100 } ] } ], "auditDetails": { "createdBy": "63a21269-d40d-4c26-878f-4f4486b1f44b", "lastModifiedBy": "63a21269-d40d-4c26-878f-4f4486b1f44b", "createdTime": 1715275958664, "lastModifiedTime": 1715276207117 } }, "RequestInfo": { } }
/project-factory/v1/project-type/search
POST
{ "RequestInfo": { }, "CampaignDetails": { "tenantId": "mz", "status": [ "failed" ], "createdBy": "ff98f9f6-192b-4e12-8e90-7b73dcd0ad4d", "pagination": { "sortBy": "createdTime", "sortOrder": "desc", "limit": 10, "offset": 0 } } }
/health-project/v1/_search?tenantId=mz&limit=10&offset=0
POST
"Projects": [ { "tenantId": "mz", "id": "c714afc2-9ab8-4d0a-bf2b-71fe56649a77" } ]
/health-project/v1/_update
POST
{ "Projects": [ { "id": "c714afc2-9ab8-4d0a-bf2b-71fe56649a77", "tenantId": "mz", "projectNumber": "PJT-2024-07-08-001876", "name": "MR_DN_CHECK_TEST_001", "projectType": "MR-DN", "projectSubType": "MR-DN", "department": "MALARIA", "description": "configuration for Multi Round Campaigns", "referenceID": "b8bb1cd8-99f8-4bf8-82e3-751c06aa70e4", "projectTypeId": "b1107f0c-7a91-4c76-afc2-a279d8a7b76a", "documents": null, "address": { "id": "9e3b5e50-5dde-4f8a-88cb-9b9b1e9c3dab", "tenantId": "mz", "clientReferenceId": null, "doorNo": null, "latitude": 0, "longitude": 0, "locationAccuracy": 0, "type": null, "addressLine1": null, "addressLine2": null, "landmark": null, "city": null, "pincode": null, "buildingName": null, "street": null, "boundaryType": "Country", "boundary": "WORKBENCH_MO", "locality": null }, "startDate": 1721154600000, "endDate": 1725128999000, "isTaskEnabled": false, "parent": null, "projectHierarchy": null, "natureOfWork": null, "ancestors": null, "descendants": null, "targets": [ { "id": "fd1faf99-7980-429c-99c6-4041b854376f", "beneficiaryType": "INDIVIDUAL", "totalNo": 62520, "targetNo": 62520, "isDeleted": false, "auditDetails": { "createdBy": "867ba408-1b82-4746-8274-eb916e625fea", "lastModifiedBy": "867ba408-1b82-4746-8274-eb916e625fea", "createdTime": 1720417261161, "lastModifiedTime": 1721633347090 } } ], "additionalDetails": { "projectType": { "id": "b1107f0c-7a91-4c76-afc2-a279d8a7b76a", "code": "MR-DN", "name": "MR_DN_CHECK_TEST_001", "group": "MALARIA", "cycles": [ { "id": "1", "endDate": 1721586599000, "startDate": 1721241000000, "deliveries": [ { "id": "1", "doseCriteria": [ { "condition": "3<=ageandage<=11", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-02-26-000034", "isBaseUnitVariant": true } ] }, { "condition": "12<=ageandage<=59", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-03-15-000042", "isBaseUnitVariant": true } ] } ], "deliveryStrategy": "DIRECT", "mandatoryWaitSinceLastDeliveryInDays": null }, { "id": "2", "doseCriteria": [ { "condition": "3<=ageandage<=11", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-02-26-000034", "isBaseUnitVariant": true } ] }, { "condition": "12<=ageandage<=59", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-03-15-000043", "isBaseUnitVariant": true } ] } ], "deliveryStrategy": "INDIRECT", "mandatoryWaitSinceLastDeliveryInDays": null }, { "id": "3", "doseCriteria": [ { "condition": "3<=ageandage<=11", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-03-15-000042", "isBaseUnitVariant": true } ] }, { "condition": "12<=ageandage<=59", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-03-15-000042", "isBaseUnitVariant": true } ] } ], "deliveryStrategy": "INDIRECT", "mandatoryWaitSinceLastDeliveryInDays": null } ], "mandatoryWaitSinceLastCycleInDays": null }, { "id": "2", "endDate": 1722104999000, "startDate": 1721673000000, "deliveries": [ { "id": "1", "doseCriteria": [ { "condition": "3<=ageandage<=11", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-02-26-000034", "isBaseUnitVariant": true } ] }, { "condition": "12<=ageandage<=59", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-03-15-000043", "isBaseUnitVariant": true } ] } ], "deliveryStrategy": "DIRECT", "mandatoryWaitSinceLastDeliveryInDays": null }, { "id": "2", "doseCriteria": [ { "condition": "3<=ageandage<=11", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-02-26-000034", "isBaseUnitVariant": true } ] }, { "condition": "12<=ageandage<=59", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-03-15-000043", "isBaseUnitVariant": true } ] } ], "deliveryStrategy": "INDIRECT", "mandatoryWaitSinceLastDeliveryInDays": null }, { "id": "3", "doseCriteria": [ { "condition": "3<=ageandage<=11", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-02-26-000034", "isBaseUnitVariant": true } ] }, { "condition": "12<=ageandage<=59", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-03-15-000042", "isBaseUnitVariant": true } ] } ], "deliveryStrategy": "INDIRECT", "mandatoryWaitSinceLastDeliveryInDays": null } ], "mandatoryWaitSinceLastCycleInDays": null }, { "id": "3", "endDate": 1722709799000, "startDate": 1722277800000, "deliveries": [ { "id": "1", "doseCriteria": [ { "condition": "3<=ageandage<=11", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-02-26-000034", "isBaseUnitVariant": true } ] }, { "condition": "12<=ageandage<=59", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-03-15-000042", "isBaseUnitVariant": true } ] } ], "deliveryStrategy": "DIRECT", "mandatoryWaitSinceLastDeliveryInDays": null }, { "id": "2", "doseCriteria": [ { "condition": "3<=ageandage<=11", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-02-26-000034", "isBaseUnitVariant": true } ] }, { "condition": "12<=ageandage<=59", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-03-15-000042", "isBaseUnitVariant": true } ] } ], "deliveryStrategy": "INDIRECT", "mandatoryWaitSinceLastDeliveryInDays": null }, { "id": "3", "doseCriteria": [ { "condition": "3<=ageandage<=11", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-03-15-000042", "isBaseUnitVariant": true } ] }, { "condition": "12<=ageandage<=59", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-03-15-000042", "isBaseUnitVariant": true } ] } ], "deliveryStrategy": "INDIRECT", "mandatoryWaitSinceLastDeliveryInDays": null } ], "mandatoryWaitSinceLastCycleInDays": null } ], "resources": [ { "productVariantId": "PVAR-2024-02-26-000034", "isBaseUnitVariant": true }, { "productVariantId": "PVAR-2024-03-15-000042", "isBaseUnitVariant": true }, { "productVariantId": "PVAR-2024-03-15-000043", "isBaseUnitVariant": true } ], "validMaxAge": 59, "validMinAge": 3, "beneficiaryType": "INDIVIDUAL", "observationStrategy": "DOT1" } }, "isDeleted": false, "rowVersion": 0, "auditDetails": { "createdBy": "867ba408-1b82-4746-8274-eb916e625fea", "lastModifiedBy": "867ba408-1b82-4746-8274-eb916e625fea", "createdTime": 1720417261161, "lastModifiedTime": 1721633347090 } } ] }
/health-project/v1/_search?tenantId=mz&limit=10&offset=0
POST
"Projects":[ { "name": "MR_DN_CHECK_TEST_001", "tenantId": "mz", "address": { "boundary": "WORKBENCH_MO_13_NAMPULA" } } ]
/health-project/v1/_update
POST
"Projects": [ { "id": "7b0d31c0-172a-4a6a-a0e9-b5f89ba72415", "tenantId": "mz", "projectNumber": "PJT-2024-07-08-001884", "name": "MR_DN_CHECK_TEST_001", "projectType": "MR-DN", "projectSubType": "MR-DN", "department": "MALARIA", "description": "configuration for Multi Round Campaigns", "referenceID": "b8bb1cd8-99f8-4bf8-82e3-751c06aa70e4", "projectTypeId": "b1107f0c-7a91-4c76-afc2-a279d8a7b76a", "documents": null, "address": { "id": "ca7f66e9-f3b9-4c3b-ac93-293f237ba38b", "tenantId": "mz", "clientReferenceId": null, "doorNo": null, "latitude": 0, "longitude": 0, "locationAccuracy": 0, "type": null, "addressLine1": null, "addressLine2": null, "landmark": null, "city": null, "pincode": null, "buildingName": null, "street": null, "boundaryType": "Province", "boundary": "WORKBENCH_MO_13_NAMPULA", "locality": null }, "startDate": 1721154600000, "endDate": 1725820199000, "isTaskEnabled": false, "parent": "c714afc2-9ab8-4d0a-bf2b-71fe56649a77", "projectHierarchy": "c714afc2-9ab8-4d0a-bf2b-71fe56649a77.7b0d31c0-172a-4a6a-a0e9-b5f89ba72415", "natureOfWork": null, "ancestors": null, "descendants": null, "targets": [ { "id": "9deba653-743d-4b4f-bd0f-57cf04d84666", "beneficiaryType": "INDIVIDUAL", "totalNo": 62520, "targetNo": 62520, "isDeleted": false, "auditDetails": { "createdBy": "867ba408-1b82-4746-8274-eb916e625fea", "lastModifiedBy": "867ba408-1b82-4746-8274-eb916e625fea", "createdTime": 1720417262456, "lastModifiedTime": 1721297458172 } } ], "additionalDetails": { "projectType": { "id": "b1107f0c-7a91-4c76-afc2-a279d8a7b76a", "code": "MR-DN", "name": "MR_DN_CHECK_TEST_001", "group": "MALARIA", "cycles": [ { "id": "1", "endDate": 1721672999000, "startDate": 1721241000000, "deliveries": [ { "id": "1", "doseCriteria": [ { "condition": "3<=ageandage<=11", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-02-26-000034", "isBaseUnitVariant": true } ] }, { "condition": "12<=ageandage<=59", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-03-15-000042", "isBaseUnitVariant": true } ] } ], "deliveryStrategy": "DIRECT", "mandatoryWaitSinceLastDeliveryInDays": null }, { "id": "2", "doseCriteria": [ { "condition": "3<=ageandage<=11", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-02-26-000034", "isBaseUnitVariant": true } ] }, { "condition": "12<=ageandage<=59", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-03-15-000043", "isBaseUnitVariant": true } ] } ], "deliveryStrategy": "INDIRECT", "mandatoryWaitSinceLastDeliveryInDays": null }, { "id": "3", "doseCriteria": [ { "condition": "3<=ageandage<=11", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-03-15-000042", "isBaseUnitVariant": true } ] }, { "condition": "12<=ageandage<=59", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-03-15-000042", "isBaseUnitVariant": true } ] } ], "deliveryStrategy": "INDIRECT", "mandatoryWaitSinceLastDeliveryInDays": null } ], "mandatoryWaitSinceLastCycleInDays": null }, { "id": "2", "endDate": 1722104999000, "startDate": 1721673000000, "deliveries": [ { "id": "1", "doseCriteria": [ { "condition": "3<=ageandage<=11", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-02-26-000034", "isBaseUnitVariant": true } ] }, { "condition": "12<=ageandage<=59", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-03-15-000043", "isBaseUnitVariant": true } ] } ], "deliveryStrategy": "DIRECT", "mandatoryWaitSinceLastDeliveryInDays": null }, { "id": "2", "doseCriteria": [ { "condition": "3<=ageandage<=11", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-02-26-000034", "isBaseUnitVariant": true } ] }, { "condition": "12<=ageandage<=59", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-03-15-000043", "isBaseUnitVariant": true } ] } ], "deliveryStrategy": "INDIRECT", "mandatoryWaitSinceLastDeliveryInDays": null }, { "id": "3", "doseCriteria": [ { "condition": "3<=ageandage<=11", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-02-26-000034", "isBaseUnitVariant": true } ] }, { "condition": "12<=ageandage<=59", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-03-15-000042", "isBaseUnitVariant": true } ] } ], "deliveryStrategy": "INDIRECT", "mandatoryWaitSinceLastDeliveryInDays": null } ], "mandatoryWaitSinceLastCycleInDays": null }, { "id": "3", "endDate": 1722709799000, "startDate": 1722277800000, "deliveries": [ { "id": "1", "doseCriteria": [ { "condition": "3<=ageandage<=11", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-02-26-000034", "isBaseUnitVariant": true } ] }, { "condition": "12<=ageandage<=59", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-03-15-000042", "isBaseUnitVariant": true } ] } ], "deliveryStrategy": "DIRECT", "mandatoryWaitSinceLastDeliveryInDays": null }, { "id": "2", "doseCriteria": [ { "condition": "3<=ageandage<=11", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-02-26-000034", "isBaseUnitVariant": true } ] }, { "condition": "12<=ageandage<=59", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-03-15-000042", "isBaseUnitVariant": true } ] } ], "deliveryStrategy": "INDIRECT", "mandatoryWaitSinceLastDeliveryInDays": null }, { "id": "3", "doseCriteria": [ { "condition": "3<=ageandage<=11", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-03-15-000042", "isBaseUnitVariant": true } ] }, { "condition": "12<=ageandage<=59", "ProductVariants": [ { "quantity": 1, "productVariantId": "PVAR-2024-03-15-000042", "isBaseUnitVariant": true } ] } ], "deliveryStrategy": "INDIRECT", "mandatoryWaitSinceLastDeliveryInDays": null } ], "mandatoryWaitSinceLastCycleInDays": null } ], "resources": [ { "productVariantId": "PVAR-2024-02-26-000034", "isBaseUnitVariant": true }, { "productVariantId": "PVAR-2024-03-15-000042", "isBaseUnitVariant": true }, { "productVariantId": "PVAR-2024-03-15-000043", "isBaseUnitVariant": true } ], "validMaxAge": 59, "validMinAge": 3, "beneficiaryType": "INDIVIDUAL", "observationStrategy": "DOT1" } }, "isDeleted": false, "rowVersion": 0, "auditDetails": { "createdBy": "867ba408-1b82-4746-8274-eb916e625fea", "lastModifiedBy": "867ba408-1b82-4746-8274-eb916e625fea", "createdTime": 1720417262456, "lastModifiedTime": 1721297458172 } } ]
boundary-service/boundary-hierarchy-definition/_search
POST
BoundaryTypeHierarchySearchCriteria: { "tenantId": "mz", "limit": 2, "offset": 0, "hierarchyType": "Workbench" }
/project-factory/v1/project-type/getProcessTrack | POST | params: { campaignId: campaignId, }, |
/boundary-service/boundary-hierarchy-definition/_create | 1759 - CAMPAIGN_MANAGER | POST | { "tenantId": "mz", "hierarchyType": "test", "boundaryHierarchy": [ { "boundaryType": "country", "parentBoundaryType": null, "active": true }, { "boundaryType": "state", "parentBoundaryType": "country", "active": true } ] } |
/project-factory/v1/data/_create | 1772- CAMPAIGN_MANAGER | POST | { "tenantId": "mz", "type": "boundary", "fileStoreId": "1f984e91-2ed2-4d5c-8788-37b3a4c8fcbc", "action": "create", "hierarchyType": "test", "additionalDetails": {} } |
/boundary-service/boundary-hierarchy-definition/_search | 1760-CAMPAIGN_MANAGER | POST | { "tenantId": "mz" } |