summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Prykop <jonathan@freeside.biz>2016-04-25 16:18:10 -0500
committerJonathan Prykop <jonathan@freeside.biz>2016-04-25 16:45:24 -0500
commit9ceca59afe85c259399f77df6f07003f6966b9b9 (patch)
tree93ebc6da466b245722c9ca39a95e13cc68e35a59
parent4300dd2e09cb0544c067a2d9a9fd92e534e49802 (diff)
RT#41866: Punctuation prevented package from billing [v3 reconcile]
-rw-r--r--FS/FS/part_pkg.pm26
-rw-r--r--FS/FS/part_pkg/global_Mixin.pm19
2 files changed, 45 insertions, 0 deletions
diff --git a/FS/FS/part_pkg.pm b/FS/FS/part_pkg.pm
index 238c64c9e..915634b94 100644
--- a/FS/FS/part_pkg.pm
+++ b/FS/FS/part_pkg.pm
@@ -669,6 +669,32 @@ sub check {
'';
}
+=item check_options
+
+For a passed I<$options> hashref, validates any options that
+have 'validate' subroutines defined (I<$options> values might
+be altered.) Returns error message, or empty string if valid.
+
+Invoked by L</insert> and L</replace> via the equivalent
+methods in L<FS::option_Common>.
+
+=cut
+
+sub check_options {
+ my ($self,$options) = @_;
+ foreach my $option (keys %$options) {
+ if (exists $plans{ $self->plan }->{fields}->{$option}) {
+ if (exists($plans{$self->plan}->{fields}->{$option}->{'validate'})) {
+ # pass option name for use in error message
+ # pass a reference to the $options value, so it can be cleaned up
+ my $error = &{$plans{$self->plan}->{fields}->{$option}->{'validate'}}($option,\($options->{$option}));
+ return $error if $error;
+ }
+ } # else "option does not exist" error?
+ }
+ return '';
+}
+
=item supersede OLD [, OPTION => VALUE ... ]
Inserts this package as a successor to the package OLD. All options are as
diff --git a/FS/FS/part_pkg/global_Mixin.pm b/FS/FS/part_pkg/global_Mixin.pm
index 9faddf08a..31d178d8c 100644
--- a/FS/FS/part_pkg/global_Mixin.pm
+++ b/FS/FS/part_pkg/global_Mixin.pm
@@ -14,16 +14,35 @@ tie my %a2billing_simultaccess, 'Tie::IxHash', (
1 => 'Enabled',
);
+# much false laziness with FS::Record::ut_money
+sub validate_moneyn {
+ my ($option, $valref) = @_;
+ if ( $$valref eq '' ) {
+ return '';
+ } elsif ( $$valref =~ /^\s*(\-)?\s*(\d*)(\.\d{1})\s*$/ ) {
+ #handle one decimal place without barfing out
+ $$valref = ( ($1||''). ($2||''). ($3.'0') ) || 0;
+ } elsif ( $$valref =~ /^\s*(\-)?\s*(\d*)(\.\d{2})?\s*$/ ) {
+ $$valref = ( ($1||''). ($2||''). ($3||'') ) || 0;
+ } else {
+ return "Illegal (money) $option: ". $$valref;
+ }
+ return '';
+}
+
+
%info = (
'disabled' => 1,
'fields' => {
'setup_fee' => {
'name' => 'Setup fee for this package',
'default' => 0,
+ 'validate' => \&validate_moneyn,
},
'recur_fee' => {
'name' => 'Recurring fee for this package',
'default' => 0,
+ 'validate' => \&validate_moneyn,
},
'unused_credit_cancel' => {
'name' => 'Credit the customer for the unused portion of service at '.