summaryrefslogtreecommitdiff
path: root/FS
diff options
context:
space:
mode:
Diffstat (limited to 'FS')
-rw-r--r--FS/FS/Conf.pm7
-rw-r--r--FS/FS/Schema.pm1
-rw-r--r--FS/FS/cust_main.pm1
-rw-r--r--FS/FS/part_pkg/prorate.pm10
-rw-r--r--FS/FS/part_pkg/recur_Common.pm15
5 files changed, 24 insertions, 10 deletions
diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm
index da29a0581..b19cd0819 100644
--- a/FS/FS/Conf.pm
+++ b/FS/FS/Conf.pm
@@ -809,6 +809,13 @@ my %payment_gateway_options = (
},
{
+ 'key' => 'cust_main-select-prorate_day',
+ 'section' => 'billing',
+ 'description' => 'When used with prorate or anniversary packages, allows the selection of the prorate day of month, on a per-customer basis',
+ 'type' => 'checkbox',
+ },
+
+ {
'key' => 'encryption',
'section' => 'billing',
'description' => 'Enable encryption of credit cards and echeck numbers',
diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm
index c38c52cc8..2f6046287 100644
--- a/FS/FS/Schema.pm
+++ b/FS/FS/Schema.pm
@@ -914,6 +914,7 @@ sub tables_hashref {
'email_csv_cdr', 'char', 'NULL', 1, '', '',
'accountcode_cdr', 'char', 'NULL', 1, '', '',
'billday', 'int', 'NULL', '', '', '',
+ 'prorate_day', 'int', 'NULL', '', '', '',
'edit_subject', 'char', 'NULL', 1, '', '',
'locale', 'varchar', 'NULL', 16, '', '',
'calling_list_exempt', 'char', 'NULL', 1, '', '',
diff --git a/FS/FS/cust_main.pm b/FS/FS/cust_main.pm
index 10f826871..b00cd9285 100644
--- a/FS/FS/cust_main.pm
+++ b/FS/FS/cust_main.pm
@@ -1800,6 +1800,7 @@ sub check {
|| $self->ut_floatn('cdr_termination_percentage')
|| $self->ut_floatn('credit_limit')
|| $self->ut_numbern('billday')
+ || $self->ut_numbern('prorate_day')
|| $self->ut_enum('edit_subject', [ '', 'Y' ] )
|| $self->ut_enum('calling_list_exempt', [ '', 'Y' ] )
|| $self->ut_enum('invoice_noemail', [ '', 'Y' ] )
diff --git a/FS/FS/part_pkg/prorate.pm b/FS/FS/part_pkg/prorate.pm
index f8d03dcb5..ac86f3918 100644
--- a/FS/FS/part_pkg/prorate.pm
+++ b/FS/FS/part_pkg/prorate.pm
@@ -44,12 +44,16 @@ use FS::part_pkg::flat;
sub calc_recur {
my $self = shift;
- return $self->calc_prorate(@_, $self->cutoff_day) - $self->calc_discount(@_);
+ my $cust_pkg = $_[0];
+ $self->calc_prorate(@_, $self->cutoff_day($cust_pkg))
+ - $self->calc_discount(@_);
}
sub cutoff_day {
- my $self = shift;
- split(/\s*,\s*/, $self->option('cutoff_day', 1) || '1');
+ my( $self, $cust_pkg ) = @_;
+ my $prorate_day = $cust_pkg->cust_main->prorate_day;
+ $prorate_day ? ( $prorate_day )
+ : split(/\s*,\s*/, $self->option('cutoff_day', 1) || '1');
}
1;
diff --git a/FS/FS/part_pkg/recur_Common.pm b/FS/FS/part_pkg/recur_Common.pm
index 9d7341b76..03d5c2cb2 100644
--- a/FS/FS/part_pkg/recur_Common.pm
+++ b/FS/FS/part_pkg/recur_Common.pm
@@ -39,14 +39,15 @@ sub calc_setup {
sub cutoff_day {
# prorate/subscription only; we don't support sync_bill_date here
- my $self = shift;
- my $cust_pkg = shift;
+ my( $self, $cust_pkg ) = @_;
my $recur_method = $self->option('recur_method',1) || 'anniversary';
- if ( $recur_method eq 'prorate' or $recur_method eq 'subscription' ) {
- return $self->option('cutoff_day',1) || 1;
- } else {
- return ();
- }
+ return () unless $recur_method eq 'prorate'
+ || $recur_method eq 'subscription';
+
+ #false laziness w/prorate.pm::cutoff_day
+ my $prorate_day = $cust_pkg->cust_main->prorate_day;
+ $prorate_day ? ( $prorate_day )
+ : split(/\s*,\s*/, $self->option('cutoff_day', 1) || '1');
}
sub calc_recur_Common {