aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Arter <davea@mysociety.org>2018-03-21 17:16:49 +0000
committerDave Arter <davea@mysociety.org>2018-03-28 15:31:17 +0100
commitf8a5b193d2eba23e8ba78209d4b70a05fb83a944 (patch)
tree1c9c759ba5c91c7dcf30fd22e168982288f998ac
parented6c2501b859a79b2284870b6f9ee2170ebf959a (diff)
Fetch and store external_status_code in GetServiceRequestUpdates
If the Open311 endpoint provides the external_status_code field in servicerequestupdates.xml output, it’s stored in each comment’s extra field as well as the problem’s extra field. This will make it possible to trigger response templates based on this value.
-rw-r--r--CHANGELOG.md1
-rw-r--r--perllib/Open311/GetServiceRequestUpdates.pm9
-rw-r--r--t/open311/getservicerequestupdates.t48
3 files changed, 58 insertions, 0 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 407656364..844d8dc27 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,7 @@
- Allow Open311 service definitions to include automated
attributes #1986
- Optionally supress blank Open311 update errors #1986
+ - Fetch/store external status code with Open311 updates. #2048
- Front end improvements:
- Improve questionnaire process. #1939 #1998
- Increase size of "sub map links" (hide pins, permalink, etc) #2003
diff --git a/perllib/Open311/GetServiceRequestUpdates.pm b/perllib/Open311/GetServiceRequestUpdates.pm
index f2a319f15..8d05a358f 100644
--- a/perllib/Open311/GetServiceRequestUpdates.pm
+++ b/perllib/Open311/GetServiceRequestUpdates.pm
@@ -110,6 +110,7 @@ sub update_comments {
if ( !$c->first ) {
my $state = $open311->map_state( $request->{status} );
+ my $external_status_code = $request->{external_status_code};
my $comment = $self->schema->resultset('Comment')->new(
{
problem => $p,
@@ -126,6 +127,14 @@ sub update_comments {
}
);
+ # Some Open311 services, e.g. Confirm via open311-adapter, provide
+ # a more fine-grained status code that we use within FMS for
+ # response templates.
+ if ( $external_status_code ) {
+ $comment->set_extra_metadata(external_status_code =>$external_status_code);
+ $p->set_extra_metadata(external_status_code =>$external_status_code);
+ }
+
$open311->add_media($request->{media_url}, $comment)
if $request->{media_url};
diff --git a/t/open311/getservicerequestupdates.t b/t/open311/getservicerequestupdates.t
index a53354685..885c0c183 100644
--- a/t/open311/getservicerequestupdates.t
+++ b/t/open311/getservicerequestupdates.t
@@ -650,6 +650,54 @@ subtest 'check that existing comments are not duplicated' => sub {
is $problem->comments->count, 2, 'if comments are deleted then they are added';
};
+subtest 'check that external_status_code is stored correctly' => sub {
+ my $requests_xml = qq{<?xml version="1.0" encoding="utf-8"?>
+ <service_requests_updates>
+ <request_update>
+ <update_id>638344</update_id>
+ <service_request_id>@{[ $problem->external_id ]}</service_request_id>
+ <status>open</status>
+ <description>This is a note</description>
+ <updated_datetime>UPDATED_DATETIME</updated_datetime>
+ <external_status_code>060</external_status_code>
+ </request_update>
+ <request_update>
+ <update_id>638354</update_id>
+ <service_request_id>@{[ $problem->external_id ]}</service_request_id>
+ <status>open</status>
+ <description>This is a different note</description>
+ <updated_datetime>UPDATED_DATETIME2</updated_datetime>
+ <external_status_code>101</external_status_code>
+ </request_update>
+ </service_requests_updates>
+ };
+
+ $problem->comments->delete;
+
+ my $dt2 = $dt->clone->subtract( hours => 1 );
+ $requests_xml =~ s/UPDATED_DATETIME2/$dt/;
+ $requests_xml =~ s/UPDATED_DATETIME/$dt2/;
+
+ my $o = Open311->new( jurisdiction => 'mysociety', endpoint => 'http://example.com', test_mode => 1, test_get_returns => { 'servicerequestupdates.xml' => $requests_xml } );
+
+ my $update = Open311::GetServiceRequestUpdates->new(
+ system_user => $user,
+ );
+
+ $update->update_comments( $o, $bodies{2482} );
+
+ $problem->discard_changes;
+ is $problem->comments->count, 2, 'two comments after fetching updates';
+
+ my @comments = $problem->comments->all;
+
+ is $comments[0]->get_extra_metadata('external_status_code'), "060", "correct external status code on first comment";
+ is $comments[1]->get_extra_metadata('external_status_code'), "101", "correct external status code on second comment";
+
+ is $problem->get_extra_metadata('external_status_code'), "101", "correct external status code";
+
+};
+
foreach my $test ( {
desc => 'check that closed and then open comment results in correct state',
dt1 => $dt->clone->subtract( hours => 1 ),