ConvertLegacyToRt
#!/tools/bin/perl -w
#-----------------------------------------------------------------------------
# convert change request data from a Flat File from a Legacy sys to RT.
# Turn OFF RT and then change your RT_SiteConfig.pm to turn off logging.
# Be sure to TURN OFF all scrips either before being RT down or via DBA/SQL.
# scrips will try to run and logging will make the program run FOREVER!!
# flat file input can be created by via Data::Dumper;
# Obviously, field names will be different. OUR Data Names are all CAPS_CAPS
# We built tickets, CF's into two different queues, ES-HRIS & ES-LETS
# We also have an extra Ticket Status value of "QA testing".
#----------------------------------------------------------------------------
use strict;
use lib "/$RTHome/rt/perl/lib";
use lib "/$RTHome/rt/lib";
use RT;
use RT::Ticket;
use RT::Transaction;
use RT::Attachment;
use MIME::Entity;
#-----------------------------------------------------------------------------
# process all requests into tickets
#-----------------------------------------------------------------------------
sub Read_Temp_File
{
my ( $fh ) = @_;
my
(
$in,
$objectId,
$evt,
$VAR1, #Dumper default variable name
$k,
$n,
);
while ( $in = <$fh> )
{
chomp $in;
eval $in; #instantiates $VAR1 as hash object of change_request and associated change_events
#print $VAR1->{REQUEST}, ' ', $VAR1->{DESCR_SHORT}, "\n";
foreach $k ( qw/MOVED_TO_PRODUCTION_DT QA_APPROVAL_DT/ )
{
if ( $VAR1->{$k} gt ' ' )
{
if ( $VAR1->{$k} > '2038' || $VAR1->{$k} < '2001' )
{
$VAR1->{$k} = '2038-01-01'; #max RT date year
}
}
}
$objectId = New_Ticket( $VAR1 ); #ObjectId = Ticket.id
foreach $evt ( @{$VAR1->{EVENTS}} )
{
$evt->{ObjectId} = $objectId;
$evt->{TransactionId} = New_Transaction( $evt ); #TransactionId = Transaction.id
New_Attachment( $evt );
}
}
}
#-----------------------------------------------------------------------------
# create Ticket for one request
#-----------------------------------------------------------------------------
sub New_Ticket
{
my ( $req ) = @_;
my
(
$ticket,
$mimeObj,
$ticketid,
$transaction_object,
$err,
$rc,
$status,
$cc,
$ccid,
$grp,
$mem,
$memberid,
$priority,
$rejected,
%ticket_vals,
%req_type_HRIS,
%req_type_LETS,
);
%req_type_LETS =
(
B => "Batch",
D => "Data Problems",
E => "Enhancements",
G => "Role removal",
L => "LETS Forms",
M => "LETSLite",
O => "Other",
R => "Reports",
T => "Weblets",
U => "Urgent Production Problem",
W => "Weblets Forms",
);
%req_type_HRIS =
(
A => "Access",
C => "Crystal",
G => "Upgrade",
H => "HRIS Online",
I => "LANOPS",
K => "Shell Script",
L => "LDRS Data Problems",
M => "HR Data Correction",
O => "Other",
P => "Perl Batch",
Q => "PS Query",
S => "SQR",
T => "WebLETS",
U => "UNIX",
V => "Inquiry",
W => "HR Web Apps",
X => "QA Test w/o System Change",
);
$ticket = RT::Ticket->new( $RT::SystemUser );
$mimeObj = MIME::Entity->build(Data => $req->{DESCR_LONG}, Type => 'text/plain');
if ( $req->{PRIORITY} le '5' )
{
$priority = $req->{PRIORITY};
$rejected = 0;
}
else
{
$priority = '5';
$rejected = 1;
}
%ticket_vals =
(
Subject => $req->{DESCR_SHORT},
MIMEObj => $mimeObj,
Creator => User_Id_For_Name( $req->{INITIATED_BY} ), #API bug won't look up corresponding id for name
Owner => $req->{DEVELOPER},
Requestor => $req->{INITIATED_BY},
Priority => $priority,
InitialPriority => $priority,
FinalPriority => $priority,
Created => $req->{CREATE_DT},
Started => $req->{DEVELOPER_ASSIGNED_DT},
Resolved => $req->{MOVED_TO_PRODUCTION_DT},
LastUpdated => $req->{ACTION_DT},
Status => StatusLookup( $req, $rejected ),
);
if ( $req->{TEAM} eq 'L' )
{
$ticket_vals{Queue} = 'ES-LETS';
}
else
{
$ticket_vals{Queue} = 'ES-HRIS';
}
( $ticketid, $transaction_object, $err ) = $ticket->Create( %ticket_vals );
print "New_Ticket request=", $req->{REQUEST}, " $err \n"; #debug
die "New_Ticket Error: $err \n" unless $ticketid;
( $rc, $err ) = $ticket->AddCustomFieldValue( Field => 'Description', Value => $req->{DESCR_LONG} );
( $rc, $err ) = $ticket->AddCustomFieldValue( Field => 'Reference Number', Value => $req->{REQUEST} );
( $rc, $err ) = $ticket->AddCustomFieldValue( Field => 'Work-Completed Date', Value => $req->{DEVELOPER_APPROVAL_DT} );
print "Work-Completed Date $rc $err\n";
( $rc, $err ) = $ticket->AddCustomFieldValue( Field => 'QA Approval Date', Value => $req->{QA_APPROVAL_DT} );
print "QA Approval Date $rc $err\n";
if ( $req->{TEAM} eq 'L' )
{
( $rc, $err ) = $ticket->AddCustomFieldValue( Field => 'LETS-QA Approvers List', Value => $req->{QA_PERSON} );
( $rc, $err ) = $ticket->AddCustomFieldValue( Field => 'LETS-Migrators List', Value => $req->{ZZ_PROMOTER} );
( $rc, $err ) = $ticket->AddCustomFieldValue( Field => 'LETS-Request Type', Value => $req_type_lets{$req->{REQUEST_TYPE}} );
print "LETS-Request Type $rc $err\n";
}
else
{
( $rc, $err ) = $ticket->AddCustomFieldValue( Field => 'HRIS-QA Approvers List', Value => $req->{QA_PERSON} );
( $rc, $err ) = $ticket->AddCustomFieldValue( Field => 'HRIS-Migrators List', Value => $req->{ZZ_PROMOTER} );
( $rc, $err ) = $ticket->AddCustomFieldValue( Field => 'HRIS-Request Type', Value => $req_type_hris{$req->{REQUEST_TYPE}} );
print "HRIS-Request Type $rc $err\n";
}
if ( $req->{CC} )
{
foreach $cc ( split( /[,\s+]/, $req->{CC} ) )
{
if ( $cc && $cc =~ /xxx\.xxx/i ) #xxx is your email address stuff like yahoo.com
{
( $cc ) = $cc =~ /(.*?)\@/; #remove @domain.ext
$ccid = User_Id_For_Name( $cc );
unless ( $ccid == 1 ) #skip Nobody
{
print "Adding CC $cc $ccid\n"; #debug
$ticket->AddWatcher( Type => 'Cc', PrincipalId => $ccid );
}
}
}
}
return $ticketid; #Ticket.id
}
#-----------------------------------------------------------------------------
# create email-like mime object from event as attachment.
#-----------------------------------------------------------------------------
sub New_Attachment
{
my ( $evt ) = @_;
my
(
$att,
$mimeObj,
$id,
$transaction_object,
$err,
);
$mimeObj = MIME::Entity->build(
Subject => substr( $evt->{DESCR_LONG}, 0, 77 ) . '...',
Data => $evt->{DESCR_LONG},
Date => $evt->{CREATE_DT},
From => $evt->{INITIATED_BY},
);
$att = RT::Attachment->new( $RT::SystemUser );
( $id, $transaction_object, $err ) = $att->Create(
TransactionId => $evt->{TransactionId},
Attachment => $mimeObj,
);
die "New_Attachment Error $err \n" unless $id;
}
#-----------------------------------------------------------------------------
# create Transaction for change_event
#-----------------------------------------------------------------------------
sub New_Transaction
{
my ( $evt ) = @_;
my
(
$trn,
$id,
$transaction_object,
$err,
);
$trn = RT::Transaction->new( $RT::SystemUser );
( $id, $transaction_object, $err ) = $trn->Create(
ObjectId => $evt->{ObjectId},
ObjectType => 'RT::Ticket',
Type => 'Comment',
Created => $evt->{CREATE_DT},
);
die "New_Transaction Error $err \n" unless $id;
return $id;
}
#------------------------------------------------------------------------------
# status logic based on dates
#------------------------------------------------------------------------------
sub StatusLookup
{
my ( $req, $rejected ) = @_;
my
(
$status,
);
if ( $rejected )
{
$status = 'rejected';
}
elsif ( $req->{MOVED_TO_PRODUCTION_DT} gt ' ' )
{
$status = 'resolved';
}
elsif ( $req->{QA_APPROVAL_DT} gt ' ' )
{
$status = 'QA testing';
}
elsif ( $req->{DEVELOPER_APPROVAL_DT} gt ' ' )
{
$status = 'QA testing';
}
elsif ( $req->{DEVELOPER_ASSIGNED_DT} gt ' ' )
{
$status = 'open';
}
else
{
$status = 'new';
}
return $status;
}
#-----------------------------------------------------------------------------
# return Id for LDAP Name - case insensitive
#-----------------------------------------------------------------------------
{ #scope
my $ids;
sub User_Id_For_Name
{
my ( $name ) = @_;
my
(
$users,
$u,
);
unless ( $ids->{XXXXXXX} ) #XXXXXX is the UserID of the person running the job
{
$users = RT::Users->new($RT::SystemUser);
$users->UnLimit();
while ( $u = $users->Next() )
{
$ids->{uc $u->Name} = $u->id;
}
}
return $ids->{uc $name} || 1; #default Nobody
}
} #scope
#-----------------------------------------------------------------------------
# main
#-----------------------------------------------------------------------------
my
(
$fh,
$fname,
);
RT::LoadConfig();
RT::Init();
$fname = '/var/tmp/chg_req_2_rt.txt';
$fh = IO::File->new( "$fname" ) or die "cannot open $fname $!\n";
Read_Temp_File( $fh );
$fh->close();
Contributed by Kenn