removing unacceptable display fields from cust_bill_pkg
[freeside.git] / FS / FS / cust_bill_pkg.pm
index d3bf65b..2bfde6d 100644 (file)
@@ -59,11 +59,6 @@ supported:
 
 =item section - Invoice section (overrides normal package section)
 
-=duplicate - Indicates this item appears elsewhere on the invoice
-             (and should not be retaxed or reincluded in totals)
-
-=post_total - A hint that this item should appear after invoice totals
-
 =cut
 
 sub section {
@@ -75,6 +70,11 @@ sub section {
   }
 }
 
+sub duplicate_section {
+  my $self = shift;
+  $self->duplicate ? $self->part_pkg->categoryname : '';
+}
+
 =item quantity - If not set, defaults to 1
 
 =item unitsetup - If not set, defaults to setup
@@ -137,6 +137,8 @@ sub insert {
       'billpkgnum' => $self->billpkgnum,
       'format'     => (ref($detail) ? $detail->[0] : '' ),
       'detail'     => (ref($detail) ? $detail->[1] : $detail ),
+      'amount'     => (ref($detail) ? $detail->[2] : '' ),
+      'classnum'   => (ref($detail) ? $detail->[3] : '' ),
     };
     $error = $cust_bill_pkg_detail->insert;
     if ( $error ) {
@@ -193,8 +195,6 @@ sub check {
       || $self->ut_numbern('edate')
       || $self->ut_textn('itemdesc')
       || $self->ut_textn('section')
-      || $self->ut_enum('duplicate', [ '', 'Y' ])
-      || $self->ut_enum('post_total', [ '', 'Y' ])
   ;
   return $error if $error;
 
@@ -370,7 +370,7 @@ sub owed_recur {
 # modeled after cust_bill::owed...
 sub owed {
   my( $self, $field ) = @_;
-  my $balance = $self->duplicate ? 0 : $self->$field();
+  my $balance = $self->$field();
   $balance -= $_->amount foreach ( $self->cust_bill_pay_pkg($field) );
   $balance -= $_->amount foreach ( $self->cust_credit_bill_pkg($field) );
   $balance = sprintf( '%.2f', $balance );
@@ -446,16 +446,68 @@ sub unitrecur {
     : $self->getfield('unitrecur');
 }
 
-=item separate_cdr
+=item usage CLASSNUM
 
-Returns true if this line item represents a cdr line item in its own section.
+Returns the amount of the charge associated with usage class CLASSNUM if
+CLASSNUM is defined.  Otherwise returns the total charge associated with
+usage.
   
 =cut
 
-# lame, but works for now
-sub separate_cdr {
-  my( $self ) = shift;
-  $self->pkgnum && $self->section ne $self->part_pkg->categoryname;
+sub usage {
+  my( $self, $classnum ) = @_;
+  my $sum = 0;
+  my @values = ();
+
+  if ( $self->get('details') ) {
+
+    @values = 
+      map { $_->[2] }
+      grep { ref($_) && ( defined($classnum) ? $_->[3] eq $classnum : 1 ) }
+      @{ $self->get('details') };
+
+  }else{
+
+    my $hashref = { 'billpkgnum' => $self->billpkgnum };
+    $hashref->{ 'classnum' } = $classnum if defined($classnum);
+    @values = map { $_->amount } qsearch('cust_bill_pkg_detail', $hashref);
+
+  }
+
+  foreach ( @values ) {
+    $sum += $_ if $_;
+  }
+  $sum;
+}
+
+=item usage_classes
+
+Returns a list of usage classnums associated with this invoice line's
+details.
+  
+=cut
+
+sub usage_classes {
+  my( $self ) = @_;
+
+  if ( $self->get('details') ) {
+
+    my %seen = ();
+    foreach my $detail ( grep { ref($_) } @{$self->get('details')} ) {
+      $seen{ $detail->[3] } = 1;
+    }
+    keys %seen;
+
+  }else{
+
+    map { $_->classnum }
+        qsearch({ table   => 'cust_bill_pkg_detail',
+                  hashref => { billpkgnum => $self->billpkgnum },
+                  select  => 'DISTINCT classnum',
+               });
+
+  }
+
 }
 
 =back