optimize CDR rating after timed rate perf regression, RT#15739
[freeside.git] / httemplate / browse / part_pkg.cgi
index 42eb5df..7668060 100755 (executable)
@@ -32,6 +32,7 @@ my $acl_edit        = $curuser->access_right($edit);
 my $acl_edit_global = $curuser->access_right($edit_global);
 my $acl_config      = $curuser->access_right('Configuration'); #to edit services
                                                                #and agent types
+                                                               #and bulk change
 
 die "access denied"
   unless $acl_edit || $acl_edit_global;
@@ -72,7 +73,7 @@ if ( $cgi->param('missing_recur_fee') ) {
   push @where, "0 = ( SELECT COUNT(*) FROM part_pkg_option
                         WHERE optionname = 'recur_fee'
                           AND part_pkg_option.pkgpart = part_pkg.pkgpart
-                          AND CAST ( optionvalue AS NUMERIC ) > 0
+                          AND CAST( optionvalue AS NUMERIC ) > 0
                     )";
 }
 
@@ -96,6 +97,13 @@ $select = "
   *,
 
   ( $count_cust_pkg
+      AND ( setup IS NULL OR setup = 0 )
+      AND ( cancel IS NULL OR cancel = 0 )
+      AND ( susp IS NULL OR susp = 0 )
+  ) AS num_not_yet_billed,
+
+  ( $count_cust_pkg
+      AND setup IS NOT NULL AND setup != 0
       AND ( cancel IS NULL OR cancel = 0 )
       AND ( susp IS NULL OR susp = 0 )
   ) AS num_active,
@@ -140,6 +148,7 @@ my $filter_change =
 #restore this so pagination works
 $cgi->param('classnum', $classnum) if length($classnum);
 
+#should hide this if there aren't any classes
 my $html_posttotal =
   "$filter_change\n<BR>( show class: ".
   include('/elements/select-pkg_class.html',
@@ -195,6 +204,9 @@ push @fields, sub {
   my $part_pkg = shift;
   (my $plan = $plan_labels{$part_pkg->plan} ) =~ s/ /&nbsp;/g;
   my $is_recur = ( $part_pkg->freq ne '0' );
+  my @discounts = sort { $a->months <=> $b->months }
+                  map { $_->discount  }
+                  $part_pkg->part_pkg_discount;
 
   [
     [
@@ -208,20 +220,34 @@ push @fields, sub {
                sprintf('%.2f', $part_pkg->option('setup_fee') ),
         align=>'right'
       },
-      { data => ( $is_recur ? ' setup' : ' one-time' ),
+      { data => ( ( $is_recur ? ' setup' : ' one-time' ).
+                  ( $part_pkg->option('recur_fee') == 0
+                      && $part_pkg->setup_show_zero
+                    ? ' (printed on invoices)'
+                    : ''
+                  )
+                ),
         align=>'left',
       },
     ],
     [
-      { data=>( $is_recur
-                  ? $money_char.sprintf('%.2f ', $part_pkg->option('recur_fee') )
-                  : $part_pkg->freq_pretty
-              ),
+      { data=>(
+          $is_recur
+            ? $money_char. sprintf('%.2f ', $part_pkg->option('recur_fee'))
+            : $part_pkg->freq_pretty
+        ),
         align=> ( $is_recur ? 'right' : 'center' ),
         colspan=> ( $is_recur ? 1 : 2 ),
       },
       ( $is_recur
-        ?  { data => ( $is_recur ? $part_pkg->freq_pretty : '' ),
+        ?  { data => ( $is_recur
+               ? $part_pkg->freq_pretty.
+                 ( $part_pkg->option('recur_fee') == 0
+                     && $part_pkg->recur_show_zero
+                   ? ' (printed on invoices)'
+                   : ''
+                 )
+               : '' ),
              align=>'left',
            }
         : ()
@@ -238,6 +264,28 @@ push @fields, sub {
           }
       $part_pkg->bill_part_pkg_link
     ),
+    ( scalar(@discounts)
+        ?  [ 
+              { data => '<b>Discounts</b>',
+                align=>'center', #?
+                colspan=>2,
+              }
+            ]
+        : ()  
+    ),
+    ( scalar(@discounts)
+        ? map { 
+            [ 
+              { data  => $_->months. ':',
+                align => 'right',
+              },
+              { data => $_->amount ? '$'. $_->amount : $_->percent. '%'
+              }
+            ]
+          }
+          @discounts
+        : ()
+    ),
   ];
 
 #  $plan_labels{$part_pkg->plan}.'<BR>'.
@@ -284,6 +332,7 @@ if ( $acl_edit_global ) {
 #if ( $cgi->param('active') ) {
   push @header, 'Customer<BR>packages';
   my %col = (
+    'not yet billed'  => '009999', #teal? cyan?
     'active'          => '00CC00',
     'suspended'       => 'FF9900',
     'cancelled'       => 'FF0000',
@@ -292,8 +341,8 @@ if ( $acl_edit_global ) {
   );
   my $cust_pkg_link = $p. 'search/cust_pkg.cgi?pkgpart=';
   push @fields, sub { my $part_pkg = shift;
-                      [
-                        map {
+                        [
+                        map( {
                               my $magic = $_;
                               my $label = $_;
                               if ( $magic eq 'active' && $part_pkg->freq == 0 ) {
@@ -301,6 +350,7 @@ if ( $acl_edit_global ) {
                                 #$label = 'one-time charge',
                                 $label = 'charge',
                               }
+                              $label= 'not yet billed' if $magic eq 'not_yet_billed';
                           
                               [
                                 {
@@ -325,8 +375,24 @@ if ( $acl_edit_global ) {
                                             ),
                                 },
                               ],
-                            } (qw( active suspended cancelled ))
-                      ]; };
+                            } (qw( not_yet_billed active suspended cancelled ))
+                          ),
+                      ($acl_config ? 
+                        [ {}, 
+                          { 'data'  => '<FONT SIZE="-1">[ '.
+                              include('/elements/popup_link.html',
+                                'label'       => 'change',
+                                'action'      => "${p}edit/bulk-cust_pkg.html?".
+                                                 'pkgpart='.$part_pkg->pkgpart,
+                                'actionlabel' => 'Change Packages',
+                                'width'       => 569,
+                                'height'      => 210,
+                              ).' ]</FONT>',
+                            'align' => 'left',
+                          } 
+                        ] : () ),
+                      ]; 
+  };
   $align .= 'r';
 #}