[freeside-commits] branch FREESIDE_3_BRANCH updated. 8443390c7a5ea14cff9896a0c95783498b63ef3b
Jonathan Prykop
jonathan at 420.am
Sun May 31 17:45:27 PDT 2015
The branch, FREESIDE_3_BRANCH has been updated
via 8443390c7a5ea14cff9896a0c95783498b63ef3b (commit)
from 5cea678977bfb24c16c4492a03f13e5d7bd8a40a (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 8443390c7a5ea14cff9896a0c95783498b63ef3b
Author: Jonathan Prykop <jonathan at freeside.biz>
Date: Fri May 29 23:05:00 2015 -0500
RT#25929: Customer self-service forward editing
diff --git a/FS/FS/ClientAPI/MasonComponent.pm b/FS/FS/ClientAPI/MasonComponent.pm
index b6f8aa4..50597e2 100644
--- a/FS/FS/ClientAPI/MasonComponent.pm
+++ b/FS/FS/ClientAPI/MasonComponent.pm
@@ -22,6 +22,7 @@ my %allowed_comps = map { $_=>1 } qw(
/misc/counties.cgi
/misc/svc_acct-domains.cgi
/misc/part_svc-columns.cgi
+ /edit/elements/svc_forward.html
);
my %session_comps = map { $_=>1 } qw(
diff --git a/FS/FS/ClientAPI/MyAccount.pm b/FS/FS/ClientAPI/MyAccount.pm
index 1e922b5..fee59bd 100644
--- a/FS/FS/ClientAPI/MyAccount.pm
+++ b/FS/FS/ClientAPI/MyAccount.pm
@@ -2752,6 +2752,15 @@ sub provision_external {
);
}
+sub provision_forward {
+ my $p = shift;
+ _provision( 'FS::svc_forward',
+ ['srcsvc','src','dstsvc','dst'],
+ [],
+ $p,
+ );
+}
+
sub _provision {
my( $class, $fields, $return_fields, $p ) = splice(@_, 0, 4);
warn "_provision called for $class\n"
@@ -2877,6 +2886,10 @@ sub part_svc_info {
}
}
+ if ($ret->{'svcdb'} eq 'svc_forward') {
+ $ret->{'forward_emails'} = {$cust_pkg->forward_emails()};
+ }
+
$ret;
}
diff --git a/FS/FS/cust_pkg.pm b/FS/FS/cust_pkg.pm
index a03a446..7845ea8 100644
--- a/FS/FS/cust_pkg.pm
+++ b/FS/FS/cust_pkg.pm
@@ -5666,6 +5666,78 @@ sub bulk_change {
'';
}
+=item forward_emails
+
+Returns a hash of svcnums and corresponding email addresses
+for svc_acct services that can be used as source or dest
+for svc_forward services provisioned in this package.
+
+Accepts options I<svc_forward> OR I<svcnum> for a svc_forward
+service; if included, will ensure the current values of the
+specified service are included in the list, even if for some
+other reason they wouldn't be. If called as a class method
+with a specified service, returns only these current values.
+
+Caution: does not actually check if svc_forward services are
+available to be provisioned on this package.
+
+=cut
+
+sub forward_emails {
+ my $self = shift;
+ my %opt = @_;
+
+ #load optional service, thoroughly validated
+ die "Use svcnum or svc_forward, not both"
+ if $opt{'svcnum'} && $opt{'svc_forward'};
+ my $svc_forward = $opt{'svc_forward'};
+ $svc_forward ||= qsearchs('svc_forward',{ 'svcnum' => $opt{'svcnum'} })
+ if $opt{'svcnum'};
+ die "Specified service is not a forward service"
+ if $svc_forward && (ref($svc_forward) ne 'FS::svc_forward');
+ die "Specified service not found"
+ if ($opt{'svcnum'} || $opt{'svc_forward'}) && !$svc_forward;
+
+ my %email;
+
+ ## everything below was basically copied from httemplate/edit/svc_forward.cgi
+ ## with minimal refactoring, not sure why we can't just load all svc_accts for this custnum
+
+ #add current values from specified service, if there was one
+ if ($svc_forward) {
+ foreach my $method (qw( srcsvc_acct dstsvc_acct )) {
+ my $svc_acct = $svc_forward->$method();
+ $email{$svc_acct->svcnum} = $svc_acct->email if $svc_acct;
+ }
+ }
+
+ if (ref($self) eq 'FS::cust_pkg') {
+
+ #and including the rest for this customer
+ my($u_part_svc, at u_acct_svcparts);
+ foreach $u_part_svc ( qsearch('part_svc',{'svcdb'=>'svc_acct'}) ) {
+ push @u_acct_svcparts,$u_part_svc->getfield('svcpart');
+ }
+
+ my $custnum = $self->getfield('custnum');
+ foreach my $i_cust_pkg ( qsearch('cust_pkg',{'custnum'=>$custnum}) ) {
+ my $cust_pkgnum = $i_cust_pkg->getfield('pkgnum');
+ #now find the corresponding record(s) in cust_svc (for this pkgnum!)
+ foreach my $acct_svcpart (@u_acct_svcparts) {
+ foreach my $i_cust_svc (
+ qsearch( 'cust_svc', { 'pkgnum' => $cust_pkgnum,
+ 'svcpart' => $acct_svcpart } )
+ ) {
+ my $svc_acct = qsearchs( 'svc_acct', { 'svcnum' => $i_cust_svc->svcnum } );
+ $email{$svc_acct->svcnum} = $svc_acct->email;
+ }
+ }
+ }
+ }
+
+ return %email;
+}
+
# Used by FS::Upgrade to migrate to a new database.
sub _upgrade_data { # class method
my ($class, %opts) = @_;
diff --git a/fs_selfservice/FS-SelfService/SelfService.pm b/fs_selfservice/FS-SelfService/SelfService.pm
index 03a3f04..21bc920 100644
--- a/fs_selfservice/FS-SelfService/SelfService.pm
+++ b/fs_selfservice/FS-SelfService/SelfService.pm
@@ -82,6 +82,7 @@ $socket .= '.'.$tag if defined $tag && length($tag);
'provision_phone' => 'MyAccount/provision_phone',
'provision_pbx' => 'MyAccount/provision_pbx',
'provision_external' => 'MyAccount/provision_external',
+ 'provision_forward' => 'MyAccount/provision_forward',
'unprovision_svc' => 'MyAccount/unprovision_svc',
'myaccount_passwd' => 'MyAccount/myaccount_passwd',
'reset_passwd' => 'MyAccount/reset_passwd',
diff --git a/fs_selfservice/FS-SelfService/cgi/myaccount_menu.html b/fs_selfservice/FS-SelfService/cgi/myaccount_menu.html
index 4802178..999c62d 100644
--- a/fs_selfservice/FS-SelfService/cgi/myaccount_menu.html
+++ b/fs_selfservice/FS-SelfService/cgi/myaccount_menu.html
@@ -28,7 +28,7 @@ my %payby_mode;
# $payby_mode{FOO} is true if FOO is thirdparty, false if it's B::OP,
# nonexistent if it's not supported
-if ( $balance > 0 ) { #XXXFIXME "enable selfservice prepay features" flag or something, eventually per-pkg or something really fancy
+if ( ($balance || 0) > 0 ) { #XXXFIXME "enable selfservice prepay features" flag or something, eventually per-pkg or something really fancy
if ( exists( $payby_mode{CARD} ) ) {
push @menu, { title => 'Recharge my account with a credit card',
diff --git a/fs_selfservice/FS-SelfService/cgi/provision_list.html b/fs_selfservice/FS-SelfService/cgi/provision_list.html
index b558337..086c79e 100644
--- a/fs_selfservice/FS-SelfService/cgi/provision_list.html
+++ b/fs_selfservice/FS-SelfService/cgi/provision_list.html
@@ -96,7 +96,7 @@ foreach my $pkg (
'('. $part_svc->{'num_avail'}. ' available)'.
'</TD></TR>'
#self-service only supports these services so far
- if grep { $part_svc->{'svcdb'} eq $_ } qw( svc_acct svc_external );
+ if grep { $part_svc->{'svcdb'} eq $_ } qw( svc_acct svc_external svc_forward );
$col = $col eq $col1 ? $col2 : $col1;
}
diff --git a/fs_selfservice/FS-SelfService/cgi/provision_svc_forward.html b/fs_selfservice/FS-SelfService/cgi/provision_svc_forward.html
new file mode 100644
index 0000000..4700663
--- /dev/null
+++ b/fs_selfservice/FS-SelfService/cgi/provision_svc_forward.html
@@ -0,0 +1,29 @@
+<%= include('header', 'Setup forward') %>
+
+<FORM name="OneTrueForm" action="<%= $selfurl %>" METHOD="POST">
+<INPUT TYPE="hidden" NAME="action" VALUE="process_svc_forward">
+
+<%= '<P><B>' . $error . '</B></P>' if $error %>
+
+<%=
+my $out = mason_comp(
+ 'session_id' => $session_id,
+ 'comp' => '/edit/elements/svc_forward.html',
+ 'args' => [
+ 'svcnum' => $svcnum,
+ 'pkgnum' => $pkgnum,
+ 'svcpart' => $svcpart,
+ 'srcsvc' => $srcsvc,
+ 'dstsvc' => $dstsvc,
+ 'src' => $src,
+ 'dst' => $dst,
+ 'email' => \%forward_emails,
+ ]
+);
+$out->{'output'} || $out->{'error'};
+%>
+
+<INPUT TYPE="submit" VALUE="Setup">
+</FORM>
+
+<%= include('footer') %>
diff --git a/fs_selfservice/FS-SelfService/cgi/selfservice.cgi b/fs_selfservice/FS-SelfService/cgi/selfservice.cgi
index d039cfd..1b728e2 100755
--- a/fs_selfservice/FS-SelfService/cgi/selfservice.cgi
+++ b/fs_selfservice/FS-SelfService/cgi/selfservice.cgi
@@ -15,7 +15,7 @@ use FS::SelfService qw(
access_info login_info login customer_info edit_info invoice
payment_info process_payment realtime_collect process_prepay
list_pkgs order_pkg signup_info order_recharge
- part_svc_info provision_acct provision_external provision_phone
+ part_svc_info provision_acct provision_external provision_phone provision_forward
unprovision_svc change_pkg suspend_pkg domainselector
list_svcs list_svc_usage list_cdr_usage list_support_usage
myaccount_passwd list_invoices create_ticket get_ticket did_report
@@ -70,6 +70,7 @@ my @actions = ( qw(
process_svc_acct
process_svc_phone
process_svc_external
+ process_svc_forward
delete_svc
view_usage
view_usage_details
@@ -847,7 +848,7 @@ sub provision_svc {
my $result = part_svc_info(
'session_id' => $session_id,
- map { $_ => $cgi->param($_) } qw( pkgnum svcpart svcnum ),
+ map { $_ => ($cgi->param($_) || '') } qw( pkgnum svcpart svcnum ),
);
die $result->{'error'} if exists $result->{'error'} && $result->{'error'};
@@ -933,6 +934,33 @@ sub process_svc_external {
);
}
+sub process_svc_forward {
+
+ my $result = provision_forward (
+ 'session_id' => $session_id,
+ map { $_ => $cgi->param($_) || '' } qw(
+ pkgnum svcpart srcsvc src dstsvc dst )
+ );
+
+ if ( exists $result->{'error'} && $result->{'error'} ) {
+ #warn "$result $result->{'error'}";
+ $action = 'provision_svc_forward';
+ return {
+ $cgi->Vars,
+ %{ part_svc_info( 'session_id' => $session_id,
+ map { $_ => $cgi->param($_) } qw( svcnum pkgnum svcpart )
+ )
+ },
+ 'error' => $result->{'error'},
+ };
+ } else {
+ #just go to setup services page, results will be visible there
+ $action = 'provision';
+ return provision();
+ }
+
+}
+
sub delete_svc {
unprovision_svc(
'session_id' => $session_id,
@@ -1143,7 +1171,7 @@ package FS::SelfService::_selfservicecgi;
use HTML::Entities;
use FS::SelfService qw(
- regionselector popselector domainselector location_form didselector
+ regionselector popselector domainselector location_form didselector mason_comp
);
#false laziness w/agent.cgi
diff --git a/httemplate/edit/elements/svc_forward.html b/httemplate/edit/elements/svc_forward.html
new file mode 100644
index 0000000..e40ebe8
--- /dev/null
+++ b/httemplate/edit/elements/svc_forward.html
@@ -0,0 +1,83 @@
+<INPUT TYPE="hidden" NAME="svcnum" VALUE="<% $opt{'svcnum'} %>">
+<INPUT TYPE="hidden" NAME="pkgnum" VALUE="<% $opt{'pkgnum'} %>">
+<INPUT TYPE="hidden" NAME="svcpart" VALUE="<% $opt{'svcpart'} %>">
+
+<SCRIPT TYPE="text/javascript">
+function srcchanged(what) {
+ if ( what.options[what.selectedIndex].value == 0 ) {
+ what.form.src.disabled = false;
+ what.form.src.style.backgroundColor = "white";
+ } else {
+ what.form.src.disabled = true;
+ what.form.src.style.backgroundColor = "lightgrey";
+ }
+}
+function dstchanged(what) {
+ if ( what.options[what.selectedIndex].value == 0 ) {
+ what.form.dst.disabled = false;
+ what.form.dst.style.backgroundColor = "white";
+ } else {
+ what.form.dst.disabled = true;
+ what.form.dst.style.backgroundColor = "lightgrey";
+ }
+}
+</SCRIPT>
+
+<% ntable("#cccccc",2) %>
+
+<TR>
+ <TD ALIGN="right">Email to</TD>
+ <TD>
+% if ( $conf->exists('svc_forward-no_srcsvc') ) {
+ <INPUT NAME="srcsrc" TYPE="hidden" VALUE="0">
+% } else {
+ <SELECT NAME="srcsvc" SIZE=1 onChange="srcchanged(this)">
+% foreach my $somesvc (keys %email) {
+ <OPTION VALUE="<% $somesvc %>"
+ <% $somesvc eq $opt{'srcsvc'} ? 'SELECTED' : '' %>
+ ><% $email{$somesvc} %></OPTION>
+% }
+ <OPTION VALUE="0" <% $opt{'src'} ? 'SELECTED' : '' %>
+ >(other email address)</OPTION>
+ </SELECT>
+% }
+
+% my $src_disabled = $opt{'src'}
+% || $conf->exists('svc_forward-no_srcsvc')
+% || !scalar(%email);
+ <INPUT NAME = "src"
+ TYPE = "text"
+ VALUE = "<% $opt{'src'} %>"
+ <% $src_disabled ? '' : 'DISABLED STYLE="background-color: lightgrey"' %>
+ >
+
+ </TD>
+</TR>
+
+<TR><TD ALIGN="right">Forwards to</TD>
+<TD><SELECT NAME="dstsvc" SIZE=1 onChange="dstchanged(this)">
+% foreach my $somesvc (keys %email) {
+
+ <OPTION<% $somesvc eq $opt{'dstsvc'} ? " SELECTED" : "" %> VALUE="<% $somesvc %>"><% $email{$somesvc} %></OPTION>
+% }
+
+<OPTION <% $opt{'dst'} ? 'SELECTED' : '' %> VALUE="0">(other email address)</OPTION>
+</SELECT>
+<INPUT TYPE="text" NAME="dst" VALUE="<% $opt{'dst'} %>" <% ( $opt{'dst'} || !scalar(%email) ) ? '' : 'DISABLED STYLE="background-color: lightgrey"' %>>
+</TD></TR>
+</TABLE>
+
+<%init>
+
+# This is used directly by selfservice, only use what's passed
+# Do not look up sensitive information here
+
+my %opt = @_;
+
+my $conf = $opt{'conf'};
+$conf ||= new FS::Conf;
+
+my %email;
+%email = %{$opt{'email'}} if ref($opt{'email'}) eq 'HASH';
+
+</%init>
diff --git a/httemplate/edit/svc_forward.cgi b/httemplate/edit/svc_forward.cgi
index 73f6465..de56070 100755
--- a/httemplate/edit/svc_forward.cgi
+++ b/httemplate/edit/svc_forward.cgi
@@ -6,74 +6,19 @@ Service #<% $svcnum ? "<B>$svcnum</B>" : " (NEW)" %><BR>
Service: <B><% $part_svc->svc %></B><BR><BR>
<FORM ACTION="process/svc_forward.cgi" METHOD="POST">
-<INPUT TYPE="hidden" NAME="svcnum" VALUE="<% $svcnum %>">
-<INPUT TYPE="hidden" NAME="pkgnum" VALUE="<% $pkgnum %>">
-<INPUT TYPE="hidden" NAME="svcpart" VALUE="<% $svcpart %>">
-
-<SCRIPT TYPE="text/javascript">
-function srcchanged(what) {
- if ( what.options[what.selectedIndex].value == 0 ) {
- what.form.src.disabled = false;
- what.form.src.style.backgroundColor = "white";
- } else {
- what.form.src.disabled = true;
- what.form.src.style.backgroundColor = "lightgrey";
- }
-}
-function dstchanged(what) {
- if ( what.options[what.selectedIndex].value == 0 ) {
- what.form.dst.disabled = false;
- what.form.dst.style.backgroundColor = "white";
- } else {
- what.form.dst.disabled = true;
- what.form.dst.style.backgroundColor = "lightgrey";
- }
-}
-</SCRIPT>
-
-<% ntable("#cccccc",2) %>
-
-<TR>
- <TD ALIGN="right">Email to</TD>
- <TD>
-% if ( $conf->exists('svc_forward-no_srcsvc') ) {
- <INPUT NAME="srcsrc" TYPE="hidden" VALUE="0">
-% } else {
- <SELECT NAME="srcsvc" SIZE=1 onChange="srcchanged(this)">
-% foreach $_ (keys %email) {
- <OPTION VALUE="<% $_ %>"
- <% $_ eq $srcsvc ? 'SELECTED' : '' %>
- ><% $email{$_} %></OPTION>
-% }
- <OPTION VALUE="0" <% $src ? 'SELECTED' : '' %>
- >(other email address)</OPTION>
- </SELECT>
-% }
-
-% my $src_disabled = $src
-% || $conf->exists('svc_forward-no_srcsvc')
-% || !scalar(%email);
- <INPUT NAME = "src"
- TYPE = "text"
- VALUE = "<% $src %>"
- <% $src_disabled ? '' : 'DISABLED STYLE="background-color: lightgrey"' %>
- >
-
- </TD>
-</TR>
-
-<TR><TD ALIGN="right">Forwards to</TD>
-<TD><SELECT NAME="dstsvc" SIZE=1 onChange="dstchanged(this)">
-% foreach $_ (keys %email) {
-
- <OPTION<% $_ eq $dstsvc ? " SELECTED" : "" %> VALUE="<% $_ %>"><% $email{$_} %></OPTION>
-% }
-
-<OPTION <% $dst ? 'SELECTED' : '' %> VALUE="0">(other email address)</OPTION>
-</SELECT>
-<INPUT TYPE="text" NAME="dst" VALUE="<% $dst %>" <% ( $dst || !scalar(%email) ) ? '' : 'DISABLED STYLE="background-color: lightgrey"' %>>
-</TD></TR>
- </TABLE>
+
+<% include('elements/svc_forward.html',
+ 'conf' => $conf,
+ 'svcnum' => $svcnum,
+ 'pkgnum' => $pkgnum,
+ 'svcpart' => $svcpart,
+ 'srcsvc' => $srcsvc,
+ 'dstsvc' => $dstsvc,
+ 'src' => $src,
+ 'dst' => $dst,
+ 'email' => \%email,
+ ) %>
+
<BR><INPUT TYPE="submit" VALUE="Submit">
</FORM>
@@ -136,44 +81,23 @@ my $action = $svc_forward->svcnum ? 'Edit' : 'Add';
my %email;
-#starting with those currently attached
-foreach my $method (qw( srcsvc_acct dstsvc_acct )) {
- my $svc_acct = $svc_forward->$method();
- $email{$svc_acct->svcnum} = $svc_acct->email if $svc_acct;
-}
-
if ($pkgnum) {
#find all possible user svcnums (and emails)
- #and including the rest for this customer
- my($u_part_svc, at u_acct_svcparts);
- foreach $u_part_svc ( qsearch('part_svc',{'svcdb'=>'svc_acct'}) ) {
- push @u_acct_svcparts,$u_part_svc->getfield('svcpart');
- }
-
- my($cust_pkg)=qsearchs('cust_pkg',{'pkgnum'=>$pkgnum});
- my($custnum)=$cust_pkg->getfield('custnum');
- my($i_cust_pkg);
- foreach $i_cust_pkg ( qsearch('cust_pkg',{'custnum'=>$custnum}) ) {
- my($cust_pkgnum)=$i_cust_pkg->getfield('pkgnum');
- my($acct_svcpart);
- foreach $acct_svcpart (@u_acct_svcparts) { #now find the corresponding
- #record(s) in cust_svc ( for this
- #pkgnum ! )
- foreach my $i_cust_svc (
- qsearch( 'cust_svc', { 'pkgnum' => $cust_pkgnum,
- 'svcpart' => $acct_svcpart } )
- ) {
- my $svc_acct =
- qsearchs( 'svc_acct', { 'svcnum' => $i_cust_svc->svcnum } );
- $email{$svc_acct->svcnum} = $svc_acct->email;
- }
- }
- }
+ my $cust_pkg = qsearchs('cust_pkg',{'pkgnum'=>$pkgnum});
+ die "Specified package not found" unless $cust_pkg;
+ %email = $cust_pkg->forward_emails('svc_forward' => $svc_forward);
} elsif ( $action eq 'Add' ) {
+
die "\$action eq Add, but \$pkgnum is null!\n";
+
+} else {
+
+ use FS::cust_pkg;
+ %email = FS::cust_pkg->forward_emails('svc_forward' => $svc_forward);
+
}
my($srcsvc,$dstsvc,$dst)=(
-----------------------------------------------------------------------
Summary of changes:
FS/FS/ClientAPI/MasonComponent.pm | 1 +
FS/FS/ClientAPI/MyAccount.pm | 13 +++
FS/FS/cust_pkg.pm | 72 ++++++++++++
fs_selfservice/FS-SelfService/SelfService.pm | 1 +
.../FS-SelfService/cgi/myaccount_menu.html | 2 +-
.../FS-SelfService/cgi/provision_list.html | 2 +-
.../FS-SelfService/cgi/provision_svc_forward.html | 29 +++++
fs_selfservice/FS-SelfService/cgi/selfservice.cgi | 34 +++++-
httemplate/edit/elements/svc_forward.html | 83 +++++++++++++
httemplate/edit/svc_forward.cgi | 122 ++++----------------
10 files changed, 255 insertions(+), 104 deletions(-)
create mode 100644 fs_selfservice/FS-SelfService/cgi/provision_svc_forward.html
create mode 100644 httemplate/edit/elements/svc_forward.html
More information about the freeside-commits
mailing list