Eagle_Point_Solutions/EPSN-135 Microsoft event integration at main · Jobin-And-Jismi-IT-Services-LLP/Eagle_Point_Solutions · GitHub
/**
* @NApiVersion 2.x
* @NScriptType Suitelet
* @NModuleScope SameAccount
*/
/***********************************************************************************************
* EPSN-137 Outlook Invite Create.
* EPSN-145, EPSN-138
* *********************************************************************************************
*
* Date: 16-Sept-2022
* created on: 16-Sept-2022
* Author: Jobin & Jismi IT Services LLP
*
* Version History
* v1.0 16-Sept-2022 JJ0104 : Created
* v1.0 10-Oct-2022 JJ053 : Update
*
************************************************************************************************
**/
define(['N/search', 'N/record', 'N/https', 'N/format','N/config'],
function (search, record, https, format,config) {
/**
* To know whether the account is Production Environment or not
* @returns {boolean} true when account is Production, false in all other scenarios
*/
function isProduction() {
var companyInfo = config.load({
type: config.Type.COMPANY_INFORMATION
});
var ns_companyid = companyInfo.getValue({
fieldId: 'companyid'
}).toString().trim().toLowerCase();
if (isNaN(Number(ns_companyid))) //Will be NaN for Sandbox or Release Preview accounts
return true//false; // return false when script moved to production
return true;
}
//entry point
function onRequest(context) {
try {
if (context.request.method === 'POST') {
var isPrd = isProduction();
if (isPrd) {
eventCreation(context)
}
}
} catch (e) {
log.error("error@onRequest", e)
}
}
function eventCreation(context) {
log.debug("method", context.request.method);
var taskDetails = {};
var requestBody = context.request.body;
log.debug("requestBody", requestBody);
var taskID = JSON.parse(requestBody);
taskID = taskID.InternaltranId
log.debug("taskID", taskID);
var tokenObj = getAccessToken();
log.debug("tokenObj", tokenObj);
var taskObj = record.load({type: 'task', id: taskID});
var eventId=taskObj.getValue({fieldId:'custevent_jj_microsoft_graph_event_id'});
var subject = taskObj.getValue({fieldId: 'title'});
if (subject) {
taskDetails.subject = subject;
}
var body = taskObj.getValue({fieldId: 'message'});
if (body) {
taskDetails.body = {
"contentType": "HTML",
"content": body
}
}
var timezone = taskObj.getValue({fieldId: 'timezone'});
log.debug('timezone', timezone)
var startDate = taskObj.getValue({fieldId: 'startdate'});
var startTime = taskObj.getValue({fieldId: 'starttime'});
log.debug('startDate', startDate)
log.debug('startTime', startTime)
startTime = format.format({
value: startTime,
type: format.Type.DATETIME,
timezone: format.Timezone.AMERICA_LOS_ANGELES
})//ATLANTIC_REYKJAVIK
log.debug('startTime', startTime)
startTime = format.parse({
value: startTime,
type: format.Type.DATETIME,
timezone: format.Timezone.AMERICA_CHICAGO
})
log.debug('startTime', startTime)
var startDate = startDate.toISOString()
var startTime = startTime.toISOString()
log.debug('startDate-1', startDate)
log.debug('startTime-1', startTime)
var startDate = startDate.split("T")[0];
var start=startDate;
var startTime = startTime.split("T")[1];
log.debug('startDate-2', startDate)
log.debug('startTime-2', startTime)
var startDateTime = startDate + "T" + startTime;
if (startDateTime) {
taskDetails.start = {
"dateTime": startDateTime,
"timeZone": timezone
}
}
// //
var endDate = taskObj.getValue({fieldId: 'duedate'});
var endTime = taskObj.getValue({fieldId: 'endtime'});
endTime = format.format({
value: endTime,
type: format.Type.DATETIME,
timezone: format.Timezone.AMERICA_LOS_ANGELES
})
endTime = format.parse({
value: endTime,
type: format.Type.DATETIME,
timezone: format.Timezone.AMERICA_CHICAGO
})
endDate = endDate.toISOString()
endTime = endTime.toISOString()
log.debug('endDate-1', endDate)
log.debug('endTime-1', endTime)
endDate = endDate.split("T")[0];
if(endDate==start) {
endTime = endTime.split("T")[1];
log.debug('endDate-2', endDate)
log.debug('endTime-2', endTime)
var endDateTime = endDate + "T" + endTime;
if (endDateTime) {
taskDetails.end = {
"dateTime": endDateTime,
"timeZone": timezone//"America/Los_Angeles"
}
}
}else{
var splitDate=start.split("-");
var date=Number(splitDate[2])+1
splitDate.pop()
splitDate.push(date)
start=splitDate.join("-")
var endDateTime = start + "T" + "04:30:00Z";
if (endDateTime) {
taskDetails.end = {
"dateTime": endDateTime,
"timeZone": timezone//"America/Los_Angeles"
}
}
}
//
var assigned = taskObj.getValue({fieldId: 'assigned'});
var supportcase = taskObj.getValue({fieldId: 'supportcase'})
var assigneeEmail, caseEmail
if (assigned) {
assigneeEmail = search.lookupFields({
type: 'employee',
id: assigned,
columns: ['email']
});
if (assigneeEmail.email)
assigneeEmail = assigneeEmail.email
else
assigneeEmail = ''
}
if (supportcase) {
caseEmail = search.lookupFields({
type: 'supportcase',
id: supportcase,
columns: ['custevent_jj_email_25']
});
if (caseEmail.custevent_jj_email_25.length)
caseEmail = caseEmail.custevent_jj_email_25[0].text
else
caseEmail = ''
}
log.debug('assigned', assigned)
log.debug('supportcase', supportcase)
if (assigneeEmail && caseEmail) {
taskDetails.attendees = [];
if (assigneeEmail)
taskDetails.attendees.push({
"emailAddress": {
"address": assigneeEmail//,
// "name": "Gloria George"
},
"type": "required"
})
if (caseEmail)
taskDetails.attendees.push({
"emailAddress": {
"address": caseEmail//,
// "name": "Gloria George"
},
"type": "required"
})
}
else{
context.response.write(JSON.stringify({status:"Invite is failed to sent", message:"The email address is missing for assignee or the email address is missing in case record. Please add an email address in the assignee and in case record before retrying to sent the invite."}))
return true;
}
taskDetails.isOnlineMeeting = true;
taskDetails.allowNewTimeProposals=true
var deleted= false;
if(eventId) { //delete the event if the event is already created
var deleteEventObj = deleteAPICall(tokenObj, eventId)
if (deleteEventObj.code == 204) {
deleted= true;
}else{
log.debug("error delete", JSON.stringify(deleteEventObj.body))
if(deleteEventObj.body&& deleteEventObj.body.error && deleteEventObj.body.error.code && deleteEventObj.body.error.code=="ErrorItemNotFound") {// if the organizer cancel the event manually in microsoft calender
log.debug('inside')
deleted = true;
taskObj.setValue({fieldId: 'custevent_jj_microsoft_graph_event_id', value: ''});
}else {
taskObj.setValue({
fieldId: 'custevent_jj_microsoft_event_sync_error',
value: JSON.stringify(deleteEventObj.body)
});
taskObj.setValue({fieldId: 'custevent_jj_microsof_event_sync_status', value: 'Update Failed'});
taskObj.save({enableSourcing: false, ignoreMandatoryFields: true})
context.response.write(JSON.stringify({status:"Failure", message:"The invite is failed to sent due to an error. Please refresh and see the 'Microsoft Graph Event Sync Error' field under the 'Outlook Sync' subtab to get more details."}))
}
}
}
if(deleted || !eventId) {//Create event if the event is deleted or not created
var taskEventObj = APIcall(tokenObj, taskDetails);
log.debug("taskEventObj", taskEventObj);
if (taskEventObj.code == 201 && taskEventObj.body.id) {
taskObj.setValue({fieldId: 'custevent_jj_microsoft_graph_event_id', value: taskEventObj.body.id});
taskObj.setValue({fieldId: 'custevent_jj_microsoft_event_sync_error', value: ''});
if (eventId)
taskObj.setValue({fieldId: 'custevent_jj_microsof_event_sync_status', value: 'Updated'});
else
taskObj.setValue({fieldId: 'custevent_jj_microsof_event_sync_status', value: 'Created'});
taskObj.save({enableSourcing: false, ignoreMandatoryFields: true})
context.response.write(JSON.stringify({status:"Success", message:"The invite is successfully sent to the task assignee."}))
} else {
taskObj.setValue({fieldId: 'custevent_jj_microsoft_event_sync_error', value: JSON.stringify(taskEventObj.body)});
if (eventId)
taskObj.setValue({fieldId: 'custevent_jj_microsof_event_sync_status', value: 'Update Failed'});
else
taskObj.setValue({
fieldId: 'custevent_jj_microsof_event_sync_status',
value: 'Creation Failed'
});
taskObj.save({enableSourcing: false, ignoreMandatoryFields: true})
context.response.write(JSON.stringify({status:"Failure", message:"The invite is failed to sent due to an error. Please refresh and see the 'Microsoft Graph Event Sync Error' field under the 'Outlook Sync' subtab to get more details."}))
}
}
}
function getAccessToken() {
var client_id = 'bc12465d-211e-4a35-adcb-020a30aa5d4d';
var client_secret = 'e5Z8Q~WdV9gTr8YojJNsIRzJHV58Gce0UHaMGaSj';
var headers = [];
headers['content-type'] = 'application/x-www-form-urlencoded';
headers['accept'] = '*/*';
headers['connection'] = 'keep-alive';
var response = https.post({
url: 'https://login.microsoftonline.com/35bac93c-66ac-48ba-af49-f31e90d802b7/oauth2/v2.0/token',
body: 'grant_type=client_credentials&client_id=' + client_id + '&client_secret=' + client_secret + '&scope=https://graph.microsoft.com/.default',
headers: headers
});
var tokenObj = JSON.parse(response.body)
//log.debug('tokenObj', tokenObj);
return tokenObj;
}
function deleteAPICall(tokenObj,eventId){
var headers={}
headers['authorization'] = tokenObj.token_type + " " + tokenObj.access_token;
var response = https.delete({
url: 'https://graph.microsoft.com/v1.0/users/6026136b-548b-4907-ab57-84352c5a605e/calendar/events/'+eventId,
headers: headers
});
var responseObj={}
if(response.body)
responseObj = JSON.parse(response.body)
log.debug('responseObj', responseObj);
return {body: responseObj, code:response.code}
}
function APIcall(tokenObj, taskDetails) {
/** CalenderID of the organizer = 4da4e0c0-bb63-4ff1-946b-b3defa373dcc*/
// var token = tokenObj.token_type+" "+tokenObj.access_token;
var headers={}
headers['content-type'] = "application/json";
headers['authorization'] = tokenObj.token_type + " " + tokenObj.access_token;
headers['Accept']='application/json;odata.metadata=minimal;odata.streaming=true;IEEE754Compatible=false'
log.debug('headers', headers);
log.debug('taskDetails', taskDetails);
var response = https.post({
url: 'https://graph.microsoft.com/v1.0/users/6026136b-548b-4907-ab57-84352c5a605e/calendar/events',
headers: headers,
body: JSON.stringify(taskDetails)
});
var responseObj = JSON.parse(response.body)
log.debug('responseObj', responseObj);
return {body:responseObj, code:response.code}
}
return {
onRequest: onRequest
}
});