for subscription.pm and prorate.pm:
authorlsc <lsc>
Thu, 23 Mar 2006 12:00:07 +0000 (12:00 +0000)
committerlsc <lsc>
Thu, 23 Mar 2006 12:00:07 +0000 (12:00 +0000)
-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 [new file with mode: 0644]
FS/FS/part_pkg/prorate.pm
FS/FS/part_pkg/subscription.pm

diff --git a/FS/FS/part_pkg/billoneday.pm b/FS/FS/part_pkg/billoneday.pm
new file mode 100644 (file)
index 0000000..8740547
--- /dev/null
@@ -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;
index 86c64d5..d9464ee 100644 (file)
@@ -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;
index 36b5a96..8ea7911 100644 (file)
@@ -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;