freeside inc. web services for address normalizaion and printing, RT#33849
authorIvan Kohler <ivan@freeside.biz>
Sun, 27 Mar 2016 05:45:43 +0000 (22:45 -0700)
committerIvan Kohler <ivan@freeside.biz>
Sun, 27 Mar 2016 05:45:43 +0000 (22:45 -0700)
FS/FS/Template_Mixin.pm
FS/FS/part_event/Action/cust_bill_fsinc_print.pm

index 1f67792..f92a564 100644 (file)
@@ -2351,6 +2351,100 @@ sub mimebuild_pdf {
   );
 }
 
+=item postal_mail_fsinc
+
+Sends this invoice to the Freeside Internet Services, Inc. print and mail
+service.
+
+=cut
+
+use CAM::PDF;
+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);
+  my $pages = CAM::PDF->new($file)->numPages;
+
+  my $ua = LWP::UserAgent->new( 'ssl_opts' => { 'verify_hostname'=>0 });
+  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};
+
+}
+
 =item _items_sections OPTIONS
 
 Generate section information for all items appearing on this invoice.
index 02e1e5a..e1e25bf 100644 (file)
@@ -2,11 +2,6 @@ package FS::part_event::Action::cust_bill_fsinc_print;
 
 use strict;
 use base qw( FS::part_event::Action );
-use LWP::UserAgent;
-use HTTP::Request::Common qw( POST );
-use Cpanel::JSON::XS;
-use CAM::PDF;
-use FS::Conf;
 
 sub description { 'Send invoice to Freeside Inc. for printing and mailing'; }
 
@@ -29,75 +24,9 @@ sub do_action {
 
   $cust_bill->set('mode' => $self->option('modenum'));
 
-  my $url = 'https://ws.freeside.biz/print';
-
-  my $cust_main = $cust_bill->cust_main;
-  my $bill_location = $cust_main->bill_location;
-
-  die 'Extra charges for international mailing; contact support@freeside.biz to enable'
-    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';
-  }
-
-  my $file = $cust_bill->print_pdf;
-  my $pages = CAM::PDF->new($file)->numPages;
-
-  my $ua = LWP::UserAgent->new( 'ssl_opts' => { 'verify_hostname'=>0 });
-  my $response = $ua->request( POST $url, [
-    'support-key'      => scalar($conf->config('support-key')),
-    'file'             => $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,
-    '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
-    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};
+  my $letter_id = $cust_bill->postal_mail_fsinc;
 
+  #TODO: store this so we can query for a status later
 }
 
 1;