FCKeditor 2.6.6
[freeside.git] / httemplate / search / cust_bill_pkg.cgi
index 8654585..115597a 100644 (file)
@@ -5,16 +5,19 @@
                  'count_query' => $count_query,
                  'count_addl'  => [ $money_char. '%.2f total', ],
                  'header'      => [
-                   '#',
+                   #'#',
                    'Description',
                    'Setup charge',
-                   'Recurring charge',
+                   ( $use_usage eq 'usage'
+                     ? 'Usage charge'
+                     : 'Recurring charge'
+                   ),
                    'Invoice',
                    'Date',
                    FS::UI::Web::cust_header(),
                  ],
                  'fields'      => [
-                   'billpkgnum',
+                   #'billpkgnum',
                    sub { $_[0]->pkgnum > 0
                            ? $_[0]->get('pkg')      # possibly use override.pkg
                            : $_[0]->get('itemdesc') # but i think this correct
                    #strikethrough or "N/A ($amount)" or something these when
                    # they're not applicable to pkg_tax search
                    sub { sprintf($money_char.'%.2f', shift->setup ) },
-                   sub { sprintf($money_char.'%.2f', shift->recur ) },
+                   sub { my $row = shift;
+                         my $value = 0;
+                         if ( $use_usage eq 'recurring' ) {
+                           $value = $row->recur - $row->usage;
+                         } elsif ( $use_usage eq 'usage' ) {
+                           $value = $row->usage;
+                         } else {
+                           $value = $row->recur;
+                         }
+                         sprintf($money_char.'%.2f', $value );
+                       },
                    'invnum',
                    sub { time2str('%b %d %Y', shift->_date ) },
                    \&FS::UI::Web::cust_fields,
                  ],
                  'links'       => [
-                   '',
+                   #'',
                    '',
                    '',
                    '',
                          FS::UI::Web::cust_header()
                    ),
                  ],
-                 'align' => 'rlrrrc'.FS::UI::Web::cust_aligns(),
+                 #'align' => 'rlrrrc'.FS::UI::Web::cust_aligns(),
+                 'align' => 'lrrrc'.FS::UI::Web::cust_aligns(),
                  'color' => [ 
-                              '',
+                              #'',
                               '',
                               '',
                               '',
@@ -49,7 +63,7 @@
                               FS::UI::Web::cust_colors(),
                             ],
                  'style' => [ 
-                              '',
+                              #'',
                               '',
                               '',
                               '',
@@ -61,6 +75,8 @@
 %>
 <%init>
 
+#LOTS of false laziness below w/cust_credit_bill_pkg.cgi
+
 die "access denied"
   unless $FS::CurrentUser::CurrentUser->access_right('Financial reports');
 
@@ -106,34 +122,45 @@ if ( $cgi->param('classnum') =~ /^(\d+)$/ ) {
   }
 }
 
-push @where, ' ( '. join(' OR ',
-                      map ' taxclass = '.dbh->quote($_), $cgi->param('taxclass')
-                    ).
-             ' ) '
-  if $cgi->param('taxclass')
-  && ! $cgi->param('istax'); #no part_pkg.taxclass in this case
-                             #(should we save a taxclass or a link to taxnum
-                             # in cust_bill_pkg or something like
-                             # cust_bill_pkg_tax_location?)
-
-#sub _where {
-# my $table = shift;
-# my $prefix = @_ ? shift : '';
-# "
-#      (    cust_main_county.county  = $table.${prefix}.county
-#      OR ( cust_main_county.county IS NULL AND $table.${prefix}.county  =  '' )
-#      OR ( cust_main_county.county  =  ''  AND $table.${prefix}.county IS NULL)
-#      OR ( cust_main_county.county IS NULL AND $table.${prefix}.county IS NULL)
-#      )
-#  AND (    cust_main_county.state   = $table.${prefix}.state
-#      OR ( cust_main_county.state  IS NULL AND $table.${prefix}.state  =  ''  )
-#      OR ( cust_main_county.state   =  ''  AND $table.${prefix}.state IS NULL )
-#      OR ( cust_main_county.state  IS NULL AND $table.${prefix}.state IS NULL )
-#      )
-#  AND cust_main_county.country = $table.${prefix}.country
-# ";
-#
-#}
+if ( $cgi->param('taxclass')
+     && ! $cgi->param('istax')  #no part_pkg.taxclass in this case
+                                #(should we save a taxclass or a link to taxnum
+                                # in cust_bill_pkg or something like
+                                # cust_bill_pkg_tax_location?)
+   )
+{
+
+  #override taxclass when use_override is specified?  probably
+  #if ( $use_override ) {
+  #
+  #  push @where,
+  #    ' ( '. join(' OR ',
+  #                  map {
+  #                        ' (    part_pkg.taxclass = '. dbh->quote($_).
+  #                        '      AND pkgpart_override IS NULL '.
+  #                        '   OR '.
+  #                        '      override.taxclass = '. dbh->quote($_).
+  #                        '      AND pkgpart_override IS NOT NULL '.
+  #                        ' ) '
+  #                      }
+  #                      $cgi->param('taxclass')
+  #               ).
+  #    ' ) ';
+  #
+  #} else {
+
+    push @where,
+      ' ( '. join(' OR ',
+                    map ' part_pkg.taxclass = '.dbh->quote($_),
+                        $cgi->param('taxclass')
+                 ).
+      ' ) ';
+
+  #}
+
+}
+
+my @loc_param = qw( city county state country );
 
 if ( $cgi->param('out') ) {
 
@@ -154,10 +181,9 @@ if ( $cgi->param('out') ) {
   ";
 
   #not linked to by anything, but useful for debugging "out of taxable region"
-  if ( grep $cgi->param($_), qw( county state country ) ) {
+  if ( grep $cgi->param($_), @loc_param ) {
 
-    my %ph = map { $_ => dbh->quote( $cgi->param($_) ) }
-                 qw( county state country );
+    my %ph = map { $_ => dbh->quote( scalar($cgi->param($_)) ) } @loc_param;
 
     my ( $loc_sql, @param ) = FS::cust_pkg->location_sql;
     while ( $loc_sql =~ /\?/ ) { #easier to do our own substitution
@@ -182,7 +208,7 @@ if ( $cgi->param('out') ) {
 
           my %ph = ( 'county' => dbh->quote($_),
                      map { $_ => dbh->quote( $cgi->param($_) ) }
-                       qw( state country )
+                       qw( city state country )
                    );
 
           my ( $loc_sql, @param ) = FS::cust_pkg->location_sql;
@@ -200,8 +226,7 @@ if ( $cgi->param('out') ) {
 
   } else {
 
-    my %ph = map { $_ => dbh->quote( $cgi->param($_) ) }
-                 qw( county state country );
+    my %ph = map { $_ => dbh->quote( scalar($cgi->param($_)) ) } @loc_param;
 
     my ( $loc_sql, @param ) = FS::cust_pkg->location_sql;
     while ( $loc_sql =~ /\?/ ) { #easier to do our own substitution
@@ -252,7 +277,7 @@ if ( $cgi->param('out') ) {
   );
 
   my %ph = map { ( $pn{$_} => dbh->quote( $cgi->param($_) || '' ) ) }
-           qw( county state city locationtaxid );
+           qw( city county state locationtaxid );
 
   push @where,
     join( ' AND ', map { "( $_ = $ph{$_} OR $ph{$_} = '' AND $_ IS NULL)" }
@@ -304,6 +329,8 @@ if ( $cgi->param('cust_tax') ) {
   push @where, $cust_exempt;
 }
 
+my $use_usage = $cgi->param('use_usage');
+
 my $count_query;
 if ( $cgi->param('pkg_tax') ) {
 
@@ -368,12 +395,17 @@ if ( $cgi->param('pkg_tax') ) {
 
 } else {
 
-  $count_query =
-    "SELECT COUNT(*), SUM(cust_bill_pkg.setup + cust_bill_pkg.recur)";
+  $count_query = "SELECT COUNT(*), ";
 
-}
+  if ( $use_usage eq 'recurring' ) {
+    $count_query .= "SUM(setup + recur - usage)";
+  } elsif ( $use_usage eq 'usage' ) {
+    $count_query .= "SUM(usage)";
+  } else {
+    $count_query .= "SUM(cust_bill_pkg.setup + cust_bill_pkg.recur)";
+  }
 
-my $where = ' WHERE '. join(' AND ', @where);
+}
 
 my $join_cust =  '      JOIN cust_bill USING ( invnum ) 
                    LEFT JOIN cust_main USING ( custnum ) ';
@@ -396,14 +428,28 @@ if ( $cgi->param('nottax') ) {
     $join_pkg .= ' LEFT JOIN cust_bill_pkg_tax_location USING ( billpkgnum )
                    LEFT JOIN cust_location              USING ( locationnum ) ';
 
-    #quelle kludge, false laziness w/report_tax.cgi
-    $where =~ s/cust_pkg\.locationnum/cust_bill_pkg_tax_location.locationnum/g; 
-  } elsif ( scalar( grep( /locationtaxid/, $cgi->param ) ) ) {
+    #quelle kludge, somewhat false laziness w/report_tax.cgi
+    s/cust_pkg\.locationnum/cust_bill_pkg_tax_location.locationnum/g for @where;
+  } elsif ( scalar( grep( /locationtaxid/, $cgi->param ) ) ||
+            $cgi->param('iscredit') eq 'rate') {
     $join_pkg .=
       ' LEFT JOIN cust_bill_pkg_tax_rate_location USING ( billpkgnum ) '.
       ' LEFT JOIN tax_rate_location USING ( taxratelocationnum ) ';
   }
 
+  if ( $cgi->param('iscredit') ) {
+    $join_pkg .= ' JOIN cust_credit_bill_pkg USING ( billpkgnum';
+    if ( $conf->exists('tax-pkg_address') ) {
+      $join_pkg .= ', billpkgtaxlocationnum )';
+      push @where, "billpkgtaxratelocationnum IS NULL";
+    } elsif ( $cgi->param('iscredit') eq 'rate' ) {
+      $join_pkg .= ', billpkgtaxratelocationnum )';
+    } else {
+      $join_pkg .= ' )';
+      push @where, "billpkgtaxratelocationnum IS NULL";
+    }
+  }
+
 } else { 
 
   #die?
@@ -414,7 +460,18 @@ if ( $cgi->param('nottax') ) {
 
 }
 
-$count_query .= " FROM cust_bill_pkg $join_cust $join_pkg $where";
+my $where = ' WHERE '. join(' AND ', @where);
+
+if ($use_usage) {
+  $count_query .=
+    " FROM (SELECT cust_bill_pkg.setup, cust_bill_pkg.recur, 
+             ( SELECT COALESCE( SUM(amount), 0 ) FROM cust_bill_pkg_detail
+               WHERE cust_bill_pkg.billpkgnum = cust_bill_pkg_detail.billpkgnum
+             ) AS usage FROM cust_bill_pkg  $join_cust $join_pkg $where
+           ) AS countquery";
+} else {
+  $count_query .= " FROM cust_bill_pkg $join_cust $join_pkg $where";
+}
 
 my @select = (
                'cust_bill_pkg.*',