OnMerge: Difference between revisions
Jump to navigation
Jump to search
(Changed code to handle multiple value fields and to actually merge, not overwrite) |
mNo edit summary |
||
(2 intermediate revisions by 2 users not shown) | |||
Line 22: | Line 22: | ||
=== Custom Condition === | === Custom Condition === | ||
< | <pre> | ||
#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; | |||
</pre> | |||
=== Custom Action Preperation Code === | |||
<pre> | |||
#nothing to do here.. just return | |||
return 1; | |||
</pre> | |||
=== Custom Action Cleanup Code === | |||
<pre> | |||
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 | #The old Ticket your merging From | ||
my $oldTicket = RT::Ticket->new($RT::SystemUser); | 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)); | |||
# | |||
my @ | |||
my | |||
#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; | |||
</pre> | |||
[[Category:Alternate Custom Action Cleanup Code for Multiple Entries]] | [[Category:Alternate Custom Action Cleanup Code for Multiple Entries]] |
Latest revision as of 17:51, 13 August 2016
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;