diff options
Diffstat (limited to 'rt/lib/RT/Ticket_Overlay.pm')
-rw-r--r-- | rt/lib/RT/Ticket_Overlay.pm | 123 |
1 files changed, 112 insertions, 11 deletions
diff --git a/rt/lib/RT/Ticket_Overlay.pm b/rt/lib/RT/Ticket_Overlay.pm index 9f1e26c0d..2feed28dd 100644 --- a/rt/lib/RT/Ticket_Overlay.pm +++ b/rt/lib/RT/Ticket_Overlay.pm @@ -81,6 +81,7 @@ use RT::Transactions; use RT::Reminders; use RT::URI::fsck_com_rt; use RT::URI; +use RT::URI::freeside; use MIME::Entity; @@ -471,13 +472,13 @@ sub Create { ); # Parameters passed in during an import that we probably don't want to touch, otherwise - foreach my $attr (qw(id Creator Created LastUpdated LastUpdatedBy)) { + foreach my $attr qw(id Creator Created LastUpdated LastUpdatedBy) { $params{$attr} = $args{$attr} if $args{$attr}; } # Delete null integer parameters foreach my $attr - (qw(TimeWorked TimeLeft TimeEstimated InitialPriority FinalPriority)) + qw(TimeWorked TimeLeft TimeEstimated InitialPriority FinalPriority) { delete $params{$attr} unless ( exists $params{$attr} && $params{$attr} ); @@ -617,11 +618,16 @@ sub Create { next; } } - + + #don't show transactions for reminders + my $silent = ( !$args{'_RecordTransaction'} + || $self->Type eq 'reminder' + ); + my ( $wval, $wmsg ) = $self->_AddLink( Type => $LINKTYPEMAP{$type}->{'Type'}, $LINKTYPEMAP{$type}->{'Mode'} => $link, - Silent => !$args{'_RecordTransaction'}, + Silent => $silent, 'Silent'. ( $LINKTYPEMAP{$type}->{'Mode'} eq 'Base'? 'Target': 'Base' ) => 1, ); @@ -631,6 +637,69 @@ sub Create { } # }}} + + # {{{ Deal with auto-customer association + + #unless we already have (a) customer(s)... + unless ( $self->Customers->Count ) { + + #first find any requestors with emails but *without* customer targets + my @NoCust_Requestors = + grep { $_->EmailAddress && ! $_->Customers->Count } + @{ $self->_Requestors->UserMembersObj->ItemsArrayRef }; + + for my $Requestor (@NoCust_Requestors) { + + #perhaps the stuff in here should be in a User method?? + my @Customers = + &RT::URI::freeside::email_search( email=>$Requestor->EmailAddress ); + + foreach my $custnum ( map $_->{'custnum'}, @Customers ) { + + ## false laziness w/RT/Interface/Web_Vendor.pm + my @link = ( 'Type' => 'MemberOf', + 'Target' => "freeside://freeside/cust_main/$custnum", + ); + + my( $val, $msg ) = $Requestor->_AddLink(@link); + #XXX should do something with $msg# push @non_fatal_errors, $msg; + + } + + } + + #find any requestors with customer targets + + my %cust_target = (); + + my @Requestors = + grep { $_->Customers->Count } + @{ $self->_Requestors->UserMembersObj->ItemsArrayRef }; + + foreach my $Requestor ( @Requestors ) { + foreach my $cust_link ( @{ $Requestor->Customers->ItemsArrayRef } ) { + $cust_target{ $cust_link->Target } = 1; + } + } + + #and then auto-associate this ticket with those customers + + foreach my $cust_target ( keys %cust_target ) { + + my @link = ( 'Type' => 'MemberOf', + #'Target' => "freeside://freeside/cust_main/$custnum", + 'Target' => $cust_target, + ); + + my( $val, $msg ) = $self->_AddLink(@link); + push @non_fatal_errors, $msg; + + } + + } + + # }}} + # Now that we've created the ticket and set up its metadata, we can actually go and check OwnTicket on the ticket itself. # This might be different than before in cases where extensions like RTIR are doing clever things with RT's ACL system if ( $DeferOwner ) { @@ -646,7 +715,6 @@ sub Create { } else { $Owner = $DeferOwner; $self->__Set(Field => 'Owner', Value => $Owner->id); - } $self->OwnerGroup->_AddMember( PrincipalId => $Owner->PrincipalId, @@ -654,7 +722,8 @@ sub Create { ); } - if ( $args{'_RecordTransaction'} ) { + #don't make a transaction or fire off any scrips for reminders either + if ( $args{'_RecordTransaction'} && $self->Type ne 'reminder' ) { # {{{ Add a transaction for the create my ( $Trans, $Msg, $TransObj ) = $self->_NewTransaction( @@ -666,7 +735,8 @@ sub Create { if ( $self->Id && $Trans ) { - $TransObj->UpdateCustomFields(ARGSRef => \%args); + #$TransObj->UpdateCustomFields(ARGSRef => \%args); + $TransObj->UpdateCustomFields(%args); $RT::Logger->info( "Ticket " . $self->Id . " created in queue '" . $QueueObj->Name . "' by " . $self->CurrentUser->Name ); $ErrStr = $self->loc( "Ticket [_1] created in queue '[_2]'", $self->Id, $QueueObj->Name ); @@ -745,7 +815,7 @@ sub _Parse822HeadersForAttributes { } - foreach my $date (qw(due starts started resolved)) { + foreach my $date qw(due starts started resolved) { my $dateobj = RT::Date->new($RT::SystemUser); if ( defined ($args{$date}) and $args{$date} =~ /^\d+$/ ) { $dateobj->Set( Format => 'unix', Value => $args{$date} ); @@ -1427,6 +1497,25 @@ sub Requestors { # }}} +# {{{ sub _Requestors + +=head2 _Requestors + +Private non-ACLed variant of Reqeustors so that we can look them up for the +purposes of customer auto-association during create. + +=cut + +sub _Requestors { + my $self = shift; + + my $group = RT::Group->new($RT::SystemUser); + $group->LoadTicketRoleGroup(Type => 'Requestor', Ticket => $self->Id); + return ($group); +} + +# }}} + # {{{ sub Cc =head2 Cc @@ -2134,6 +2223,7 @@ sub _RecordNote { NoteType => 'Correspond', TimeTaken => 0, CommitScrips => 1, + CustomFields => {}, @_ ); @@ -2190,6 +2280,7 @@ sub _RecordNote { TimeTaken => $args{'TimeTaken'}, MIMEObj => $args{'MIMEObj'}, CommitScrips => $args{'CommitScrips'}, + CustomFields => $args{'CustomFields'}, ); unless ($Trans) { @@ -2224,6 +2315,16 @@ sub _Links { return $links; } + # without this you will also get RT::User(s) instead of tickets! + if ($field == 'Base' and $type == 'MemberOf') { + my $rtname = RT->Config->Get('rtname'); + $links->Limit( + FIELD => 'Base', + OPERATOR => 'STARTSWITH', + VALUE => "fsck.com-rt://$rtname/ticket/", + ); + } + # Maybe this ticket is a merge ticket my $limit_on = 'Local'. $field; # at least to myself @@ -2600,7 +2701,7 @@ sub MergeInto { } # Update time fields - foreach my $type (qw(TimeEstimated TimeWorked TimeLeft)) { + foreach my $type qw(TimeEstimated TimeWorked TimeLeft) { my $mutator = "Set$type"; $MergeInto->$mutator( @@ -2608,7 +2709,7 @@ sub MergeInto { } #add all of this ticket's watchers to that ticket. - foreach my $watcher_type (qw(Requestors Cc AdminCc)) { + foreach my $watcher_type qw(Requestors Cc AdminCc) { my $people = $self->$watcher_type->MembersObj; my $addwatcher_type = $watcher_type; @@ -3226,7 +3327,7 @@ sub _ApplyTransactionBatch { my $batch = $self->TransactionBatch; my %seen; - my $types = join ',', grep !$seen{$_}++, grep defined, map $_->__Value('Type'), grep defined, @{$batch}; + my $types = join ',', grep !$seen{$_}++, grep defined, map $_->Type, grep defined, @{$batch}; require RT::Scrips; RT::Scrips->new($RT::SystemUser)->Apply( |