);
use strict;
-use vars qw( %plans $DEBUG $setup_hack $skip_pkg_svc_hack );
+use vars qw( %plans $DEBUG $setup_hack $skip_pkg_svc_hack
+ $cache_enabled %cache_link %cache_pkg_svc
+ );
use Carp qw(carp cluck confess);
use Scalar::Util qw( blessed );
use DateTime;
use FS::part_svc_link;
$DEBUG = 0;
+
$setup_hack = 0;
$skip_pkg_svc_hack = 0;
+$cache_enabled = 0;
+%cache_link = ();
+%cache_pkg_svc = ();
+
=head1 NAME
FS::part_pkg - Object methods for part_pkg objects
sub pkg_svc {
my $self = shift;
+ return @{ $cache_pkg_svc{$self->pkgpart} }
+ if $cache_enabled && $cache_pkg_svc{$self->pkgpart};
+
# #sort { $b->primary cmp $a->primary }
# grep { $_->quantity }
# qsearch( 'pkg_svc', { 'pkgpart' => $self->pkgpart } );
}
}
- values(%pkg_svc);
+ my @pkg_svc = values(%pkg_svc);
+
+ $cache_pkg_svc{$self->pkgpart} = \@pkg_svc if $cache_enabled;
+
+ @pkg_svc;
}
return $self->hashref->{"_$opt"};
}
- cluck "$self -> option: searching for $opt"
- if $DEBUG;
+ cluck "$self -> option: searching for $opt" if $DEBUG;
my $part_pkg_option =
qsearchs('part_pkg_option', {
pkgpart => $self->pkgpart,
sub _part_pkg_link {
my( $self, $type ) = @_;
- qsearch({ table => 'part_pkg_link',
- hashref => { 'src_pkgpart' => $self->pkgpart,
- 'link_type' => $type,
- #protection against infinite recursive links
- 'dst_pkgpart' => { op=>'!=', value=> $self->pkgpart },
- },
- order_by => "ORDER BY hidden",
- });
+
+ return @{ $cache_link{$type}->{$self->pkgpart} }
+ if $cache_enabled && $cache_link{$type}->{$self->pkgpart};
+
+ cluck $type.'_part_pkg_link called' if $DEBUG;
+
+ my @ppl =
+ qsearch({ table => 'part_pkg_link',
+ hashref => { src_pkgpart => $self->pkgpart,
+ link_type => $type,
+ #protection against infinite recursive links
+ dst_pkgpart => { op=>'!=', value=> $self->pkgpart },
+ },
+ order_by => "ORDER BY hidden",
+ });
+
+ $cache_link{$type}->{$self->pkgpart} = \@ppl if $cache_enabled;
+
+ return @ppl;
}
sub self_and_bill_linked {
}
+=item join_options_sql
+
+Returns an SQL fragment for JOINing the part_pkg_option records for this
+package's setup_fee and recur_fee (as setup_option and recur_option,
+respectively). Useful for optimization.
+
+=cut
+
+sub join_options_sql {
+ #my $class = shift;
+ "
+ LEFT JOIN part_pkg_option AS setup_option
+ ON ( part_pkg.pkgpart = setup_option.pkgpart
+ AND setup_option.optionname = 'setup_fee' )
+ LEFT JOIN part_pkg_option AS recur_option
+ ON ( part_pkg.pkgpart = recur_option.pkgpart
+ AND recur_option.optionname = 'recur_fee' )
+ ";
+}
+
=back
=head1 SUBROUTINES