Server side script help to create new user and relationship from widget
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
04-27-2024 07:45 AM
Hello all,
I have the following script:
if(input&&input.action=='addNonPUser')
{
var emailValid = 'true';
var isPpsUser = 'false';
data.errormsg = '';
var flag = '';
var email = input.nonUser.nonPUseremail.toLowerCase();
if(!email.match(/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/)){
emailValid = 'false';
gs.addErrorMessage('Enter a valid email address');
}
if(email.includes('pps.com'))
{
isPpsUser = 'true';
gs.addErrorMessage('Enter a Non-Pps User email');
}
if(emailValid == 'true' && isPsUser == 'false'){
var grgetUser = new GlideRecord("sys_user");
grgetUser.addQuery("email",input.nonUser.nonPUseremail);
grgetUser.addQuery("active","true");
grgetUser.query();
if (grgetUser.next()) {
var grgetUsersysid = grgetUser.sys_id;
grgetUser.u_function = input.nonUser.nonPUsertitle;
grgetUser.u_primary_contact_phone = input.nonUser.nonPusrphone;
grgetUser.update();
var grgetUserName1 = grgetUser.sys_id;
var table2 = [
{'tblname':'cmdb_rel_person', 'col1':'user', 'col2':'ci','dev_key':'devauthcaller','prod_key':'prodauthcaller'},
{'tblname':'u_m2m_sys_user_cmdb_ci_service', 'col1':'sys_user', 'col2':'u_cmdb_ci_service','dev_key':'devauthappr','prod_key':'prodauthappr'},
{'tblname':'u_m2m_from_cmdb_ci_service_watchlist', 'col1':'u_user','col2':'u_cmdb_ci_service','dev_key':'devwatchlist','prod_key':'prodwatchlist'}
]
table2.forEach(function(element) {
var k =0;
var test2 = usedfor.split(",");
test2.forEach(function(value){
var grCheckExistence = new GlideRecord(element.tblname);
grCheckExistence.addQuery(element.col1,grgetUsersysid);
grCheckExistence.addQuery(element.col2, res[k]); //res[k] contains the CI sys_id
grCheckExistence.query();
if (!grCheckExistence.next()) {
if(input.nonUser[element.dev_key] == true && input.nonUser.nonPUseremail !="" && value == "Development")
{
var graddNonUsrRole = new GlideRecord(element.tblname);
graddNonUsrRole.initialize();
graddNonUsrRole[element.col1] = input.nonUser.nonPUseremail;
graddNonUsrRole[element.col2] = res[k];
graddNonUsrRole.insert();
flag = 'true';
}
if(input.nonUser[element.prod_key] == true && input.nonUser.nonPUseremail !="" && value == "Production")
{
var graddNonUsrRole1 = new GlideRecord(element.tblname);
graddNonUsrRole1.initialize();
graddNonUsrRole1[element.col1] = input.nonUser.nonPUseremail;
graddNonUsrRole1[element.col2] = res[k];
graddNonUsrRole1.insert();
flag = 'true';
}
}
else
{
flag = (flag != '' )? flag:'false';
}
k++;
});
});
if(flag == 'true')
{
gs.addInfoMessage("User profile has been added");
}
if(flag == 'false')
{
//gs.addInfoMessage("This user already exists. Please go to User Profiles to update this user's settings.");
data.errormsg = "This user already exists. Please go to User Profiles to update this user's settings.";
//return;
}
}
else
{
//User email not found
// Create User and Add Roles
grgetUser.initialize();
grgetUser.first_name = input.nonUser.nonPUserfname;
grgetUser.last_name = input.nonUser.nonPUserlname;
grgetUser.email = input.nonUser.nonPUseremail;
grgetUser.u_function = input.nonUser.nonPUsertitle;
grgetUser.u_primary_contact_phone = input.nonUser.nonPusrphone;
grgetUser.time_zone = input.nonUser.nonPUsertimezone;
grgetUser.user_name = input.nonUser.nonPUseremail;
grgetUser.insert();
var table3 = [
{'tblname':'cmdb_rel_person', 'col1':'user', 'col2':'ci','dev_key':'devauthcaller','prod_key':'prodauthcaller'},
{'tblname':'u_m2m_sys_user_cmdb_ci_service', 'col1':'sys_user', 'col2':'u_cmdb_ci_service','dev_key':'devauthappr','prod_key':'prodauthappr'},
{'tblname':'u_m2m_from_cmdb_ci_service_watchlist', 'col1':'u_user','col2':'u_cmdb_ci_service','dev_key':'devwatchlist','prod_key':'prodwatchlist'}
]
table3.forEach(function(element) {
var k =0;
var test2 = usedfor.split(",");
test2.forEach(function(value){
if(input.nonUser[element.dev_key] == true && input.nonUser.nonPUseremail !="" && value == "Development")
{
var graddNonUsrRole = new GlideRecord(element.tblname);
//graddNonUsrRole.addQuery('');
graddNonUsrRole.initialize();
graddNonUsrRole[element.col1] = input.nonUser.nonPUseremail;
graddNonUsrRole[element.col2] = res[k];
graddNonUsrRole.insert();
}
if(input.nonUser[element.prod_key] == true && input.nonUser.nonPUseremail !="" && value == "Production")
{
//gs.addInfoMessage("User has been added successfully into Prod Key");
var graddNonUsrRole1 = new GlideRecord(element.tblname);
graddNonUsrRole1.initialize();
graddNonUsrRole1[element.col1] = input.nonUser.nonPUseremail;
graddNonUsrRole1[element.col2] = res[k];
graddNonUsrRole1.insert();
}
k++;
});
});
gs.addInfoMessage("User profile has been added");
}
}
}
I have 2 parts here..
1.
if (grgetUser.next()) {
else
{
//User email not found
// Create User and Add Roles
grgetUser.initialize();
grgetUser.first_name = input.nonUser.nonPUserfname;
grgetUser.last_name = input.nonUser.nonPUserlname;
grgetUser.email = input.nonUser.nonPUseremail;
grgetUser.u_function = input.nonUser.nonPUsertitle;
grgetUser.u_primary_contact_phone = input.nonUser.nonPusrphone;
grgetUser.time_zone = input.nonUser.nonPUsertimezone;
grgetUser.user_name = input.nonUser.nonPUseremail;
grgetUser.insert();
but while inserting the relationship with the below code it still takes the old inactive record user value and inserts the relationship, it does not take the value of new user created. How to fix the issue?
graddNonUsrRole1[element.col1] = input.nonUser.nonPUseremail;// should this be updated?
or should I have a new glide record for inserting new user in else part like:
var graddnewuser = new GlideRecord('sys_user');
graddnewuser.initialize() and insert?
var table3 = [
{'tblname':'cmdb_rel_person', 'col1':'user', 'col2':'ci','dev_key':'devauthcaller','prod_key':'prodauthcaller'},
{'tblname':'u_m2m_sys_user_cmdb_ci_service', 'col1':'sys_user', 'col2':'u_cmdb_ci_service','dev_key':'devauthappr','prod_key':'prodauthappr'},
{'tblname':'u_m2m_from_cmdb_ci_service_watchlist', 'col1':'u_user','col2':'u_cmdb_ci_service','dev_key':'devwatchlist','prod_key':'prodwatchlist'}
]
table3.forEach(function(element) {
var k =0;
var test2 = usedfor.split(",");
test2.forEach(function(value){
if(input.nonUser[element.dev_key] == true && input.nonUser.nonPUseremail !="" && value == "Development")
{
var graddNonUsrRole = new GlideRecord(element.tblname);
//graddNonUsrRole.addQuery('');
graddNonUsrRole.initialize();
graddNonUsrRole[element.col1] = input.nonUser.nonPUseremail;
graddNonUsrRole[element.col2] = res[k];
graddNonUsrRole.insert();
}
if(input.nonUser[element.prod_key] == true && input.nonUser.nonPUseremail !="" && value == "Production")
{
//gs.addInfoMessage("User has been added successfully into Prod Key");
var graddNonUsrRole1 = new GlideRecord(element.tblname);
graddNonUsrRole1.initialize();
graddNonUsrRole1[element.col1] = input.nonUser.nonPUseremail;
graddNonUsrRole1[element.col2] = res[k];
graddNonUsrRole1.insert();
}
k++;
});
});
TIA,
@Dr Atul G- LNG @Maddysunil @James Chun @Sujatha V M @Ankur Bawiskar
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
04-28-2024 04:09 PM
Hi @DPrasna ,
To address the issue where the relationship inserts are still using the old inactive user record, you need to ensure that you're capturing and using the sys_id of the newly created user when you're inserting relationships in the 'else' part of your script.
Currently, you are using the email address (input.nonUser.nonPUseremail) directly to link the relationship records. However, if there are multiple user records with the same email (like an inactive one and the one you just created), ServiceNow will not be able to determine which user you're referring to just by email, potentially leading to the wrong user being associated.
Here's a suggested revision of your script for the 'else' part where you create a new user and then add the relationships.
else {
// User email not found or inactive
// Create User and Add Roles
var newUser = new GlideRecord('sys_user');
newUser.initialize();
newUser.first_name = input.nonUser.nonPUserfname;
newUser.last_name = input.nonUser.nonPUserlname;
newUser.email = input.nonUser.nonPUseremail;
newUser.u_function = input.nonUser.nonPUsertitle;
newUser.u_primary_contact_phone = input.nonUser.nonPusrphone;
newUser.time_zone = input.nonUser.nonPUsertimezone;
newUser.user_name = input.nonUser.nonPUseremail;
newUser.active = true; // Ensure the user is active
var newUserId = newUser.insert(); // This will be the sys_id of the newly created user
var table3 = [
{'tblname':'cmdb_rel_person', 'col1':'user', 'col2':'ci', 'dev_key':'devauthcaller', 'prod_key':'prodauthcaller'},
{'tblname':'u_m2m_sys_user_cmdb_ci_service', 'col1':'sys_user', 'col2':'u_cmdb_ci_service', 'dev_key':'devauthappr', 'prod_key':'prodauthappr'},
{'tblname':'u_m2m_from_cmdb_ci_service_watchlist', 'col1':'u_user', 'col2':'u_cmdb_ci_service', 'dev_key':'devwatchlist', 'prod_key':'prodwatchlist'}
];
table3.forEach(function(element) {
var k = 0;
var test2 = usedfor.split(",");
test2.forEach(function(value){
var graddNonUsrRole = new GlideRecord(element.tblname);
graddNonUsrRole.initialize();
graddNonUsrRole[element.col1] = newUserId; // Use newUserId instead of the email
graddNonUsrRole[element.col2] = res[k]; // Assuming res[k] contains the correct CI sys_id
if ((element.dev_key && value == "Development") || (element.prod_key && value == "Production")) {
graddNonUsrRole.insert();
}
k++;
});
});
gs.addInfoMessage("New user profile has been created and associated.");
}
Few things to remember, always use sys_id as it uniquely identifies the record and no chances of duplicate or incorrect data.
Basically you just need to add 2 lines of code and 1 update-
Note- I have used a new glideRecord object newUser
newUser.active = true; // Ensure the user is active
var newUserId = newUser.insert();
Then using the variable - newUserId in your code like below-
graddNonUsrRole.initialize();
graddNonUsrRole[element.col1] = newUserId; // Use newUserId instead of the email
This should solve your issue.
If my response has resolved your query, please consider giving it a thumbs up and marking it as the correct answer!
Thanks & Regards,
Sanjay Kumar