projects
/
freeside.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
*** empty log message ***
[freeside.git]
/
FS
/
FS
/
part_pkg.pm
diff --git
a/FS/FS/part_pkg.pm
b/FS/FS/part_pkg.pm
index
faaf485
..
a5e3c21
100644
(file)
--- 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 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 );
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;
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;
$DEBUG = 0;
@@
-230,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 $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,
my $pkg_svc = new FS::pkg_svc( {
'pkgpart' => $self->pkgpart,
@@
-372,6
+377,7
@@
sub replace {
next unless $old_quantity != $quantity || $old_primary_svc ne $primary_svc;
my $new_pkg_svc = new FS::pkg_svc( {
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,
'pkgpart' => $new->pkgpart,
'svcpart' => $part_svc->svcpart,
'quantity' => $quantity,
@@
-414,7
+420,7
@@
sub check {
my $error = $self->ut_number('freq');
return $error if $error;
} else {
my $error = $self->ut_number('freq');
return $error if $error;
} else {
- $self->freq =~ /^(\d+[dw]?)$/
+ $self->freq =~ /^(\d+[
h
dw]?)$/
or return "Illegal or empty freq: ". $self->freq;
$self->freq($1);
}
or return "Illegal or empty freq: ". $self->freq;
$self->freq($1);
}
@@
-432,9
+438,20
@@
sub check {
;
return $error if $error;
;
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});
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');
+
'';
}
'';
}
@@
-529,6
+546,7
@@
Returns an english representation of the I<freq> field, such as "monthly",
tie %freq, 'Tie::IxHash',
'0' => '(no recurring fee)',
tie %freq, 'Tie::IxHash',
'0' => '(no recurring fee)',
+ '1h' => 'hourly',
'1d' => 'daily',
'1w' => 'weekly',
'2w' => 'biweekly (every 2 weeks)',
'1d' => 'daily',
'1w' => 'weekly',
'2w' => 'biweekly (every 2 weeks)',
@@
-538,6
+556,10
@@
tie %freq, 'Tie::IxHash',
'6' => 'semiannually (every 6 months)',
'12' => 'annually',
'24' => 'biannually (every 2 years)',
'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 {
;
sub freq_pretty {
@@
-547,8
+569,8
@@
sub freq_pretty {
$freq{$freq};
} else {
my $interval = 'month';
$freq{$freq};
} else {
my $interval = 'month';
- if ( $freq =~ /^(\d+)([dw])$/ ) {
- my %interval = ( 'd'=>'day', 'w'=>'week' );
+ if ( $freq =~ /^(\d+)([
h
dw])$/ ) {
+ my %interval = ( '
h' => 'hour', '
d'=>'day', 'w'=>'week' );
$interval = $interval{$2};
}
if ( $1 == 1 ) {
$interval = $interval{$2};
}
if ( $1 == 1 ) {
@@
-635,9
+657,16
@@
on how to create new price plans, but until then, see L</NEW PLAN CLASSES>.
sub _rebless {
my $self = shift;
my $plan = $self->plan;
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";
my $class = ref($self). "::$plan";
+ warn "reblessing $self into $class" if $DEBUG;
eval "use $class;";
eval "use $class;";
-
#
die $@ if $@;
+ die $@ if $@;
bless($self, $class) unless $@;
$self;
}
bless($self, $class) unless $@;
$self;
}
@@
-689,6
+718,7
@@
sub calc_cancel { 0; }
my %info;
foreach my $INC ( @INC ) {
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 {
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 {
@@
-739,6
+769,8
@@
The delete method is unimplemented.
setup and recur semantics are not yet defined (and are implemented in
FS::cust_bill. hmm.).
setup and recur semantics are not yet defined (and are implemented in
FS::cust_bill. hmm.).
+plandata should go
+
=head1 SEE ALSO
L<FS::Record>, L<FS::cust_pkg>, L<FS::type_pkgs>, L<FS::pkg_svc>, L<Safe>.
=head1 SEE ALSO
L<FS::Record>, L<FS::cust_pkg>, L<FS::type_pkgs>, L<FS::pkg_svc>, L<Safe>.