X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fpart_pkg.pm;h=709e137f373f92f092f6136cb4fd923a2e883431;hp=3adbc06e821623166f3ac3ec6225909816c20ae8;hb=674cb2d9d7105f4cc2871539b2e9f7088cdaa750;hpb=f7329b766b496393064a4dd4df2515cbfbb00827 diff --git a/FS/FS/part_pkg.pm b/FS/FS/part_pkg.pm index 3adbc06e8..709e137f3 100644 --- a/FS/FS/part_pkg.pm +++ b/FS/FS/part_pkg.pm @@ -770,6 +770,32 @@ sub check { ''; } +=item check_options + +For a passed I<$options> hashref, validates any options that +have 'validate' subroutines defined (I<$options> values might +be altered.) Returns error message, or empty string if valid. + +Invoked by L and L via the equivalent +methods in L. + +=cut + +sub check_options { + my ($self,$options) = @_; + foreach my $option (keys %$options) { + if (exists $plans{ $self->plan }->{fields}->{$option}) { + if (exists($plans{$self->plan}->{fields}->{$option}->{'validate'})) { + # pass option name for use in error message + # pass a reference to the $options value, so it can be cleaned up + my $error = &{$plans{$self->plan}->{fields}->{$option}->{'validate'}}($option,\($options->{$option})); + return $error if $error; + } + } # else "option does not exist" error? + } + return ''; +} + =item check_pkg_svc Checks pkg_svc records as a whole (for part_svc_link dependencies). @@ -1119,14 +1145,11 @@ sub pkg_svc { # qsearch( 'pkg_svc', { 'pkgpart' => $self->pkgpart } ); my $opt = ref($_[0]) ? $_[0] : { @_ }; - my %pkg_svc = map { $_->svcpart => $_ } - grep { $_->quantity } - qsearch( 'pkg_svc', { 'pkgpart' => $self->pkgpart } ); + my %pkg_svc = map { $_->svcpart => $_ } $self->_pkg_svc; 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 } ); + my @pkg_svc = $dst_pkg->_pkg_svc; foreach my $pkg_svc ( @pkg_svc ) { if ( $pkg_svc{$pkg_svc->svcpart} ) { my $quantity = $pkg_svc{$pkg_svc->svcpart}->quantity; @@ -1146,6 +1169,17 @@ sub pkg_svc { } +sub _pkg_svc { + my $self = shift; + grep { $_->quantity } + qsearch({ + 'select' => 'pkg_svc.*, part_svc.*', + 'table' => 'pkg_svc', + 'addl_from' => 'LEFT JOIN part_svc USING ( svcpart )', + 'hashref' => { 'pkgpart' => $self->pkgpart }, + }); +} + =item svcpart [ SVCDB ] Returns the svcpart of the primary service definition (see L) @@ -1416,9 +1450,8 @@ sub option { my( $self, $opt, $ornull ) = @_; #cache: was pulled up in the original part_pkg query - if ( $opt =~ /^(setup|recur)_fee$/ && defined($self->hashref->{"_$opt"}) ) { - return $self->hashref->{"_$opt"}; - } + return $self->hashref->{"_opt_$opt"} + if exists $self->hashref->{"_opt_$opt"}; cluck "$self -> option: searching for $opt" if $DEBUG; my $part_pkg_option = @@ -2332,6 +2365,26 @@ sub _pkgs_sql { } +=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