From 678f8eeb97d0fb59063440c38cabe03de569cdd1 Mon Sep 17 00:00:00 2001 From: Matthew Somerville Date: Thu, 12 Feb 2026 17:42:21 +0000 Subject: [PATCH 1/4] [Confirm] Add ability to ignore states in job fetching. --- perllib/Open311/Endpoint/Integration/Confirm.pm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/perllib/Open311/Endpoint/Integration/Confirm.pm b/perllib/Open311/Endpoint/Integration/Confirm.pm index fbc8dcb53..5603288f7 100644 --- a/perllib/Open311/Endpoint/Integration/Confirm.pm +++ b/perllib/Open311/Endpoint/Integration/Confirm.pm @@ -772,6 +772,7 @@ sub _get_service_request_updates_for_jobs { for my $log ( @{$status_logs} ) { my $status = $self->job_reverse_status_mapping->{ $log->{statusCode} }; + next if $status && $status eq 'IGNORE'; if (!$status) { # This shouldn't happen given that we filter by status code @@ -1457,6 +1458,7 @@ sub _get_service_requests_for_jobs { my $status = $self->job_reverse_status_mapping ->{ $last_status_log->{statusCode} }; + next if $status && $status eq 'IGNORE'; unless ($status) { # This shouldn't happen given that we filter by status code # in graphql. But just in case, default to open. From 97100aa99237754cdb83c0f36b5fcd7c1352507f Mon Sep 17 00:00:00 2001 From: Matthew Somerville Date: Thu, 12 Feb 2026 17:56:36 +0000 Subject: [PATCH 2/4] [Confirm] [Jobs] Switch to currentStatusLog. --- perllib/Integrations/Confirm.pm | 2 +- .../Open311/Endpoint/Integration/Confirm.pm | 4 +- t/open311/endpoint/confirm.t | 42 +++++++------------ 3 files changed, 17 insertions(+), 31 deletions(-) diff --git a/perllib/Integrations/Confirm.pm b/perllib/Integrations/Confirm.pm index 6e205d072..b7a4d48a9 100644 --- a/perllib/Integrations/Confirm.pm +++ b/perllib/Integrations/Confirm.pm @@ -550,7 +550,7 @@ sub jobs_graphql_query { name } - statusLogs ( + currentStatusLog ( filter: { statusCode: { inList: [ "$status_codes_str" ] diff --git a/perllib/Open311/Endpoint/Integration/Confirm.pm b/perllib/Open311/Endpoint/Integration/Confirm.pm index 5603288f7..c65a7a736 100644 --- a/perllib/Open311/Endpoint/Integration/Confirm.pm +++ b/perllib/Open311/Endpoint/Integration/Confirm.pm @@ -1448,8 +1448,8 @@ sub _get_service_requests_for_jobs { next; } - my $last_status_log = $job->{statusLogs}[-1]; - unless ($last_status_log) { + my $last_status_log = $job->{currentStatusLog}; + unless ($last_status_log && %$last_status_log) { $self->logger->warn( "no status logs for job type code " . $job->{jobType}{code} . " for job $job_id" ); diff --git a/t/open311/endpoint/confirm.t b/t/open311/endpoint/confirm.t index f44478ad6..842f179bd 100644 --- a/t/open311/endpoint/confirm.t +++ b/t/open311/endpoint/confirm.t @@ -318,12 +318,10 @@ $open311->mock( perform_request_graphql => sub { code => 'ASAP', name => 'ASAP', }, - statusLogs => [ - { - loggedDate => '2023-12-01T00:00:00', - statusCode => 'OPEN', - }, - ], + currentStatusLog => { + loggedDate => '2023-12-01T00:00:00', + statusCode => 'OPEN', + }, }, { description => 'A completed job', @@ -340,16 +338,10 @@ $open311->mock( perform_request_graphql => sub { code => 'ASAP', name => 'ASAP', }, - statusLogs => [ - { - loggedDate => '2023-12-01T00:00:00', - statusCode => 'OPEN', - }, - { - loggedDate => '2024-01-01T00:00:00', - statusCode => 'FIXED', - }, - ], + currentStatusLog => { + loggedDate => '2024-01-01T00:00:00', + statusCode => 'FIXED', + }, }, # Filtered out @@ -368,16 +360,10 @@ $open311->mock( perform_request_graphql => sub { code => 'ASAP', name => 'ASAP', }, - statusLogs => [ - { - loggedDate => '2023-12-01T00:00:00', - statusCode => 'OPEN', - }, - { - loggedDate => '2023-12-01T01:00:00', - statusCode => 'SHUT', - }, - ], + currentStatusLog => { + loggedDate => '2023-12-01T01:00:00', + statusCode => 'SHUT', + }, }, { description => 'A job with no status logs', @@ -394,7 +380,7 @@ $open311->mock( perform_request_graphql => sub { code => 'ASAP', name => 'ASAP', }, - statusLogs => [], + currentStatusLog => {}, }, { description => 'A job with EOFY priority', @@ -411,7 +397,7 @@ $open311->mock( perform_request_graphql => sub { code => 'EOFY', name => 'End Of Financial Year', }, - statusLogs => [], + currentStatusLog => {}, }, ], }, From 8784ef69ff54b2940d37b6d84895fc76cc760d5c Mon Sep 17 00:00:00 2001 From: Matthew Somerville Date: Thu, 12 Feb 2026 17:56:58 +0000 Subject: [PATCH 3/4] [Confirm] [Jobs] Refactor out some filtering. --- perllib/Integrations/Confirm.pm | 56 +++++-------------- .../Open311/Endpoint/Integration/Confirm.pm | 10 ++++ 2 files changed, 24 insertions(+), 42 deletions(-) diff --git a/perllib/Integrations/Confirm.pm b/perllib/Integrations/Confirm.pm index b7a4d48a9..326d11124 100644 --- a/perllib/Integrations/Confirm.pm +++ b/perllib/Integrations/Confirm.pm @@ -456,34 +456,19 @@ sub perform_request_graphql { sub job_status_logs_graphql_query { my ( $self, %args ) = @_; - my @job_type_codes - = keys %{ $self->config->{job_service_whitelist} // () }; - - my @status_codes - = keys %{ $self->config->{job_reverse_status_mapping} // () }; - - my ( - $start_date, - $end_date, - $job_type_codes_str, - $status_codes_str, - ) = ( - $args{start_date}, - $args{end_date}, - join( '","', @job_type_codes ), - join( '","', @status_codes ), - ); + my $job_type_codes = join '","', sort keys %{ $self->config->{job_service_whitelist} // () }; + my $status_filter = $args{jobs_status_filter} || ""; return <config->{job_service_whitelist} // () }; - - my @status_codes - = keys %{ $self->config->{job_reverse_status_mapping} // () }; - - my ( - $start_date, - $end_date, - $job_type_codes_str, - $status_codes_str, - ) = ( - $args{start_date}, - $args{end_date}, - join( '","', @job_type_codes ), - join( '","', @status_codes ), - ); + my $job_type_codes = join '","', sort keys %{ $self->config->{job_service_whitelist} // () }; + my $jobs_extra_filter = $args{jobs_extra_filter} || ""; + my $status_filter = $args{jobs_status_filter} || ""; return <<"GRAPHQL" { jobs ( filter: { entryDate: { - greaterThanEquals: "$start_date" - lessThanEquals: "$end_date" + greaterThanEquals: "$args{start_date}" + lessThanEquals: "$args{end_date}" } + $jobs_extra_filter } ){ jobType( filter: { code: { - inList: [ "$job_type_codes_str" ] + inList: [ "$job_type_codes" ] } } ){ @@ -553,7 +525,7 @@ sub jobs_graphql_query { currentStatusLog ( filter: { statusCode: { - inList: [ "$status_codes_str" ] + $status_filter } } ) { diff --git a/perllib/Open311/Endpoint/Integration/Confirm.pm b/perllib/Open311/Endpoint/Integration/Confirm.pm index c65a7a736..d5a0ee52d 100644 --- a/perllib/Open311/Endpoint/Integration/Confirm.pm +++ b/perllib/Open311/Endpoint/Integration/Confirm.pm @@ -767,6 +767,7 @@ sub _get_service_request_updates_for_jobs { my $status_logs = $integ->GetJobStatusLogs( start_date => $args->{start_date}, end_date => $args->{end_date}, + jobs_status_filter => $self->jobs_status_filter, ); for my $log ( @{$status_logs} ) { @@ -1412,6 +1413,13 @@ and appends them to the $requests array as Open311 ServiceRequests. =cut +sub jobs_extra_filter { "" } +sub jobs_status_filter { + my $self = shift; + my $status_codes = join '","', sort keys %{ $self->job_reverse_status_mapping // () }; + return "inList: [ \"$status_codes\" ]"; +} + sub _get_service_requests_for_jobs { my ($self, $integ, $services, $args, $requests) = @_; @@ -1420,6 +1428,8 @@ sub _get_service_requests_for_jobs { my $jobs = $integ->GetJobs( start_date => $args->{start_date}, end_date => $args->{end_date}, + jobs_extra_filter => $self->jobs_extra_filter, + jobs_status_filter => $self->jobs_status_filter, ); for my $job (@$jobs) { From af5cbf294670cb81724b045d6df5f230e0c33540 Mon Sep 17 00:00:00 2001 From: Matthew Somerville Date: Thu, 12 Feb 2026 17:44:15 +0000 Subject: [PATCH 4/4] [Shropshire] Add filtering for fetched jobs. --- .../Open311/Endpoint/Integration/UK/Shropshire.pm | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/perllib/Open311/Endpoint/Integration/UK/Shropshire.pm b/perllib/Open311/Endpoint/Integration/UK/Shropshire.pm index e3d8b9589..670b0a794 100644 --- a/perllib/Open311/Endpoint/Integration/UK/Shropshire.pm +++ b/perllib/Open311/Endpoint/Integration/UK/Shropshire.pm @@ -39,4 +39,16 @@ around process_service_request_args => sub { return $ret; }; +sub jobs_extra_filter { + return <<"GRAPHQL"; + contractCode: { equals: "ZVC18" } + statusFlag: { equals: "C" } + actualCompletionDate: { hasValue: false } +GRAPHQL +} + +sub jobs_status_filter { + return 'notEquals: "X020"'; +} + 1;