Copy this script into ServiceNow under application x_786686_hr_leave (Australia). Table/API names already use the current scope.
Source: src/server/script_includes/HRLXProIntegrationUtilsV2.js
/**
* Script Include: HRLXProIntegrationUtilsV2
* Scope: x_786686_hr_leave
* Application: Custom · Scope: x_786686_hr_leave · sys_id: c84db0e8839f0b509f02b0d6feaad3c9
* Client callable: false
* Purpose: Inbound create + Outbound push for leave integration.
*/
var HRLXProIntegrationUtilsV2 = Class.create();
HRLXProIntegrationUtilsV2.prototype = {
initialize: function () {},
/**
* Inbound: create a leave request from a JSON payload (string).
* @return {string} sys_id of created record
*/
inboundCreateLeave: function (jsonString) {
var data = {};
try { data = JSON.parse(jsonString); } catch (e) { return ''; }
var gr = new GlideRecord('x_786686_hr_leave_req_v2');
gr.initialize();
gr.u_employee_ref = this._findEmployeeByExternalId(data.employee_id);
gr.u_requested_for_user = this._findUserByEmployee(data.employee_id);
gr.u_leave_type = data.leave_type || 'annual';
gr.u_start_date = data.start_date || '';
gr.u_end_date = data.end_date || '';
gr.u_reason = data.reason || '';
gr.u_state = 'submitted';
return gr.insert();
},
/**
* Outbound: push an approved leave decision to ERP/Payroll.
* Endpoint + auth come from system properties (no secrets in code).
*/
outboundPushDecision: function (leaveSysId) {
var gr = new GlideRecord('x_786686_hr_leave_req_v2');
if (!gr.get(leaveSysId)) return false;
var endpoint = gs.getProperty('x_786686_hr_leave.config.erp_endpoint');
if (!endpoint) {
gs.error('[HRLX] Missing property x_786686_hr_leave.config.erp_endpoint');
return false;
}
try {
var r = new sn_ws.RESTMessageV2();
r.setEndpoint(endpoint);
r.setHttpMethod('POST');
r.setRequestHeader('Content-Type', 'application/json');
r.setRequestBody(JSON.stringify({
number: gr.getValue('u_number'),
employee: gr.getDisplayValue('u_employee_ref'),
type: gr.getValue('u_leave_type'),
days: gr.getValue('u_days_count'),
state: gr.getValue('u_state')
}));
var resp = r.execute();
var code = resp.getStatusCode();
gs.info('[HRLX] Outbound status ' + code);
return (code >= 200 && code < 300);
} catch (ex) {
gs.error('[HRLX] Outbound error: ' + ex.message);
return false;
}
},
_findEmployeeByExternalId: function (employeeId) {
var e = new GlideRecord('x_786686_hr_leave_employee_v2');
e.addQuery('u_employee_id', employeeId);
e.query();
return e.next() ? e.getUniqueValue() : '';
},
_findUserByEmployee: function (employeeId) {
var e = new GlideRecord('x_786686_hr_leave_employee_v2');
e.addQuery('u_employee_id', employeeId);
e.query();
return e.next() ? e.getValue('u_user') : '';
},
type: 'HRLXProIntegrationUtilsV2'
};