X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fpart_pkg.pm;h=96bd019a635271dcb65b94d003d0488da808119e;hb=54e557ff60c8c11f3666c4f6acc33ebe8aa4b8ff;hp=3b5764200c6bb27cf29ed7cee013c88bb5a3fd75;hpb=9416ea00fca06f52c71c95968ecf00bfa2a57f1c;p=freeside.git diff --git a/FS/FS/part_pkg.pm b/FS/FS/part_pkg.pm index 3b5764200..96bd019a6 100644 --- a/FS/FS/part_pkg.pm +++ b/FS/FS/part_pkg.pm @@ -491,18 +491,46 @@ sub agent { qsearchs('agent', { 'agentnum' => $self->agentnum } ); } -=item pkg_svc +=item pkg_svc [ HASHREF | OPTION => VALUE ] Returns all FS::pkg_svc objects (see L) for this package definition (with non-zero quantity). +One option is available, I. If set true it will return the +services for this package definition alone, omitting services from any add-on +packages. + =cut sub pkg_svc { my $self = shift; - #sort { $b->primary cmp $a->primary } - grep { $_->quantity } - qsearch( 'pkg_svc', { 'pkgpart' => $self->pkgpart } ); + +# #sort { $b->primary cmp $a->primary } +# grep { $_->quantity } +# qsearch( 'pkg_svc', { 'pkgpart' => $self->pkgpart } ); + + my $opt = ref($_[0]) ? $_[0] : { @_ }; + my %pkg_svc = map { $_->svcpart => $_ } + grep { $_->quantity } + qsearch( 'pkg_svc', { 'pkgpart' => $self->pkgpart } ); + + unless ( $opt->{disable_linked} ) { + foreach my $dst_pkg ( map $_->dst_pkg, $self->svc_part_pkg_link ) { + my @pkg_svc = grep { $_->quantity } + qsearch( 'pkg_svc', { pkgpart=>$dst_pkg->pkgpart } ); + foreach my $pkg_svc ( @pkg_svc ) { + if ( $pkg_svc{$pkg_svc->svcpart} ) { + my $quantity = $pkg_svc{$pkg_svc->svcpart}->quantity; + $pkg_svc{$pkg_svc->svcpart}->quantity($quantity + $pkg_svc->quantity); + } else { + $pkg_svc{$pkg_svc->svcpart} = $pkg_svc; + } + } + } + } + + values(%pkg_svc); + } =item svcpart [ SVCDB ]