new fee either flat or percentage based, #17319
authorBrian Medley <bpm@snafu.org>
Fri, 20 Apr 2012 14:58:25 +0000 (09:58 -0500)
committerBrian Medley <bpm@snafu.org>
Fri, 20 Apr 2012 14:58:25 +0000 (09:58 -0500)
FS/FS/part_event/Action/cust_bill_fee_greater_percent_or_flat.pm [new file with mode: 0644]

diff --git a/FS/FS/part_event/Action/cust_bill_fee_greater_percent_or_flat.pm b/FS/FS/part_event/Action/cust_bill_fee_greater_percent_or_flat.pm
new file mode 100644 (file)
index 0000000..13f886a
--- /dev/null
@@ -0,0 +1,41 @@
+package FS::part_event::Action::cust_bill_fee_greater_percent_or_flat;
+
+use strict;
+use base qw( FS::part_event::Action::fee );
+use Tie::IxHash;
+
+sub description { 'Late fee (greater of percentage of invoice or flat fee)'; }
+
+sub eventtable_hashref {
+  { 'cust_bill' => 1 };
+}
+
+sub option_fields {
+  my $class = shift;
+
+  my $t = tie my %option_fields, 'Tie::IxHash', $class->SUPER::option_fields();
+  $t->Shift; #assumes charge is first
+  $t->Unshift( 'flat_fee'  => { label=>'Flat Fee', type=>'money', } );
+  $t->Unshift( 'percent'   => { label=>'Percent', size=>2, } );
+
+  %option_fields;
+}
+
+sub _calc_fee {
+  my( $self, $cust_bill ) = @_;
+  my $percent  = sprintf('%.2f', $cust_bill->owed * $self->option('percent') / 100 );
+  my $flat_fee = $self->option('flat_fee');
+
+  my $num = $flat_fee - $percent;
+  if ($num == 0) {
+    return($percent);
+  } 
+  elsif ($num > 0) {
+    return($flat_fee);
+  }
+  else {
+    return($percent);
+  }
+}
+
+1;