Server side script help to create new user and relationship from widget

DPrasna
Tera Contributor

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. 

var grgetUser = new GlideRecord("sys_user");
grgetUser.addQuery("email",input.nonUser.nonPUseremail);
grgetUser.addQuery("active","true");
grgetUser.query();
if (grgetUser.next()) {
......
}
else
{
...
}
 
the if part checks for existing email and if it is active it adds the user to the relationship(if there exist none)
on else part this is what is expected.
 else part means either the email does exist and inactive or the email does not exist at all.
1. so if it is case 1. if input email exist but inactive, I want a new user record to be created with same email and insert the values accordingly and add them to the relationship on respective tables.
 
Now, with the above script it does create a new user:
 

 

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 

1 REPLY 1

Community Alums
Not applicable

 

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