bug ya bug resulting from agent-virtualized packages
[freeside.git] / httemplate / search / cust_pkg.cgi
index e8b3f49..5c209eb 100755 (executable)
@@ -1,4 +1,119 @@
-<%
+<% include( 'elements/search.html',
+                  'title'       => 'Package Search Results', 
+                  'name'        => 'packages',
+                  'query'       => $sql_query,
+                  'count_query' => $count_query,
+                  #'redirect'    => $link,
+                  'header'      => [ '#',
+                                     'Package',
+                                     'Class',
+                                     'Status',
+                                     'Freq.',
+                                     'Setup',
+                                     'Last bill',
+                                     'Next bill',
+                                     'Adjourn',
+                                     'Susp.',
+                                     'Expire',
+                                     'Cancel',
+                                     FS::UI::Web::cust_header(
+                                       $cgi->param('cust_fields')
+                                     ),
+                                     'Services',
+                                   ],
+                  'fields'      => [
+                    'pkgnum',
+                    sub { #my $part_pkg = $part_pkg{shift->pkgpart};
+                          #$part_pkg->pkg; # ' - '. $part_pkg->comment;
+                          $_[0]->pkg; # ' - '. $_[0]->comment;
+                        },
+                    'classname',
+                    sub { ucfirst(shift->status); },
+                    sub { #shift->part_pkg->freq_pretty;
+
+                          #my $part_pkg = $part_pkg{shift->pkgpart};
+                          #$part_pkg->freq_pretty;
+
+                          FS::part_pkg::freq_pretty(shift);
+                        },
+
+                    #sub { time2str('%b %d %Y', shift->setup); },
+                    #sub { time2str('%b %d %Y', shift->last_bill); },
+                    #sub { time2str('%b %d %Y', shift->bill); },
+                    #sub { time2str('%b %d %Y', shift->susp); },
+                    #sub { time2str('%b %d %Y', shift->expire); },
+                    #sub { time2str('%b %d %Y', shift->get('cancel')); },
+                    ( map { time_or_blank($_) }
+                          qw( setup last_bill bill adjourn susp expire cancel ) ),
+
+                    \&FS::UI::Web::cust_fields,
+                    #sub { '<table border=0 cellspacing=0 cellpadding=0 STYLE="border:none">'.
+                    #      join('', map { '<tr><td align="right" style="border:none">'. $_->[0].
+                    #                     ':</td><td style="border:none">'. $_->[1]. '</td></tr>' }
+                    #                   shift->labels
+                    #          ).
+                    #      '</table>';
+                    #    },
+                    sub {
+                          [ map {
+                                  [ 
+                                    { 'data' => $_->[0]. ':',
+                                      'align'=> 'right',
+                                    },
+                                    { 'data' => $_->[1],
+                                      'align'=> 'left',
+                                      'link' => $p. 'view/' .
+                                                $_->[2]. '.cgi?'. $_->[3],
+                                    },
+                                  ];
+                                } shift->labels
+                          ];
+                        },
+                  ],
+                  'color' => [
+                    '',
+                    '',
+                    '',
+                    sub { shift->statuscolor; },
+                    '',
+                    '',
+                    '',
+                    '',
+                    '',
+                    '',
+                    '',
+                    FS::UI::Web::cust_colors(),
+                    '',
+                  ],
+                  'style' => [ '', '', '', 'b', '', '', '', '', '', '', '',
+                               FS::UI::Web::cust_styles() ],
+                  'size'  => [ '', '', '', '-1', ],
+                  'align' => 'rllclrrrrrr'. FS::UI::Web::cust_aligns(). 'r',
+                  'links' => [
+                    $link,
+                    $link,
+                    '',
+                    '',
+                    '',
+                    '',
+                    '',
+                    '',
+                    '',
+                    '',
+                    '',
+                    ( map { $_ ne 'Cust. Status' ? $clink : '' }
+                          FS::UI::Web::cust_header(
+                                                    $cgi->param('cust_fields')
+                                                  )
+                    ),
+                    '',
+                  ],
+              )
+%>
+<%init>
+
+die "access denied"
+  unless $FS::CurrentUser::CurrentUser->access_right('List packages');
 
 # my %part_pkg = map { $_->pkgpart => $_ } qsearch('part_pkg', {});
 
@@ -12,7 +127,7 @@ my @where = ();
 
 if ( $cgi->param('agentnum') =~ /^(\d+)$/ and $1 ) {
   push @where,
-    "agentnum = $1";
+    "cust_main.agentnum = $1";
 }
 
 ##
@@ -24,6 +139,12 @@ if (    $cgi->param('magic')  eq 'active'
 
   push @where, FS::cust_pkg->active_sql();
 
+} elsif (    $cgi->param('magic')  eq 'inactive'
+          || $cgi->param('status') eq 'inactive' ) {
+
+  push @where, FS::cust_pkg->inactive_sql();
+
+
 } elsif (    $cgi->param('magic')  eq 'suspended'
           || $cgi->param('status') eq 'suspended'  ) {
 
@@ -47,7 +168,10 @@ if (    $cgi->param('magic')  eq 'active'
 #false lazinessish w/graph/cust_bill_pkg.cgi
 my $classnum = 0;
 my @pkg_class = ();
-if ( $cgi->param('classnum') =~ /^(\d*)$/ ) {
+if ( exists($cgi->Vars->{'classnum'})
+     && $cgi->param('classnum') =~ /^(\d*)$/
+   )
+{
   $classnum = $1;
   if ( $classnum ) { #a specific class
     push @where, "classnum = $classnum";
@@ -71,55 +195,78 @@ if ( $cgi->param('classnum') =~ /^(\d*)$/ ) {
 #eslaf
 
 ###
-# parse magic, legacy, etc.
+# parse part_pkg
 ###
 
-my $orderby;
-if ( $cgi->param('magic') && $cgi->param('magic') eq 'bill' ) {
-  $orderby = 'ORDER BY bill';
+my $pkgpart = join (' OR pkgpart=',
+                    grep {$_} map { /^(\d+)$/; } ($cgi->param('pkgpart')));
+push @where,  '(pkgpart=' . $pkgpart . ')' if $pkgpart;
+
+###
+# parse dates
+###
+
+my $orderby = '';
+
+#false laziness w/report_cust_pkg.html
+my %disable = (
+  'all'             => {},
+  'one-time charge' => { 'last_bill'=>1, 'bill'=>1, 'adjourn'=>1, 'susp'=>1, 'expire'=>1, 'cancel'=>1, },
+  'active'          => { 'susp'=>1, 'cancel'=>1 },
+  'suspended'       => { 'cancel' => 1 },
+  'cancelled'       => {},
+  ''                => {},
+);
+
+foreach my $field (qw( setup last_bill bill adjourn 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 )'
-  ;
+    "cust_pkg.$field IS NOT NULL",
+    "cust_pkg.$field >= $beginning",
+    "cust_pkg.$field <= $ending";
 
-} else {
+  $orderby ||= "ORDER BY cust_pkg.$field";
 
-  if ( $cgi->param('magic') &&
-       $cgi->param('magic') =~ /^(active|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
+                              )
+  )';
+  
 }
 
 ##
@@ -127,7 +274,7 @@ if ( $cgi->param('magic') && $cgi->param('magic') eq 'bill' ) {
 ##
 
 # here is the agent virtualization
-push @where, $FS::CurrentUser::CurrentUser->agentnums_sql;
+push @where, $FS::CurrentUser::CurrentUser->agentnums_sql('table'=>'cust_main');
 
 my $extra_sql = scalar(@where) ? ' WHERE '. join(' AND ', @where) : '';
 
@@ -190,121 +337,4 @@ sub time_or_blank {
    };
 }
 
-###
-# and finally, include the search template
-### 
-
-%><%=  include( 'elements/search.html',
-                  'title'       => 'Package Search Results', 
-                  'name'        => 'packages',
-                  'query'       => $sql_query,
-                  'count_query' => $count_query,
-                  #'redirect'    => $link,
-                  'header'      => [ '#',
-                                     'Package',
-                                     'Class',
-                                     'Status',
-                                     'Freq.',
-                                     'Setup',
-                                     'Last bill',
-                                     'Next bill',
-                                     'Susp.',
-                                     'Expire',
-                                     'Cancel',
-                                     FS::UI::Web::cust_header(
-                                       $cgi->param('cust_fields')
-                                     ),
-                                     'Services',
-                                   ],
-                  'fields'      => [
-                    'pkgnum',
-                    sub { #my $part_pkg = $part_pkg{shift->pkgpart};
-                          #$part_pkg->pkg; # ' - '. $part_pkg->comment;
-                          $_[0]->pkg; # ' - '. $_[0]->comment;
-                        },
-                    'classname',
-                    sub { ucfirst(shift->status); },
-                    sub { #shift->part_pkg->freq_pretty;
-
-                          #my $part_pkg = $part_pkg{shift->pkgpart};
-                          #$part_pkg->freq_pretty;
-
-                          FS::part_pkg::freq_pretty(shift);
-                        },
-
-                    #sub { time2str('%b %d %Y', shift->setup); },
-                    #sub { time2str('%b %d %Y', shift->last_bill); },
-                    #sub { time2str('%b %d %Y', shift->bill); },
-                    #sub { time2str('%b %d %Y', shift->susp); },
-                    #sub { time2str('%b %d %Y', shift->expire); },
-                    #sub { time2str('%b %d %Y', shift->get('cancel')); },
-                    ( map { time_or_blank($_) }
-                          qw( setup last_bill bill susp expire cancel ) ),
-
-                    \&FS::UI::Web::cust_fields,
-                    #sub { '<table border=0 cellspacing=0 cellpadding=0 STYLE="border:none">'.
-                    #      join('', map { '<tr><td align="right" style="border:none">'. $_->[0].
-                    #                     ':</td><td style="border:none">'. $_->[1]. '</td></tr>' }
-                    #                   shift->labels
-                    #          ).
-                    #      '</table>';
-                    #    },
-                    sub {
-                          [ map {
-                                  [ 
-                                    { 'data' => $_->[0]. ':',
-                                      'align'=> 'right',
-                                    },
-                                    { 'data' => $_->[1],
-                                      'align'=> 'left',
-                                      'link' => $p. 'view/' .
-                                                $_->[2]. '.cgi?'. $_->[3],
-                                    },
-                                  ];
-                                } shift->labels
-                          ];
-                        },
-                  ],
-                  'color' => [
-                    '',
-                    '',
-                    '',
-                    sub { shift->statuscolor; },
-                    '',
-                    '',
-                    '',
-                    '',
-                    '',
-                    '',
-                    '',
-                    ( map { '' }
-                          FS::UI::Web::cust_header(
-                                                    $cgi->param('cust_fields')
-                                                  )
-                    ),
-                    '',
-                  ],
-                  'style' => [ '', '', '', 'b' ],
-                  'size'  => [ '', '', '', '-1', ],
-                  'align' => 'rllclrrrrrr',
-                  'links' => [
-                    $link,
-                    $link,
-                    '',
-                    '',
-                    '',
-                    '',
-                    '',
-                    '',
-                    '',
-                    '',
-                    '',
-                    ( map { $clink }
-                          FS::UI::Web::cust_header(
-                                                    $cgi->param('cust_fields')
-                                                  )
-                    ),
-                    '',
-                  ],
-              )
-%>
+</%init>