'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',
},
{
},
{
+ '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.',
'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',
},
{
'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,
},
{
} 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 {
% } 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 %>
%# + ': ' +
</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;
</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>
my %confitems = map { $_->key => $_ } @config_items;
my %element_types = map { $_ => 1 } qw(
- select-part_svc
+ select-part_svc select-part_pkg
);
</%once>
% #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 ) = ( '', '', '', '' );
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>
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;
);
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;
}