[freeside-commits] freeside/FS/FS/part_pkg billoneday.pm, NONE, 1.1 prorate.pm, 1.4, 1.5 subscription.pm, 1.4, 1.5

Luke S. Crawford lsc at wavetail.420.am
Thu Mar 23 04:00:09 PST 2006


Update of /home/cvs/cvsroot/freeside/FS/FS/part_pkg
In directory wavetail:/tmp/cvs-serv15152

Modified Files:
	prorate.pm subscription.pm 
Added Files:
	billoneday.pm 
Log Message:
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.

----------------------------------------------------------------------


Index: prorate.pm
===================================================================
RCS file: /home/cvs/cvsroot/freeside/FS/FS/part_pkg/prorate.pm,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- prorate.pm	9 Jul 2005 10:36:43 -0000	1.4
+++ prorate.pm	23 Mar 2006 12:00:07 -0000	1.5
@@ -9,7 +9,7 @@
 @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 @@
                                    ' 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 @@
   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: subscription.pm
===================================================================
RCS file: /home/cvs/cvsroot/freeside/FS/FS/part_pkg/subscription.pm,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- subscription.pm	9 Jul 2005 10:36:43 -0000	1.4
+++ subscription.pm	23 Mar 2006 12:00:07 -0000	1.5
@@ -9,18 +9,22 @@
 @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 @@
 
   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;

--- NEW FILE: billoneday.pm ---
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;



More information about the freeside-commits mailing list