X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fcust_bill_pkg.pm;h=1ee5c0943b6ceeee4d45de0520f405c5a94be599;hb=7fbe88a91e80c40c70f3e666ce1965586544c181;hp=58e24192f220c4081beccb44cf486d83d9a74041;hpb=f1371047a59f62165fa3b6d639af72e03cba9a8f;p=freeside.git diff --git a/FS/FS/cust_bill_pkg.pm b/FS/FS/cust_bill_pkg.pm index 58e24192f..1ee5c0943 100644 --- a/FS/FS/cust_bill_pkg.pm +++ b/FS/FS/cust_bill_pkg.pm @@ -19,6 +19,8 @@ use FS::cust_bill_pkg_tax_location; use FS::cust_bill_pkg_tax_rate_location; use FS::cust_tax_adjustment; +use List::Util qw(sum); + @ISA = qw( FS::cust_main_Mixin FS::Record ); $DEBUG = 0; @@ -147,30 +149,8 @@ sub insert { if ( $self->get('details') ) { foreach my $detail ( @{$self->get('details')} ) { - my %hash = (); - if ( ref($detail) ) { - if ( ref($detail) eq 'ARRAY' ) { - #carp "this way sucks, use a hash"; #but more useful/friendly - $hash{'format'} = $detail->[0]; - $hash{'detail'} = $detail->[1]; - $hash{'amount'} = $detail->[2]; - $hash{'classnum'} = $detail->[3]; - $hash{'phonenum'} = $detail->[4]; - $hash{'accountcode'} = $detail->[5]; - $hash{'startdate'} = $detail->[6]; - $hash{'duration'} = $detail->[7]; - $hash{'regionname'} = $detail->[8]; - } elsif ( ref($detail) eq 'HASH' ) { - %hash = %$detail; - } else { - die "unknow detail type ". ref($detail); - } - } else { - $hash{'detail'} = $detail; - } - $hash{'billpkgnum'} = $self->billpkgnum; - my $cust_bill_pkg_detail = new FS::cust_bill_pkg_detail \%hash; - $error = $cust_bill_pkg_detail->insert; + $detail->billpkgnum($self->billpkgnum); + $error = $detail->insert; if ( $error ) { $dbh->rollback if $oldAutoCommit; return "error inserting cust_bill_pkg_detail: $error"; @@ -351,6 +331,8 @@ sub check { ; return $error if $error; + $self->regularize_details; + #if ( $self->pkgnum != 0 ) { #allow unchecked pkgnum 0 for tax! (add to part_pkg?) if ( $self->pkgnum > 0 ) { #allow -1 for non-pkg line items and 0 for tax (add to part_pkg?) return "Unknown pkgnum ". $self->pkgnum @@ -363,6 +345,50 @@ sub check { $self->SUPER::check; } +=item regularize_details + +Converts the contents of the 'details' pseudo-field to +L objects, if they aren't already. + +=cut + +sub regularize_details { + my $self = shift; + if ( $self->get('details') ) { + foreach my $detail ( @{$self->get('details')} ) { + if ( ref($detail) ne 'FS::cust_bill_pkg_detail' ) { + # then turn it into one + my %hash = (); + if ( ! ref($detail) ) { + $hash{'detail'} = $detail; + } + elsif ( ref($detail) eq 'HASH' ) { + %hash = %$detail; + } + elsif ( ref($detail) eq 'ARRAY' ) { + carp "passing invoice details as arrays is deprecated"; + #carp "this way sucks, use a hash"; #but more useful/friendly + $hash{'format'} = $detail->[0]; + $hash{'detail'} = $detail->[1]; + $hash{'amount'} = $detail->[2]; + $hash{'classnum'} = $detail->[3]; + $hash{'phonenum'} = $detail->[4]; + $hash{'accountcode'} = $detail->[5]; + $hash{'startdate'} = $detail->[6]; + $hash{'duration'} = $detail->[7]; + $hash{'regionname'} = $detail->[8]; + } + else { + die "unknown detail type ". ref($detail); + } + $detail = new FS::cust_bill_pkg_detail \%hash; + } + $detail->billpkgnum($self->billpkgnum) if $self->billpkgnum; + } + } + return; +} + =item cust_pkg Returns the package (see L) for this invoice line item. @@ -531,7 +557,7 @@ sub details { #avoid the fetchall_arrayref and loop for less memory usage? - map { $_->[0] eq 'C' + map { (defined($_->[0]) && $_->[0] eq 'C') ? &{$format_sub}( $_->[1] ) : &{$escape_function}( $_->[1] ); } @@ -863,29 +889,15 @@ usage. sub usage { my( $self, $classnum ) = @_; + $self->regularize_details; if ( $self->get('details') ) { - my $sum = 0; - foreach my $value ( - map { ref($_) eq 'HASH' - ? $_->{'amount'} - : $_->[2] - } - grep { ref($_) && ( defined($classnum) - ? $classnum eq ( ref($_) eq 'HASH' - ? $_->{'classnum'} - : $_->[3] - ) - : 1 - ) - } + return sum( 0, + map { $_->amount || 0 } + grep { !defined($classnum) or $classnum eq $_->classnum } @{ $self->get('details') } - ) { - $sum += $value if $value; - } - - return $sum; + ); } else { @@ -896,7 +908,7 @@ sub usage { my $sth = dbh->prepare($sql) or die dbh->errstr; $sth->execute or die $sth->errstr; - return $sth->fetchrow_arrayref->[0]; + return $sth->fetchrow_arrayref->[0] || 0; } @@ -911,16 +923,11 @@ details. sub usage_classes { my( $self ) = @_; + $self->regularize_details; if ( $self->get('details') ) { - my %seen = (); - foreach my $detail ( grep { ref($_) } @{$self->get('details')} ) { - $seen{ ref($detail) eq 'HASH' - ? $detail->{'classnum'} - : $detail->[3] - } = 1; - } + my %seen = ( map { $_->classnum => 1 } @{ $self->get('details') } ); keys %seen; } else {