From 0a7f7a78dafb35f9dc445147aa7d7b64a44162e0 Mon Sep 17 00:00:00 2001 From: Ivan Kohler Date: Sat, 26 Mar 2016 22:46:23 -0700 Subject: [PATCH] freeside inc. web services for address normalizaion and printing, RT#33849 --- FS/FS/Template_Mixin.pm | 106 +++++++++++++++++++++++ FS/FS/part_event/Action/cust_bill_fsinc_print.pm | 78 +---------------- 2 files changed, 109 insertions(+), 75 deletions(-) diff --git a/FS/FS/Template_Mixin.pm b/FS/FS/Template_Mixin.pm index 76cadc396..775cc3d72 100644 --- a/FS/FS/Template_Mixin.pm +++ b/FS/FS/Template_Mixin.pm @@ -2345,6 +2345,112 @@ sub mimebuild_pdf { ); } + + +use CAM::PDF; +use LWP::UserAgent; +use HTTP::Request::Common qw( POST ); +use JSON::XS; +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"; + } + + 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' => $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->payname + && $cust_main->payby !~ /^(CARD|DCRD|CHEK|DCHK)$/ + ? $cust_main->payname + : $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}; +} + +1; + '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}; + + #TODO: get some kind of letter ID back we can later retreive a status on +} + =item _items_sections OPTIONS Generate section information for all items appearing on this invoice. diff --git a/FS/FS/part_event/Action/cust_bill_fsinc_print.pm b/FS/FS/part_event/Action/cust_bill_fsinc_print.pm index ed323b943..b0d65c633 100644 --- a/FS/FS/part_event/Action/cust_bill_fsinc_print.pm +++ b/FS/FS/part_event/Action/cust_bill_fsinc_print.pm @@ -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 JSON::XS; -use CAM::PDF; -use FS::Conf; sub description { 'Send invoice to Freeside Inc. for printing and mailing'; } @@ -29,77 +24,10 @@ sub do_action { $cust_bill->set('mode' => $self->option('modenum')); - my $url = 'https://ws.freeside.biz/print'; + my $error = $cust_bill->postal_mail_fsinc; + die $error if $error; - 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->payname - && $cust_main->payby !~ /^(CARD|DCRD|CHEK|DCHK)$/ - ? $cust_main->payname - : $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}; + #TODO: get some kind of letter ID back we can later retreive a status on } 1; -- 2.11.0