Outlook event Integration

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
        }

    });

Leave a comment

Your email address will not be published. Required fields are marked *