diff options
Diffstat (limited to 'FS')
-rw-r--r-- | FS/FS/Conf.pm | 7 | ||||
-rw-r--r-- | FS/FS/Schema.pm | 1 | ||||
-rw-r--r-- | FS/FS/cust_pkg.pm | 11 | ||||
-rw-r--r-- | FS/FS/part_pkg.pm | 37 | ||||
-rw-r--r-- | FS/FS/part_pkg/delayed_Mixin.pm | 12 |
5 files changed, 62 insertions, 6 deletions
diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm index f76c72ff4..ae1fd4be8 100644 --- a/FS/FS/Conf.pm +++ b/FS/FS/Conf.pm @@ -4349,6 +4349,13 @@ and customer address. Include units.', }, { + 'key' => 'part_pkg-delay_start', + 'section' => '', + 'description' => 'Enabled "delayed start" option for packages.', + 'type' => 'checkbox', + }, + + { 'key' => 'mcp_svcpart', 'section' => '', 'description' => 'Master Control Program svcpart. Leave this blank.', diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm index 6df45e2b1..5e2e2efd5 100644 --- a/FS/FS/Schema.pm +++ b/FS/FS/Schema.pm @@ -2050,6 +2050,7 @@ sub tables_hashref { 'setup_show_zero', 'char', 'NULL', 1, '', '', 'successor', 'int', 'NULL', '', '', '', 'family_pkgpart','int', 'NULL', '', '', '', + 'delay_start', 'int', 'NULL', '', '', '', ], 'primary_key' => 'pkgpart', 'unique' => [], diff --git a/FS/FS/cust_pkg.pm b/FS/FS/cust_pkg.pm index ddfab5dcb..2d7393aa3 100644 --- a/FS/FS/cust_pkg.pm +++ b/FS/FS/cust_pkg.pm @@ -289,6 +289,7 @@ sub insert { my $part_pkg = $self->part_pkg; + # if the package def says to start only on the first of the month: if ( $part_pkg->option('start_1st', 1) && !$self->start_date ) { my ($sec,$min,$hour,$mday,$mon,$year) = (localtime(time) )[0,1,2,3,4,5]; $mon += 1 unless $mday == 1; @@ -296,6 +297,8 @@ sub insert { $self->start_date( timelocal_nocheck(0,0,0,1,$mon,$year) ); } + # set up any automatic expire/adjourn/contract_end timers + # based on the start date foreach my $action ( qw(expire adjourn contract_end) ) { my $months = $part_pkg->option("${action}_months",1); if($months and !$self->$action) { @@ -304,16 +307,16 @@ sub insert { } } + # if this package has "free days" and delayed setup fee, tehn + # set start date that many days in the future. + # (this should have been set in the UI, but enforce it here) if ( ! $options{'change'} && ( my $free_days = $part_pkg->option('free_days',1) ) && $part_pkg->option('delay_setup',1) #&& ! $self->start_date ) { - my ($mday,$mon,$year) = (localtime(time) )[3,4,5]; - #my $start_date = ($self->start_date || timelocal(0,0,0,$mday,$mon,$year)) + 86400 * $free_days; - my $start_date = timelocal(0,0,0,$mday,$mon,$year) + 86400 * $free_days; - $self->start_date($start_date); + $self->start_date( $part_pkg->default_start_date ); } $self->order_date(time); diff --git a/FS/FS/part_pkg.pm b/FS/FS/part_pkg.pm index 22e8828d6..0722647b4 100644 --- a/FS/FS/part_pkg.pm +++ b/FS/FS/part_pkg.pm @@ -5,7 +5,7 @@ use strict; use vars qw( %plans $DEBUG $setup_hack $skip_pkg_svc_hack ); use Carp qw(carp cluck confess); use Scalar::Util qw( blessed ); -use Time::Local qw( timelocal_nocheck ); +use Time::Local qw( timelocal timelocal_nocheck ); use Tie::IxHash; use FS::Conf; use FS::Record qw( qsearch qsearchs dbh dbdef ); @@ -116,6 +116,8 @@ If this record is not obsolete, will be null. ancestor of this record. If this record is not a successor to another part_pkg, will be equal to pkgpart. +=item delay_start - Number of days to delay package start, by default + =back =head1 METHODS @@ -682,6 +684,7 @@ sub check { ) || $self->ut_numbern('fcc_ds0s') || $self->ut_numbern('fcc_voip_class') + || $self->ut_numbern('delay_start') || $self->ut_foreign_keyn('successor', 'part_pkg', 'pkgpart') || $self->ut_foreign_keyn('family_pkgpart', 'part_pkg', 'pkgpart') || $self->SUPER::check @@ -1072,9 +1075,39 @@ sub is_free { } } +# whether the plan allows discounts to be applied to this package sub can_discount { 0; } - + +# whether the plan allows changing the start date sub can_start_date { 1; } + +# the default start date; takes an FS::cust_main as an argument +sub default_start_date { + my $self = shift; + my $cust_main = shift; + my $conf = FS::Conf->new; + + if ( $self->delay_start ) { + my $delay = $self->delay_start; + + my ($mday,$mon,$year) = (localtime(time))[3,4,5]; + my $start_date = timelocal(0,0,0,$mday,$mon,$year) + 86400 * $delay; + return $start_date; + + } elsif ( $conf->exists('order_pkg-no_start_date') ) { + + return ''; + + } elsif ( $cust_main ) { + + return $cust_main->next_bill_date; + + } else { + + return ''; + + } +} sub can_currency_exchange { 0; } diff --git a/FS/FS/part_pkg/delayed_Mixin.pm b/FS/FS/part_pkg/delayed_Mixin.pm index ab53bda06..ae286d351 100644 --- a/FS/FS/part_pkg/delayed_Mixin.pm +++ b/FS/FS/part_pkg/delayed_Mixin.pm @@ -2,6 +2,7 @@ package FS::part_pkg::delayed_Mixin; use strict; use vars qw(%info); +use Time::Local qw(timelocal); use NEXT; %info = ( @@ -52,4 +53,15 @@ sub calc_remain { sub can_start_date { ! shift->option('delay_setup', 1) } +sub default_start_date { + my $self = shift; + if ( $self->option('delay_setup') and $self->option('free_days') ) { + my $delay = $self->option('free_days'); + + my ($mday, $mon, $year) = (localtime(time))[3,4,5]; + return timelocal(0,0,0,$mday,$mon,$year) + 86400 * $self->option('free_days'); + } + return $self->NEXT::default_start_date(@_); +} + 1; |