NetSuite-Call Monkey Integration

Call Monkey is a third party application which connects with the lead and creates business opportunities. When a new lead is created in NetSuite or in Call Monkey these leads will be updated in Call Monkey and NetSuite. A scheduled script which runs in every 15 minutes will search for new lead created in Call Monkey if there is any that will be updated in NetSuite. If a NetSuite lead record is created or updated this will also be reflected in Call Monkey. A default campaign ID is chosen for a lead update.

User Event

/**
 * @NApiVersion 2.x
 * @NScriptType UserEventScript
 * @NModuleScope SameAccount
 */
define(['N/http', 'N/https', 'N/format', 'N/record', 'N/search'],


    function(http, https, format, record, search) {
        var myArray;
        //function to search in field array
        function fieldSearch(nameKey, optionKey) {
            try {
                for (var i = 0; i < myArray.length; i++) {
                    if (myArray[i].fieldId === nameKey) {
                        return ((myArray[i].type === "PULL_DOWN" || myArray[i].type === "CHECK_BOX") ?
                            optionSearch(optionKey, myArray[i].options) : myArray[i].id);
                    }
                }
            } catch (e) {
                log.debug({ title: "error in fieldSearch", details: e });
            }
        }

        function optionSearch(optionKey, myArray1) {
            try {
                log.debug({ title: "optionKey", details: optionKey });
                log.debug({ title: "myArray1", details: myArray1 });
                for (var i = 0; i < myArray1.length; i++) {
                    if (myArray1[i].name === optionKey) {
                        return myArray1[i].id;
                    }
                }
            } catch (e) {
                log.debug({ title: "error in optionSearch", details: e });
            }
        }

        function getlistval(listid, val) {
            try {
                var list = record.load({
                    type: "customlist",
                    id: listid
                });
                var optionsCount = list.getLineCount({
                    sublistId: 'customvalue'
                });
                for (i = 0; i < optionsCount; i++) {
                    var id = list.getSublistValue({
                        sublistId: 'customvalue',
                        fieldId: 'valueid',
                        line: i
                    })
                    if (id == val)
                        return list.getSublistValue({
                            sublistId: 'customvalue',
                            fieldId: 'value',
                            line: i
                        })
                }
            } catch (e) {
                log.debug("e", e);
            }
        }

        function getemployee(id) {
            try {
                var employeeSearchObj = search.create({
                    type: "employee",
                    filters: [
                        ["internalidnumber", "equalto", id]
                    ],
                    columns: [
                        search.createColumn({
                            name: "entityid",
                            sort: search.Sort.ASC
                        })
                    ]
                });
                var searchResultCount = employeeSearchObj.runPaged().count;
                var ram;
                employeeSearchObj.run().each(function(result) {
                    ram = result.getValue({ name: "entityid" })
                });
                return ram;
            } catch (e) {
                log.debug("e", e);
            }
        }
        /**
         * Function definition to be triggered before record is loaded.
         *
         * @param {Object} scriptContext
         * @param {Record} scriptContext.newRecord - New record
         * @param {Record} scriptContext.oldRecord - Old record
         * @param {string} scriptContext.type - Trigger type
         * @Since 2015.2
         */
        function afterSubmit(scriptContext) {
            try {
                if (scriptContext.type == "edit" || scriptContext.type == "create") {
                    var rec = scriptContext.newRecord;
                    /**start ,select all necessary fields from netsuite**/

                    var savetocall = rec.getValue({
                        fieldId: 'custentity_jj_save_tocall_monkey'
                    });
                    log.debug({ title: "savetocall", details: savetocall });
                    var calladdressid = rec.getValue({
                        fieldId: 'custentity_jj_callmonkey_address'
                    });
                    log.debug({ title: "calladdressid", details: calladdressid });
                    if (savetocall && (calladdressid == null || calladdressid == "")) {
                        try {
                            var naam = rec.getText({
                                fieldId: 'custentityll_naam'
                            });
                        } catch (e) {
                            var naamval = rec.getValue({
                                fieldId: 'custentityll_naam'
                            });
                            //     log.debug({ title: "e naamval ", details: naamval });
                            var naam = getlistval(131, naamval);
                            //     log.debug({ title: "e naam ", details: naam });

                        }
                        var dateLeadGathered = rec.getValue({ fieldId: 'custentity8' });
                        /*                       if (dateLeadGathered != null && dateLeadGathered != "")
                                     dateLeadGathered = format.format({
                                         value: dateLeadGathered,
                                         type: format.Type.DATE
                                     });

                                 //    var dateLeadGathered = "23-2-2018";
                                 dateLeadGathered = dateLeadGathered.replace("/", "-").replace("/", "-");
                                */

                        var timeLeadGathered = rec.getValue({
                            fieldId: 'custentitytijdleadopgehaald_ilse'
                        });
                        // timeLeadGathered = timeLeadGathered.replace("/", "-").replace("/", "-");
                        try {
                            var incentive = rec.getText({
                                fieldId: 'custentityregio'
                            });
                        } catch (e) {
                            var incentiveval = rec.getValue({
                                fieldId: 'custentityregio'
                            });
                            //     log.debug({ title: "e incentiveval ", details: incentiveval });

                            var incentive = getlistval(154, incentiveval);
                            //   log.debug({ title: "e incentive ", details: incentive });

                        }

                        try {
                            var door2door = rec.getText({
                                fieldId: 'custentity6'
                            });
                        } catch (e) {
                            var door2doorval = rec.getValue({
                                fieldId: 'custentity6'
                            });
                            //      log.debug({ title: "e door2doorval ", details: door2doorval });

                            var door2door = getlistval(128, door2doorval);
                            //   log.debug({ title: "e door2door ", details: door2door });

                        }
                        try {
                            var gender = rec.getValue({
                                fieldId: 'salutation'
                            });
                        } catch (e) {
                            var genderval = rec.getValue({
                                fieldId: 'salutation'
                            });
                            //    log.debug({ title: "e genderval ", details: genderval });

                            var gender = getlistval(128, genderval);
                            //   log.debug({ title: "e gender ", details: gender });

                        }
                        try {
                            var region = rec.getText({
                                fieldId: 'custentityregio'
                            });
                        } catch (e) {

                            var regionval = rec.getValue({
                                fieldId: 'custentityregio'
                            });
                            //  log.debug({ title: "e regionval ", details: regionval });

                            var region = getlistval(154, regionval);
                            //  log.debug({ title: "e region ", details: region });

                        }
                        try {
                            var adviseur = rec.getText({
                                fieldId: 'custentityadviseur_ilse'
                            });
                        } catch (e) {
                            var adviseurval = rec.getValue({
                                fieldId: 'custentityadviseur_ilse'
                            });
                            //  log.debug({ title: "e adviseurval ", details: adviseurval });

                            var adviseur = getemployee(adviseurval);
                            //       log.debug({ title: "e adviseur ", details: adviseur });

                        }
                        var salutation = rec.getValue({
                            fieldId: 'salutation'
                        });
                        var firstName = rec.getValue({
                            fieldId: 'firstname'
                        });
                        var lastname = rec.getValue({
                            fieldId: 'lastname'
                        });
                        var telephoneNumber = rec.getValue({
                            fieldId: 'phone'
                        }); //doubt
                        var homeTelephoneNumber = rec.getValue({
                            fieldId: 'mobilephone'
                        }); //doubt
                        var email = rec.getValue({
                            fieldId: 'email'
                        });
                        try {
                            var contactPreference = rec.getText({
                                fieldId: 'custentity7'
                            });
                        } catch (e) {
                            var contactPreferenceval = rec.getValue({
                                fieldId: 'custentity7'
                            });
                            // log.debug({ title: "e contactPreferenceval ", details: contactPreferenceval });
                            var contactPreference = getlistval(129, contactPreferenceval);
                            //    log.debug({ title: "e contactPreference ", details: contactPreference });
                        }
                        var contactPreference = contactPreference.charAt(0).toUpperCase() + contactPreference.slice(1);
                        var remarksLead = rec.getValue({
                            fieldId: 'custentityopmerkingen_lead_ilse'
                        });
                        var durableEnergy = rec.getValue({
                            fieldId: 'custentityenergysource'
                        });
                        var energyPrice = rec.getValue({
                            fieldId: 'custentityenergyprice'
                        });
                        var noinvest = rec.getValue({
                            fieldId: 'custentitynoinvest'
                        });
                        var energyNota = rec.getValue({
                            fieldId: 'custentityenergynota'
                        });
                        var houseOwner = rec.getValue({
                            fieldId: 'custentityhouseowner'
                        });
                        var finances = rec.getValue({
                            fieldId: 'custentityfinances'
                        });
                        var relationaggrement = rec.getValue({
                            fieldId: 'custentitypartnerok'
                        });
                        var addressobj = findaddress(rec);
                        var address = addressobj.addr1;
                        var housenumber = addressobj.housenum;
                        var housenumber1 = addressobj.houseexten;
                        var zipcode = addressobj.zip;
                        var cityname = addressobj.city;
                        // log.debug({ title: "afar", details: address + " addr1 " + housenumber + " housenumber " + housenumber1 + " housenumber1 " + zipcode + " zipcode " + cityname + " cityname " })
                        var contactForAppointment = rec.getValue({
                            fieldId: 'custentityakkoord_telcon_afspraak_ilse'
                        });
                        /**End ,select all necessary fields from netsuite)**/
                        // log.debug({ title: "got datas", details: " naam=" + naam + "  dateLeadGathered=" + dateLeadGathered + "  timeLeadGathered=" + timeLeadGathered + "  door2door=" + door2door + "  region=" + region + "  salesRep=" + adviseur + "  salutation=" + salutation + "   firstName=" + firstName + "  telephoneNumber=" + telephoneNumber + "  homeTelephoneNumber=" + homeTelephoneNumber + "   email=" + email + "   contactPreference=" + contactPreference + "     remarksLead=" + remarksLead + "     durableEnergy=" + durableEnergy + "   energyPrice=" + energyPrice + "   noinvest=" + noinvest + "     energyNota=" + energyNota + "        houseOwner=" + houseOwner + "  finances=" + finances + "       contactForAppointment=" + contactForAppointment });
                        var headerObj = { "Accept": "application/json" };
                        var callMonkeyResponse = https
                            .get({
                                url: 'https://backoffice.callmonkey.com/external-api/field/get-form-fields?apiKey=8a62db93-f096-464b-947f-c750f3a91780&scriptId=02197cc9-372c-40a4-ae6a-a91f85e1a427',
                                headers: headerObj
                            });
                        var data = callMonkeyResponse.body;
                        var data1 = JSON.parse(data);
                        myArray = data1.data;
                        var genderid = fieldSearch('CPGender', gender);
                        var door2doorId = fieldSearch('DOOR2DOORCAMPAGNEREGIO', door2door);
                        var contactPreferenceId = fieldSearch('BESCHIKBAARHEID', contactPreference);
                        //log.debug("contactPreferenceId", contactPreferenceId)
                        var headerObj = { "Accept": "application/json", "Content-Type": "application/json", "apiKey": "8a62db93-f096-464b-947f-c750f3a91780" };
                        var fieldarray = [];
                        var regionob = { "fieldId": "WELKESTIMULERINGSREGELINGISVANTOEPASSING", "value": region };
                        var gender = { "fieldId": "CPGender", "optionUuids": [genderid] };
                        var contactpref = { "fieldId": "BESCHIKBAARHEID", "optionUuids": [contactPreferenceId] };
                        var lastnameobj = { "fieldId": "CPLastname", "value": lastname };
                        var leadmaker = { "fieldId": "LEADMAKER", "value": naam };
                        var door = { "fieldId": "DOOR2DOORCAMPAGNEREGIO", "optionUuids": [door2doorId] };
                        var advisor = { "fieldId": "ADVISEUR", "value": adviseur };
                        var firstnme = { "fieldId": "CPFirstname", "value": firstName };
                        var addr1 = { "fieldId": "ORStreet", "value": address };
                        var leaddate = { "fieldId": "LEADDATUM", "value": dateLeadGathered };
                        var leadtime = { "fieldId": "LEADTIJD", "value": timeLeadGathered };
                        var housnum = { "fieldId": "ORHouseNumberAddition", "value": housenumber };
                        var zip = { "fieldId": "ORPostcode", "value": zipcode };
                        var city = { "fieldId": "ORCity", "value": cityname };
                        var phone = { "fieldId": "CPTelephone1", "value": telephoneNumber };
                        var aleternate = { "fieldId": "CPMobile", "value": homeTelephoneNumber };
                        var emailobj = { "fieldId": "CPEmail1", "value": email };
                        var content = { "fieldId": "OPMERKINGENKCC", "value": remarksLead };
                        var houesownrobj = { "fieldId": "ISDECONTACTPERSOONDANWELPARTNEREIGENAARVANDEWONING", "value": houseOwner };
                        var relationaggrementobj = { "fieldId": "ISDERELATIEAKKOORDDATERCONTACTWORDTOPGENOMENVOORHETMAKENVANEENAFSPRAAK", "value": relationaggrement };
                        var durableEnergyobj = { "fieldId": "WATISVOLGENSUDEMEESTDUURZAMEBRONVANENERGIE", "value": durableEnergy };
                        var energyPriceobj = { "fieldId": "VERWACHTINGENERGIEPRIJSENBIJKOMENDEKOSTEN", "value": energyPrice };
                        var noinvestIdobj = { "fieldId": "ALSUZONDERDATHETUMEERKOSTPMENZONDEREIGENINVESTERINGOVERKUNTGAANOPDUURZAMEZONNEENERGIEZOUUDATDANOVERWEGEN", "value": noinvest };
                        var financesdobj = { "fieldId": "BEHEERDECONTACTPERSOONZELFSTANDIGOFSAMENMETDEPARTNERHETFINANCIELEHUISHOUDEN", "value": finances };

                        //   fieldarray.push(lastnameobj, leadmaker, leadtime, regionob, door, advisor, gender, firstnme, lastnme, addr1, housnum, housenum1, zip, city, phone, aleternate, emailobj, contactpref, content, houesownrobj, relationaggrementobj, durableEnergyobj, energyPriceobj, noinvestIdobj, financesdobj);
                        fieldarray.push(lastnameobj, leadmaker, regionob, advisor, firstnme, addr1, city, emailobj, content, houesownrobj, relationaggrementobj, durableEnergyobj, energyPriceobj, noinvestIdobj, financesdobj, phone, aleternate, leaddate, leadtime);
                        if (genderid != null) {
                            fieldarray.push(gender);
                        }
                        if (door2doorId != null) {
                            fieldarray.push(door);
                        }
                        if (contactPreferenceId != null) {
                            fieldarray.push(contactpref);
                        }
                        //            log.debug({ title: "fieldarray", details: fieldarray });
                        var bodyObj = { "campaignId": "ae86d4a8-d135-45cd-a198-457fe24d576b", "fields": fieldarray };
                        var stringbody = JSON.stringify(bodyObj);
                        var addressResponse = https
                            .post({
                                url: 'https://backoffice.callmonkey.com/external-api/address/create?apiKey=8a62db93-f096-464b-947f-c750f3a91780',
                                body: stringbody,
                                headers: headerObj
                            });
                        //, { "fieldId": "CPEmail1", "value": email }
                        //{ "fieldId": "ADVISEUR", "optionUuids": [adviseurId] }
                        //  var responseBody = JSON.parse(addressResponse);
                        statusCode = addressResponse.code;
                        //         log.debug({ title: "addressResponse", details: addressResponse });
                        if (statusCode == 200) {
                            var responseBody = JSON.parse(addressResponse.body);
                            //  log.debug({ title: "responseData", details: responseBody });
                            var addressId = responseBody.id;
                            log.debug({ title: "addressId", details: addressId });
                            internalid = scriptContext.newRecord.id;
                            log.debug({ title: "addressId", details: internalid });
                            //setting the custom field Trigger type in the sales order
                            var id = record.submitFields({
                                type: record.Type.LEAD,
                                id: scriptContext.newRecord.id,
                                values: {
                                    custentity_jj_callmonkey_address: addressId
                                },
                                options: {
                                    enableSourcing: true,
                                    ignoreMandatoryFields: true,
                                    ignoreFieldChange: false
                                }
                            });
                            log.debug({ title: "id", details: id });

                        }
                    }

                }
            } catch (e) {
                log.debug({
                    title: 'error in main',
                    details: e
                });
            }
        }

        return {
            afterSubmit: afterSubmit
        };

        function findaddress(resultrec) {
            try {
                var leadSearchObj = search.create({
                    type: "lead",
                    filters: [
                        ["stage", "anyof", "LEAD"],
                        "AND", ["internalidnumber", "equalto", 5303]
                    ],
                    columns: [
                        search.createColumn({
                            name: "custrecord_houesnumber",
                            join: "Address"
                        }),
                        search.createColumn({
                            name: "custrecord_housenumber_extension",
                            join: "Address"
                        }),
                        search.createColumn({
                            name: "city",
                            join: "Address"
                        }),
                        search.createColumn({
                            name: "zipcode",
                            join: "Address"
                        }),
                        search.createColumn({
                            name: "address1",
                            join: "Address"
                        }),
                        search.createColumn({
                            name: "statedisplayname",
                            join: "Address"
                        })
                    ]
                });

                var results = leadSearchObj.run().getRange({
                    start: 0,
                    end: 1000
                });
                var customer = {};
                var result = results[0];
                customer.zip = result.getValue({
                    name: "zipcode",
                    join: "Address"
                });
                customer.city = result.getValue({
                    name: "city",
                    join: "Address"
                });
                customer.houseexten = result.getValue({
                    name: "custrecord_housenumber_extension",
                    join: "Address"
                });
                customer.housenum = result.getValue({
                    name: "custrecord_houesnumber",
                    join: "Address"
                });
                customer.addr1 = result.getValue({
                    name: "address1",
                    join: "Address"
                });
                //   log.debug({ title: "customer", details: customer });
                return customer;
            } catch (e) {

                log.debug({ title: "e in address ", details: e });

            }
        }
    });

Schedule Script

  /**
   * @NApiVersion 2.x
   * @NScriptType ScheduledScript
   * @NModuleScope SameAccount
   */
  define(['N/https', 'N/email', 'N/record', 'N/search', 'N/runtime', 'N/task', 'N/file'],

      function(https, email, record, search, runtime, task, file) {

          /**
           * Definition of the Scheduled script trigger point.
           *
           * @param {Object} scriptContext
           * @param {string} scriptContext.type - The context in which the script is executed. It is one of the values from the scriptContext.InvocationType enum.
           * @Since 2015.2
           */
          function execute(scriptContext) {
              try {
                  var searchobj = createsearch();
                  log.debug({ details: searchobj, title: "searchobj" });
                  for (var i = 0; i < searchobj.length; i++) {
                      var response = sendrequest(searchobj[i].callmonkey_address, searchobj[i].internalid);
                  }

              } catch (e) {
                  log.debug({ title: "e in main", details: e });
              }
          }

          return {
              execute: execute
          };
          //to get the update from netsuite 
          function sendrequest(address, internalid) {
              try {
                  var queryurl = "https://backoffice.callmonkey.com/external-api/address/get/" + address
                  var headerobj = {
                      accept: "application/json",
                      apikey: "8a62db93-f096-464b-947f-c750f3a91780"
                  }
                  var response = https.get({
                      url: queryurl,
                      headers: headerobj
                  });
                  //  var parsedresponse = JSON.parse(response.body);     
                  //return response.body;
                  if (response.code == 200) {
                      var currentstatus = formatresponse(response.body);
                      var id = updatestatus(internalid, currentstatus);
                  }
                  log.debug({ details: id, title: "id" });
              } catch (e) {
                  log.debug({ details: e, title: "e in sendrequest" });
              }
          }
          //to get lead details   
          function createsearch() {
              try {
                  var leadSearchObj = search.create({
                      type: "lead",
                      filters: [
                          ["stage", "anyof", "LEAD"],
                          "AND", ["custentity_jj_save_tocall_monkey", "is", "T"],
                          "AND", ["custentity_jj_callmonkey_address", "isnotempty", ""]
                      ],
                      columns: [
                          search.createColumn({
                              name: "entityid",
                              sort: search.Sort.ASC
                          }),
                          "altname",
                          "email",
                          "custentity_jj_save_tocall_monkey",
                          "custentity_jj_callmonkey_address",
                          "internalid",
                          "entitystatus"
                      ]
                  });
                  var i = 0;
                  var leadarray = [];

                  var searchResultCount = leadSearchObj.runPaged().count;
                  var i = 0;
                  leadSearchObj.run().each(function(result) {
                      var leadobj = {};
                      leadobj.internalid = result.getValue({
                          name: 'internalid'
                      });
                      leadobj.callmonkey_address = result.getValue({
                          name: 'custentity_jj_callmonkey_address'
                      });
                      leadarray.push(leadobj);
                      return true

                  });

                  return leadarray;
              } catch (e) {
                  log.debug({ details: e, title: "e in search" });
              }
          }
          // to format response 
          function formatresponse(response) {
              try {
                  log.debug({ details: response, title: "response" });
                  var response = JSON.parse(response);
                  var statusarray = response.dispositions;
                  var currentstatus = statusarray[statusarray.length - 1].type;
                  log.debug({ details: currentstatus, title: "currentstatus" });
                  return currentstatus;
              } catch (e) {
                  log.debug({ details: e, title: "e in format" });
              }
          }
          // to update status to lead record in netsuite
          function updatestatus(internalid, status) {
              var leadstatusobj = {
                  CALLBACK: "21",
                  QUALIFIED: "7",
                  NEGATIVE: "19",
                  DISCHARGE: "22",
                  CANCELLED: "23"
              };
              log.debug({ details: status, title: "status" });
              log.debug({ details: leadstatusobj[status], title: "leadstatusobj.status" });
              var id = record.submitFields({
                  type: record.Type.LEAD,
                  id: internalid,
                  values: {
                      entitystatus: leadstatusobj[status]
                  },
                  options: {
                      enableSourcing: false,
                      ignoreMandatoryFields: true
                  }
              });
              return id
          }

      });

Leave a comment

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