add more options to advanced package reporting
authorivan <ivan>
Wed, 14 Feb 2007 08:48:36 +0000 (08:48 +0000)
committerivan <ivan>
Wed, 14 Feb 2007 08:48:36 +0000 (08:48 +0000)
FS/FS/UI/Web.pm
httemplate/elements/select-cust_pkg-status.html
httemplate/elements/tr-input-beginning_ending.html
httemplate/images/calendar-disabled.png [new file with mode: 0644]
httemplate/search/cust_pkg.cgi
httemplate/search/report_cust_pkg.html

index 18afc3d..9ddcf14 100644 (file)
@@ -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;
   }
index 58f2703..71aaa84 100644 (file)
@@ -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>
index 6bef6b4..9c067db 100644 (file)
@@ -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 %>
   });
 
 <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
new file mode 100644 (file)
index 0000000..81816bc
Binary files /dev/null and b/httemplate/images/calendar-disabled.png differ
index bb23076..84b083a 100755 (executable)
@@ -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
+                              )
+  )';
+  
 }
 
 ##
index 92138b5..a2316e2 100755 (executable)
                    $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>&nbsp;</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>