1 # Copyright (c) 2004 Ivan Kohler <ivan-rt@420.am>
2 # Copyright (c) 2008 Freeside Internet Services, Inc.
4 # This work is made available to you under the terms of Version 2 of
5 # the GNU General Public License. A copy of that license should have
6 # been provided with this software, but in any event can be snarfed
9 # This work is distributed in the hope that it will be useful, but
10 # WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 # General Public License for more details.
16 RT::Interface::Web_Vendor
22 Freeside vendor overlay for RT::Interface::Web.
26 use_ok(RT::Interface::Web_Vendor);
32 #package RT::Interface::Web;
35 package HTML::Mason::Commands;
37 no warnings qw(redefine);
39 =head2 ProcessTicketCustomers
43 sub ProcessTicketCustomers {
52 my $Ticket = $args{'TicketObj'};
53 my $ARGSRef = $args{'ARGSRef'};
54 my $Debug = $args{'Debug'};
55 my $me = 'ProcessTicketCustomers';
57 ### false laziness w/RT::Interface::Web::ProcessTicketLinks
58 # Delete links that are gone gone gone.
59 foreach my $arg ( keys %$ARGSRef ) {
60 if ( $arg =~ /DeleteLink-(.*?)-(DependsOn|MemberOf|RefersTo)-(.*)$/ ) {
66 "Trying to delete: Base: $base Target: $target Type $type";
67 my ( $val, $msg ) = $Ticket->DeleteLink( Base => $base,
82 my @custnums = map { /^Ticket-AddCustomer-(\d+)$/; $1 }
83 grep { /^Ticket-AddCustomer-(\d+)$/ && $ARGSRef->{$_} }
86 #my @delete_custnums =
87 # map { /^Ticket-AddCustomer-(\d+)$/; $1 }
88 # grep { /^Ticket-AddCustomer-(\d+)$/ && $ARGSRef->{$_} }
92 #figure out if we're going to auto-link requestors, and find them if so
95 my $num_cur_cust = $Ticket->Customers->Count;
96 my $num_new_cust = scalar(@custnums);
97 warn "$me: $num_cur_cust current customers / $num_new_cust new customers\n"
100 #if we're linking the first ticket to one customer
101 my $link_requestors = ( $num_cur_cust == 0 && $num_new_cust == 1 );
102 warn "$me: adding a single customer to a previously customerless".
103 " ticket, so linking customers to requestor too\n"
104 if $Debug && $link_requestors;
107 if ( $link_requestors ) {
109 #find any requestors without customers
111 grep { ! $_->Customers->Count }
112 @{ $Ticket->Requestors->UserMembersObj->ItemsArrayRef };
114 warn "$me: found ". scalar(@Requestors). " requestors without".
115 " customers; linking them\n"
121 #link ticket (and requestors) to customers
124 foreach my $custnum ( @custnums ) {
126 my @link = ( 'Type' => 'MemberOf',
127 'Target' => "freeside://freeside/cust_main/$custnum",
130 my( $val, $msg ) = $Ticket->AddLink(@link);
133 #add customer links to requestors
134 foreach my $Requestor ( @Requestors ) {
135 my( $val, $msg ) = $Requestor->AddLink(@link);
137 warn "$me: linking requestor to custnum $custnum: $msg\n"
147 #false laziness w/above... eventually it should go away in favor of this
148 sub ProcessObjectCustomers {
156 my $Object = $args{'Object'};
157 my $ARGSRef = $args{'ARGSRef'};
159 ### false laziness w/RT::Interface::Web::ProcessTicketLinks
160 # Delete links that are gone gone gone.
161 foreach my $arg ( keys %$ARGSRef ) {
162 if ( $arg =~ /DeleteLink-(.*?)-(DependsOn|MemberOf|RefersTo)-(.*)$/ ) {
168 "Trying to delete: Base: $base Target: $target Type $type";
169 my ( $val, $msg ) = $Object->DeleteLink( Base => $base,
180 #my @delete_custnums =
181 # map { /^Object-AddCustomer-(\d+)$/; $1 }
182 # grep { /^Object-AddCustomer-(\d+)$/ && $ARGSRef->{$_} }
185 my @custnums = map { /^Object-AddCustomer-(\d+)$/; $1 }
186 grep { /^Object-AddCustomer-(\d+)$/ && $ARGSRef->{$_} }
189 foreach my $custnum ( @custnums ) {
191 $Object->AddLink( 'Type' => 'MemberOf',
192 'Target' => "freeside://freeside/cust_main/$custnum",
201 =head2 ProcessTicketBasics ( TicketObj => $Ticket, ARGSRef => \%ARGS );
203 Updates all core ticket fields except Status, and returns an array of results
208 sub ProcessTicketBasics {
216 my $TicketObj = $args{'TicketObj'};
217 my $ARGSRef = $args{'ARGSRef'};
219 # {{{ Set basic fields
231 if ( $ARGSRef->{'Queue'} and ( $ARGSRef->{'Queue'} !~ /^(\d+)$/ ) ) {
232 my $tempqueue = RT::Queue->new($RT::SystemUser);
233 $tempqueue->Load( $ARGSRef->{'Queue'} );
234 if ( $tempqueue->id ) {
235 $ARGSRef->{'Queue'} = $tempqueue->id;
239 my @results = UpdateRecordObject(
240 AttributesRef => \@attribs,
241 Object => $TicketObj,
245 # We special case owner changing, so we can use ForceOwnerChange
246 if ( $ARGSRef->{'Owner'} && ( $TicketObj->Owner != $ARGSRef->{'Owner'} ) ) {
248 if ( $ARGSRef->{'ForceOwnerChange'} ) {
249 $ChownType = "Force";
254 my ( $val, $msg ) = $TicketObj->SetOwner( $ARGSRef->{'Owner'}, $ChownType );
255 push( @results, $msg );
263 =head2 ProcessTicketStatus (TicketObj => RT::Ticket, ARGSRef => {})
265 Process updates to the 'Status' field of the ticket. If the new value
266 of Status is 'resolved', this will check required custom fields before
271 sub ProcessTicketStatus {
278 my $TicketObj = $args{'TicketObj'};
279 my $ARGSRef = $args{'ARGSRef'};
282 return () if !$ARGSRef->{'Status'};
284 if ( lc( $ARGSRef->{'Status'} ) eq 'resolved' ) {
285 foreach my $field ( $TicketObj->MissingRequiredFields ) {
286 push @results, loc('Missing required field: [_1]', $field->Name);
290 $m->notes('RedirectToBasics' => 1);
294 return UpdateRecordObject(
295 AttributesRef => [ 'Status' ],
296 Object => $TicketObj,