- if ( $self->pkgnum ) {
- my $cust_pkg = qsearchs( 'cust_pkg', { 'pkgnum' => $self->pkgnum } );
- return "Unknown pkgnum" unless $cust_pkg;
- my $pkg_svc = qsearchs( 'pkg_svc', {
- 'pkgpart' => $cust_pkg->pkgpart,
- 'svcpart' => $self->svcpart,
- });
- # or new FS::pkg_svc ( { 'pkgpart' => $cust_pkg->pkgpart,
- # 'svcpart' => $self->svcpart,
- # 'quantity' => 0 } );
- my $quantity = $pkg_svc ? $pkg_svc->quantity : 0;
-
- my @cust_svc = qsearch('cust_svc', {
- 'pkgnum' => $self->pkgnum,
- 'svcpart' => $self->svcpart,
- });
- return "Already ". scalar(@cust_svc). " ". $part_svc->svc.
+ if ( $self->pkgnum && ! $ignore_quantity ) {
+
+ #slightly inefficient since ->pkg_svc will also look it up, but fixing
+ # a much larger perf problem and have bigger fish to fry
+ my $cust_pkg = $self->cust_pkg;
+
+ my $pkg_svc = $self->pkg_svc
+ or return "No svcpart ". $self->svcpart.
+ " services in pkgpart ". $cust_pkg->pkgpart;
+
+ my $num_cust_svc = $cust_pkg->num_cust_svc( $self->svcpart );
+
+ #false laziness w/cust_pkg->part_svc
+ my $num_avail = max( 0, ($cust_pkg->quantity || 1) * $pkg_svc->quantity
+ - $num_cust_svc
+ );
+
+ return "Already $num_cust_svc ". $pkg_svc->part_svc->svc.