X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fpart_pkg.pm;h=a5e3c21707bbc8ffe4b68b47ac9569b26da9f235;hb=a5a4afbb77bbdffc25ae94d10b645b0bcc76e859;hp=f210a67d47fb21b1bd66d9e46257990a54e03c91;hpb=55a68e4aabe10db4d9c3ab1bb8befd2f9f4b9008;p=freeside.git diff --git a/FS/FS/part_pkg.pm b/FS/FS/part_pkg.pm index f210a67d4..a5e3c2170 100644 --- a/FS/FS/part_pkg.pm +++ b/FS/FS/part_pkg.pm @@ -2,7 +2,7 @@ package FS::part_pkg; use strict; use vars qw( @ISA %freq %plans $DEBUG ); -use Carp qw(carp cluck); +use Carp qw(carp cluck confess); use Tie::IxHash; use FS::Conf; use FS::Record qw( qsearch qsearchs dbh dbdef ); @@ -13,7 +13,9 @@ use FS::agent_type; use FS::type_pkgs; use FS::part_pkg_option; -@ISA = qw( FS::Record ); +@ISA = qw( FS::Record ); # FS::option_Common ); # this can use option_Common + # when all the plandata bs is + # gone $DEBUG = 0; @@ -116,8 +118,8 @@ sub clone { Adds this package definition to the database. If there is an error, returns the error, otherwise returns false. -Currently available options are: I, I, I and -I. +Currently available options are: I, I, I, +I and I. If I is set to a hashref with svcparts as keys and quantities as values, appropriate FS::pkg_svc records will be inserted. @@ -131,6 +133,9 @@ record itself), the object will be updated to point to this package definition. In conjunction with I, if I is set to a scalar reference, the scalar will be updated with the custnum value from the cust_pkg record. +If I is set to a hashref of options, appropriate FS::part_pkg_option +records will be inserted. + =cut sub insert { @@ -163,7 +168,8 @@ sub insert { } if ( $plandata ) { - warn " inserting part_pkg_option records for plandata" if $DEBUG; + + warn " inserting part_pkg_option records for plandata" if $DEBUG; foreach my $part_pkg_option ( map { /^(\w+)=(.*)$/ or do { $dbh->rollback if $oldAutoCommit; return "illegal plandata: $plandata"; @@ -182,6 +188,27 @@ sub insert { return $error; } } + + } elsif ( $options{'options'} ) { + + warn " inserting part_pkg_option records for options hashref" if $DEBUG; + foreach my $optionname ( keys %{$options{'options'}} ) { + + my $part_pkg_option = + new FS::part_pkg_option { + 'pkgpart' => $self->pkgpart, + 'optionname' => $optionname, + 'optionvalue' => $options{'options'}->{$optionname}, + }; + + my $error = $part_pkg_option->insert; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + + } + } my $conf = new FS::Conf; @@ -205,7 +232,10 @@ sub insert { my $pkg_svc = $options{'pkg_svc'} || {}; foreach my $part_svc ( qsearch('part_svc', {} ) ) { my $quantity = $pkg_svc->{$part_svc->svcpart} || 0; - my $primary_svc = $options{'primary_svc'} == $part_svc->svcpart ? 'Y' : ''; + my $primary_svc = + ( $options{'primary_svc'} && $options{'primary_svc'}==$part_svc->svcpart ) + ? 'Y' + : ''; my $pkg_svc = new FS::pkg_svc( { 'pkgpart' => $self->pkgpart, @@ -347,6 +377,7 @@ sub replace { next unless $old_quantity != $quantity || $old_primary_svc ne $primary_svc; my $new_pkg_svc = new FS::pkg_svc( { + 'pkgsvcnum' => ( $old_pkg_svc ? $old_pkg_svc->pkgsvcnum : '' ), 'pkgpart' => $new->pkgpart, 'svcpart' => $part_svc->svcpart, 'quantity' => $quantity, @@ -389,7 +420,7 @@ sub check { my $error = $self->ut_number('freq'); return $error if $error; } else { - $self->freq =~ /^(\d+[dw]?)$/ + $self->freq =~ /^(\d+[hdw]?)$/ or return "Illegal or empty freq: ". $self->freq; $self->freq($1); } @@ -407,9 +438,20 @@ sub check { ; return $error if $error; + if ( $self->classnum !~ /^$/ ) { + my $error = $self->ut_foreign_key('classnum', 'pkg_class', 'classnum'); + return $error if $error; + } else { + $self->classnum(''); + } + return 'Unknown plan '. $self->plan unless exists($plans{$self->plan}); + my $conf = new FS::Conf; + return 'Taxclass is required' + if ! $self->taxclass && $conf->exists('require_taxclasses'); + ''; } @@ -504,6 +546,7 @@ Returns an english representation of the I field, such as "monthly", tie %freq, 'Tie::IxHash', '0' => '(no recurring fee)', + '1h' => 'hourly', '1d' => 'daily', '1w' => 'weekly', '2w' => 'biweekly (every 2 weeks)', @@ -513,6 +556,10 @@ tie %freq, 'Tie::IxHash', '6' => 'semiannually (every 6 months)', '12' => 'annually', '24' => 'biannually (every 2 years)', + '36' => 'triannually (every 3 years)', + '48' => '(every 4 years)', + '60' => '(every 5 years)', + '120' => '(every 10 years)', ; sub freq_pretty { @@ -522,8 +569,8 @@ sub freq_pretty { $freq{$freq}; } else { my $interval = 'month'; - if ( $freq =~ /^(\d+)([dw])$/ ) { - my %interval = ( 'd'=>'day', 'w'=>'week' ); + if ( $freq =~ /^(\d+)([hdw])$/ ) { + my %interval = ( 'h' => 'hour', 'd'=>'day', 'w'=>'week' ); $interval = $interval{$2}; } if ( $1 == 1 ) { @@ -610,9 +657,16 @@ on how to create new price plans, but until then, see L. sub _rebless { my $self = shift; my $plan = $self->plan; + unless ( $plan ) { + confess "no price plan found for pkgpart ". $self->pkgpart. "\n" + if $DEBUG; + return $self; + } + return $self if ref($self) =~ /::$plan$/; #already blessed into plan subclass my $class = ref($self). "::$plan"; + warn "reblessing $self into $class" if $DEBUG; eval "use $class;"; - #die $@ if $@; + die $@ if $@; bless($self, $class) unless $@; $self; } @@ -647,6 +701,11 @@ sub _calc_eval { $value; } +#fallback that return 0 for old legacy packages with no plan + +sub calc_remain { 0; } +sub calc_cancel { 0; } + =back =head1 SUBROUTINES @@ -659,6 +718,7 @@ sub _calc_eval { my %info; foreach my $INC ( @INC ) { + warn "globbing $INC/FS/part_pkg/*.pm\n" if $DEBUG; foreach my $file ( glob("$INC/FS/part_pkg/*.pm") ) { warn "attempting to load plan info from $file\n" if $DEBUG; $file =~ /\/(\w+)\.pm$/ or do { @@ -709,6 +769,8 @@ The delete method is unimplemented. setup and recur semantics are not yet defined (and are implemented in FS::cust_bill. hmm.). +plandata should go + =head1 SEE ALSO L, L, L, L, L.