Skip to content

Commit

Permalink
Update servicenow integration samples
Browse files Browse the repository at this point in the history
  • Loading branch information
sahanHe committed Jan 10, 2024
1 parent e9a6b73 commit 97d4e3c
Showing 1 changed file with 23 additions and 48 deletions.
71 changes: 23 additions & 48 deletions servicenow-case-to-salesforce-case/main.bal
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import ballerina/http;
import ballerina/io;
import ballerina/log;
import ballerina/mime;
import ballerina/time;
import ballerina/url;
Expand All @@ -12,60 +11,17 @@ configurable string serviceNowUsername = ?;
configurable string serviceNowPassword = ?;
configurable sf:ConnectionConfig salesforceConfig = ?;

public function main() returns error? {
DateRange|error fetchPeriod = calculateFetchingPeriod();
if fetchPeriod is error {
log:printError("Error while calculating fetching period: ", fetchPeriod);
return;
}

CaseData[]|error cases = fetchCasesFromServiceNow(fetchPeriod.'start, fetchPeriod.end);
if cases is error {
log:printError("Error while fetching cases from ServiceNow: ", cases);
return;
}
sf:Client salesforce = check new (salesforceConfig);

error? e = addCasesToSalesforce(cases);
if e is error {
log:printError("Error while adding cases to Salesforce: ", e);
return;
}

check io:fileWriteString(syncData, check time:civilToString(fetchPeriod.now));
log:printInfo("Updated salesforce with cases from servicenow." +
" Cases added: " + cases.length().toString() +
" Update Timestamp: " + check time:civilToString(fetchPeriod.now));
}

function calculateFetchingPeriod() returns DateRange|error {
string lastFetchString = check io:fileReadString(syncData);
time:Civil lastFetch = check time:civilFromString(lastFetchString);
string 'start = string `'${lastFetch.year}-${lastFetch.month}-${lastFetch.day}','${lastFetch.hour}:${lastFetch.minute}:00'`;
time:Civil now = time:utcToCivil(time:utcNow());
string end = string `'${now.year}-${now.month}-${now.day}','${now.hour}:${now.minute}:00'`;
return {'start, end, now};
}

function fetchCasesFromServiceNow(string fetchFrom, string fetchTill) returns CaseData[]|error {
http:Client servicenow = check new (string `https://${servicenowInstance}.service-now.com/api/sn_customerservice`);
string serviceNowCredentials = check mime:base64Encode(serviceNowUsername + ":" + serviceNowPassword, "UTF-8").ensureType();
string query = string `sys_created_onBETWEENjavascript:gs.dateGenerate(${fetchFrom})@javascript:gs.dateGenerate(${fetchTill})`;
record {CaseData[] result;} caseResponse = check servicenow->/case(
headers = {"Authorization": "Basic " + serviceNowCredentials},
sysparm_query = check url:encode(query, "UTF-8")
);
return caseResponse.result;
}

function addCasesToSalesforce(CaseData[] cases) returns error? {
sf:Client salesforce = check new (salesforceConfig);
public function main() returns error? {
DateRange fetchPeriod = check calculateFetchingPeriod();
CaseData[] cases = check fetchCasesFromServiceNow(fetchPeriod.'start, fetchPeriod.end);
foreach CaseData caseData in cases {
stream<Id, error?> customerStream = check salesforce->query(
string `SELECT Id FROM Account WHERE Name = '${caseData.account.name}'`);
record {|Id value;|}? existingCustomer = check customerStream.next();
check customerStream.close();
if existingCustomer is () {
log:printInfo("Customer not found in Salesforce: " + caseData.account.name);
continue;
}
SalesforceCase salesforceCase = {
Expand All @@ -77,4 +33,23 @@ function addCasesToSalesforce(CaseData[] cases) returns error? {
};
_ = check salesforce->create("Support_Case__c", salesforceCase);
}
check io:fileWriteString(syncData, check time:civilToString(fetchPeriod.now));
}
function fetchCasesFromServiceNow(string fetchFrom, string fetchTill) returns CaseData[]|error {
http:Client servicenow = check new (string `https://${servicenowInstance}.service-now.com/api/sn_customerservice`);
string serviceNowCredentials = check mime:base64Encode(serviceNowUsername + ":" + serviceNowPassword, "UTF-8").ensureType();
string query = string `sys_created_onBETWEENjavascript:gs.dateGenerate(${fetchFrom})@javascript:gs.dateGenerate(${fetchTill})`;
record {CaseData[] result;} caseResponse = check servicenow->/case(
headers = {"Authorization": "Basic " + serviceNowCredentials},
sysparm_query = check url:encode(query, "UTF-8")
);
return caseResponse.result;
}
function calculateFetchingPeriod() returns DateRange|error {
string lastFetchString = check io:fileReadString(syncData);
time:Civil lastFetch = check time:civilFromString(lastFetchString);
string 'start = string `'${lastFetch.year}-${lastFetch.month}-${lastFetch.day}','${lastFetch.hour}:${lastFetch.minute}:00'`;
time:Civil now = time:utcToCivil(time:utcNow());
string end = string `'${now.year}-${now.month}-${now.day}','${now.hour}:${now.minute}:00'`;
return {'start, end, now};
}

0 comments on commit 97d4e3c

Please sign in to comment.