aboutsummaryrefslogtreecommitdiffstats
path: root/perllib/FixMyStreet/DB/ResultSet/Problem.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perllib/FixMyStreet/DB/ResultSet/Problem.pm')
-rw-r--r--perllib/FixMyStreet/DB/ResultSet/Problem.pm290
1 files changed, 20 insertions, 270 deletions
diff --git a/perllib/FixMyStreet/DB/ResultSet/Problem.pm b/perllib/FixMyStreet/DB/ResultSet/Problem.pm
index ec8f5357d..e87211716 100644
--- a/perllib/FixMyStreet/DB/ResultSet/Problem.pm
+++ b/perllib/FixMyStreet/DB/ResultSet/Problem.pm
@@ -4,6 +4,8 @@ use base 'DBIx::Class::ResultSet';
use strict;
use warnings;
+use FixMyStreet::SendReport::Email;
+
my $site_restriction;
my $site_key;
@@ -293,6 +295,7 @@ while (my $row = $unsent->next) {
$h{closest_address} = $cobrand->find_closest( $h{latitude}, $h{longitude}, $row );
}
+ my %reporters = ();
my (@to, @recips, $template, $areas_info, @open311_councils);
if ($site eq 'emptyhomes') {
@@ -327,39 +330,16 @@ while (my $row = $unsent->next) {
$areas_info = mySociety::MaPit::call('areas', \@all_councils);
my (@dear, %recips);
my $all_confirmed = 1;
+
foreach my $council (@councils) {
my $name = $areas_info->{$council}->{name};
push @dear, $name;
- if ($council == 2330) { # E. Hants have a web service
- $send_web = 'easthants';
- $h{category} = 'Customer Services' if $h{category} eq 'Other';
- } elsif ($areas_info->{$council}->{type} eq 'LBO') { # London
- $send_web = 'london';
- } elsif ( my $endpoint = FixMyStreet::App->model("DB::Open311conf")->search( { area_id => $council, endpoint => { '!=', '' } } )->first ) {
- push @open311_councils, $endpoint;
- $send_web = 'open311';
- } else {
- my $contact = FixMyStreet::App->model("DB::Contact")->find( {
- deleted => 0,
- area_id => $council,
- category => $row->category
- } );
- my ($council_email, $confirmed, $note) = ( $contact->email, $contact->confirmed, $contact->note );
- $council_email = essex_contact($row->latitude, $row->longitude) if $council == 2225;
- $council_email = oxfordshire_contact($row->latitude, $row->longitude) if $council == 2237 && $council_email eq 'SPECIAL';
- unless ($confirmed) {
- $all_confirmed = 0;
- $note = 'Council ' . $row->council . ' deleted'
- unless $note;
- $council_email = 'N/A' unless $council_email;
- $notgot{$council_email}{$row->category}++;
- $note{$council_email}{$row->category} = $note;
- }
- push @to, [ $council_email, $name ];
- $recips{$council_email} = 1;
- $send_email = 1;
- }
+ my $sender = $cobrand->get_council_sender( $council, $areas_info->{$council} );
+ $sender = "FixMyStreet::SendReport::$sender";
+ $reporters{ $sender } = $sender->new() unless $reporters{$sender};
+ $reporters{ $sender }->add_council( $council, $name );
}
+
@recips = keys %recips;
next unless $all_confirmed;
@@ -396,7 +376,7 @@ while (my $row = $unsent->next) {
}
- unless ($send_email || $send_web) {
+ unless ($send_email || $send_web || keys %reporters ) {
die 'Report not going anywhere for ID ' . $row->id . '!';
}
@@ -405,6 +385,9 @@ while (my $row = $unsent->next) {
@recips = ( mySociety::Config::get('CONTACT_EMAIL') );
$send_web = 0;
$send_email = 1;
+ %reporters = (
+ 'FixMyStreet::SendReport::Email' => $reporters{ 'FixMyStreet::SendReport::Email' }
+ );
} elsif ($site eq 'emptyhomes') {
my $council = $row->council;
my $country = $areas_info->{$council}->{country};
@@ -426,75 +409,15 @@ while (my $row = $unsent->next) {
# Multiply results together, so one success counts as a success.
my $result = -1;
- if ($send_email) {
- $result *= FixMyStreet::App->send_email_cron(
- {
- _template_ => $template,
- _parameters_ => \%h,
- To => \@to,
- From => [ $row->user->email, $row->name ],
- },
- mySociety::Config::get('CONTACT_EMAIL'),
- \@recips,
- $nomail
+ for my $sender ( keys %reporters ) {
+ $result *= $reporters{ $sender }->send(
+ $row, \%h, \@to, $template, \@recips, $nomail
);
}
-
- if ($send_web eq 'easthants') {
- $h{message} = construct_easthants_message(%h);
- if (!$nomail) {
- $result *= post_easthants_message(%h);
- }
- } elsif ($send_web eq 'london') {
- $h{message} = construct_london_message(%h);
- if (!$nomail) {
- $result *= post_london_report( $row, %h );
- }
- } elsif ($send_web eq 'open311') {
- foreach my $conf ( @open311_councils ) {
- print 'posting to end point for ' . $conf->area_id . "\n" if $verbose;
-
- my $contact = FixMyStreet::App->model("DB::Contact")->find( {
- deleted => 0,
- area_id => $conf->area_id,
- category => $row->category
- } );
-
- my $open311 = Open311->new(
- jurisdiction => $conf->jurisdiction,
- endpoint => $conf->endpoint,
- api_key => $conf->api_key,
- );
-
- # non standard west berks end points
- if ( $row->council =~ /2619/ ) {
- $open311->endpoints( { services => 'Services', requests => 'Requests' } );
- }
-
- # required to get round issues with CRM constraints
- if ( $row->council =~ /2218/ ) {
- $row->user->name( $row->user->id . ' ' . $row->user->name );
- }
-
- my $resp = $open311->send_service_request( $row, \%h, $contact->email );
-
- # make sure we don't save user changes from above
- if ( $row->council =~ /2218/ ) {
- $row->discard_changes();
- }
-
- if ( $resp ) {
- $row->external_id( $resp );
- $result *= 0;
- } else {
- $result *= 1;
- # temporary fix to resolve some issues with west berks
- if ( $row->council =~ /2619/ ) {
- $result *= 0;
- }
- }
- }
- }
+ #if ($send_email) {
+ #$result *= FixMyStreet::SendReport::Email::send(
+ #);
+ #}
if ($result == mySociety::EmailUtil::EMAIL_SUCCESS) {
$row->update( {
@@ -514,177 +437,4 @@ if ($verbose) {
}
}
-sub _get_district_for_contact {
- my ( $lat, $lon ) = @_;
- my $district =
- mySociety::MaPit::call( 'point', "4326/$lon,$lat", type => 'DIS' );
- ($district) = keys %$district;
- return $district;
-}
-
-# Essex has different contact addresses depending upon the district
-# Might be easier if we start storing in the db all areas covered by a point
-# Will do for now :)
-sub essex_contact {
- my $district = _get_district_for_contact(@_);
- my $email;
- $email = 'eastarea' if $district == 2315 || $district == 2312;
- $email = 'midarea' if $district == 2317 || $district == 2314 || $district == 2316;
- $email = 'southarea' if $district == 2319 || $district == 2320 || $district == 2310;
- $email = 'westarea' if $district == 2309 || $district == 2311 || $district == 2318 || $district == 2313;
- die "Returned district $district which is not in Essex!" unless $email;
- return "highways.$email\@essexcc.gov.uk";
-}
-
-# Oxfordshire has different contact addresses depending upon the district
-sub oxfordshire_contact {
- my $district = _get_district_for_contact(@_);
- my $email;
- $email = 'northernarea' if $district == 2419 || $district == 2420 || $district == 2421;
- $email = 'southernarea' if $district == 2417 || $district == 2418;
- die "Returned district $district which is not in Oxfordshire!" unless $email;
- return "$email\@oxfordshire.gov.uk";
-}
-
-# East Hampshire
-
-sub construct_easthants_message {
- my %h = @_;
- my $message = '';
- $message .= "[ This report was also sent to the district council covering the location of the problem, as the user did not categorise it; please ignore if you're not the correct council to deal with the issue. ]\n\n"
- if $h{multiple};
- $message .= <<EOF;
-Subject: $h{title}
-
-Details: $h{detail}
-
-$h{fuzzy}, or to provide an update on the problem, please visit the following link:
-
-$h{url}
-
-$h{closest_address}
-EOF
- return $message;
-}
-
-my $eh_service;
-sub post_easthants_message {
- my %h = @_;
- my $return = 1;
- $eh_service ||= EastHantsWSDL->on_fault(sub { my($soap, $res) = @_; die ref $res ? $res->faultstring : $soap->transport->status, "\n"; });
- try {
- # ServiceName, RemoteCreatedBy, Salutation, FirstName, Name, Email, Telephone, HouseNoName, Street, Town, County, Country, Postcode, Comments, FurtherInfo, ImageURL
- my $message = ent(encode_utf8($h{message}));
- my $name = ent(encode_utf8($h{name}));
- my $result = $eh_service->INPUTFEEDBACK(
- $h{category}, 'FixMyStreet', '', '', $name, $h{email}, $h{phone},
- '', '', '', '', '', '', $message, 'Yes', $h{image_url}
- );
- $return = 0 if $result eq 'Report received';
- } otherwise {
- my $e = shift;
- print "Caught an error: $e\n";
- };
- return $return;
-}
-
-# London
-
-sub construct_london_message {
- my %h = @_;
- return <<EOF,
-A user of FixMyStreet has submitted the following report of a local
-problem that they believe might require your attention.
-
-Subject: $h{title}
-
-Details: $h{detail}
-
-$h{fuzzy}, or to provide an update on the problem, please visit the
-following link:
-
-$h{url}
-
-$h{closest_address}
-Yours,
-The FixMyStreet team
-EOF
-}
-
-sub post_london_report {
- my ( $problem, %h ) = @_;
- my $phone = $h{phone};
- my $mobile = '';
- if ($phone && $phone =~ /^\s*07/) {
- $mobile = $phone;
- $phone = '';
- }
- my ($first, $last) = $h{name} =~ /^(\S*)(?: (.*))?$/;
- my %params = (
- Key => mySociety::Config::get('LONDON_REPORTIT_KEY'),
- Signature => Digest::MD5::md5_hex( $h{confirmed} . mySociety::Config::get('LONDON_REPORTIT_SECRET') ),
- Type => Utils::london_categories()->{$h{category}},
- RequestDate => $h{confirmed},
- RequestMethod => 'Web',
- ExternalId => $h{url},
- 'Customer.Title' => '',
- 'Customer.FirstName' => $first,
- 'Customer.Surname' => $last,
- 'Customer.Email' => $h{email},
- 'Customer.Phone' => $phone,
- 'Customer.Mobile' => $mobile,
- 'ProblemDescription' => $h{message},
- );
- if ($h{used_map}) {
- $params{'Location.Latitude'} = $h{latitude};
- $params{'Location.Longitude'} = $h{longitude};
- } elsif (mySociety::PostcodeUtil::is_valid_postcode($h{query})) {
- # Didn't use map, and entered postcode, so use that.
- $params{'Location.Postcode'} = $h{query};
- } else {
- # Otherwise, lat/lon is all we have, even if it's wrong.
- $params{'Location.Latitude'} = $h{latitude};
- $params{'Location.Longitude'} = $h{longitude};
- }
- if ($h{has_photo}) {
- $params{'Document1.Name'} = 'Photograph';
- $params{'Document1.MimeType'} = 'image/jpeg';
- $params{'Document1.URL'} = $h{image_url};
- $params{'Document1.URLPublic'} = 'true';
- }
- my $browser = LWP::UserAgent->new;
- my $response = $browser->post( mySociety::Config::get('LONDON_REPORTIT_URL'), \%params );
- my $out = $response->content;
- if ($response->code ne 200) {
- print "Failed to post $h{id} to London API, response was " . $response->code . " $out\n";
- return 1;
- }
- my ($id) = $out =~ /<caseid>(.*?)<\/caseid>/;
- my ($org) = $out =~ /<organisation>(.*?)<\/organisation>/;
- my ($team) = $out =~ /<team>(.*?)<\/team>/;
-
- $org = london_lookup($org);
- $problem->external_id( $id );
- $problem->external_body( $org );
- $problem->external_team( $team );
- return 0;
-}
-
-# Nearest things
-
-sub london_lookup {
- my $org = shift || '';
- my $str = "Unknown ($org)";
- open(FP, "$FindBin::Bin/../data/dft.csv");
- while (<FP>) {
- /^(.*?),(.*)/;
- if ($org eq $1) {
- $str = $2;
- last;
- }
- }
- close FP;
- return $str;
-}
-
1;