typo adding agentnum setting possibility...
[freeside.git] / fs_signup / FS-SignupClient / SignupClient.pm
1 package FS::SignupClient;
2
3 use strict;
4 use vars qw($VERSION @ISA @EXPORT_OK $fs_signupd_socket);
5 use Exporter;
6 use Socket;
7 use FileHandle;
8 use IO::Handle;
9 use Storable qw(nstore_fd fd_retrieve);
10
11 $VERSION = '0.03';
12
13 @ISA = qw( Exporter );
14 @EXPORT_OK = qw( signup_info new_customer );
15
16 $fs_signupd_socket = "/usr/local/freeside/fs_signupd_socket";
17
18 $ENV{'PATH'} ='/usr/bin:/usr/ucb:/bin';
19 $ENV{'SHELL'} = '/bin/sh';
20 $ENV{'IFS'} = " \t\n";
21 $ENV{'CDPATH'} = '';
22 $ENV{'ENV'} = '';
23 $ENV{'BASH_ENV'} = '';
24
25 my $freeside_uid = scalar(getpwnam('freeside'));
26 die "not running as the freeside user\n" if $> != $freeside_uid;
27
28 =head1 NAME
29
30 FS::SignupClient - Freeside signup client API
31
32 =head1 SYNOPSIS
33
34   use FS::SignupClient qw( signup_info new_customer );
35
36   ( $locales, $packages, $pops ) = signup_info;
37
38   $error = new_customer ( {
39     'first'            => $first,
40     'last'             => $last,
41     'ss'               => $ss,
42     'comapny'          => $company,
43     'address1'         => $address1,
44     'address2'         => $address2,
45     'city'             => $city,
46     'county'           => $county,
47     'state'            => $state,
48     'zip'              => $zip,
49     'country'          => $country,
50     'daytime'          => $daytime,
51     'night'            => $night,
52     'fax'              => $fax,
53     'payby'            => $payby,
54     'payinfo'          => $payinfo,
55     'paydate'          => $paydate,
56     'payname'          => $payname,
57     'invoicing_list'   => $invoicing_list,
58     'referral_custnum' => $referral_custnum,
59     'pkgpart'          => $pkgpart,
60     'username'         => $username,
61     '_password'        => $password,
62     'sec_phrase'       => $sec_phrase,
63     'popnum'           => $popnum,
64     'agentnum'         => $agentnum, #optional
65   } );
66
67 =head1 DESCRIPTION
68
69 This module provides an API for a remote signup server.
70
71 It needs to be run as the freeside user.  Because of this, the program which
72 calls these subroutines should be written very carefully.
73
74 =head1 SUBROUTINES
75
76 =over 4
77
78 =item signup_info
79
80 Returns three array references of hash references.
81
82 The first set of hash references is of allowable locales.  Each hash reference
83 has the following keys:
84   taxnum
85   state
86   county
87   country
88
89 The second set of hash references is of allowable packages.  Each hash
90 reference has the following keys:
91   pkgpart
92   pkg
93
94 The third set of hash references is of allowable POPs (Points Of Presence).
95 Each hash reference has the following keys:
96   popnum
97   city
98   state
99   ac
100   exch
101
102 (Future expansion: fourth argument is the $init_data hash reference)
103
104 =cut
105
106 sub signup_info {
107   socket(SOCK, PF_UNIX, SOCK_STREAM, 0) or die "socket: $!";
108   connect(SOCK, sockaddr_un($fs_signupd_socket)) or die "connect: $!";
109   print SOCK "signup_info\n";
110   SOCK->flush;
111
112   my $init_data = fd_retrieve(\*SOCK);
113   close SOCK;
114
115   (map { $init_data->{$_} } qw( cust_main_county part_pkg svc_acct_pop ) ),
116   $init_data;
117
118 }
119
120 =item new_customer HASHREF
121
122 Adds a customer to the remote Freeside system.  Requires a hash reference as
123 a paramater with the following keys:
124   first
125   last
126   ss
127   comapny
128   address1
129   address2
130   city
131   county
132   state
133   zip
134   country
135   daytime
136   night
137   fax
138   payby
139   payinfo
140   paydate
141   payname
142   invoicing_list
143   referral_custnum
144   pkgpart
145   username
146   _password
147   sec_phrase
148   popnum
149
150 Returns a scalar error message, or the empty string for success.
151
152 =cut
153
154 sub new_customer {
155   my $hashref = shift;
156
157   socket(SOCK, PF_UNIX, SOCK_STREAM, 0) or die "socket: $!";
158   connect(SOCK, sockaddr_un($fs_signupd_socket)) or die "connect: $!";
159   print SOCK "new_customer\n";
160
161   my $signup_data = { map { $_ => $hashref->{$_} } qw(
162     first last ss company address1 address2 city county state zip country
163     daytime night fax payby payinfo paydate payname invoicing_list
164     referral_custnum pkgpart username _password sec_phrase popnum
165   ) };
166
167   $signup_data->{agentnum} = $hashref->{agentnum} if $hashref->{agentnum};
168
169   nstore_fd($signup_data, \*SOCK) or die "can't send customer signup: $!";
170   SOCK->flush;
171
172   chop( my $error = <SOCK> );
173   $error;
174 }
175
176 =back
177
178 =head1 BUGS
179
180 =head1 SEE ALSO
181
182 L<fs_signupd>, L<FS::cust_main>
183
184 =cut
185
186 1;
187