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
|
package FS::ClientAPI::Freeside;
use strict;
#use vars qw($DEBUG $me);
use FS::Record qw(qsearchs);
use FS::Conf;
use FS::svc_acct;
use FS::webservice_log;
#$DEBUG = 0;
#$me = '[FS::ClientAPI:Freeside]';
# inputs:
# support-key
# method
# quantity (i.e. pages) - defaults to 1
#
# returns:
# error (empty, or error message)
# custnum
sub freesideinc_service {
my $packet = shift;
my $svcpart = FS::Conf->new->config('freesideinc-webservice-svcpart')
or return { 'error' => 'guru meditation #pow' };
die 'no' unless $svcpart =~ /^\d+$/;
( my $support_key = $packet->{'support-key'} ) =~ /^\s*([^:]+):(.+)\s*$/
or return { 'error' => 'bad support-key' };
my($username, $_password) = ($1,$2);
my $svc_acct = qsearchs({
'table' => 'svc_acct',
'addl_from' => 'LEFT JOIN cust_svc USING ( svcnum )',
'hashref' => { 'username' => $username,
'_password' => $_password,
},
'extra_sql' => "AND svcpart = $svcpart",
});
unless ( $svc_acct ) {
warn "bad support-key for $username from $ENV{REMOTE_IP}\n";
sleep 5; #ideally also rate-limit and eventually ban their IP
return { 'error' => 'bad support-key' };
}
my $cust_pkg = $svc_acct->cust_svc->cust_pkg;
my $custnum = $cust_pkg->custnum;
my $quantity = $packet->{'quantity'} || 1;
#false laziness w/webservice_log.pm
my $color = 1.10;
my $page = 0.10;
#XXX check if some customers can use some API calls, rate-limiting, etc.
# but for now, everybody can use everything
if ( $packet->{method} eq 'print' ) {
my $avail_credit = $cust_pkg->cust_main->credit_limit
- $color - $quantity * $page
- FS::webservice_log->price_print(
'custnum' => $custnum,
);
return { 'error' => 'Over credit limit' }
if $avail_credit <= 0;
}
#record it happened
my $webservice_log = new FS::webservice_log {
'custnum' => $custnum,
'svcnum' => $svc_acct->svcnum,
'method' => $packet->{'method'},
'quantity' => $quantity,
};
my $error = $webservice_log->insert;
return { 'error' => $error } if $error;
return { 'error' => '',
'custnum' => $custnum,
};
}
1;
|