Custom Functions

Custom Functions are codes that you can write to perform automated actions to achieve any specialized requirements of your organization.These functions are mainly created to manipulate data, connect with a third party and internal applications and update responses in Zoho People. These user-defined functions that can be reused anywhere in Zoho People. You can maintain and edit custom functions and the script will be in one central location.

Creating a Custom Function

  1. From your home page, go to Settings >  Automation > Actions.
  2. Go to the Custom Functions tab and select the form.

  1. Click + Add Custom Function.

  1. Provide Function Name and click Edit Params.
  2. Provide Method Name, under Method Argument, specify customer value or Show people field.

  1. Click Save.
  2. Provide the script and click Save & Execute Script.

The executed message will be displayed and if not, please click Execute Again to retry the execution.

Mapping a Custom Function to Workflow

  1. From your home page, go to Settings > Automation > Workflows  > Add Workflow.
  2. Provide all the required details. Learn more to configure a workflow.
  3. Under Action, click Custom Functions and click either the add icon to add the custom function to the workflow or the folder icon to map the custom function

  1. Click Save.

Example scenario - automatic travel expense update using custom functions

Consider a scenario of calculating an employee's travel expenses. All of the travel expenses gets automatically calculated using the below custom function in the travel expense form. Thus, the respective employee's self-service form will get the updated travel expense details. To achieve this, a custom field has to be created in the employee self-service form.

  1. From your home page, go to Settings > Automation > Actions > Custom Functions.
  2. Select respective Form Name and click + Add Custom Function.
  3. Provide Function Name.
  4. Provide the script as given below.
  5. Click Save&Execute Script.

travelExpenseMap = zoho.people.getRecordById("travelexpenses",travel_id);
tabularList = travelExpenseMap.get("tabularSections").get("Expense");
totalExp = 0;
for each str in tabularList
{
totalExp = totalExp + str.get("Ticket").toDecimal() + str.get("Lodging").toDecimal() + str.get("LocalConveyance").toDecimal() + str.get("Boarding").toDecimal() + str.get("Others").toDecimal() + str.get("Incidentals").toDecimal() +str.get("Phone").toDecimal();
}
updateemp = Map();
updateemp.put("recordid",erecno);
updateemp.put("Total_Expense",totalExp);
updaterecord = zoho.people.update("employee",updateemp);
info updaterecord;

Example scenario-automatically change the employee status from active to resigned during an employee's date of exit using custom functions

An employee is resigning his job and you want to change the status to 'Resigned' in the employee form during the date of exit. You can do this action using the below script in our custom function. By adding exit details for an employee, a workflow will be triggered where the mapped custom function will get executed. Upon successful execution, the selected employee's employee status value will be changed to 'Resigned'. Thus, the employee cannot log in to the organization account anymore.

  1. From your home page, go to Settings > Automation > Actions > Custom Functions.
  2. Select respective Form Name and click + Add Custom Function.
  3. Provide Function Name.
  4. Provide the script as given below.
  5. Click Save&Execute Script.

getrecord = zoho.people.getRecordById("employee",erecno);
params = Map();
params.put("scope","creatorapi");
params.put("Employee_ID",empid);
params.put("First_Name",fname);
params.put("Last_Name",lname);
params.put("Email_ID",emailid);
pushrecord = invokeurl
[
    url: "https://creator.zoho.com/api/karenjohn/json/custom-function/form/Custom_form/record/add/"
    type: POST
    parameters: params
    connection : "cf"
];
info pushrecord;

Example scenario-automatic check out in Attendance module

Let us consider a scenario, where an employee forgets to do check out on the system at the end of the day. It is possible to use Custom Functions to do an Auto-check out on the system. This helps in tracking the exact working hours of an employee.

Use the following parameters for both the methods mentioned below.

Method 1: When the check out is not done, Custom Functions can be used to update the respective shift's end time as the check out time on the system.

Steps:

  1. From your home page, go to Settings > Automation > Actions > Custom Functions.
  2. Select respective Form Name and click + Add Custom Function.
  3. Provide Function Name as Auto-check Shift End Time.
  4. Provide the script as given below.
  5. Click Save&Execute Script.

getUA = Collection();
getUA.insert("erecno":erecno);
get_Rec = invokeurl
[
url :"https://people.zoho.com/people/api/attendance/getUserAvailability"
type :POST
parameters:getUA.toMap()
connection : "peoplecf"
];
isUserAvailable = get_Rec.get("isUserAvailable");
if(isUserAvailable == true)
{
getdata = zoho.people.getRecordByID("P_AttendanceForm",recordid.toLong());
expcheckout = getdata.get("ExpectedToTime");
addrecord = Map();
addrecord.put("empId",empid);
addrecord.put("checkOut",expcheckout);
updaterecord = invokeurl
[
    url: "https://people.zoho.com/people/api/attendance"
    type: POST
    parameters: addrecord
    connection : "peoplecf"
];
info updaterecord;
}

Method 2:  When the check out is not done,"08" hours from check-in time can be updated as check out time on the system using Custom Functions.

  1. From your home page, go to Settings > Automation > Actions > Custom Functions.
  2. Select respective Form Name click + Add Custom Function.
  3. Provide function name as Auto-check on 8hrs from Checked in.
  4. Provide the script as given below.
  5. Click Save&Execute Script.

getUA = Collection();
getUA.insert("erecno":erecno);
get_Rec = invokeurl
[
url :"https://people.zoho.com/people/api/attendance/getUserAvailability"
type :POST
parameters:getUA.toMap()
connection : "peoplecf"
];
isUserAvailable = get_Rec.get("isUserAvailable");
if(isUserAvailable == true)
{
getdata = zoho.people.getRecordByID("P_AttendanceForm",recordid.toLong());
checkin = getdata.get("FromTime").toTime();
addedhrs= checkin.addHour(8);
addrecord = Map();
addrecord.put("empId",empid);
addrecord.put("checkOut",addedhrs);
updaterecord = invokeurl
[
    url: "https://people.zoho.com/people/api/attendance"
    type: POST
    parameters: addrecord
    connection : "peoplecf"
];
info updaterecord;
}

Note:Automatic check-out custom functions can be used only when all employees in the organization belong to the same time zone.

Example scenario-Automatic conversion of any currency to USD

Irrespective of the amount in the travel claim form, the currency will be converted to USD based on the exchange rate of the day on which the claim is raised.

  1. From your home page, go to Settings > Automation > Actions > Custom Functions.
  2. Select respective Form Name and click +Add Custom Function. (For example - Travel Claim form)
  3. Provide Function Name
  4. Provide the parameters as given below.

recordId = ZohoID(Travel Claim) here 'Travel Claim' is the respective form name.

  1. Provide the script as given below.
  2. Click Save&Execute Script.

getValues = zoho.people.getRecordById("Travel_Claim",recordId);
tabularsec = getValues.get("tabularSections").get("Cost Details");
result = 0;
for each tabularsecvalues in tabularsec.toList()
{
cost = tabularsecvalues.get("");
format = tabularsecvalues.get("");
if(format != "USD" && cost > 0.00 && format != "")
{
currencyvalues = getUrl("https://data.fixer.io/api/latest?access_key=YOUR_ACCESS_KEY&base=USD");
formatvalues = currencyvalues.get("rates").get(format);
totalval = cost.toDecimal() * formatvalues.toDecimal();
total = totalval.round(2);
result = total + result;
}
}
addrecmap = Map();
addrecmap.put("recordid",recordId);
addrecmap.put("total",result.toString());
addtotal = zoho.people.update("Travel_Claim",addrecmap);
info addtotal;

 TipRefer here to know the form and field link names

Example scenario-Adding leave balance

If leave balance has to be given to an employee, the below code can be used. leavetypeid of a particular leave type can be obtained from this API one time and can be replaced in the code.

  1. From your home page, go to Settings > Automation > Actions > Custom Functions.
  2. Select respective Form Name click +Add Custom Function.(For example Leave Gifting form)
  3. Provide Function Name
  4. Provide the parameters as given below

erecno = ID(Employee ID)

count = count(Leave Gifting)

  1. Provide the script as given below.
  2. Click Save&Execute Script.

param = Collection();
leavetypeid = "494174000000515325";
details = "{" + erecno + ":{" + leavetypeid + ":{'date':" + today.toString("dd-MMM-yyyy") + ",'count':" + count + "}}}";
param.insert("balanceData":details);
getRecord = invokeurl
[
    url :"https://people.zoho.com/people/api/leave/addBalance"
    type :POST
    parameters:param.toMap()
    connection:"people_cf"
];
info getRecord;

 TipRefer here to know the form and field link names

Example scenario- Send email if total hours for a week is less than 45 hours for an employee

By making use of the below script, if total hours of attendance is less than 45 hours for an employee, then an email can be sent.

  1. From your home page, go to Settings > Automation > Actions > Custom Functions.
  2. Click Custom Scheduler  and then Add Scheduler.
  3. Provide a name for the Scheduler.
  4. Select the desired Start date and time, Frequency and Time zone.
  5. Provide the script as given below.

start_date = today.toDate().subDay(7);
end_date = today.toDate().subDay(1);
getrec_Col = Collection();
getrec_Col.insert("startDate":Start_Date);
getrec_Col.insert("endDate":End_Date);
getrec_Col.insert("dateFormat":"dd-MMM-yyyy");
get_rec = invokeurl
[
url :"https://people.zoho.com/people/api/attendance/getSummaryReport"
type :POST
parameters:getrec_Col.toMap()
connection : "cf"
];
summary_Reports = get_rec.get("summaryReport");
for each  summary in summary_Reports
{
emailId = summary.get("emailId");
totalWorkedDays = summary.get("totalHours");
totalWorkedDays = totalWorkedDays.getPrefix(":").toNumber();
if(totalWorkedDays < 45)
{
    sendmail
    [
        from : zoho.adminuserid
        to : emailId
        subject: "Total Hours"
        message : "<div>Hi,<br></div><div><br></div><div>You have not completed 45 hours for the previous week.<br></div><div><br></div><div>Thanks,<br></div><div>Admin Team</div>"
    ]
}
}

 TipRefer here to know about form and field link names

 TipThe above scripts can also be edited and used to serve other similar scenarios.

Note: All APIs used in Custom Functions have threshhold limits. Refer the API guide for the limits under each module and customize the code accordingly.