summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorivan <ivan>2011-12-27 01:07:29 +0000
committerivan <ivan>2011-12-27 01:07:29 +0000
commit59a31e68e7363b4252dca782e2df63cdbc1ffb02 (patch)
tree368605d57d5effd2033a5f77068881a08e4ce431
parent03ba7166fa88a9cc92d343c916e2db05476e2fdf (diff)
optimize needless "resetting usage counters" work with non-svc_acct services, RT#15804
-rw-r--r--FS/FS/cust_pkg.pm76
1 files changed, 58 insertions, 18 deletions
diff --git a/FS/FS/cust_pkg.pm b/FS/FS/cust_pkg.pm
index b49ed6c5f..d67c02c0d 100644
--- a/FS/FS/cust_pkg.pm
+++ b/FS/FS/cust_pkg.pm
@@ -1736,11 +1736,13 @@ sub num_cust_event {
$sth->fetchrow_arrayref->[0];
}
-=item cust_svc [ SVCPART ]
+=item cust_svc [ SVCPART ] (old, deprecated usage)
+
+=item cust_svc [ OPTION => VALUE ... ] (current usage)
Returns the services for this package, as FS::cust_svc objects (see
-L<FS::cust_svc>). If a svcpart is specified, return only the matching
-services.
+L<FS::cust_svc>). Available options are svcpart and svcdb. If either is
+spcififed, returns only the matching services.
=cut
@@ -1749,9 +1751,25 @@ sub cust_svc {
return () unless $self->num_cust_svc(@_);
- if ( @_ ) {
- return qsearch( 'cust_svc', { 'pkgnum' => $self->pkgnum,
- 'svcpart' => shift, } );
+ my %opt = ();
+ if ( @_ && $_[0] =~ /^\d+/ ) {
+ $opt{svcpart} = shift;
+ } elsif ( @_ && ref($_[0]) eq 'HASH' ) {
+ %opt = %{ $_[0] };
+ } elsif ( @_ ) {
+ %opt = @_;
+ }
+
+ my %search = (
+ 'table' => 'cust_svc',
+ 'hashref' => { 'pkgnum' => $self->pkgnum },
+ );
+ if ( $opt{svcpart} ) {
+ $search{hashref}->{svcpart} = $opt{'svcpart'};
+ }
+ if ( $opt{'svcdb'} ) {
+ $search{addl_from} = ' LEFT JOIN part_svc USING ( svcpart ) ';
+ $search{hashref}->{svcdb} = $opt{'svcdb'};
}
cluck "cust_pkg->cust_svc called" if $DEBUG > 2;
@@ -1759,9 +1777,7 @@ sub cust_svc {
#if ( $self->{'_svcnum'} ) {
# values %{ $self->{'_svcnum'}->cache };
#} else {
- $self->_sort_cust_svc(
- [ qsearch( 'cust_svc', { 'pkgnum' => $self->pkgnum } ) ]
- );
+ $self->_sort_cust_svc( [ qsearch(\%search) ] );
#}
}
@@ -1829,10 +1845,12 @@ sub _sort_cust_svc {
}
-=item num_cust_svc [ SVCPART ]
+=item num_cust_svc [ SVCPART ] (old, deprecated usage)
-Returns the number of provisioned services for this package. If a svcpart is
-specified, counts only the matching services.
+=item num_cust_svc [ OPTION => VALUE ... ] (current usage)
+
+Returns the number of services for this package. Available options are svcpart
+and svcdb. If either is spcififed, returns only the matching services.
=cut
@@ -1847,11 +1865,31 @@ sub num_cust_svc {
cluck "cust_pkg->num_cust_svc called, _num_cust_svc:".$self->{'_num_cust_svc'}
if $DEBUG > 2;
- my $sql = 'SELECT COUNT(*) FROM cust_svc WHERE pkgnum = ?';
- $sql .= ' AND svcpart = ?' if @_;
+ my %opt = ();
+ if ( @_ && $_[0] =~ /^\d+/ ) {
+ $opt{svcpart} = shift;
+ } elsif ( @_ && ref($_[0]) eq 'HASH' ) {
+ %opt = %{ $_[0] };
+ } elsif ( @_ ) {
+ %opt = @_;
+ }
+
+ my $select = 'SELECT COUNT(*) FROM cust_svc ';
+ my $where = ' WHERE pkgnum = ? ';
+ my @param = ($self->pkgnum);
+
+ if ( $opt{'svcpart'} ) {
+ $where .= ' AND svcpart = ? ';
+ push @param, $opt{'svcpart'};
+ }
+ if ( $opt{'svcdb'} ) {
+ $select .= ' LEFT JOIN part_svc USING ( svcpart ) ';
+ $where .= ' AND svcdb = ? ';
+ push @param, $opt{'svcdb'};
+ }
- my $sth = dbh->prepare($sql) or die dbh->errstr;
- $sth->execute($self->pkgnum, @_) or die $sth->errstr;
+ my $sth = dbh->prepare("$select $where") or die dbh->errstr;
+ $sth->execute(@param) or die $sth->errstr;
$sth->fetchrow_arrayref->[0];
}
@@ -2652,7 +2690,8 @@ All svc_accts which are part of this package have their values reset.
sub set_usage {
my ($self, $valueref, %opt) = @_;
- foreach my $cust_svc ($self->cust_svc){
+ #only svc_acct can set_usage for now
+ foreach my $cust_svc ( $self->cust_svc( 'svcdb'=>'svc_acct' ) ) {
my $svc_x = $cust_svc->svc_x;
$svc_x->set_usage($valueref, %opt)
if $svc_x->can("set_usage");
@@ -2672,7 +2711,8 @@ All svc_accts which are part of this package have their values incremented.
sub recharge {
my ($self, $valueref) = @_;
- foreach my $cust_svc ($self->cust_svc){
+ #only svc_acct can set_usage for now
+ foreach my $cust_svc ( $self->cust_svc( 'svcdb'=>'svc_acct' ) ) {
my $svc_x = $cust_svc->svc_x;
$svc_x->recharge($valueref)
if $svc_x->can("recharge");