%# Senate, n.:
%# A body of elderly gentlemen charged with high duties and misdemeanors.
%# -- Ambrose Bierce
<%INIT>
if ($ApprovalId) {
my $Approval = LoadTicket($ApprovalId);
my $Ticket = $Approval->OriginObj;
foreach my $key (keys %ARGS) {
$key =~ /^AddMoreEntry-(.*)$/ or next;
$ARGS{'AddMoreEntry'} = [ split(/-/, $1) ];
}
my $Entries = $m->comp('/Work/Tickets/Elements/ProcessEntryUpdates', TicketObj => $Ticket, %ARGS);
$ARGS{"Ticket-".$Ticket->Id."-CustomField-$_-Values"} = $Entries->{$_} foreach keys %{$Entries};
ProcessTicketCustomFieldUpdates( ARGSRef => \%ARGS );
if ($ARGS{'AddMoreEntry'}) {
return $m->comp('Display.html', %ARGS);
}
}
foreach my $key (reverse sort keys %ARGS) {
$key =~ /^Approval-(\d+)-(Action|Content)$/ or next;
my ($id, $mode) = ($1, $2);
my $Approval = LoadTicket($id);
if ( $mode eq 'Content' ) {
$ARGS{$key} =~ /\S/ or next;
my $method = ($ARGS{"Approval-$id-Action"} eq 'None') ? 'Correspond' : 'Comment';
my $notes = MIME::Entity->build( Data => [ $ARGS{$key} ] );
RT::I18N::SetMIMEEntityToUTF8($notes); # convert text parts into utf-8
$Approval->$method( MIMEObj => $notes, _reopen => 0, _open => 0 );
if ($RT::OIN104 and $method eq 'Correspond') {
# XXX - for some reason jimmy wants to attach it to the parent
my $Ticket = $Approval->OriginObj;
local *RT::Scrips::Apply = sub { return 1 };
my $notes = MIME::Entity->build( Data => [
loc("Approver's notes: [_1]", $ARGS{$key})
] );
$Ticket->Correspond( MIMEObj => $notes, _reopen => 0, _open => 0 );
}
next;
}
# Okay, here is the Action part.
my $Action = $ARGS{$key};
if ( $Action eq 'Deny' ) {
$Approval->SetStatus('rejected');
}
elsif ( $Action eq 'Approve' ) {
if ( my $owner = $ARGS{"Approval-$id-Owner"} ) {
my $Transfer = RT::Ticket->new($RT::SystemUser);
$Transfer->Create(
Type => 'approval',
Owner => $owner,
Subject => loc("Transferred Approval"),
Queue => $Approval->Queue,
);
$Transfer->SetOriginObj( $Approval->OriginObj );
my $links = $Approval->DependedOnBy->ItemsArrayRef;
foreach my $link (@$links) {
my $child = $link->BaseObj or next;
$Transfer->AddLink(
Type => 'DependsOn',
Base => $child->Id,
Silent => 1,
);
$link->Delete unless $child->Type eq 'ticket';
}
$Approval->AddLink(
Type => 'DependsOn',
Base => $Transfer->Id,
Silent => 1,
);
$Approval->SetStatus('resolved');
delete $session{"Approval-$id-Owner"};
next;
}
# XXX - eventually factor this out to RT::Ticket.
my @proc = $Approval;
while (my $TicketObj = shift(@proc)) {
$TicketObj->SetStatus('resolved');
my $deps = RT::Tickets->new($session{'CurrentUser'});
$deps->LimitStatus(VALUE => 'open');
$deps->LimitStatus(VALUE => 'stalled');
$deps->LimitType(VALUE => 'approval');
$deps->LimitDependsOn($TicketObj->Id);
$deps->LimitOwner(VALUE => $session{'CurrentUser'}->UserObj->Id);
push @proc, @{ $deps->ItemsArrayRef || [] };
}
}
}
%INIT>
<%ARGS>
$ApprovalId => undef
%ARGS>