+=item postal_mail_fsinc
+
+Sends this invoice to the Freeside Internet Services, Inc. print and mail
+service.
+
+=cut
+
+use CAM::PDF;
+use IO::Socket::SSL;
+use LWP::UserAgent;
+use HTTP::Request::Common qw( POST );
+use Cpanel::JSON::XS;
+use MIME::Base64;
+sub postal_mail_fsinc {
+ my ( $self, %opt ) = @_;
+
+ my $url = 'https://ws.freeside.biz/print';
+
+ my $cust_main = $self->cust_main;
+ my $agentnum = $cust_main->agentnum;
+ my $bill_location = $cust_main->bill_location;
+
+ die "Extra charges for international mailing; contact support\@freeside.biz to enable\n"
+ if $bill_location->country ne 'US';
+
+ my $conf = new FS::Conf;
+
+ my @company_address = $conf->config('company_address', $agentnum);
+ my ( $company_address1, $company_address2, $company_city, $company_state, $company_zip );
+ if ( $company_address[2] =~ /^\s*(\S.*\S)\s*[\s,](\w\w),?\s*(\d{5}(-\d{4})?)\s*$/ ) {
+ $company_address1 = $company_address[0];
+ $company_address2 = $company_address[1];
+ $company_city = $1;
+ $company_state = $2;
+ $company_zip = $3;
+ } elsif ( $company_address[1] =~ /^\s*(\S.*\S)\s*[\s,](\w\w),?\s*(\d{5}(-\d{4})?)\s*$/ ) {
+ $company_address1 = $company_address[0];
+ $company_address2 = '';
+ $company_city = $1;
+ $company_state = $2;
+ $company_zip = $3;
+ } else {
+ die "Unparsable company_address; contact support\@freeside.biz\n";
+ }
+ $company_city =~ s/,$//;
+
+ my $file = $self->print_pdf(%opt, 'no_addresses' => 1);
+ my $pages = CAM::PDF->new($file)->numPages;
+
+ my $ua = LWP::UserAgent->new(
+ 'ssl_opts' => {
+ verify_hostname => 0,
+ SSL_verify_mode => IO::Socket::SSL::SSL_VERIFY_NONE,
+ }
+ );
+ my $response = $ua->request( POST $url, [
+ 'support-key' => scalar($conf->config('support-key')),
+ 'file' => encode_base64($file),
+ 'pages' => $pages,
+
+ #from:
+ 'company_name' => scalar( $conf->config('company_name', $agentnum) ),
+ 'company_address1' => $company_address1,
+ 'company_address2' => $company_address2,
+ 'company_city' => $company_city,
+ 'company_state' => $company_state,
+ 'company_zip' => $company_zip,
+ 'company_country' => 'US',
+ 'company_phonenum' => scalar($conf->config('company_phonenum', $agentnum)),
+ 'company_email' => scalar($conf->config('invoice_from', $agentnum)),
+
+ #to:
+ 'name' => $cust_main->invoice_attn
+ || $cust_main->contact_firstlast,
+ 'company' => $cust_main->company,
+ 'address1' => $bill_location->address1,
+ 'address2' => $bill_location->address2,
+ 'city' => $bill_location->city,
+ 'state' => $bill_location->state,
+ 'zip' => $bill_location->zip,
+ 'country' => $bill_location->country,
+ ]);
+
+ die "Print connection error: ". $response->message. "\n"
+ unless $response->is_success;
+
+ local $@;
+ my $content = eval { decode_json($response->content) };
+ die "Print JSON error : $@\n" if $@;
+
+ die $content->{error}."\n"
+ if $content->{error};
+
+ #TODO: store this so we can query for a status later
+ warn "Invoice printed, ID ". $content->{id}. "\n";
+
+ $content->{id};
+
+}
+