OnMerge
Jump to navigation
Jump to search
Return true if current transaction is merge action.
Custom condition code:
my $txn = $self->TransactionObj; return undef unless $txn->Type =~ /^AddLink$/i; return undef unless $txn->Field =~ /^MergedInto$/i; return 1;
If you need to refer to the original ticket id in a template it is available as $Transaction->ObjectId.
Variation:
Another Variation that says, if we are merging from a queue into a set of queues, and data from the merging tickets Custom fields need to be populated into the ticket your merging into..
Description: OnMergeCF Condition: User Defined Action: User Defined Template: Global Template: Transaction State: TransactionCreate
Custom Condition
#Transaction Association
my $txn = $self->TransactionObj;
#Condition on Type
return undef unless $txn->Type =~ /^AddLink$/i;
return undef unless $txn->Field =~ /^MergedInto$/i;
$RT::Logger->info('Merge is Occurring');
#Ticket Association
#The New Ticket your Merging into
my $ticket = $self->TicketObj;
#The old Ticket your merging From
my $oldTicket = RT::Ticket->new($RT::SystemUser);
$oldTicket->LoadById($txn->ObjectId);
$RT::Logger->info('Merging '.$txn->ObjectId.' into '.$ticket->Id);
#Are we merging from the right queue?
my $oldqueue = $oldTicket->Queue;
return undef unless $oldqueue == 36;
$RT::Logger->info('Merging From Lead Tracking Queue');
#Are we merging into an allowed queue?
my @queues = qw(Enrollment/Recruitment Installation Accounting HealthCheck/Follow-up);
my $queue = $ticket->QueueObj->Name;
my $qCount = grep(/\Q$queue\E/,@queues);
return undef unless $qCount >= 1;
$RT::Logger->info('Merging into an allowed Queue');
return 1;
Custom Action Preperation Code
#nothing to do here.. just return return 1;
Custom Action Cleanup Code
use List::MoreUtils qw/ uniq /;
#Define the Custom Field Name Were Going to Play with.
my $CFName = 'Lead Source';
#Transaction Association
my $txnObj = $self->TransactionObj;
#Ticket Association
#The New Ticket your Merging into
my $ticketObj = $self->TicketObj;
my $queueObj = $self->TicketObj->QueueObj;
my $CFObj = RT::CustomField->new($RT::SystemUser);
$CFObj->LoadByNameAndQueue(Name => $CFName, Queue => $queueObj->id);
unless($CFObj->id) {
$CFObj->LoadByNameAndQueue(Name => $CFName, Queue=>0);
unless($CFObj->id){
$RT::Logger->warning("Custom Field: $CFName not for this Queue");
return undef;
};
};
#The old Ticket your merging From
my $oldTicket = RT::Ticket->new($RT::SystemUser);
$oldTicket->LoadById($txnObj->ObjectId);
#skip merge into same ticket
return undef if $oldTicket->id() == $ticketObj->id();
#Extract the fields (including multifields) from both tickets
my @cfv1 = sort(uniq(split(/\n/, $oldTicket->CustomFieldValuesAsString($CFName))));
my @cfv2 = split(/\n/, $ticketObj->CustomFieldValuesAsString($CFName));
#Merge in the fields from the old ticket into the new ticket
my $cfv = "";
foreach $cfv (@cfv1)
{
if(! grep { $_ eq $cfv} @cfv2 )
{
#$RT::Logger->warning("cfv: adding ". $cfv);
my ($st, $msg) = $ticketObj->AddCustomFieldValue(
Field => $CFObj->id,
Value => $cfv,
RecordTransaction => 0
);
unless ($st){
$RT::Logger->warning("Odd we couldn't set $CFName to $cfv");
};
}
}
return 1;