aboutsummaryrefslogtreecommitdiffstats
path: root/bin
diff options
context:
space:
mode:
Diffstat (limited to 'bin')
-rwxr-xr-xbin/open311-populate-service-list112
-rw-r--r--bin/open311-update-reports124
-rwxr-xr-xbin/send-reports29
3 files changed, 265 insertions, 0 deletions
diff --git a/bin/open311-populate-service-list b/bin/open311-populate-service-list
new file mode 100755
index 000000000..2a6733ef1
--- /dev/null
+++ b/bin/open311-populate-service-list
@@ -0,0 +1,112 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use LWP::Simple;
+use XML::Simple;
+use FixMyStreet::App;
+use Open311;
+
+use Data::Dumper;
+
+my $council_list = FixMyStreet::App->model('DB::Open311conf');
+
+while ( my $council = $council_list->next ) {
+
+ my $open311 = Open311->new(
+ endpoint => $council->endpoint,
+ jurisdiction => $council->jurisdiction,
+ api_key => $council->api_key
+ );
+
+ my $list = $open311->get_service_list;
+
+ my @found_contacts;
+
+ # print Dumper $list;
+
+ foreach my $service ( @{ $list->{service} } ) {
+ print $service->{service_code} . ': ' . $service->{service_name} . "\n";
+ my $contacts = FixMyStreet::App->model( 'DB::Contact')->search(
+ {
+ area_id => $council->area_id,
+ -OR => [
+ email => $service->{service_code},
+ category => $service->{service_name}
+ ]
+ }
+ );
+
+ my $contact = $contacts->first;
+
+ # FIXME - handle change of service name or service code
+ if ( $contact ) {
+
+ print $council->area_id . " already has a contact for service code " . $service->{service_code} . "\n";
+ push @found_contacts, $service->{service_code};
+
+ if ( $contact->deleted ) {
+ $contact->update(
+ {
+ category => $service->{service_name},
+ email => $service->{service_code},
+ confirmed => 1,
+ deleted => 0,
+ editor => $0,
+ whenedited => \'ms_current_timestamp()',
+ note => 'automatically undeleted by script',
+ }
+ );
+ }
+ } else {
+ my $contact = FixMyStreet::App->model( 'DB::Contact')->create(
+ {
+ email => $service->{service_code},
+ area_id => $council->area_id,
+ category => $service->{service_name},
+ confirmed => 1,
+ deleted => 0,
+ editor => $0,
+ whenedited => \'ms_current_timestamp()',
+ note => 'created automatically by script',
+ }
+ );
+
+ if ( lc( $service->{metadata} ) eq 'true' ) {
+ print "Fetching meta data for $service->{service_code}\n";
+ my $meta_data = $open311->get_service_meta_info( $service->{service_code} );
+
+ # turn the data into something a bit more friendly to use
+ my @meta =
+ # remove trailing colon as we add this when we display so we don't want 2
+ map { $_->{description} =~ s/:\s*//; $_ }
+ # there is a display order and we only want to sort once
+ sort { $a->{order} <=> $b->{order} }
+ @{ $meta_data->{attributes}->{attribute} };
+
+ $contact->extra( \@meta );
+ $contact->update;
+ }
+
+ push @found_contacts, $service->{service_code};
+ print "created contact for service code " . $service->{service_code} . " for council @{[$council->area_id]}\n";
+ }
+ }
+
+ my $found_contacts = FixMyStreet::App->model( 'DB::Contact')->search(
+ {
+ email => { -not_in => \@found_contacts },
+ area_id => $council->area_id,
+ deleted => 0,
+ }
+ );
+
+ $found_contacts->update(
+ {
+ deleted => 1,
+ editor => $0,
+ whenedited => \'ms_current_timestamp()',
+ note => 'automatically marked as deleted by script'
+ }
+ );
+}
diff --git a/bin/open311-update-reports b/bin/open311-update-reports
new file mode 100644
index 000000000..00242a094
--- /dev/null
+++ b/bin/open311-update-reports
@@ -0,0 +1,124 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use Open311;
+use FixMyStreet::App;
+
+# FIXME - make this configurable and/or better
+my $system_user = FixMyStreet::App->model('DB::User')->find_or_create(
+ {
+ email => 'fixmystreet@mysociety.org',
+ name => 'System User',
+ }
+);
+
+my $council_list = FixMyStreet::App->model('DB::Open311conf');
+
+while ( my $council = $council_list->next ) {
+
+ my $open311 = Open311->new(
+ endpoint => $council->endpoint,
+ jurisdiction => $council->jurisdiction,
+ api_key => $council->api_key
+ );
+
+ my $area_id = $council->area_id;
+
+ my $council_details = mySociety::MaPit::call( 'area', $area_id );
+
+ my $reports = FixMyStreet::App->model('DB::Problem')->search(
+ {
+ council => { like => "\%$area_id\%" },
+ external_id => { '!=', undef },
+ external_id => { '!=', '' },
+
+ # FIXME - only care about visible states
+ }
+ );
+
+ my @report_ids = ();
+ while ( my $report = $reports->next ) {
+ push @report_ids, $report->external_id;
+ }
+
+ next unless @report_ids;
+
+ my $service_requests = $open311->get_service_requests( \@report_ids );
+
+ my $requests;
+
+ # XML::Simple is a bit inconsistent in how it structures
+ # things depending on the number of children an element has :(
+ if ( ref $service_requests->{request} eq 'ARRAY' ) {
+ $requests = $service_requests->{request};
+ }
+ else {
+ $requests = [ $service_requests->{request} ];
+ }
+
+ for my $request (@$requests) {
+ my $request_id = $request->{service_request_id};
+
+ my $problem =
+ FixMyStreet::App->model('DB::Problem')
+ ->search( { external_id => $request_id, } );
+
+ if (my $p = $problem->first) {
+ my ( $updated, $status_notes );
+
+ if ( ! ref $request->{updated_datetime} ) {
+ $updated = $request->{updated_datetime};
+ }
+
+ if ( ! ref $request->{status_notes} ) {
+ $status_notes = $request->{status_notes};
+ }
+
+ my $update = FixMyStreet::App->model('DB::Comment')->new(
+ {
+ problem_id => $p->id,
+ state => 'confirmed',
+ created => $updated || \'ms_current_timestamp()',
+ confirmed => \'ms_current_timestamp()',
+ text => $status_notes,
+ mark_open => 0,
+ mark_fixed => 0,
+ user => $system_user,
+ anonymous => 0,
+ name => $council_details->{name},
+ }
+ );
+ if ( $request->{status} eq 'closed' ) {
+ if ( $p->state ne 'fixed' ) {
+ $p->state('fixed');
+ $update->mark_fixed(1);
+
+ if ( !$status_notes ) {
+
+ # FIXME - better text here
+ $update->text( 'Closed by council' );
+ }
+
+ $p->update;
+ $update->insert;
+ }
+ }
+ else {
+ if ( $p->state eq 'fixed' ) {
+ $p->state('confirmed');
+ $update->mark_open(1);
+
+ if ( !$status_notes ) {
+
+ # FIXME - better text here
+ $update->text( 'Re-opened by council' );
+ }
+
+ $p->update;
+ $update->insert;
+ }
+ }
+ }
+ }
+}
diff --git a/bin/send-reports b/bin/send-reports
index 1af3ba1ea..298eb458d 100755
--- a/bin/send-reports
+++ b/bin/send-reports
@@ -28,6 +28,8 @@ use mySociety::EmailUtil;
use mySociety::MaPit;
use mySociety::Web qw(ent);
+use Open311;
+
# Set up site, language etc.
my ($verbose, $nomail) = CronFns::options();
my $base_url = mySociety::Config::get('BASE_URL');
@@ -136,6 +138,8 @@ while (my $row = $unsent->next) {
$h{category} = 'Customer Services' if $h{category} eq 'Other';
} elsif ($areas_info->{$council}->{type} eq 'LBO') { # London
$send_web = 'london';
+ } elsif ( FixMyStreet::App->model("DB::Open311conf")->find( { area_id => $council } ) ) {
+ $send_web = 'open311';
} else {
my $contact = FixMyStreet::App->model("DB::Contact")->find( {
deleted => 0,
@@ -248,6 +252,31 @@ while (my $row = $unsent->next) {
if (!$nomail) {
$result *= post_london_report( $row, %h );
}
+ } elsif ($send_web eq 'open311') {
+ # FIXME - looking this up twice :(
+ my $conf = FixMyStreet::App->model('DB::Open311conf')->find( { area_id => $row->council } );
+
+ # FIXME - doesn't deal with multiple recipients
+ my $contact = FixMyStreet::App->model("DB::Contact")->find( {
+ deleted => 0,
+ area_id => $row->council,
+ category => $row->category
+ } );
+
+ my $open311 = Open311->new(
+ jurisdiction => $conf->jurisdiction,
+ endpoint => $conf->endpoint,
+ api_key => $conf->api_key,
+ );
+
+ my $resp = $open311->send_service_request( $row, \%h, $contact->email );
+
+ if ( $resp ) {
+ $row->external_id( $resp );
+ $result = 0;
+ } else {
+ $result = 1;
+ }
}
if ($result == mySociety::EmailUtil::EMAIL_SUCCESS) {