summaryrefslogtreecommitdiff
path: root/httemplate/misc/process/recharge_svc.html
blob: 5f68bf151b55a87e1a5ba0b88a30792333832681 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
%if ($error) {
%  $cgi->param('error', $error);
<% $cgi->redirect(popurl(2). "recharge_svc.html?". $cgi->query_string ) %>
%} else {
<% header("Package recharged") %>
  <SCRIPT TYPE="text/javascript">
    window.top.location.reload();
  </SCRIPT>
  </BODY></HTML>
%}
<%init>

my $conf = new FS::Conf;

die "access denied"
  unless $FS::CurrentUser::CurrentUser->access_right('Recharge customer service');

#untaint svcnum
my $svcnum = $cgi->param('svcnum');
$svcnum =~ /^(\d+)$/ || die "Illegal svcnum";
$svcnum = $1;

#untaint prepaid
my $prepaid = $cgi->param('prepaid');
$prepaid =~ /^(\w*)$/;
$prepaid = $1;

#untaint payby
my $payby = $cgi->param('payby');
$payby =~ /^([A-Z]*)$/;
$payby = $1;

my $error = '';
my $svc_acct = qsearchs( 'svc_acct', {'svcnum'=>$svcnum} );
$error = "Can't recharge service $svcnum. " unless $svc_acct;

my $cust_main = $svc_acct->cust_svc->cust_pkg->cust_main;

my $oldAutoCommit = $FS::UID::AutoCommit;
local $FS::UID::AutoCommit = 0;
my $dbh = dbh;

unless ($error) {

  #should probably use payby.pm but whatever
  if ($payby eq 'PREP') {
    $error = $cust_main->recharge_prepay( $prepaid );
  } elsif ( $payby =~ /^(CARD|DCRD|CHEK|DCHK|LECB|BILL|COMP)$/ ) {
    my $part_pkg = $svc_acct->cust_svc->cust_pkg->part_pkg;
    my $amount = $part_pkg->option('recharge_amount', 1);
    my %rhash = map { $_ =~ /^recharge_(.*)$/; $1, $part_pkg->option($_) }
      grep { $part_pkg->option($_, 1) }
      qw ( recharge_seconds recharge_upbytes recharge_downbytes
           recharge_totalbytes );

    my $description = "Recharge";
    $description .= " $rhash{seconds}s" if $rhash{seconds};
    $description .= " $rhash{upbytes} up" if $rhash{upbytes};
    $description .= " $rhash{downbytes} down" if $rhash{downbytes};
    $description .= " $rhash{totalbytes} total" if $rhash{totalbytes};

    $error = $cust_main->charge($amount, "Recharge " . $svc_acct->label,
                                $description, $part_pkg->taxclass);

    if ($part_pkg->option('recharge_reset', 1)) {
      $error ||= $svc_acct->set_usage(\%rhash, 'null' => 1);
    }else{
      $error ||= $svc_acct->recharge(\%rhash);
    }

    my $old_balance = $cust_main->balance;
    $error ||= $cust_main->bill;
    $error ||= $cust_main->apply_payments_and_credits;
    my $bill_error = $cust_main->collect('realtime' => 1) unless $error;
    $error ||= "Failed to collect - $bill_error"
      if $cust_main->balance > $old_balance && $cust_main->balance > 0
          && $payby ne 'BILL';

  } else {
    $error = "fatal error - unknown payby: $payby";
  }

}

if ($error) {
  $dbh->rollback if $oldAutoCommit;
} else {
  $dbh->commit or die $dbh->errstr if $oldAutoCommit;
}

</%init>