selfservice payment fees, RT#18345
authorIvan Kohler <ivan@freeside.biz>
Fri, 3 Aug 2012 20:09:05 +0000 (13:09 -0700)
committerIvan Kohler <ivan@freeside.biz>
Fri, 3 Aug 2012 20:09:05 +0000 (13:09 -0700)
FS/FS/ClientAPI/MasonComponent.pm
FS/FS/ClientAPI/MyAccount.pm
FS/FS/Conf.pm
fs_selfservice/FS-SelfService/cgi/make_payment.html
fs_selfservice/FS-SelfService/cgi/selfservice.cgi [changed mode: 0644->0755]
httemplate/elements/tr-amount_fee.html
httemplate/misc/payment.cgi

index 534b48a..c72d268 100644 (file)
@@ -26,6 +26,7 @@ my %allowed_comps = map { $_=>1 } qw(
 
 my %session_comps = map { $_=>1 } qw(
   /elements/location.html
 
 my %session_comps = map { $_=>1 } qw(
   /elements/location.html
+  /elements/tr-amount_fee.html
   /edit/cust_main/first_pkg/select-part_pkg.html
 );
 
   /edit/cust_main/first_pkg/select-part_pkg.html
 );
 
@@ -41,6 +42,28 @@ my %session_callbacks = (
     return ''; #no error
   },
 
     return ''; #no error
   },
 
+  '/elements/tr-amount_fee.html' => sub {
+    my( $custnum, $argsref ) = @_;
+
+    my $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } )
+      or return "unknown custnum $custnum";
+
+    my $conf = new FS::Conf;
+
+    my %args = @$argsref;
+    %args = (
+      %args,
+      'process-pkgpart'    => scalar($conf->config('selfservice_process-pkgpart')),
+      'process-display'    => scalar($conf->config('selfservice_process-display')),
+      'process-skip-first' => $conf->exists('selfservice_process-skip_first'),
+      'num_payments'       => scalar($cust_main->cust_pay), 
+      'surcharge_percentage' => scalar($conf->config('credit-card-surcharge-percentage')),
+    );
+    @$argsref = ( %args );
+
+    return ''; #no error
+  },
+
   '/edit/cust_main/first_pkg/select-part_pkg.html' => sub {
     my( $custnum, $argsref ) = @_;
     my $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } )
   '/edit/cust_main/first_pkg/select-part_pkg.html' => sub {
     my( $custnum, $argsref ) = @_;
     my $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } )
index 54799b8..151a2ed 100644 (file)
@@ -38,6 +38,7 @@ use FS::cust_main;
 use FS::cust_bill;
 use FS::legacy_cust_bill;
 use FS::cust_main_county;
 use FS::cust_bill;
 use FS::legacy_cust_bill;
 use FS::cust_main_county;
+use FS::part_pkg;
 use FS::cust_pkg;
 use FS::payby;
 use FS::acct_rt_transaction;
 use FS::cust_pkg;
 use FS::payby;
 use FS::acct_rt_transaction;
@@ -926,6 +927,16 @@ sub validate_payment {
   my $amount = $1;
   return { error => 'Amount must be greater than 0' } unless $amount > 0;
 
   my $amount = $1;
   return { error => 'Amount must be greater than 0' } unless $amount > 0;
 
+  #false laziness w/tr-amount_fee.html, but we don't want selfservice users
+  #changing the hidden form values
+  my $conf = new FS::Conf;
+  my $fee_display = $conf->config('selfservice_process-display') || 'add';
+  my $fee_pkgpart = $conf->config('selfservice_process-pkgpart');
+  if ( $fee_display eq 'add' && $fee_pkgpart ) {
+    my $fee_pkg = qsearchs('part_pkg', { pkgpart=>$fee_pkgpart } );
+    $amount = sprintf('%.2f', $amount + $fee_pkg->option('setup_fee') );
+  }
+
   $p->{'discount_term'} =~ /^\s*(\d*)\s*$/
     or return { 'error' => gettext('illegal_discount_term'). ': '. $p->{'discount_term'} };
   my $discount_term = $1;
   $p->{'discount_term'} =~ /^\s*(\d*)\s*$/
     or return { 'error' => gettext('illegal_discount_term'). ': '. $p->{'discount_term'} };
   my $discount_term = $1;
@@ -1085,6 +1096,24 @@ sub do_process_payment {
   );
   return { 'error' => $error } if $error;
 
   );
   return { 'error' => $error } if $error;
 
+  #no error, so order the fee package if applicable...
+  my $conf = new FS::Conf;
+  my $fee_pkgpart = $conf->config('selfservice_process-pkgpart');
+  if ( $fee_pkgpart ) {
+
+    my $cust_pkg = new FS::cust_pkg { 'pkgpart' => $fee_pkgpart };
+
+    $error = $cust_main->order_pkg( 'cust_pkg' => $cust_pkg );
+    return { 'error' => "payment processed successfully, but error ordering fee: $error" }
+      if $error;
+
+    #and generate an invoice for it now too
+    $error = $cust_main->bill( 'pkg_list' => [ $cust_pkg ] );
+    return { 'error' => "payment processed and fee ordered sucessfully, but error billing fee: $error" }
+      if $error;
+
+  }
+
   $cust_main->apply_payments;
 
   if ( $validate->{'save'} ) {
   $cust_main->apply_payments;
 
   if ( $validate->{'save'} ) {
index 8069fb4..39b59cf 100644 (file)
@@ -2592,30 +2592,30 @@ and customer address. Include units.',
     'type'        => 'checkbox',
   },
 
     'type'        => 'checkbox',
   },
 
-  {
-    'key'         => 'suto_process-pkgpart',
-    'section'     => 'billing',
-    'description' => 'Package to add to each automatic credit card and ACH payment processed by billing events.  Enabling this option may be in violation of your merchant agreement(s), so please check them carefully before enabling this option.',
-    'type'        => 'select-part_pkg',
-  },
-
 #  {
 #  {
-#    'key'         => 'auto_process-display',
+#    'key'         => 'auto_process-pkgpart',
 #    'section'     => 'billing',
 #    'section'     => 'billing',
-#    'description' => 'When using auto_process-pkgpart, add the fee to the amount entered (default), or subtract the fee from the amount entered.',
-#    'type'        => 'select',
-#    'select_hash' => [
-#                       'add'      => 'Add fee to amount entered',
-#                       'subtract' => 'Subtract fee from amount entered',
-#                     ],
+#    'description' => 'Package to add to each automatic credit card and ACH payment processed by billing events.  Enabling this option may be in violation of your merchant agreement(s), so please check them carefully before enabling this option.',
+#    'type'        => 'select-part_pkg',
+#  },
+#
+##  {
+##    'key'         => 'auto_process-display',
+##    'section'     => 'billing',
+##    'description' => 'When using auto_process-pkgpart, add the fee to the amount entered (default), or subtract the fee from the amount entered.',
+##    'type'        => 'select',
+##    'select_hash' => [
+##                       'add'      => 'Add fee to amount entered',
+##                       'subtract' => 'Subtract fee from amount entered',
+##                     ],
+##  },
+#
+#  {
+#    'key'         => 'auto_process-skip_first',
+#    'section'     => 'billing',
+#    'description' => "When using auto_process-pkgpart, omit the fee if it is the customer's first payment.",
+#    'type'        => 'checkbox',
 #  },
 #  },
-
-  {
-    'key'         => 'auto_process-skip_first',
-    'section'     => 'billing',
-    'description' => "When using auto_process-pkgpart, omit the fee if it is the customer's first payment.",
-    'type'        => 'checkbox',
-  },
 
   {
     'key'         => 'allow_negative_charges',
 
   {
     'key'         => 'allow_negative_charges',
index bec37ca..defd4a5 100644 (file)
@@ -9,29 +9,15 @@
   <TH ALIGN="right">Amount&nbsp;Due</TH>
   <TD COLSPAN=7>
     <TABLE><TR><TD BGCOLOR="#ffffff">
   <TH ALIGN="right">Amount&nbsp;Due</TH>
   <TD COLSPAN=7>
     <TABLE><TR><TD BGCOLOR="#ffffff">
-      $<%=sprintf("%.2f",$balance)%>
-    </TD></TR></TABLE>
-  </TD>
-</TR>
-<TR>
-  <TH ALIGN="right">Payment&nbsp;amount</TH>
-  <TD COLSPAN=7>
-    <TABLE><TR><TD BGCOLOR="#ffffff">
-<%=
-    $amt = '';
-    if ( $balance > 0 ) {
-        $amt = $balance;
-        $amt += $amt * $credit_card_surcharge_percentage/100
-                                    if $credit_card_surcharge_percentage > 0;
-        $amt = sprintf("%.2f",$amt);
-    }
-    '';
-%>
-      $<INPUT TYPE="text" NAME="amount" SIZE=8 VALUE="<%=$amt%>">
+      <FONT COLOR="#000000">$<%=sprintf("%.2f",$balance)%></FONT>
     </TD></TR></TABLE>
   </TD>
 </TR>
     </TD></TR></TABLE>
   </TD>
 </TR>
+
+<%= $tr_amount_fee %>
+
 <%= include('discount_term') %>
 <%= include('discount_term') %>
+
 <TR>
   <TH ALIGN="right">Card&nbsp;type</TH>
   <TD COLSPAN=7>
 <TR>
   <TH ALIGN="right">Card&nbsp;type</TH>
   <TD COLSPAN=7>
old mode 100644 (file)
new mode 100755 (executable)
index fe8d082..61361b8
@@ -476,7 +476,21 @@ sub process_order_recharge {
 }
 
 sub make_payment {
 }
 
 sub make_payment {
-  payment_info( 'session_id' => $session_id );
+
+  my $payment_info = payment_info( 'session_id' => $session_id );
+
+  my $tr_amount_fee = mason_comp(
+    'session_id' => $session_id,
+    'comp'       => '/elements/tr-amount_fee.html',
+    'args'       => [ 'amount' => $payment_info->{'balance'},
+                    ],
+  );
+
+  $tr_amount_fee = $tr_amount_fee->{'error'} || $tr_amount_fee->{'output'};
+
+  $payment_info->{'tr_amount_fee'} = $tr_amount_fee;
+
+  $payment_info;
 }
 
 sub payment_results {
 }
 
 sub payment_results {
index a1a9e34..1248852 100644 (file)
@@ -90,7 +90,9 @@ if ( $amount > 0 ) {
   $amount += $fee
     if $fee && $fee_display eq 'subtract';
 
   $amount += $fee
     if $fee && $fee_display eq 'subtract';
 
-  &{ $opt{post_fee_callback} }( \$amount ) if $opt{post_fee_callback};
+  #&{ $opt{post_fee_callback} }( \$amount ) if $opt{post_fee_callback};
+  $amount += $amount * $opt{'surcharge_percentage'}/100
+    if $opt{'surcharge_percentage'} > 0;
 
   $amount = sprintf("%.2f", $amount);
 }
 
   $amount = sprintf("%.2f", $amount);
 }
index 1ae15b9..e221c60 100644 (file)
@@ -16,7 +16,7 @@
        'process-display'    => scalar($conf->config('manual_process-display')),
        'process-skip-first' => $conf->exists('manual_process-skip_first'),
        'num_payments'       => scalar($cust_main->cust_pay), 
        'process-display'    => scalar($conf->config('manual_process-display')),
        'process-skip-first' => $conf->exists('manual_process-skip_first'),
        'num_payments'       => scalar($cust_main->cust_pay), 
-       'post_fee_callback'  => $post_fee_callback,
+       'surcharge_percentage' => scalar($conf->config('credit-card-surcharge-percentage')),
   &>
 
   <& /elements/tr-select-discount_term.html,
   &>
 
   <& /elements/tr-select-discount_term.html,
@@ -269,19 +269,6 @@ if ( $balance > 0 ) {
   $amount = $balance;
 }
 
   $amount = $balance;
 }
 
-my $post_fee_callback = sub {
-  my( $amountref ) = @_;
-
-  return unless $$amountref > 0;
-
-  my $conf = new FS::Conf;
-
-  my $cc_surcharge_pct = $conf->config('credit-card-surcharge-percentage');
-  $$amountref += $$amountref * $cc_surcharge_pct/100 if $cc_surcharge_pct > 0;
-
-  $$amountref = sprintf("%.2f", $$amountref);
-};
-
 my $payunique = "webui-payment-". time. "-$$-". rand() * 2**32;
 
 </%init>
 my $payunique = "webui-payment-". time. "-$$-". rand() * 2**32;
 
 </%init>