summaryrefslogtreecommitdiff
path: root/FS/FS
diff options
context:
space:
mode:
authorIvan Kohler <ivan@freeside.biz>2016-03-26 12:51:54 -0700
committerIvan Kohler <ivan@freeside.biz>2016-03-26 12:51:54 -0700
commit2df25d1d8a79a775f715f36c8ded11665a944a25 (patch)
tree7c6e3f31b7c327a084cdb3117a14ab9f0fc0a925 /FS/FS
parent8bf7866ff8b83f34a5e3b328ba233c2a0dbe6967 (diff)
freeside inc. web services for address normalizaion and printing, RT#33849
Diffstat (limited to 'FS/FS')
-rw-r--r--FS/FS/Conf.pm1
-rw-r--r--FS/FS/Misc/Geo.pm36
-rw-r--r--FS/FS/part_event/Action/cust_bill_fsinc_print.pm106
3 files changed, 143 insertions, 0 deletions
diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm
index 7aa81e5..f7f0a8f 100644
--- a/FS/FS/Conf.pm
+++ b/FS/FS/Conf.pm
@@ -4341,6 +4341,7 @@ and customer address. Include units.',
'usps' => 'U.S. Postal Service',
'tomtom' => 'TomTom',
'melissa' => 'Melissa WebSmart',
+ 'freeside' => 'Freeside web service (support contract required)',
],
},
diff --git a/FS/FS/Misc/Geo.pm b/FS/FS/Misc/Geo.pm
index aa4e55e..73122fa 100644
--- a/FS/FS/Misc/Geo.pm
+++ b/FS/FS/Misc/Geo.pm
@@ -642,6 +642,42 @@ sub standardize_melissa {
}
}
+sub standardize_freeside {
+ my $class = shift;
+ my $location = shift;
+
+ my $url = 'https://ws.freeside.biz/normalize';
+
+ #free freeside.biz normalization only for US
+ if ( $location->{country} ne 'US' ) {
+ # soft failure
+ #why? something else could have cleaned it $location->{addr_clean} = '';
+ return $location;
+ }
+
+ my $ua = LWP::UserAgent->new( 'ssl_opts' => { 'verify_hostname'=>0 });
+ my $response = $ua->request( POST $url, [
+ 'support-key' => scalar($conf->config('support-key')),
+ %$location,
+ ]);
+
+ die "Address normalization error: ". $response->message
+ unless $response->is_success;
+
+ local $@;
+ my $content = eval { decode_json($response->content) };
+ die "Address normalization JSON error : $@\n" if $@;
+
+ die $content->{error}."\n"
+ if $content->{error};
+
+ { 'addr_clean' => 'Y',
+ map { $_ => $content->{$_} }
+ qw( address1 address2 city state zip country )
+ };
+
+}
+
=back
=cut
diff --git a/FS/FS/part_event/Action/cust_bill_fsinc_print.pm b/FS/FS/part_event/Action/cust_bill_fsinc_print.pm
new file mode 100644
index 0000000..2ef564b
--- /dev/null
+++ b/FS/FS/part_event/Action/cust_bill_fsinc_print.pm
@@ -0,0 +1,106 @@
+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 Cpanel::JSON::XS;
+use CAM::PDF;
+use FS::Conf;
+
+sub description { 'Send invoice to Freeside Inc. for printing and mailing'; }
+
+sub eventtable_hashref {
+ { 'cust_bill' => 1 };
+}
+
+sub option_fields {
+ (
+ 'modenum' => { label => 'Invoice mode',
+ type => 'select-invoice_mode',
+ },
+ );
+}
+
+sub default_weight { 52; }
+
+sub do_action {
+ my( $self, $cust_bill ) = @_;
+
+ $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->payname
+ && $cust_main->payby !~ /^(CARD|DCRD|CHEK|DCHK)$/
+ ? $cust_main->payname
+ : $cust_main->contact_firstlast
+ )
+ #'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};
+}
+
+1;