L<FS:;cust_bill_pkg_discount> - Customer package discount line item application class
 
-L<FS:;discount> - Discount class
+L<FS::discount> - Discount class
+
+L<FS::discount_class> - Discount class class
 
 L<FS::reason_type> - Reason type class
 
 
   use FS::invoice_conf;
   use FS::cable_provider;
   use FS::cust_credit_void;
+  use FS::discount_class;
   # Sammath Naur
 
   if ( $FS::Mason::addl_handler_use ) {
 
       'columns' => [
         'discountnum', 'serial',     '',      '', '', '',
         #'agentnum',       'int', 'NULL',      '', '', '', 
+        'classnum',       'int', 'NULL',      '', '', '',
         'name',       'varchar', 'NULL', $char_d, '', '',
         'amount',   @money_type,                  '', '', 
         'percent',    'decimal',     '',   '7,4', '', '',
       'index'  => [], # [ 'agentnum' ], ],
     },
 
+    'discount_class' => {
+      'columns' => [
+        'classnum',    'serial',   '',      '', '', '', 
+        'classname',   'varchar',  '', $char_d, '', '', 
+        #'categorynum', 'int',  'NULL',      '', '', '', 
+        'disabled',    'char', 'NULL',       1, '', '', 
+      ],
+      'primary_key' => 'classnum',
+      'unique' => [],
+      'index' => [ ['disabled'] ],
+    },
+
     'cust_refund' => {
       'columns' => [
         'refundnum',    'serial',    '',   '', '', '', 
 
 package FS::discount;
+use base qw( FS::Record );
 
 use strict;
-use base qw( FS::Record );
 use FS::Record qw( qsearch qsearchs );
+use FS::discount_class;
 
 =head1 NAME
 
 
   my $error = 
     $self->ut_numbern('discountnum')
+    || $self->ut_foreign_keyn('classnum', 'discount_class', 'classnum')
     || $self->ut_textn('name')
     || $self->ut_money('amount')
     || $self->ut_float('percent') #actually decimal, but this will do
   ;
   return $error if $error;
 
-  #discourage non-integer months for package discounts
-  if ($self->discountnum) {
-    my $sql =
-      "SELECT count(*) FROM part_pkg_discount WHERE part_pkg_discount.discountnum = ".
-      $self->discountnum;
-
-    my $count = $self->scalar_sql($sql); 
-    return "months must be integers greater than 1"
-      if ( $count && ($self->ut_number('months') || $self->months < 2) );
-  }
+#causes "months must be integers greater than 1" errors when you go back and
+# try to edit an existing discount (because the months format as NN.000)
+#not worth whatever reason it came in with "prepayment discounts rt#5318" for
+#  #discourage non-integer months for package discounts
+#  if ($self->discountnum) {
+#    my $sql =
+#      "SELECT count(*) FROM part_pkg_discount WHERE part_pkg_discount.discountnum = ".
+#      $self->discountnum;
+#
+#    my $count = $self->scalar_sql($sql); 
+#    return "months must be integers greater than 1"
+#      if ( $count && ($self->ut_number('months') || $self->months < 2) );
+#  }
     
   $self->SUPER::check;
 }
   $desc;
 }
 
+sub classname {
+  my $self = shift;
+  my $discount_class = $self->discount_class;
+  $discount_class ? $discount_class->classname : '(none)';
+}
+
+sub discount_class {
+  my $self = shift;
+  qsearchs('discount_class', { 'classnum' => $self->classnum });
+}
+
+
 =back
 
 =head1 BUGS
 
 t/cable_provider.t
 FS/cust_credit_void.pm
 t/cust_credit_void.t
+FS/discount_class.pm
+t/discount_class.t
 
                  'count_query' => 'SELECT COUNT(*) FROM discount',
                  'disableable' => 1,
                  'disabled_statuspos' => 1,
-                 'header'      => [ 'Name', 'Discount', ],
+                 'header'      => [ 'Name', 'Class', 'Discount', ],
                  'fields'      => [ 'name',
+                                    'classname',
                                     'description',
                                   ],
                  'links'       => [ $link,
 
                  'table'  => 'discount',
                  'fields' => [
                                'name',
+                               { field => 'classnum', type => 'select-discount_class' },
                                { field => 'disabled', type => 'checkbox', value=>'Y', },
                                # a weird kind of false laziness
                                # w/elements/tr-select-discount.html
                  'labels' => { 
                                'discountnum' => 'Discount #',
                                'name'        => 'Name ',
+                               'classnum'    => 'Class',
                                'disabled'    => 'Disabled ',
                                '_type'       => 'Type ',
                                'amount'      => 'Amount ',
 
   #eo package grouping sub-menu
 
   $config_pkg{'Discounts'} = [ $fsurl.'browse/discount.html', '' ];
+  $config_pkg{'Discount classes'} = [ $fsurl.'browse/discount_class.html', '' ];
   $config_pkg{'Cancel/Suspend Reasons'} = [ \%config_pkg_reason, '' ];
 }
 
 
-<% include('/elements/header.html', 'Discount Report' ) %>
+<& /elements/header.html', 'Discount Report' &>
 
 <FORM ACTION="cust_bill_pkg_discount.html" METHOD="GET">
 
 <TABLE>
 
-<% include('/elements/tr-select-from_to.html' ) %>
+<!--
+  <& /elements/tr-select-discount_class.html,
+       'field'       => 'discount_classnum',
+       'pre_options' => [ '0' => 'all' ],
+       'empty_label' => '(none)'
+  &>
+-->
 
-<% include('/elements/tr-select-agent.html',
-             'label'         => 'For agent: ',
-             'disable_empty' => 0,
-          )
-%>
+  <& /elements/tr-select-from_to.html &>
 
-%# anything about line items, discounts or packages really
-%# otaker?
-%# package class?
-%# discount picker?  (discount classes and categories?  eek!)
+  <& /elements/tr-select-agent.html,
+       'label'         => 'For agent: ',
+       'disable_empty' => 0,
+  &>
+
+% # anything about line items, discounts or packages really
+% # otaker?
+% # package class?
+% # discount picker?  (discount classes and categories?  haha yup!)
 
 </TABLE>
 
 <BR><INPUT TYPE="submit" VALUE="Display">
 </FORM>
 
-<% include('/elements/footer.html') %>
+<& /elements/footer.html &>
 <%init>
 
 die "access denied"
 
                  'header'      => [
                    #'#',
                    'Discount',
+                   'Class',
                    'Amount',
                    'Months',
                    'Package',
                  'fields'      => [
                    #'billpkgdiscountnum',
                    sub { $_[0]->cust_pkg_discount->discount->description },
+                   sub { $_[0]->cust_pkg_discount->discount->classname },
                    sub { sprintf($money_char.'%.2f', shift->amount ) },
                    sub { my $m = shift->months;
                          $m =~ /\./ ? sprintf('%.2f', $m) : $m;
                    \&FS::UI::Web::cust_fields,
                  ],
                  'sort_fields' => [
+                   '',
                    '',
                    'amount',
                    'months',
                    '',
                    '',
                    '',
+                   '',
                    $ilink,
                    $ilink,
                    ( map { $_ ne 'Cust. Status' ? $clink : '' }
                    ),
                  ],
                  #'align' => 'rlrrrc'.FS::UI::Web::cust_aligns(),
-                 'align' => 'lrrlrr'.FS::UI::Web::cust_aligns(),
+                 'align' => 'lcrrlrr'.FS::UI::Web::cust_aligns(),
                  'color' => [ 
                               #'',
                               '',
                               '',
                               '',
                               '',
+                              '',
                               FS::UI::Web::cust_colors(),
                             ],
                  'style' => [ 
                               '',
                               '',
                               '',
+                              '',
                               FS::UI::Web::cust_styles(),
                             ],
            
   push @where, "cust_pkg_discount.usernum = $1";
 }
 
-# #classnum
+# (discount) classnum
+my $join_discount = '';
+#false laziness w/cust_pkg_discount.html and cust_pkg.pm::search
+if ( grep { $_ eq 'discount_classnum' } $cgi->param ) {
+
+#  my @classnum = ();
+#  if ( ref($params->{'discount_classnum'}) ) {
+#
+#    if ( ref($params->{'discount_classnum'}) eq 'HASH' ) {
+#      @classnum = grep $params->{'discount_classnum'}{$_}, keys %{ $params->{'discount_classnum'} };
+#    } elsif ( ref($params->{'discount_classnum'}) eq 'ARRAY' ) {
+#      @classnum = @{ $params->{'discount_classnum'} };
+#    } else {
+#      die 'unhandled discount_classnum ref '. $params->{'discount_classnum'};
+#    }
+#
+#
+#  } elsif ( $params->{'discount_classnum'} =~ /^(\d*)$/ && $1 ne '0' ) {
+#    @classnum = ( $1 );
+#  }
+#
+#  if ( @classnum ) {
+
+   if ( $cgi->param('discount_classnum') =~ /^(\d*)$/ && $1 ne '0' ) {
+    my @classnum = ( $1 );
+
+    $join_discount = 'LEFT JOIN discount USING (discountnum)';
+
+    my @c_where = ();
+    my @nums = grep $_, @classnum;
+    push @c_where, 'discount.classnum IN ('. join(',',@nums). ')' if @nums;
+    my $null = scalar( grep { $_ eq '' } @classnum );
+    push @c_where, 'discount.classnum IS NULL' if $null;
+
+    if ( scalar(@c_where) == 1 ) {
+      push @where, @c_where;
+    } elsif ( @c_where ) {
+      push @where, ' ( '. join(' OR ', @c_where). ' ) ';
+    }
+
+  }
+
+}
+
+# #(package) classnum
 # # not specified: all classes
 # # 0: empty class
 # # N: classnum
 #   }
 # }
 
-my $count_query = "SELECT COUNT(*), SUM(amount)";
+my $count_query = "SELECT COUNT(*), SUM(cust_bill_pkg_discount.amount)";
 
 my $join_cust_pkg_discount =
   'LEFT JOIN cust_pkg_discount USING (pkgdiscountnum)';
   #LEFT JOIN part_pkg AS override
   #  ON pkgpart_override = override.pkgpart ';
 
+my $join = "$join_cust_pkg_discount $join_discount $join_pkg $join_cust";
+
 my $where = ' WHERE '. join(' AND ', @where);
 
-$count_query .=
-  " FROM cust_bill_pkg_discount $join_cust_pkg_discount $join_pkg $join_cust ".
-  $where;
+$count_query .= " FROM cust_bill_pkg_discount $join $where";
 
 my @select = (
                'cust_bill_pkg_discount.*',
 
 my $query = {
   'table'     => 'cust_bill_pkg_discount',
-  'addl_from' => "$join_cust_pkg_discount $join_pkg $join_cust",
+  'addl_from' => $join,
   'hashref'   => {},
   'select'    => join(', ', @select ),
   'extra_sql' => $where,
 
                   #'redirect'    => $link,
                   'header'      => [ 'Status',
                                      'Discount',
+                                     'Class',
                                      'Months used',
                                      'Employee',
                                      'Package',
                   'fields'      => [
                                      sub { ucfirst( shift->status ) },
                                      sub { shift->discount->description },
+                                     sub { shift->discount->classname },
                                      sub { my $m = shift->months_used;
                                            $m =~ /\./ ? sprintf('%.2f',$m) : $m;
                                          },
                                      '',
                                      '',
                                      '',
+                                     '',
                                      ( map { $_ ne 'Cust. Status' ? $clink : ''}
                                            FS::UI::Web::cust_header()
                                      ),
                                    ],
-                  'align'       => 'clrll'. FS::UI::Web::cust_aligns(),
+                  'align'       => 'clcrll'. FS::UI::Web::cust_aligns(),
                   'color'       => [ 
                                      '',
                                      '',
                                      '',
                                      '',
                                      '',
+                                     '',
                                      FS::UI::Web::cust_colors(),
                                    ],
                  'style'        => [ 
                                      '',
                                      '',
                                      '',
+                                     '',
                                      FS::UI::Web::cust_styles(),
                                    ],
            
                ";     #XXX also end date
 }
 
+#classnum
+#false laziness w/cust_pkg.pm::search
+if ( grep { $_ eq 'classnum' } $cgi->param ) {
+
+#  my @classnum = ();
+#  if ( ref($params->{'classnum'}) ) {
+#
+#    if ( ref($params->{'classnum'}) eq 'HASH' ) {
+#      @classnum = grep $params->{'classnum'}{$_}, keys %{ $params->{'classnum'} };
+#    } elsif ( ref($params->{'classnum'}) eq 'ARRAY' ) {
+#      @classnum = @{ $params->{'classnum'} };
+#    } else {
+#      die 'unhandled classnum ref '. $params->{'classnum'};
+#    }
+#
+#
+#  } elsif ( $params->{'classnum'} =~ /^(\d*)$/ && $1 ne '0' ) {
+#    @classnum = ( $1 );
+#  }
+#
+#  if ( @classnum ) {
+
+   if ( $cgi->param('classnum') =~ /^(\d*)$/ && $1 ne '0' ) {
+    my @classnum = ( $1 );
+
+    my @c_where = ();
+    my @nums = grep $_, @classnum;
+    push @c_where, 'discount.classnum IN ('. join(',',@nums). ')' if @nums;
+    my $null = scalar( grep { $_ eq '' } @classnum );
+    push @c_where, 'discount.classnum IS NULL' if $null;
+
+    if ( scalar(@c_where) == 1 ) {
+      push @where, @c_where;
+    } elsif ( @c_where ) {
+      push @where, ' ( '. join(' OR ', @c_where). ' ) ';
+    }
+
+  }
+
+}
+
 #usernum
 if ( $cgi->param('usernum') =~ /^(\d+)$/ ) {
   push @where, "cust_pkg_discount.usernum = $1";
 
-<% include('/elements/header.html', 'Discount report' ) %>
+<& /elements/header.html, 'Discount report' &>
 
 <FORM ACTION="cust_bill_pkg_discount.html" METHOD="GET">
 
 
 <TABLE>
 
-  <% include( '/elements/tr-select-user.html',
-                'label'       => 'Discounts by employee: ',
-                'access_user' => \%access_user,
-            )
-  %>
+  <& /elements/tr-select-discount_class.html,
+       'field'       => 'discount_classnum',
+       'pre_options' => [ '0' => 'all' ],
+       'empty_label' => '(none)'
+  &>
 
-  <% include( '/elements/tr-select-agent.html',
-                 'curr_value'    => scalar( $cgi->param('agentnum') ),
-                 'label'         => 'for agent: ',
-                 'disable_empty' => 0,
-             )
-  %>
+  <& /elements/tr-select-user.html,
+       'label'       => 'Discounts by employee: ',
+       'access_user' => \%access_user,
+  &>
 
-  <% include( '/elements/tr-input-beginning_ending.html' ) %>
+  <& /elements/tr-select-agent.html,
+       'curr_value'    => scalar( $cgi->param('agentnum') ),
+       'label'         => 'for agent: ',
+       'disable_empty' => 0,
+  &>
 
-  <% include( '/elements/tr-input-lessthan_greaterthan.html',
-                'label' => 'Amount',
-               'field' => 'amount',
-            )
-  %>
+  <& /elements/tr-input-beginning_ending.html &>
+
+<!-- doesn't actually work yet, needs support in cust_bill_pkg_discount.html
+  <& /elements/tr-input-lessthan_greaterthan.html,
+       'label' => 'Amount',
+       'field' => 'amount',
+  &>
+-->
 
 </TABLE>
 
 
 </FORM>
 
-<% include('/elements/footer.html') %>
+<& /elements/footer.html &>
 <%init>
 
 die "access denied"
 
-<% include('/elements/header.html', 'Package discount report' ) %>
+<& /elements/header.html, 'Package discount report' &>
 
 <FORM ACTION="cust_pkg_discount.html" METHOD="GET">
 
 <TABLE>
 
   <TR>
-    <TD>Discount status</TD>
+    <TD ALIGN="right">Discount status</TD>
     <TD>
       <SELECT NAME="status">
         <OPTION VALUE="active">Active
     </TD>
   </TR>
 
-  <% include( '/elements/tr-select-user.html',
-                'label'       => 'Discounts by employee: ',
-                'access_user' => \%access_user,
-            )
-  %>
+  <& /elements/tr-select-discount_class.html,
+       'pre_options' => [ '0' => 'all' ],
+       'empty_label' => '(none)'
+  &>
 
-  <% include( '/elements/tr-select-agent.html',
-                 'curr_value'    => scalar( $cgi->param('agentnum') ),
-                 'label'         => 'for agent: ',
-                 'disable_empty' => 0,
-             )
-  %>
+  <& /elements/tr-select-user.html,
+       'label'       => 'Discounts by employee: ',
+       'access_user' => \%access_user,
+  &>
+
+  <& /elements/tr-select-agent.html,
+       'curr_value'    => scalar( $cgi->param('agentnum') ),
+       'label'         => 'for agent: ',
+       'disable_empty' => 0,
+  &>
 
 </TABLE>
 
 
 </FORM>
 
-<% include('/elements/footer.html') %>
+<& /elements/footer.html &>
 <%init>
 
 die "access denied"