const express = require('express');
const bodyParser = require('body-parser');
const recastai = require('recastai').default;
const requestify = require('requestify');
const request = new recastai.request('<YOUR RECAST ID>');
const ccode = require('ccode.js');
const app = express();
app.use(bodyParser.json());
app.set('port', (process.env.PORT || 5000));
app.get('/', function(req, res) {
res.send('Use the /api/askBot endpoint.');
});
app.get('/api/askBot', function(req, res) {
res.send('You must POST your request');
});
app.post('/api/getEmployees', function(req, res) {
var entities = req.body.nlp.entities;
var memory = req.body.conversation.memory;
//We need to store the conversation values in internal variables before converting to SAP keys...
//This is because we will repeat some of the values back to the user, and we don't want this to be the technical values used for search etc.
var replyGender = (entities.gender !== undefined) ? entities.gender[0].value : ( (memory.replyGender !== undefined) ? memory.replyGender : '' );
var replyGroup = (entities.group !== undefined) ? entities.group[0].value : ( (memory.replyGroup !== undefined) ? memory.replyGroup : '' );
var replyStatus = (entities.status !== undefined) ? entities.status[0].value : ( (memory.replyStatus !== undefined) ? memory.replyStatus : '' );
var replyZone = (entities.zone!== undefined) ? entities.zone[0].value : ( (memory.replyZone !== undefined) ? memory.replyZone : '' );
// var replyCountry = (entities.location !== undefined) ? entities.location[0].raw : ( (memory.replyCountry !== undefined) ? memory.replyCountry : '' );
//Scoop up all the countries
var cleansedCountries = [];
var replyCountries = [];
if (entities.location !== undefined) {
for (let i = 0; i < entities.location.length; i++) {
replyCountries.push(entities.location[i].raw);
cleansedCountries.push(ccode.CConvert(entities.location[i].raw.toUpperCase()));
}
console.log('Here are all of your country codes:' + cleansedCountries);
}
else {
//If no new locations provided, get the ones already in memory
cleansedCountries = memory.cleansedCountries;
replyCountries = memory.replyCountries;
}
console.log('replyGender = ' + replyGender);
console.log('replyGroup = ' + replyGroup);
console.log('replyStatus = ' + replyStatus);
console.log('replyZone = ' + replyZone);
console.log('replyCountries = ' + replyCountries);
//Convert entity values to be cleansed into SAP search criteria
//If we got anything from the entities (conversation), we translate to upper case, otherwise set to "*"
var newGender = (entities.gender !== undefined) ? entities.gender[0].value.toUpperCase() : '*';
var newGroup = (entities.group !== undefined) ? entities.group[0].value.toUpperCase() : '*';
var newStatus = (entities.status !== undefined) ? entities.status[0].value.toUpperCase() : '*';
var newZone = (entities.zone!== undefined) ? entities.zone[0].value.toUpperCase() : '*';
console.log('newGender = ' + newGender);
console.log('newGroup = ' + newGroup);
console.log('newStatus = ' + newStatus);
console.log('newZone = ' + newZone);
//Cleansing: Recast does not currently support mapping of entity values to "master" values, so we have to do it manually.
//This means all A0 values will be mapped - or remain "*" if no specific new value was provided by the user.
//Note: for each iteration, we only need to map any "new" entity value provided by the user.
if (newGender !== '*') {
newGender = ccode.GConvert(newGender);
}
console.log("The translated gender value is: " + newGender);
if (newGroup !== '*') {
newGroup = ccode.GrpConvert(newGroup);
}
console.log("The translated employee group value is: " + newGroup);
if (newZone !== '*') {
newZone = ccode.ZConvert(newZone);
}
console.log("The translated zone value is: " + newZone);
//Store all the "cleansed" variables in our own memory, since the Recast mapping doesn't work properly
//We have to check whether the cleansed variables are already there, otherwise we grab the new values
//from the cleansed entity values.
//cleansedValue will be set to A0 value if A0 value not "*". Else, cleansedValue will remain unless it is undefined (then, it is set to "*")
var cleansedGender = (newGender !== "*") ? newGender : ( (memory.cleansedGender !== undefined) ? memory.cleansedGender : "*" );
var cleansedGroup = (newGroup !== "*") ? newGroup : ( (memory.cleansedGroup !== undefined) ? memory.cleansedGroup : "*" );
var cleansedStatus = (newStatus !== "*") ? newStatus : ( (memory.cleansedStatus !== undefined) ? memory.cleansedStatus : "*" );
var cleansedZone = (newZone !== "*") ? newZone : ( (memory.cleansedZone !== undefined) ? memory.cleansedZone : "*" );
console.log('cleansedGender = ' + cleansedGender);
console.log('cleansedGroup = ' + cleansedGroup);
console.log('cleansedStatus = ' + cleansedStatus);
console.log('cleansedZone = ' + cleansedZone);
cleansedCountriesJSON = JSON.stringify(cleansedCountries);
// Call the backend service
requestify.request('https://YOURSAPCPTENANT.hana.ondemand.com/etc/etc/blabla/OurPreciousBot/services/GetHeadcount.xsjs', {
method: "GET",
params: {
"A0GENDER": cleansedGender,
"A0EMPLGROUP": cleansedGroup,
"A0EMPLSTATUS": cleansedStatus,
"YGZONE": cleansedZone,
"A0COUNTRY": cleansedCountriesJSON
}
})
.then(function(response) {
console.log("Got a response from the request");
var replyFrom = "";
if (replyZone !== "" || replyCountries !== "") {
replyFrom = " in " + replyZone;
for (let i = 0; i < replyCountries.length; i++) {
replyFrom += replyCountries[i];
if (i < (replyCountries.length - 1)) {
replyFrom += " and ";
}
}
}
console.log("replyFrom = " + replyFrom);
var replyContent = "The number of " +
replyGender + " " + replyStatus + " " + replyGroup +
" employees " + replyFrom + " is: " + response.getBody();
replyContent = replyContent.replace(/ +/g, ' ');
var reply = [{
type: 'text',
content: replyContent
}];
console.log("The response.getBody() is: " + response.getBody());
res.status(200).json({
replies: reply,
conversation: {
memory: { cleansedGender: cleansedGender,
cleansedGroup : cleansedGroup,
cleansedStatus : cleansedStatus,
cleansedZone : cleansedZone,
cleansedCountries : cleansedCountries,
replyGender: replyGender,
replyGroup : replyGroup,
replyStatus : replyStatus,
replyZone : replyZone,
replyCountries : replyCountries
}
}
});
}, function(error) {
var errorMessage = "GET to XSJS service failed";
if(error.code && error.body) {
errorMessage += " - " + error.code + ": " + error.body
}
console.log("Something went wrong with the call");
console.log(errorMessage);
// dump the full object to see if you can formulate a better error message.
console.log(error.body);
//Try to provide a proper error response
var reply = [{
type: 'text',
content: "I'm sorry! Something went wrong with the call to the SAP query. Try asking a different question - or type 'reset'."
}];
res.status(200).json({
replies: reply,
conversation: {
memory: { cleansedGender: cleansedGender,
cleansedGroup : cleansedGroup,
cleansedStatus : cleansedStatus,
cleansedZone : cleansedZone,
cleansedCountries : cleansedCountries,
replyGender: replyGender,
replyGroup : replyGroup,
replyStatus : replyStatus,
replyZone : replyZone,
replyCountries : replyCountries
}
}
});
}
);
});
app.post('/api/askBot', function(req, res) {
var sMessage = req.body['message'];
client.analyseText(sMessage)
.then(function(response) {
if (response.intent()) {
console.log('Intent: ', res.intent().slug)
}
if (response.intent().slug === 'YOUR_EXPECTED_INTENT') {
// Do your code...
}
})
});
app.listen(app.get('port'), function() {
console.log('* Webhook service is listening on port:' + app.get('port'));
});
//Get headcount for Recast HRBot
try {
switch ($.request.method) {
case $.net.http.GET:
var A0GENDER = '*';
var A0EMPLGROUP = '*';
var A0EMPLSTATUS = '*';
var YGZONE = '*';
var A0PERS_AREA = '*';
var A0COUNTRY = '*';
for (let i = 0; i < $.request.parameters.length; i++) {
switch ($.request.parameters[i].name) {
case "A0GENDER":
A0GENDER = $.request.parameters[i].value;
break;
case "A0EMPLGROUP":
A0EMPLGROUP = $.request.parameters[i].value;
break;
case "A0EMPLSTATUS":
A0EMPLSTATUS = $.request.parameters[i].value;
break;
case "YGZONE":
YGZONE = $.request.parameters[i].value;
break;
case "A0PERS_AREA":
A0PERS_AREA = $.request.parameters[i].value;
break;
case "A0COUNTRY":
A0COUNTRY = $.request.parameters[i].value;
break;
}
}
var destination = $.net.http.readDestination("OurMagnificentBot.services", "gatewayXXX");
//Creating an HTTP Client
var client = new $.net.http.Client();
var requestString = '?$select=A006..............SZ2NM&$format=json';
var filterString = "empty";
if (A0GENDER !== '*') {
filterString = "A0GENDER%20eq%20'" + A0GENDER + "'";
}
if (A0EMPLGROUP !== '*') {
if (filterString === "empty") {
filterString = "A0EMPLGROUP%20eq%20'" + A0EMPLGROUP + "'";
} else {
filterString += "%20and%20A0EMPLGROUP%20eq%20'" + A0EMPLGROUP + "'";
}
}
if (A0EMPLSTATUS !== '*') {
if (filterString === "empty") {
filterString = "A0EMPLSTATUS%20eq%20'" + A0EMPLSTATUS + "'";
} else {
filterString += "%20and%20A0EMPLSTATUS%20eq%20'" + A0EMPLSTATUS + "'";
}
}
//Now catering for multiple countries
if (A0COUNTRY !== '*') {
A0COUNTRY = JSON.parse(A0COUNTRY);
if (A0COUNTRY.length > 0) {
if (filterString === "empty") {
filterString = "(A0COUNTRY%20eq%20";
} else {
filterString += "%20and%20(A0COUNTRY%20eq%20";
}
for (var i = 0; i < A0COUNTRY.length; i++) {
filterString += "'" + A0COUNTRY[i] + "'";
if (i < (A0COUNTRY.length - 1)) {
filterString += "%20or%20A0COUNTRY%20eq%20";
}
}
filterString += ")";
}
}
if (filterString !== "empty") {
requestString += "&$filter=(";
requestString += filterString;
requestString += ")";
}
var request = new $.net.http.Request($.net.http.GET, requestString);
//Setting the headers
request.headers.set("SAP-Connectivity-SCC-Location_ID", "[LOCATION_ID]");
request.contentType = "text/plain";
//Fire the request
client.request(request, destination);
var gwResponse = client.getResponse().body.asString();
var JSONObj = JSON.parse(gwResponse);
var botResponse;
botResponse = (JSONObj.d.results.length > 0 ? Math.round(JSONObj.d.results[0].A006................Z2NM) : 0);
$.response.status = $.net.http.OK;
$.response.contentType = "application/json";
$.response.setBody(botResponse);
break;
default:
$.response.status = $.net.http.METHOD_NOT_ALLOWED;
$.response.setBody("Wrong request method");
break;
}
} catch (e) {
$.response.setBody("Failed to execute: " + e.toString());
}
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
10 | |
10 | |
7 | |
4 | |
4 | |
3 | |
3 | |
3 | |
3 | |
2 |