processing fee on credit card recharges, RT#5889
authorivan <ivan>
Fri, 25 Sep 2009 12:29:16 +0000 (12:29 +0000)
committerivan <ivan>
Fri, 25 Sep 2009 12:29:16 +0000 (12:29 +0000)
FS/FS/Conf.pm
httemplate/config/config-process.cgi
httemplate/config/config-view.cgi
httemplate/config/config.cgi
httemplate/misc/payment.cgi
httemplate/misc/process/payment.cgi

index e7a9c16..d5304af 100644 (file)
@@ -1430,23 +1430,7 @@ worry that config_items is freeside-specific and icky.
     'key'         => 'signup_server-default_pkgpart',
     'section'     => '',
     'description' => 'Default package for the signup server',
-    'type'        => 'select-sub',
-    'options_sub' => sub { require FS::Record;
-                           require FS::part_pkg;
-                           map { $_->pkgpart => $_->pkg.' - '.$_->comment }
-                               FS::Record::qsearch( 'part_pkg',
-                                                   { 'disabled' => ''}
-                                                 );
-                        },
-    'option_sub'  => sub { require FS::Record;
-                           require FS::part_pkg;
-                           my $part_pkg = FS::Record::qsearchs(
-                            'part_pkg', { 'pkgpart'=>shift }
-                          );
-                           $part_pkg
-                            ? $part_pkg->pkg.' - '.$part_pkg->comment
-                            : '';
-                        },
+    'type'        => 'select-part_pkg',
   },
 
   {
@@ -1823,6 +1807,13 @@ worry that config_items is freeside-specific and icky.
   },
 
   {
+    'key'         => 'manual_process-pkgpart',
+    'section'     => 'billing',
+    'description' => 'Package to add to each manual credit card and ACH payments entered from the backend.  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'         => 'allow_negative_charges',
     'section'     => 'billing',
     'description' => 'Allow negative charges.  Normally not used unless importing data from a legacy system that requires this.',
@@ -2283,19 +2274,7 @@ worry that config_items is freeside-specific and icky.
     'key'         => 'postal_invoice-fee_pkgpart',
     'section'     => 'billing',
     'description' => 'This allows selection of a package to insert on invoices for customers with postal invoices selected.',
-    'type'        => 'select-sub',
-    'options_sub' => sub { require FS::Record;
-                           require FS::part_pkg;
-                          map { $_->pkgpart => $_->pkg }
-                               FS::Record::qsearch('part_pkg', { disabled=>'' } );
-                        },
-    'option_sub'  => sub { require FS::Record;
-                           require FS::part_pkg;
-                          my $part_pkg = FS::Record::qsearchs(
-                            'part_pkg', { 'pkgpart'=>shift }
-                          );
-                           $part_pkg ? $part_pkg->pkg : '';
-                        },
+    'type'        => 'select-part_pkg',
   },
 
   {
@@ -2607,7 +2586,8 @@ worry that config_items is freeside-specific and icky.
     'key'         => 'support_packages',
     'section'     => '',
     'description' => 'A list of packages eligible for RT ticket time transfer, one pkgpart per line.', #this should really be a select multiple, or specified in the packages themselves...
-    'type'        => 'textarea',
+    'type'        => 'select-part_pkg',
+    'multiple'    => 1,
   },
 
   {
index 0569197..a241de8 100644 (file)
@@ -41,16 +41,16 @@ foreach my $type ( ref($i->type) ? @{$i->type} : $i->type ) {
     } else {
       push @delete, $i->key;
     }
-  } elsif ( $type =~ /^(editlist|selectmultiple)$/
-            or ( $type =~ /^select(-(sub|part_svc))?$/ || $i->multiple )
-          )
-  {
+  } elsif (
+    $type =~ /^(editlist|selectmultiple)$/
+    or ( $type =~ /^select(-(sub|part_svc|part_pkg))?$/ || $i->multiple )
+  {
     if ( scalar(@{[ $cgi->param($i->key.$n) ]}) ) {
       $conf->set($i->key, join("\n", @{[ $cgi->param($i->key.$n) ]} ), $agentnum);
     } else {
       $conf->delete($i->key, $agentnum);
     }
-  } elsif ( $type =~ /^(text|select(-(sub|part_svc))?)$/ ) {
+  } elsif ( $type =~ /^(text|select(-(sub|part_svc|part_pkg))?)$/ ) {
     if ( $cgi->param($i->key.$n) ne '' ) {
       $conf->set($i->key, $cgi->param($i->key.$n), $agentnum);
     } else {
@@ -104,7 +104,7 @@ $conf->delete($_, $agentnum) foreach @delete;
 
 %     } elsif ( $type eq 'text' || $type eq 'select' ) {
         configCell.innerHTML = <% $conf->exists($i->key, $agentnum) ? $conf->config($i->key, $agentnum) : '' |js_string %>;
-%     } elsif ( $type eq 'select-part_svc' && ! $i->multiple ) {
+%     } elsif ( $type =~ /^select-(part_svc|part_pkg)$/ && ! $i->multiple ) {
         configCell.innerHTML =
           <% $conf->config($i->key, $agentnum) |js_string %>
 %# + ': ' +
index 80a65d0..51535d7 100644 (file)
@@ -48,7 +48,8 @@ Click on a configuration value to change it.
   </tr>
 % foreach my $i (@{ $section_items{$section} }) { 
 %   my @types = ref($i->type) ? @{$i->type} : ($i->type);
-%   my( $width, $height ) = ( 522, 336 );
+%#  my( $width, $height ) = ( 522, 336 );
+%   my( $width, $height ) = ( 600, 336 );
 %   if ( grep $_ eq 'textarea', @types ) {
 %     #800x600
 %     $width = 763;
@@ -208,14 +209,14 @@ Click on a configuration value to change it.
               </td>
             </tr>
 
-%   } elsif ( $type eq 'select-part_svc' ) {
-%     my @svcparts = $conf->config($i->key, $agentnum);
+%   } elsif ( $type =~ /^select-(part_svc|part_pkg)$/ ) {
+%     my @keys = $conf->config($i->key, $agentnum);
 
             <tr>
               <td id="<% $agentnum.$i->key.$n %>" bgcolor="#ffffff">
-                <% join('<BR>', map { $_ # ': '. $svc
+                <% join('<BR>', map { $_ # ': '. $svc, $pkg, whatever
                                     }
-                                    @svcparts
+                                    @keys
                        )
                 %>
               </td>
index 4ebedc1..45d77ff 100644 (file)
@@ -308,7 +308,7 @@ my @config_items = $conf->config_items;
 my %confitems = map { $_->key => $_ } @config_items;
 
 my %element_types = map { $_ => 1 } qw(
-  select-part_svc
+  select-part_svc select-part_pkg
 );
 
 </%once>
index 45aeaca..472763b 100644 (file)
 
 % #include( '/elements/table.html', '#cccccc' ) 
 
+% my $amount = $balance > 0 ? sprintf("%.2f", $balance) : '';
+
 <% ntable('#cccccc') %>
   <TR>
     <TH ALIGN="right">Payment amount</TH>
-    <TD>
+    <TD COLSPAN=7>
       <TABLE><TR><TD BGCOLOR="#ffffff">
-        $<INPUT TYPE="text" NAME="amount" SIZE=8 VALUE="<% $balance > 0 ? sprintf("%.2f", $balance) : '' %>">
+        <% $money_char %><INPUT NAME     = "amount"
+                                TYPE     = "text"
+                                VALUE    = "<% $amount %>"
+                                SIZE     = 8
+                                STYLE    = "text-align:right;"
+%                               if ( $fee ) {
+                                  onChange   = "amount_changed(this)"
+                                  onKeyDown  = "amount_changed(this)"
+                                  onKeyUp    = "amount_changed(this)"
+                                  onKeyPress = "amount_changed(this)"
+%                               }
+                         >
+      </TD><TD BGCOLOR="#cccccc">
+%        if ( $fee ) {
+           <INPUT TYPE="hidden" NAME="fee_pkgpart" VALUE="<% $fee_pkg->pkgpart %>">
+           <INPUT TYPE="hidden" NAME="fee" VALUE="<% $fee %>">
+           <B><FONT SIZE='+1'>+</FONT>
+              <% $money_char . $fee %>
+           </B>
+           <% $fee_pkg->pkg |h %>
+           <B><FONT SIZE='+1'>=</FONT></B>
+      </TD><TD ID="ajax_total_cell" BGCOLOR="#dddddd" STYLE="border:1px solid blue">
+           <FONT SIZE="+1"><% length($amount) ? $money_char. sprintf('%.2f', $amount + $fee ) : '' %> TOTAL</FONT>
+  
+%        }
       </TD></TR></TABLE>
     </TD>
   </TR>
 
+% if ( $fee ) {
+
+    <SCRIPT TYPE="text/javascript">
+
+      function amount_changed(what) {
+
+
+        var total = '';
+        if ( what.value.length ) {
+          total = parseFloat(what.value) + <% $fee %>;
+          /* total = Math.round(total*100)/100; */
+          total = '<% $money_char %>' + total.toFixed(2);
+        }
+
+        var total_cell = document.getElementById('ajax_total_cell');
+        total_cell.innerHTML = '<FONT SIZE="+1">' + total + ' TOTAL</FONT>';
+
+      }
+
+    </SCRIPT>
+
+% }
+
+
 % if ( $payby eq 'CARD' ) {
 %
 %   my( $payinfo, $paycvv, $month, $year ) = ( '', '', '', '' );
@@ -237,16 +287,29 @@ my $balance = $cust_main->balance;
 
 my $payinfo = '';
 
-#false laziness w/selfservice make_payment.html shortcut for one-country
 my $conf = new FS::Conf;
+
+my $money_char = $conf->config('money_char') || '$';
+
+#false laziness w/selfservice make_payment.html shortcut for one-country
 my %states = map { $_->state => 1 }
                qsearch('cust_main_county', {
                  'country' => $conf->config('countrydefault') || 'US'
                } );
 my @states = sort { $a cmp $b } keys %states;
 
-my $payunique = "webui-payment-". time. "-$$-". rand() * 2**32;
+my $fee = '';
+my $fee_pkg = '';
+if ( $conf->config('manual_process-pkgpart') ) {
+  $fee_pkg =
+    qsearchs('part_pkg', { pkgpart=>$conf->config('manual_process-pkgpart') } );
 
-</%init>
+  #well ->unit_setup or ->calc_setup both call for a $cust_pkg
+  # (though ->unit_setup doesn't use it...)
+  $fee = $fee_pkg->option('setup_fee')
+    if $fee_pkg; #in case.. better than dying with a perl traceback
+}
 
+my $payunique = "webui-payment-". time. "-$$-". rand() * 2**32;
 
+</%init>
index ea0c794..d41bc0f 100644 (file)
@@ -32,6 +32,11 @@ $cgi->param('amount') =~ /^\s*(\d*(\.\d\d)?)\s*$/
 my $amount = $1;
 errorpage("amount <= 0") unless $amount > 0;
 
+if ( $cgi->param('fee') =~ /^\s*(\d*(\.\d\d)?)\s*$/ ) {
+  my $fee = $1;
+  $amount = sprintf('%.2f', $amount + $fee);
+}
+
 $cgi->param('year') =~ /^(\d+)$/
   or errorpage("illegal year ". $cgi->param('year'));
 my $year = $1;
@@ -143,6 +148,15 @@ if ( $cgi->param('batch') ) {
   );
   errorpage($error) if $error;
 
+  #no error, so order the fee package if applicable...
+  if ( $cgi->param('fee_pkgpart') =~ /^(\d+)$/ ) {
+    my $error = $cust_main->order_pkg(
+      'cust_pkg' => new FS::cust_pkg { 'pkgpart' => $1 }
+    );
+    errorpage("payment processed successfully, but error ordering fee: $error")
+      if $error;
+  }
+
   $cust_main->apply_payments;
 
 }