HR Leave · Australia

Script — HRLXProIntegrationUtilsV2.js

ServiceNow Australia · Custom app · Arabic + English readable · scripts copy/paste ready

App typeCustom
Scopex_786686_hr_leave
sys_idc84db0e8839f0b509f02b0d6feaad3c9
Replace{BASE} = your instance
Instance URLs Studio Business Rules Client Scripts Script Includes

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'
};