1# BEGIN BPS TAGGED BLOCK {{{ 2# 3# COPYRIGHT: 4# 5# This software is Copyright (c) 1996-2021 Best Practical Solutions, LLC 6# <sales@bestpractical.com> 7# 8# (Except where explicitly superseded by other copyright notices) 9# 10# 11# LICENSE: 12# 13# This work is made available to you under the terms of Version 2 of 14# the GNU General Public License. A copy of that license should have 15# been provided with this software, but in any event can be snarfed 16# from www.gnu.org. 17# 18# This work is distributed in the hope that it will be useful, but 19# WITHOUT ANY WARRANTY; without even the implied warranty of 20# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 21# General Public License for more details. 22# 23# You should have received a copy of the GNU General Public License 24# along with this program; if not, write to the Free Software 25# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 26# 02110-1301 or visit their web page on the internet at 27# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. 28# 29# 30# CONTRIBUTION SUBMISSION POLICY: 31# 32# (The following paragraph is not intended to limit the rights granted 33# to you to modify and distribute this software under the terms of 34# the GNU General Public License and is only of importance to you if 35# you choose to contribute your changes and enhancements to the 36# community by submitting them to Best Practical Solutions, LLC.) 37# 38# By intentionally submitting any modifications, corrections or 39# derivatives to this work, or any other work intended for use with 40# Request Tracker, to Best Practical Solutions, LLC, you confirm that 41# you are the copyright holder for those contributions and you grant 42# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, 43# royalty-free, perpetual, license to use, copy, create derivative 44# works based on those contributions, and sublicense and distribute 45# those contributions and any derivatives thereof. 46# 47# END BPS TAGGED BLOCK }}} 48 49package RT::Approval::Rule::Rejected; 50use strict; 51use warnings; 52use base 'RT::Approval::Rule'; 53 54use constant Description => "If an approval is rejected, reject the original and delete pending approvals"; # loc 55 56sub Prepare { 57 my $self = shift; 58 return unless $self->SUPER::Prepare(); 59 60 return (0) 61 unless $self->OnStatusChange('rejected') or $self->OnStatusChange('deleted') 62} 63 64sub Commit { # XXX: from custom prepare code 65 my $self = shift; 66 if ( my ($rejected) = 67 $self->TicketObj->AllDependedOnBy( Type => 'ticket' ) ) { 68 my $note = $self->GetNotes; 69 70 my $template = $self->GetTemplate('Approval Rejected', 71 TicketObj => $rejected, 72 Approval => $self->TicketObj, 73 Approver => $self->TransactionObj->CreatorObj, 74 Notes => $note); 75 76 $rejected->Correspond( MIMEObj => $template->MIMEObj ); 77 $rejected->SetStatus( 78 Status => $rejected->LifecycleObj->DefaultStatus('denied') || 'rejected', 79 Force => 1, 80 ); 81 } 82 my $links = $self->TicketObj->DependedOnBy; 83 foreach my $link ( @{ $links->ItemsArrayRef } ) { 84 my $obj = $link->BaseObj; 85 if ( $obj->QueueObj->IsActiveStatus( $obj->Status ) ) { 86 if ( $obj->Type eq 'approval' ) { 87 $obj->SetStatus( 88 Status => 'deleted', 89 Force => 1, 90 ); 91 } 92 } 93 } 94 95 $links = $self->TicketObj->DependsOn; 96 foreach my $link ( @{ $links->ItemsArrayRef } ) { 97 my $obj = $link->TargetObj; 98 if ( $obj->QueueObj->IsActiveStatus( $obj->Status ) ) { 99 $obj->SetStatus( 100 Status => 'deleted', 101 Force => 1, 102 ); 103 } 104 } 105 106} 107 108sub GetNotes { 109 my $self = shift; 110 my $note = ''; 111 112 if ( RT->Config->Get('ApprovalRejectionNotes') ) { 113 my $t = $self->TicketObj->Transactions; 114 while ( my $o = $t->Next ) { 115 next unless $o->Type eq 'Correspond'; 116 $note .= $o->Content . "\n" if $o->ContentObj; 117 } 118 } 119 return $note; 120} 121 122RT::Base->_ImportOverlays(); 123 1241; 125