#!/usr/bin/perl -Tw # # fs_signup_server # use strict; use IO::Handle; use Tie::RefHash; use FS::SSH qw(sshopen2); use FS::UID qw(adminsuidsetup); use FS::Record qw( qsearch qsearchs ); use FS::cust_main_county; use FS::cust_main; use vars qw( $opt $Debug ); $Debug = 0; my @payby = qw(CARD PREPAY); my $user = shift or die &usage; &adminsuidsetup( $user ); my $machine = shift or die &usage; my $agentnum = shift or die &usage; my $agent = qsearchs( 'agent', { 'agentnum' => $agentnum } ) or die &usage; my $pkgpart = $agent->pkgpart_hashref; my $refnum = shift or die &usage; #causing trouble for some folks #$SIG{CHLD} = sub { wait() }; my($fs_signupd)="/usr/local/sbin/fs_signupd"; while (1) { my($reader,$writer)=(new IO::Handle, new IO::Handle); $writer->autoflush(1); warn "[fs_signup_server] Connecting to $machine...\n" if $Debug; sshopen2($machine,$reader,$writer,$fs_signupd); my $data; warn "[fs_signup_server] Sending locales...\n" if $Debug; my @cust_main_county = qsearch('cust_main_county', {} ); print $writer $data = join("\n", ( scalar(@cust_main_county) || die "no tax rates (cust_main_county records)" ), map { $_->taxnum, $_->state, $_->county, $_->country, } @cust_main_county ),"\n"; warn "[fs_signup_server] $data\n" if $Debug > 2; warn "[fs_signup_server] Sending package definitions...\n" if $Debug; my @part_pkg = grep { $_->svcpart('svc_acct') && $pkgpart->{ $_->pkgpart } } qsearch( 'part_pkg', {} ); print $writer $data = join("\n", ( scalar(@part_pkg) || die "no usable package definitions, agent $agentnum" ), map { $_->pkgpart, $_->pkg, } @part_pkg ), "\n"; warn "[fs_signup_server] $data\n" if $Debug > 2; warn "[fs_signup_server] Sending POPs...\n" if $Debug; my @svc_acct_pop = qsearch ('svc_acct_pop',{} ); print $writer $data = join("\n", ( scalar(@svc_acct_pop) || die "No points of presence (svc_acct_pop records)" ), map { $_->popnum, $_->city, $_->state, $_->ac, $_->exch, $_->loc, } @svc_acct_pop ), "\n"; warn "[fs_signup_server] $data\n" if $Debug > 2; warn "[fs_signup_server] Entering main loop...\n" if $Debug; while (1) { warn "[fs_signup_server] Reading (waiting for) signup data...\n" if $Debug; chop( my( $first, $last, $ss, $company, $address1, $address2, $city, $county, $state, $zip, $country, $daytime, $night, $fax, $payby, $payinfo, $paydate, $payname, $invoicing_list, $pkgpart, $username, $password, $popnum, ) = map { scalar(<$reader>) } ( 1 .. 23 ) ); warn "[fs_signup_server] Processing signup...\n" if $Debug; my $error = ''; #shares some stuff with htdocs/edit/process/cust_main.cgi... take any # common that are still here and library them. my $cust_main = new FS::cust_main ( { 'custnum' => '', 'agentnum' => $agentnum, 'refnum' => $refnum, 'last' => $last, 'first' => $first, 'ss' => $ss, 'company' => $company, 'address1' => $address1, 'address2' => $address2, 'city' => $city, 'county' => $county, 'state' => $state, 'zip' => $zip, 'country' => $country, 'daytime' => $daytime, 'night' => $night, 'fax' => $fax, 'payby' => $payby, 'payinfo' => $payinfo, 'paydate' => $paydate, 'payname' => $payname, } ); $error = "Illegal payment type" unless grep { $_ eq $payby } @payby; my @invoicing_list = split( /\s*\,\s*/, $invoicing_list ); $error ||= $cust_main->check_invoicing_list( \@invoicing_list ); my $part_pkg = qsearchs( 'part_pkg', { 'pkgpart' => $pkgpart } ) or $error ||= "WARNING: unknown pkgpart $pkgpart"; my $svcpart = $part_pkg->svcpart unless $error; # this should wind up in FS::cust_pkg! my $agent = qsearchs( 'agent', { 'agentnum' => $agentnum } ); my $pkgpart_href = $agent->pkgpart_hashref; $error ||= "WARNING: agent $agentnum can't purchase pkgpart $pkgpart" unless $pkgpart_href->{ $pkgpart }; my $cust_pkg = new FS::cust_pkg ( { #later#'custnum' => $custnum, 'pkgpart' => $pkgpart, } ); $error ||= $cust_pkg->check; my $svc_acct = new FS::svc_acct ( { 'svcpart' => $svcpart, 'username' => $username, '_password' => $password, 'popnum' => $popnum, } ); my $y = $svc_acct->setdefault; # arguably should be in new method $error ||= $y unless ref($y); #and just in case you were silly $svc_acct->svcpart($svcpart); $svc_acct->username($username); $svc_acct->_password($password); $svc_acct->popnum($popnum); $error ||= $svc_acct->check; use Tie::RefHash; tie my %hash, 'Tie::RefHash'; %hash = { $cust_pkg => [ $svc_acct ] }; $error ||= $cust_main->insert( \%hash ); #if ( $cust_pkg && ! $error ) { #in this case, $cust_pkg should always # #be definied, but.... # $cust_pkg->custnum( $cust_main->custnum ); # $error ||= $cust_pkg->insert; # warn "WARNING: $error on pre-checked cust_pkg record!" if $error; # $svc_acct->pkgnum( $cust_pkg->pkgnum ); # $error ||= $svc_acct->insert; # warn "WARNING: $error on pre-checked svc_acct record!" if $error; #} warn "[fs_signup_server] Sending results...\n" if $Debug; print $writer $error, "\n"; $cust_main->invoicing_list( \@invoicing_list ) unless $error; } close $writer; close $reader; warn "connection to $machine lost! waiting 60 seconds...\n"; sleep 60; warn "reconnecting...\n"; } sub usage { die "Usage:\n\n fs_signup_server user machine agentnum refnum\n"; }