1 package FS::ClientAPI::Freeside;
4 #use vars qw($DEBUG $me);
5 use FS::Record qw(qsearchs);
8 use FS::webservice_log;
11 #$me = '[FS::ClientAPI:Freeside]';
16 # quantity (i.e. pages) - defaults to 1
19 # error (empty, or error message)
22 sub freesideinc_service {
25 my $svcpart = FS::Conf->new->config('freesideinc-webservice-svcpart')
26 or return { 'error' => 'guru meditation #pow' };
27 die 'no' unless $svcpart =~ /^\d+$/;
29 ( my $support_key = $packet->{'support-key'} ) =~ /^\s*([^:]+):(.+)\s*$/
30 or return { 'error' => 'bad support-key' };
31 my($username, $_password) = ($1,$2);
33 my $svc_acct = qsearchs({
34 'table' => 'svc_acct',
35 'addl_from' => 'LEFT JOIN cust_svc USING ( svcnum )',
36 'hashref' => { 'username' => $username,
37 '_password' => $_password,
39 'extra_sql' => "AND svcpart = $svcpart",
41 unless ( $svc_acct ) {
42 warn "bad support-key for $username from $ENV{REMOTE_IP}\n";
43 sleep 5; #ideally also rate-limit and eventually ban their IP
44 return { 'error' => 'bad support-key' };
47 my $cust_pkg = $svc_acct->cust_svc->cust_pkg;
48 my $custnum = $cust_pkg->custnum;
50 my $quantity = $packet->{'quantity'} || 1;
52 #false laziness w/webservice_log.pm
56 #XXX check if some customers can use some API calls, rate-limiting, etc.
57 # but for now, everybody can use everything
58 if ( $packet->{method} eq 'print' ) {
59 my $avail_credit = $cust_pkg->cust_main->credit_limit
60 - $color - $quantity * $page
61 - FS::webservice_log->price_print(
62 'custnum' => $custnum,
65 return { 'error' => 'Over credit limit' }
66 if $avail_credit <= 0;
70 my $webservice_log = new FS::webservice_log {
71 'custnum' => $custnum,
72 'svcnum' => $svc_acct->svcnum,
73 'method' => $packet->{'method'},
74 'quantity' => $quantity,
76 my $error = $webservice_log->insert;
77 return { 'error' => $error } if $error;
79 return { 'error' => '',
80 'custnum' => $custnum,