Hello Everyone,
Here we are again thrilled to share another requirement that has been accomplished through the implementation of custom functions.
A Custom function is a user-written set of code to achieve a specific requirement. We should create a connection with required scopes. Following that, define criteria for workflow rules and link a custom function to those rules.
Requirement:-
Similar to the gallery custom function - Milestone Autocomplete, one of the customers would like to update the status of the project upon completion of all tasks within the project.
Using the below custom function code, we can automate the project status update once all the Tasks are closed.
Custom function code:-
// TODO: Please create a connection for the Zoho Projects service with the scopes "ZohoProjects.tasks.READ, ZohoProjects.projects.UPDATE, ZohoProjects.projects.READ". Replace 'xxxxxxxxx' with the connection name. Click this link below to learn how to create the connection.
// TODO : Replace the Project Status's name.
updateStatusName = "Completed";
projectsAPIEndPoint = "https://projectsapi.zoho.com/restapi";
taskParam = Map();
taskParam.put("status","notcompleted");
taskResponse = zoho.projects.getRecords(portalId,projectId,"tasks",taskParam,1,"xxxxxxxxx");
info "taskResponse:"+taskResponse;
info "------------------------------------";
// If no open tasks are found
if(taskResponse.isEmpty())
{
projectDetails = invokeurl
[
url :projectsAPIEndPoint + "/portal/" + portalId + "/projects/" + projectId + "/"
type :GET
connection:"xxxxxxxxxx"
];
info projectDetails;
info "-------------------------------------";
statusMap = Map();
if(projectDetails != null && projectDetails.get("projects") != null)
{
projectDetail = projectDetails.get("projects").get(0);
layoutDetails = projectDetail.get("layout_details");
projectLayoutId = layoutDetails.get("project").get("id");
info "projectLayoutId: " + projectLayoutId;
projectLayoutDetail = invokeurl
[
url :projectsAPIEndPoint + "/portal/" + portalId + "/module/projects/layouts/" + projectLayoutId + "/"
type :GET
connection:""
];
info projectLayoutDetail;
info "---------";
if(projectLayoutDetail != null && projectLayoutDetail.get("customstatus"))
{
projectStatus = projectLayoutDetail.get("customstatus");
for each status in projectStatus
{
statusMap.put(status.get("status_name"),status.get("status_id"));
}
}
info "statusMap : " + statusMap;
info "------------------------";
if(statusMap.containKey(updateStatusName))
{
updateProjectParamMap = Map();
updateProjectParamMap.put("custom_status",statusMap.get(updateStatusName));
projectDetail = invokeurl
[
url :projectsAPIEndPoint + "/portal/" + portalId + "/projects/" + projectId + "/"
type :POST
parameters:updateProjectParamMap
connection:"xxxxxxxxxx"
];
info projectDetail;
info "-------------------------------------";
}
}
}
Make sure to replace "xxxxxxxxxx" in the above code with the connection link name. Screenshot of the list of parameters to be mapped is attached for reference.
With the custom function code provided above, our customer effectively utilised Task custom functions in Zoho Projects which allowed them to automate Project status updates, reducing time consumption and in turn increasing their business productivity.
We hope you found this post useful. If you have any questions or wondering if your requirement could be met using custom functions, feel free to share them in the comments section below.