diff options
Diffstat (limited to 'FS')
-rw-r--r-- | FS/FS/ClientAPI/MyAccount.pm | 53 | ||||
-rw-r--r-- | FS/FS/TicketSystem/RT_Internal.pm | 85 |
2 files changed, 138 insertions, 0 deletions
diff --git a/FS/FS/ClientAPI/MyAccount.pm b/FS/FS/ClientAPI/MyAccount.pm index 181c994c4..2e84dffd8 100644 --- a/FS/FS/ClientAPI/MyAccount.pm +++ b/FS/FS/ClientAPI/MyAccount.pm @@ -1789,6 +1789,59 @@ sub create_ticket { } +sub get_ticket { + my $p = shift; + my($context, $session, $custnum) = _custoragent_session_custnum($p); + return { 'error' => $session } if $context eq 'error'; + + warn "$me get_ticket: initializing ticket system\n" if $DEBUG; + FS::TicketSystem->init(); + + if(length($p->{'reply'})) { + my @err_or_res = FS::TicketSystem->correspond_ticket( + '', #create RT session based on FS CurrentUser (fs_selfservice) + 'ticket_id' => $p->{'ticket_id'}, + 'content' => $p->{'reply'}, + ); + + return { 'error' => 'unable to reply to ticket' } + unless ( $err_or_res[0] != 0 && defined $err_or_res[2] ); + } + + warn "$me get_ticket: getting ticket\n" if $DEBUG; + my $err_or_ticket = FS::TicketSystem->get_ticket( + '', #create RT session based on FS CurrentUser (fs_selfservice) + 'ticket_id' => $p->{'ticket_id'}, + ); + + if ( ref($err_or_ticket) ) { + +# since we're bypassing the RT security/permissions model by always using +# fs_selfservice as the RT user (as opposed to a requestor, which we +# can't do since we want all tickets linked to a cust), we check below whether +# the requested ticket was actually linked to this customer + my @custs = @{$err_or_ticket->{'custs'}}; + my @txns = @{$err_or_ticket->{'txns'}}; + + return { 'error' => 'no customer' } unless ( $custnum && scalar(@custs) ); + + return { 'error' => 'invalid ticket requested' } + unless grep($_ eq $custnum, @custs); + + warn "$me get_ticket: sucessful: \n" + if $DEBUG; + return { 'error' => '', + 'transactions' => \@txns, + 'ticket_id' => $p->{'ticket_id'}, + }; + } else { + warn "$me create_ticket: unsucessful: $err_or_ticket\n" + if $DEBUG; + return { 'error' => $err_or_ticket }; + } +} + + #-- sub _custoragent_session_custnum { diff --git a/FS/FS/TicketSystem/RT_Internal.pm b/FS/FS/TicketSystem/RT_Internal.pm index 4036d9005..6fc2bb666 100644 --- a/FS/FS/TicketSystem/RT_Internal.pm +++ b/FS/FS/TicketSystem/RT_Internal.pm @@ -215,6 +215,91 @@ sub create_ticket { $Ticket; } +=item get_ticket SESSION_HASHREF, OPTION => VALUE ... + +Class method. Retrieves a ticket. If there is an error, returns the scalar +error. Otherwise, currently returns a slightly tricky data structure containing +a list of the linked customers and each transaction's content, description, and +create time. + +Accepts the following options: + +=over 4 + +=item ticket_id + +The ticket id + +=back + +=cut + +sub get_ticket { + my($self, $session, %param) = @_; + + $session = $self->session($session); + + my $Ticket = RT::Ticket->new($session->{'CurrentUser'}); + my $ticketid = $Ticket->Load( $param{'ticket_id'} ); + return 'Could not load ticket' unless $ticketid; + + my @custs = (); + foreach my $link ( @{ $Ticket->Customers->ItemsArrayRef } ) { + my $cust = $link->Target; + push @custs, $1 if $cust =~ /\/(\d+)$/; + } + + my @txns = (); + my $transactions = $Ticket->Transactions; + while ( my $transaction = $transactions->Next ) { + my $t = { created => $transaction->Created, + content => $transaction->Content, + description => $transaction->Description, + }; + push @txns, $t; + } + + { txns => [ @txns ], + custs => [ @custs ], + }; +} + + +=item correspond_ticket SESSION_HASHREF, OPTION => VALUE ... + +Class method. Correspond on a ticket. If there is an error, returns the scalar +error. Otherwise, returns the transaction id, error message, and +RT::Transaction object. + +Accepts the following options: + +=over 4 + +=item ticket_id + +The ticket id + +=item content + +Correspondence content + +=back + +=cut + +sub correspond_ticket { + my($self, $session, %param) = @_; + + $session = $self->session($session); + + my $Ticket = RT::Ticket->new($session->{'CurrentUser'}); + my $ticketid = $Ticket->Load( $param{'ticket_id'} ); + return 'Could not load ticket' unless $ticketid; + return 'No content' unless $param{'content'}; + + $Ticket->Correspond( Content => $param{'content'} ); +} + #shameless false laziness w/RT::Interface::Web::AttemptExternalAuth # to get logged into RT from afar sub _web_external_auth { |