From 6235203383153fb1d3725662db4ee3e779b449f4 Mon Sep 17 00:00:00 2001 From: lsc Date: Thu, 23 Mar 2006 12:00:07 +0000 Subject: [PATCH] for subscription.pm and prorate.pm: -modify the subscription and prorate price plans (FS/FS/part_pkg/subscription.pm and prorate.pm) to have a configurable (add a field to the %info hash) billing day instead of "1st of the month" only. subscription will be easy, prorate will be a little trickier. essentially, I replaced the '1' in the 'day' field of the timelocal that generates $$date with the value I added to the %info hash, 'cutoff_day' -implement a price plan (new file in FS/FS/part_pkg/ - probably @ISA FS::part_pkg::subscription) that charges the first full month if the customer signs up between the 1st and the configurable billing day, and gives them the remainder of the month free if they sign up between the configurable billing day and the end of the month. if this is the first time the customer is billed, and if the date is greater than the cutoff date, advance $ssdate to cutoff_day of next month, else $$date is cutoff_date of this month. Either way, charge them for a month. ---------------------------------------------------------------------- --- FS/FS/part_pkg/billoneday.pm | 48 ++++++++++++++++++++++++++++++++++++++++++ FS/FS/part_pkg/prorate.pm | 14 +++++++----- FS/FS/part_pkg/subscription.pm | 15 +++++++------ 3 files changed, 66 insertions(+), 11 deletions(-) create mode 100644 FS/FS/part_pkg/billoneday.pm diff --git a/FS/FS/part_pkg/billoneday.pm b/FS/FS/part_pkg/billoneday.pm new file mode 100644 index 000000000..8740547a3 --- /dev/null +++ b/FS/FS/part_pkg/billoneday.pm @@ -0,0 +1,48 @@ +package FS::part_pkg::billoneday; + +use strict; +use vars qw(@ISA %info); +use Time::Local qw(timelocal); +#use FS::Record qw(qsearch qsearchs); +use FS::part_pkg::flat; + +@ISA = qw(FS::part_pkg::flat); + +%info = ( + 'name' => 'charge a full month every (selectable) billing day', + 'fields' => { + 'setup_fee' => { 'name' => 'Setup fee for this package', + 'default' => 0, + }, + 'recur_fee' => { 'name' => 'Recurring fee for this package', + 'default' => 0, + }, + 'cutoff_day' => { 'name' => 'billing day', + 'default' => 1, + }, + + }, + 'fieldorder' => [ 'setup_fee', 'recur_fee','cutoff_day'], + #'setup' => 'what.setup_fee.value', + #'recur' => '\'my $mnow = $sdate; my ($sec,$min,$hour,$mday,$mon,$year) = (localtime($sdate) )[0,1,2,3,4,5]; $sdate = timelocal(0,0,0,$self->option('cutoff_day'),$mon,$year); \' + what.recur_fee.value', + 'freq' => 'm', + 'weight' => 30, +); + +sub calc_recur { + my($self, $cust_pkg, $sdate ) = @_; + + my $mnow = $$sdate; + my ($sec,$min,$hour,$mday,$mon,$year) = (localtime($mnow) )[0,1,2,3,4,5]; + my $mstart = timelocal(0,0,0,$self->option('cutoff_day'),$mon,$year); + my $mend = timelocal(0,0,0,$self->option('cutoff_day'), $mon == 11 ? 0 : $mon+1, $year+($mon==11)); + + if($mday > $self->option('cutoff_date') and $mstart != $mnow ) { + $$sdate = timelocal(0,0,0,$self->option('cutoff_day'), $mon == 11 ? 0 : $mon+1, $year+($mon==11)); + } + else{ + $$sdate = timelocal(0,0,0,$self->option('cutoff_day'), $mon, $year); + } + $self->option('recur_fee'); +} +1; diff --git a/FS/FS/part_pkg/prorate.pm b/FS/FS/part_pkg/prorate.pm index 86c64d53a..d9464eef9 100644 --- a/FS/FS/part_pkg/prorate.pm +++ b/FS/FS/part_pkg/prorate.pm @@ -9,7 +9,7 @@ use FS::part_pkg::flat; @ISA = qw(FS::part_pkg::flat); %info = ( - 'name' => 'First partial month pro-rated, then flat-rate (1st of month billing)', + 'name' => 'First partial month pro-rated, then flat-rate (selectable billing day)', 'fields' => { 'setup_fee' => { 'name' => 'Setup fee for this package', 'default' => 0, @@ -21,8 +21,12 @@ use FS::part_pkg::flat; ' of service at cancellation', 'type' => 'checkbox', }, - }, - 'fieldorder' => [ 'setup_fee', 'recur_fee', 'unused_credit' ], + 'cutoff_day' => { 'name' => 'billing day', + 'default' => 1, + }, + + }, + 'fieldorder' => [ 'setup_fee', 'recur_fee', 'unused_credit', 'cutoff_day' ], #'setup' => 'what.setup_fee.value', #'recur' => '\'my $mnow = $sdate; my ($sec,$min,$hour,$mday,$mon,$year) = (localtime($sdate) )[0,1,2,3,4,5]; my $mstart = timelocal(0,0,0,1,$mon,$year); my $mend = timelocal(0,0,0,1, $mon == 11 ? 0 : $mon+1, $year+($mon==11)); $sdate = $mstart; ( $part_pkg->freq - 1 ) * \' + what.recur_fee.value + \' / $part_pkg->freq + \' + what.recur_fee.value + \' / $part_pkg->freq * ($mend-$mnow) / ($mend-$mstart) ; \'', 'freq' => 'm', @@ -33,8 +37,8 @@ sub calc_recur { my($self, $cust_pkg, $sdate ) = @_; my $mnow = $$sdate; my ($sec,$min,$hour,$mday,$mon,$year) = (localtime($mnow) )[0,1,2,3,4,5]; - my $mstart = timelocal(0,0,0,1,$mon,$year); - my $mend = timelocal(0,0,0,1, $mon == 11 ? 0 : $mon+1, $year+($mon==11)); + my $mstart = timelocal(0,0,0,$self->option('cutoff_day'),$mon,$year); + my $mend = timelocal(0,0,0,$self->option('cutoff_day'), $mon == 11 ? 0 : $mon+1, $year+($mon==11)); $$sdate = $mstart; my $permonth = $self->option('recur_fee') / $self->freq; diff --git a/FS/FS/part_pkg/subscription.pm b/FS/FS/part_pkg/subscription.pm index 36b5a96fb..8ea791154 100644 --- a/FS/FS/part_pkg/subscription.pm +++ b/FS/FS/part_pkg/subscription.pm @@ -9,18 +9,22 @@ use FS::part_pkg::flat; @ISA = qw(FS::part_pkg::flat); %info = ( - 'name' => 'First partial month full charge, then flat-rate (1st of month billing)', + 'name' => 'First partial month full charge, then flat-rate (selectable month billing)', 'fields' => { 'setup_fee' => { 'name' => 'Setup fee for this package', 'default' => 0, }, 'recur_fee' => { 'name' => 'Recurring fee for this package', 'default' => 0, - }, + }, + 'cutoff_day' => { 'name' => 'billing day', + 'default' => 1, + }, + }, - 'fieldorder' => [ 'setup_fee', 'recur_fee' ], + 'fieldorder' => [ 'setup_fee', 'recur_fee','cutoff_day'], #'setup' => 'what.setup_fee.value', - #'recur' => '\'my $mnow = $sdate; my ($sec,$min,$hour,$mday,$mon,$year) = (localtime($sdate) )[0,1,2,3,4,5]; $sdate = timelocal(0,0,0,1,$mon,$year); \' + what.recur_fee.value', + #'recur' => '\'my $mnow = $sdate; my ($sec,$min,$hour,$mday,$mon,$year) = (localtime($sdate) )[0,1,2,3,4,5]; $sdate = timelocal(0,0,0,$self->option('cutoff_day'),$mon,$year); \' + what.recur_fee.value', 'freq' => 'm', 'weight' => 30, ); @@ -30,9 +34,8 @@ sub calc_recur { my $mnow = $$sdate; my ($sec,$min,$hour,$mday,$mon,$year) = (localtime($mnow) )[0,1,2,3,4,5]; - $$sdate = timelocal(0,0,0,1,$mon,$year); + $$sdate = timelocal(0,0,0,$self->option('cutoff_day'),$mon,$year); $self->option('recur_fee'); } - 1; -- 2.11.0