diff options
-rw-r--r-- | FS/FS/UI/Web.pm | 11 | ||||
-rw-r--r-- | httemplate/elements/select-cust_pkg-status.html | 27 | ||||
-rw-r--r-- | httemplate/elements/tr-input-beginning_ending.html | 28 | ||||
-rw-r--r-- | httemplate/images/calendar-disabled.png | bin | 0 -> 209 bytes | |||
-rwxr-xr-x | httemplate/search/cust_pkg.cgi | 87 | ||||
-rwxr-xr-x | httemplate/search/report_cust_pkg.html | 106 |
6 files changed, 186 insertions, 73 deletions
diff --git a/FS/FS/UI/Web.pm b/FS/FS/UI/Web.pm index 18afc3d48..9ddcf142d 100644 --- a/FS/FS/UI/Web.pm +++ b/FS/FS/UI/Web.pm @@ -18,19 +18,20 @@ $me = '[FS::UID::Web]'; use Date::Parse; sub parse_beginning_ending { - my($cgi) = @_; + my($cgi, $prefix) = @_; + $prefix .= '_' if $prefix; my $beginning = 0; - if ( $cgi->param('begin') =~ /^(\d+)$/ ) { + if ( $cgi->param($prefix.'begin') =~ /^(\d+)$/ ) { $beginning = $1; - } elsif ( $cgi->param('beginning') =~ /^([ 0-9\-\/]{1,64})$/ ) { + } elsif ( $cgi->param($prefix.'beginning') =~ /^([ 0-9\-\/]{1,64})$/ ) { $beginning = str2time($1) || 0; } my $ending = 4294967295; #2^32-1 - if ( $cgi->param('end') =~ /^(\d+)$/ ) { + if ( $cgi->param($prefix.'end') =~ /^(\d+)$/ ) { $ending = $1 - 1; - } elsif ( $cgi->param('ending') =~ /^([ 0-9\-\/]{1,64})$/ ) { + } elsif ( $cgi->param($prefix.'ending') =~ /^([ 0-9\-\/]{1,64})$/ ) { #probably need an option to turn off the + 86399 $ending = str2time($1) + 86399; } diff --git a/httemplate/elements/select-cust_pkg-status.html b/httemplate/elements/select-cust_pkg-status.html index 58f270342..71aaa84b6 100644 --- a/httemplate/elements/select-cust_pkg-status.html +++ b/httemplate/elements/select-cust_pkg-status.html @@ -1,20 +1,21 @@ -% -% my( $status, %opt ) = @_; -% -% $opt{'statuses'} ||= [ FS::cust_pkg->statuses() ]; # { disabled=>'' } ) -% -% - - -<SELECT NAME="status"> +<SELECT NAME="status" <% $opt{'onchange'} %>> <OPTION VALUE="">all -% foreach my $status ( @{ $opt{'statuses'} } ) { - - <OPTION VALUE="<% $status %>"><% $status %> +% foreach my $option ( @{ $opt{'statuses'} } ) { + <OPTION VALUE="<% $option %>" <% $option eq $status ? 'SELECTED' : '' %>><% $option %> % } - </SELECT> +<%init> + my( $status, %opt ) = @_; + + $opt{'statuses'} ||= [ FS::cust_pkg->statuses() ]; # { disabled=>'' } ) + + if ( exists $opt{'onchange'} && $opt{'onchange'} ) { + $opt{'onchange'} = ' onChange="' . $opt{'onchange'}. '"'; + } else { + $opt{'onchange'} = ''; + } +</%init> diff --git a/httemplate/elements/tr-input-beginning_ending.html b/httemplate/elements/tr-input-beginning_ending.html index 6bef6b4ef..9c067dbea 100644 --- a/httemplate/elements/tr-input-beginning_ending.html +++ b/httemplate/elements/tr-input-beginning_ending.html @@ -3,29 +3,33 @@ <SCRIPT TYPE="text/javascript" SRC="<%$fsurl%>elements/calendar-en.js"></SCRIPT> <SCRIPT TYPE="text/javascript" SRC="<%$fsurl%>elements/calendar-setup.js"></SCRIPT> - <TR> <TD ALIGN="right">From date: </TD> - <TD><INPUT TYPE="text" NAME="beginning" ID="beginning_text" VALUE="" SIZE=<%$size%> MAXLENGTH=<%$maxlength%>> <IMG SRC="<%$fsurl%>images/calendar.png" ID="beginning_button" STYLE="cursor: pointer" TITLE="Select date"><BR><i>m/d/y<% $time_hint %></i></TD> + <TD><INPUT TYPE="text" NAME="<% $opt{prefix} %>beginning" ID="<% $opt{prefix} %>beginning_text" VALUE="" SIZE=<%$size%> MAXLENGTH=<%$maxlength%>> <IMG SRC="<%$fsurl%>images/calendar.png" ID="<% $opt{prefix} %>beginning_button" STYLE="cursor: pointer" TITLE="Select date"><IMG SRC="<%$fsurl%>images/calendar-disabled.png" ID="<% $opt{prefix} %>beginning_disabled" STYLE="display:none"><BR><i>m/d/y<% $time_hint %></i></TD> <SCRIPT TYPE="text/javascript"> Calendar.setup({ - inputField: "beginning_text", + inputField: "<% $opt{prefix} %>beginning_text", ifFormat: "%m/%d/%Y<% $time_format %>", - button: "beginning_button", + button: "<% $opt{prefix} %>beginning_button", align: "BR" <% $input_time %> }); </SCRIPT> -</TR> +% unless ( $opt{layout} =~ /^h/i ) { #horizontal + +</TR> <TR> + +% } + <TD ALIGN="right">To date: </TD> - <TD><INPUT TYPE="text" NAME="ending" ID="ending_text" VALUE="" SIZE=<%$size%> MAXLENGTH=<%$maxlength%>> <IMG SRC="<%$fsurl%>images/calendar.png" ID="ending_button" STYLE="cursor: pointer" TITLE="Select date"><BR><i>m/d/y<% $time_hint %></i></TD> + <TD><INPUT TYPE="text" NAME="<% $opt{prefix} %>ending" ID="<% $opt{prefix} %>ending_text" VALUE="" SIZE=<%$size%> MAXLENGTH=<%$maxlength%>> <IMG SRC="<%$fsurl%>images/calendar.png" ID="<% $opt{prefix} %>ending_button" STYLE="cursor: pointer" TITLE="Select date"><IMG SRC="<%$fsurl%>images/calendar-disabled.png" ID="<% $opt{prefix} %>ending_disabled" STYLE="display:none"><BR><i>m/d/y<% $time_hint %></i></TD> <SCRIPT TYPE="text/javascript"> Calendar.setup({ - inputField: "ending_text", + inputField: "<% $opt{prefix} %>ending_text", ifFormat: "%m/%d/%Y<% $time_format %>", - button: "ending_button", + button: "<% $opt{prefix} %>ending_button", align: "BR" <% $input_time %> }); @@ -34,13 +38,18 @@ <TR> <TD></TD> - <TD> + <TD COLSPAN=<% $opt{layout} =~ /^h/i ? 3 : 1 %>> <FONT SIZE="-1">(leave one or both dates blank for an open-ended search)</FONT> </TD> </TR> <%init> + my %opt = @_; + +$opt{prefix} = '' unless defined $opt{prefix}; +$opt{prefix} .= '_' if $opt{prefix}; + my( $input_time, $time_format, $time_hint ) = ( '', '', '' ); my( $size, $maxlength ) = ( 11, 10 ); if ( $opt{'input_time'} ) { @@ -50,4 +59,5 @@ if ( $opt{'input_time'} ) { $size = 21; $maxlength = 27; } + </%init> diff --git a/httemplate/images/calendar-disabled.png b/httemplate/images/calendar-disabled.png Binary files differnew file mode 100644 index 000000000..81816bcd6 --- /dev/null +++ b/httemplate/images/calendar-disabled.png diff --git a/httemplate/search/cust_pkg.cgi b/httemplate/search/cust_pkg.cgi index bb2307641..84b083a3d 100755 --- a/httemplate/search/cust_pkg.cgi +++ b/httemplate/search/cust_pkg.cgi @@ -202,55 +202,70 @@ my $pkgpart = join (' OR pkgpart=', push @where, '(pkgpart=' . $pkgpart . ')' if $pkgpart; ### -# parse magic, legacy, etc. +# parse dates ### -my $orderby; -if ( $cgi->param('magic') && $cgi->param('magic') eq 'bill' ) { - $orderby = 'ORDER BY bill'; +my $orderby = ''; + +#false laziness w/report_cust_pkg.html +my %disable = ( + 'all' => {}, + 'one-time charge' => { 'last_bill'=>1, 'bill'=>1, 'susp'=>1, 'expire'=>1, 'cancel'=>1, }, + 'active' => { 'susp'=>1, 'cancel'=>1 }, + 'suspended' => { 'cancel' => 1 }, + 'cancelled' => {}, + '' => {}, +); + +foreach my $field (qw( setup last_bill bill susp expire cancel )) { + + my($beginning, $ending) = FS::UI::Web::parse_beginning_ending($cgi, $field); + + next if $beginning == 0 && $ending == 4294967295 + or $disable{$cgi->param('status')}->{$field}; - my($beginning, $ending) = FS::UI::Web::parse_beginning_ending($cgi); push @where, - #"bill >= $beginning ", - #"bill <= $ending", - "CASE WHEN bill IS NULL THEN 0 ELSE bill END >= $beginning ", - "CASE WHEN bill IS NULL THEN 0 ELSE bill END <= $ending", - #'( cancel IS NULL OR cancel = 0 )' - ; + "$field IS NOT NULL", + "$field >= $beginning", + "$field <= $ending"; -} else { + $orderby ||= "ORDER BY $field"; - if ( $cgi->param('magic') && - $cgi->param('magic') =~ /^(active|inactive|suspended|cancell?ed)$/ - ) { +} - $orderby = 'ORDER BY pkgnum'; +$orderby ||= 'ORDER BY bill'; - if ( $cgi->param('pkgpart') =~ /^(\d+)$/ ) { - push @where, "pkgpart = $1"; - } +### +# parse magic, legacy, etc. +### - } elsif ( $query eq 'pkgnum' ) { +if ( $cgi->param('magic') && + $cgi->param('magic') =~ /^(active|inactive|suspended|cancell?ed)$/ +) { - $orderby = 'ORDER BY pkgnum'; + $orderby = 'ORDER BY pkgnum'; - } elsif ( $query eq 'APKG_pkgnum' ) { - - $orderby = 'ORDER BY pkgnum'; - - push @where, '0 < ( - SELECT count(*) FROM pkg_svc - WHERE pkg_svc.pkgpart = cust_pkg.pkgpart - AND pkg_svc.quantity > ( SELECT count(*) FROM cust_svc - WHERE cust_svc.pkgnum = cust_pkg.pkgnum - AND cust_svc.svcpart = pkg_svc.svcpart - ) - )'; - - } else { - die "Empty or unknown QUERY_STRING!"; + if ( $cgi->param('pkgpart') =~ /^(\d+)$/ ) { + push @where, "pkgpart = $1"; } +} elsif ( $query eq 'pkgnum' ) { + + $orderby = 'ORDER BY pkgnum'; + +} elsif ( $query eq 'APKG_pkgnum' ) { + + $orderby = 'ORDER BY pkgnum'; + + push @where, '0 < ( + SELECT count(*) FROM pkg_svc + WHERE pkg_svc.pkgpart = cust_pkg.pkgpart + AND pkg_svc.quantity > ( SELECT count(*) FROM cust_svc + WHERE cust_svc.pkgnum = cust_pkg.pkgnum + AND cust_svc.svcpart = pkg_svc.svcpart + ) + )'; + } ## diff --git a/httemplate/search/report_cust_pkg.html b/httemplate/search/report_cust_pkg.html index 92138b507..a2316e257 100755 --- a/httemplate/search/report_cust_pkg.html +++ b/httemplate/search/report_cust_pkg.html @@ -12,23 +12,77 @@ $cgi->param('agentnum'), ) %> - <% include( '/elements/tr-select-cust_pkg-status.html' ) %> + + <% include( '/elements/tr-select-cust_pkg-status.html', '', + 'onchange' => 'status_changed(this);', + ) + %> + + <SCRIPT TYPE="text/javascript"> + + function status_changed(what) { + +% foreach my $status ( '', FS::cust_pkg->statuses() ) { + + if ( what.options[what.selectedIndex].value == '<% $status %>' ) { + +% foreach my $field (qw( setup last_bill bill susp expire cancel )) { +% if ( $disable{$status}->{$field} ) { + + what.form.<% $field %>_beginning_text.disabled = true; + what.form.<% $field %>_ending_text.disabled = true; + + what.form.<% $field %>_beginning_button.style.display = 'none'; + what.form.<% $field %>_ending_button.style.display = 'none'; + what.form.<% $field %>_beginning_disabled.style.display = ''; + what.form.<% $field %>_ending_disabled.style.display = ''; + +% } else { + + what.form.<% $field %>_beginning_text.disabled = false; + what.form.<% $field %>_ending_text.disabled = false; + + what.form.<% $field %>_beginning_button.style.display = ''; + what.form.<% $field %>_ending_button.style.display = ''; + what.form.<% $field %>_beginning_disabled.style.display = 'none'; + what.form.<% $field %>_ending_disabled.style.display = 'none'; + +% } +% } + + } + +% } + + } + + </SCRIPT> + <% include( '/elements/tr-select-pkg_class.html', '', 'pre_options' => [ '0' => 'all' ], 'empty_label' => '(empty class)', ) %> - <% include( '/elements/tr-selectmultiple-part_pkg.html' ) %> - <TR> - <TD ALIGN="right" VALIGN="center">Next bill date</TD> - <TD> - <TABLE> - <% include( '/elements/tr-input-beginning_ending.html' ) %> - </TABLE> - </TD> - </TR> +% foreach my $field (qw( setup last_bill bill susp expire cancel )) { + + <TR> + <TD ALIGN="right" VALIGN="center"><% $label{$field} %></TD> + <TD> + <TABLE> + <% include( '/elements/tr-input-beginning_ending.html', + prefix => $field, + layout => 'horiz', + ) + %> + </TABLE> + </TD> + </TR> + +% } + <% include( '/elements/tr-selectmultiple-part_pkg.html' ) %> + <TR> <TH BGCOLOR="#e8e8e8" COLSPAN=2> </TH> </TR> @@ -52,3 +106,35 @@ die "access denied" unless $FS::CurrentUser::CurrentUser->access_right('List packages'); </%init> +<%once> + +my %label = ( + 'setup' => 'Setup', + 'last_bill' => 'Last bill', + 'bill' => 'Next bill', + 'susp' => 'Suspended', + 'expire' => 'Expires', + 'cancel' => 'Cancelled', +); + +#false laziness w/cust_pkg.cgi +my %disable = ( + 'all' => {}, + 'one-time charge' => { 'last_bill'=>1, 'bill'=>1, 'susp'=>1, 'expire'=>1, 'cancel'=>1, }, + 'active' => { 'susp'=>1, 'cancel'=>1 }, + 'suspended' => { 'cancel' => 1 }, + 'cancelled' => {}, + '' => {}, +); + +#hmm? +my %checkbox = ( + 'setup' => 0, + 'last_bill' => 0, + 'bill' => 0, + 'susp' => 1, + 'expire' => 1, + 'cancel' => 1, +); + +</%once> |