From 7c5c97fd11e04b0e71afed4d014ca5de6e05015a Mon Sep 17 00:00:00 2001 From: levinse Date: Fri, 17 Dec 2010 01:16:04 +0000 Subject: [PATCH] self-service improvements, RT10883 --- FS/FS/ClientAPI/MyAccount.pm | 53 ++++++++++++++ FS/FS/TicketSystem/RT_Internal.pm | 85 +++++++++++++++++++++++ fs_selfservice/FS-SelfService/SelfService.pm | 1 + fs_selfservice/FS-SelfService/cgi/myaccount.html | 3 +- fs_selfservice/FS-SelfService/cgi/selfservice.cgi | 11 ++- fs_selfservice/FS-SelfService/cgi/tktview.html | 31 +++++++++ 6 files changed, 181 insertions(+), 3 deletions(-) create mode 100644 fs_selfservice/FS-SelfService/cgi/tktview.html diff --git a/FS/FS/ClientAPI/MyAccount.pm b/FS/FS/ClientAPI/MyAccount.pm index 21a923f33..5e5972e67 100644 --- a/FS/FS/ClientAPI/MyAccount.pm +++ b/FS/FS/ClientAPI/MyAccount.pm @@ -1773,6 +1773,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 { diff --git a/fs_selfservice/FS-SelfService/SelfService.pm b/fs_selfservice/FS-SelfService/SelfService.pm index 9e6fe6887..135feebd5 100644 --- a/fs_selfservice/FS-SelfService/SelfService.pm +++ b/fs_selfservice/FS-SelfService/SelfService.pm @@ -61,6 +61,7 @@ $socket .= '.'.$tag if defined $tag && length($tag); 'unprovision_svc' => 'MyAccount/unprovision_svc', 'myaccount_passwd' => 'MyAccount/myaccount_passwd', 'create_ticket' => 'MyAccount/create_ticket', + 'get_ticket' => 'MyAccount/get_ticket', 'signup_info' => 'Signup/signup_info', 'skin_info' => 'MyAccount/skin_info', 'access_info' => 'MyAccount/access_info', diff --git a/fs_selfservice/FS-SelfService/cgi/myaccount.html b/fs_selfservice/FS-SelfService/cgi/myaccount.html index db95f339f..eaf4164bf 100644 --- a/fs_selfservice/FS-SelfService/cgi/myaccount.html +++ b/fs_selfservice/FS-SelfService/cgi/myaccount.html @@ -94,8 +94,9 @@ Hello <%= $name %>!

foreach my $ticket ( @tickets ) { my $td = qq!!; + my $link = qq!!; $OUT .= - "$td". $ticket->{'id'}. "". + "$td $link". $ticket->{'id'}. "". $td. $ticket->{'subject'}. "". $td. ($ticket->{'content'} || $ticket->{'priority'}). "". $td. $ticket->{'queue'}. "". diff --git a/fs_selfservice/FS-SelfService/cgi/selfservice.cgi b/fs_selfservice/FS-SelfService/cgi/selfservice.cgi index 0ef4e9aad..acd64146e 100644 --- a/fs_selfservice/FS-SelfService/cgi/selfservice.cgi +++ b/fs_selfservice/FS-SelfService/cgi/selfservice.cgi @@ -16,7 +16,7 @@ use FS::SelfService qw( part_svc_info provision_acct provision_external unprovision_svc change_pkg suspend_pkg domainselector list_svcs list_svc_usage list_cdr_usage list_support_usage - myaccount_passwd list_invoices create_ticket + myaccount_passwd list_invoices create_ticket get_ticket mason_comp ); @@ -73,7 +73,7 @@ $session_id = $cgi->param('session'); #order|pw_list XXX ??? $cgi->param('action') =~ - /^(myaccount|tktcreate|invoices|view_invoice|make_payment|make_ach_payment|make_term_payment|make_thirdparty_payment|payment_results|ach_payment_results|recharge_prepay|recharge_results|logout|change_bill|change_ship|change_pay|process_change_bill|process_change_ship|process_change_pay|customer_order_pkg|process_order_pkg|customer_change_pkg|process_change_pkg|process_order_recharge|provision|provision_svc|process_svc_acct|process_svc_external|delete_svc|view_usage|view_usage_details|view_cdr_details|view_support_details|change_password|process_change_password|customer_suspend_pkg|process_suspend_pkg)$/ + /^(myaccount|tktcreate|tktview|invoices|view_invoice|make_payment|make_ach_payment|make_term_payment|make_thirdparty_payment|payment_results|ach_payment_results|recharge_prepay|recharge_results|logout|change_bill|change_ship|change_pay|process_change_bill|process_change_ship|process_change_pay|customer_order_pkg|process_order_pkg|customer_change_pkg|process_change_pkg|process_order_recharge|provision|provision_svc|process_svc_acct|process_svc_external|delete_svc|view_usage|view_usage_details|view_cdr_details|view_support_details|change_password|process_change_password|customer_suspend_pkg|process_suspend_pkg)$/ or die "unknown action ". $cgi->param('action'); my $action = $1; @@ -224,6 +224,13 @@ sub tktcreate { ); } +sub tktview { + get_ticket( 'session_id' => $session_id, + 'ticket_id' => $cgi->param('ticket_id'), + 'reply' => $cgi->param('reply'), + ); +} + sub customer_order_pkg { my $init_data = signup_info( 'customer_session_id' => $session_id ); return $init_data if ( $init_data->{'error'} ); diff --git a/fs_selfservice/FS-SelfService/cgi/tktview.html b/fs_selfservice/FS-SelfService/cgi/tktview.html new file mode 100644 index 000000000..6f540bcf4 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/tktview.html @@ -0,0 +1,31 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', "View ticket #$ticket_id") %> + +<%= +if($error) { + $OUT .= qq!
Error: $error
!; +} +elsif(@transactions) { + $OUT .= qq! !; + foreach my $txn ( @transactions ) { + next if $txn->{content} eq 'This transaction appears to have no content'; + $OUT .= ""; + } + $OUT .= "
$txn->{created}   $txn->{description}"; + $OUT .= "
$txn->{content}
"; +} +else { + $OUT .= "No transactions on this ticket"; +} +%> +


+
+ + + + Add reply to ticket: +
+
+
+ +<%= include('footer') %> -- 2.11.0