diff --git a/perllib/Integrations/Confirm.pm b/perllib/Integrations/Confirm.pm index 6e205d072..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" ] } } ){ @@ -550,10 +522,10 @@ sub jobs_graphql_query { name } - statusLogs ( + 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 fbc8dcb53..d5a0ee52d 100644 --- a/perllib/Open311/Endpoint/Integration/Confirm.pm +++ b/perllib/Open311/Endpoint/Integration/Confirm.pm @@ -767,11 +767,13 @@ 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} ) { 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 @@ -1411,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) = @_; @@ -1419,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) { @@ -1447,8 +1458,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" ); @@ -1457,6 +1468,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. 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; 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 => {}, }, ], },