From 43f8c4ca0668a417b86e1ef8d1c15b25097bc8a4 Mon Sep 17 00:00:00 2001 From: Ivan Kohler Date: Sat, 9 May 2015 15:16:02 -0700 Subject: [PATCH] add packages to small_custview, RT#34237 --- FS/FS/UI/Web/small_custview.pm | 140 ++++++++++++++++++++---- FS/FS/cust_main/Packages.pm | 15 +++ rt/share/html/NoAuth/css/freeside3/freeside.css | 7 ++ rt/share/html/NoAuth/css/freeside3/main.css | 1 + 4 files changed, 139 insertions(+), 24 deletions(-) create mode 100644 rt/share/html/NoAuth/css/freeside3/freeside.css diff --git a/FS/FS/UI/Web/small_custview.pm b/FS/FS/UI/Web/small_custview.pm index d7cede62a..72af03ea4 100644 --- a/FS/FS/UI/Web/small_custview.pm +++ b/FS/FS/UI/Web/small_custview.pm @@ -11,32 +11,97 @@ use FS::cust_main; @ISA = qw(Exporter); @EXPORT_OK = qw( small_custview ); +=head1 NAME + +FS::UI::Web::small_custview + +=head1 SYNOPSIS + + use FS::UI::Web::small_custview qw( small_custview ); + + #new-style + $html = small_custview( + { 'cust_main' => $cust_main, #or 'custnum' => $custnum, + 'countrydefault' => 'US', + 'nobalance' => 1, + 'url' => 'http://freeside.machine/freeside/view/cust_main.cgi', + 'nopkg' => 1, + } + ); + + #old-style (deprecated) + $html = small_custview( $cust_main, $countrydefault, $nobalance, $url ); + +=head1 DESCRIPTION + +A subroutine for displaying customer information. + +=head1 SUBROUTINES + +=over 4 + +=item small_custview HASHREF + +New-style interface. Keys are: + +=over 4 + +=item cust_main + +Customer (as a FS::cust_main object) + +=item custnum + +Customer number (if cust_main is not provided). + +=item countrydefault + +=item nobalance + +=item url + +=back + =item small_custview CUSTNUM || CUST_MAIN_OBJECT, COUNTRYDEFAULT, NOBALANCE_FLAG, URL -Sheesh. I did switch to mason, but this is still hanging around. Figure out -some better way to sling mason components to self-service & RT. +Old-style (deprecated) interface. =cut sub small_custview { - - my $arg = shift; - my $countrydefault = shift || 'US'; - my $nobalance = shift; - my $url = shift; - - my $cust_main = ref($arg) ? $arg - : qsearchs('cust_main', { 'custnum' => $arg } ) - or die "unknown custnum $arg"; + my( $cust_main, $countrydefault, $nobalance, $url, $nopkg ); + if ( ref($_[0]) eq 'HASH' ) { + my $opt = shift; + $cust_main = $opt->{cust_main} + || qsearchs('cust_main', { 'custnum' => $opt->{custnum} } ); + $countrydefault = $opt->{countrydefault} || 'US'; + $nobalance = $opt->{nobalance}; + $url = $opt->{url}; + $nopkg = $opt->{nopkg}; + } else { + my $arg = shift; + $countrydefault = shift || 'US'; + $nobalance = shift; + $url = shift; + $nopkg = 0; + + $cust_main = ref($arg) ? $arg + : qsearchs('cust_main', { 'custnum' => $arg } ) + or die "unknown custnum $arg"; + } my $html = '
'; $html = qq!' if $url; - $html .= 'Customer #'. $cust_main->display_custnum. ''. - ' - '. - $cust_main->status_label. ''; + $html .= 'Customer #'. $cust_main->display_custnum. + ': '. encode_entities($cust_main->name). ''; + ' - '. + $cust_main->status_label. ''; + + $html .= ' (Balance: $'. $cust_main->balance. ')' + unless $nobalance; my @part_tag = $cust_main->part_tag; if ( @part_tag ) { @@ -57,11 +122,7 @@ sub small_custview { $html .= ntable('#e8e8e8'). ''. ntable("#cccccc",2). - 'Billing
Address'. - encode_entities($cust_main->getfield('last')). ', '. - encode_entities($cust_main->first). '
'; - - $html .= encode_entities($cust_main->company). '
' if $cust_main->company; + 'Billing
Address'; if ( $cust_main->bill_locationnum ) { @@ -98,8 +159,7 @@ sub small_custview { 'Service
Address'; $html .= join('
', map encode_entities($_), grep $_, - $cust_main->contact, - $cust_main->company, + $cust_main->ship_company, $ship->address1, $ship->address2, ($ship->city . ', ' . $ship->state . ' ' . $ship->zip), @@ -112,10 +172,25 @@ sub small_custview { } - $html .= ''; + $html .= ''; - $html .= '
Balance: $'. $cust_main->balance. '
' - unless $nobalance; + #would be better to use ncancelled_active_pkgs, but that doesn't have an + # optimization to just count them yet, so it would be a perf problem on + # tons-of-package customers + if ( !$nopkg && scalar($cust_main->ncancelled_pkgs) < 20 ) { + + foreach my $cust_pkg ( $cust_main->ncancelled_active_pkgs ) { + + $html .= ''. + ''. + ucfirst($cust_pkg->status). ' - '. + encode_entities($cust_pkg->part_pkg->pkg_comment_only(nopkgpart=>1)). + ''; + } + + } + + $html .= ''; # last payment might be good here too? @@ -137,5 +212,22 @@ sub ntable { } +=back + +=head1 BUGS + +Sheesh. I did switch to mason, but this is still hanging around. Figure out +some better way to sling mason components to self-service & RT. + +(Or, is it useful to have this without depending on the regular back-office UI +and Mason stuff to be in place? So we have something suitable for displaying +customer information in other external systems, not just RT?) + +=head1 SEE ALSO + +L + +=cut + 1; diff --git a/FS/FS/cust_main/Packages.pm b/FS/FS/cust_main/Packages.pm index d7a1e928a..c147e551c 100644 --- a/FS/FS/cust_main/Packages.pm +++ b/FS/FS/cust_main/Packages.pm @@ -574,6 +574,21 @@ sub active_pkgs { $self->unsuspended_pkgs; } +=item ncancelled_active_pkgs + +Returns all non-cancelled packages (see L) for this customer that +are active (recurring). + +=cut + +sub ncancelled_active_pkgs { + my $self = shift; + grep { my $part_pkg = $_->part_pkg; + $part_pkg->freq ne '' && $part_pkg->freq ne '0'; + } + $self->ncancelled_pkgs; +} + =item billing_pkgs Returns active packages, and also any suspended packages which are set to diff --git a/rt/share/html/NoAuth/css/freeside3/freeside.css b/rt/share/html/NoAuth/css/freeside3/freeside.css new file mode 100644 index 000000000..1c0befbc1 --- /dev/null +++ b/rt/share/html/NoAuth/css/freeside3/freeside.css @@ -0,0 +1,7 @@ +div.small_custview { + border: 1px solid #cccccc; + padding: 3px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; +} diff --git a/rt/share/html/NoAuth/css/freeside3/main.css b/rt/share/html/NoAuth/css/freeside3/main.css index 4839e878a..e30706c66 100644 --- a/rt/share/html/NoAuth/css/freeside3/main.css +++ b/rt/share/html/NoAuth/css/freeside3/main.css @@ -59,5 +59,6 @@ @import "ticket-search.css"; @import "ticket.css"; @import "misc.css"; +@import "freeside.css"; % $m->callback(CallbackName => 'End'); -- 2.11.0