diff options
Diffstat (limited to 'perllib')
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Report.pm | 3 | ||||
-rw-r--r-- | perllib/FixMyStreet/Cobrand/Zurich.pm | 207 |
2 files changed, 156 insertions, 54 deletions
diff --git a/perllib/FixMyStreet/App/Controller/Report.pm b/perllib/FixMyStreet/App/Controller/Report.pm index 3aaa3e201..d7cae05d4 100644 --- a/perllib/FixMyStreet/App/Controller/Report.pm +++ b/perllib/FixMyStreet/App/Controller/Report.pm @@ -112,7 +112,8 @@ sub load_problem_or_display_error : Private { $c->detach( '/page_error_404_not_found', [ _('Unknown problem ID') ] ) unless $c->cobrand->show_unconfirmed_reports ; } - elsif ( $problem->hidden_states->{ $problem->state } ) { + elsif ( $problem->hidden_states->{ $problem->state } or + (($problem->get_extra_metadata('closure_status')||'') eq 'hidden')) { $c->detach( '/page_error_410_gone', [ _('That report has been removed from FixMyStreet.') ] # diff --git a/perllib/FixMyStreet/Cobrand/Zurich.pm b/perllib/FixMyStreet/Cobrand/Zurich.pm index 3f57ecf5a..1a9963a60 100644 --- a/perllib/FixMyStreet/Cobrand/Zurich.pm +++ b/perllib/FixMyStreet/Cobrand/Zurich.pm @@ -108,8 +108,11 @@ sub prettify_dt { sub zurich_closed_states { my $states = { 'fixed - council' => 1, - 'closed' => 1, + 'closed' => 1, # extern 'hidden' => 1, + 'investigating' => 1, # wish + 'unable to fix' => 1, # jurisdiction unknown + 'partial' => 1, # not contactable }; return wantarray ? keys %{ $states } : $states; @@ -525,6 +528,7 @@ sub admin_report_edit { } } + # Problem updates upon submission if ( ($type eq 'super' || $type eq 'dm') && $c->get_param('submit') ) { $problem->set_extra_metadata('publish_photo' => $c->get_param('publish_photo') || 0 ); @@ -564,6 +568,17 @@ sub admin_report_edit { my $redirect = 0; my $new_cat = $c->get_param('category') || ''; my $state = $c->get_param('state') || ''; + my $oldstate = $problem->state; + + my %closure_states = ( + 'closed' => 1, + 'investigating' => 1, + 'hidden' => 1, + 'partial' => 1, + 'unable to fix' => 1, + ); + + my $old_closure_state = $problem->get_extra_metadata('closure_status'); if ( ($state eq 'confirmed') @@ -580,6 +595,23 @@ sub admin_report_edit { $internal_note_text = "Weitergeleitet von $old_cat an $new_cat"; $self->update_admin_log($c, $problem, "Changed category from $old_cat to $new_cat"); $redirect = 1 if $cat->body_id ne $body->id; + } elsif ( $closure_states{$state} and + ( $oldstate ne 'planned' ) + || (($old_closure_state ||'') ne $state)) + { + # for these states + # - closed (Extern) + # - investigating (Wish) + # - hidden + # - partial (Not contactable) + # - unable to fix (Jurisdiction unknown) + # we divert to planned (Rueckmeldung ausstehend) and set closure_status to the requested state + # From here, the DM can reply to the user, triggering the setting of problem to correct state + $problem->set_extra_metadata( closure_status => $state ); + $self->set_problem_state($c, $problem, 'planned'); + $state = 'planned'; + $redirect = 1; + } elsif ( my $subdiv = $c->get_param('body_subdivision') ) { $problem->set_extra_metadata_if_undefined( moderated_overdue => $self->overdue( $problem ) ); $self->set_problem_state($c, $problem, 'in progress'); @@ -587,55 +619,75 @@ sub admin_report_edit { $problem->bodies_str( $subdiv ); $problem->whensent( undef ); $redirect = 1; - } elsif ( my $external = $c->get_param('body_external') and $state =~/^(closed|investigating)$/) { - # Extern | Wish - my $external_body = $c->model('DB::Body')->find($external) - or die "Body $external not found"; - $problem->set_extra_metadata_if_undefined( moderated_overdue => $self->overdue( $problem ) ); - $problem->set_extra_metadata_if_undefined( closed_overdue => $self->overdue( $problem ) ); - $problem->external_body( $external ); - $problem->whensent( undef ); - $self->set_problem_state($c, $problem, $state); - if ( my $external_message = $c->req->params->{external_message} ) { - $problem->add_to_comments( { - text => ( - sprintf '(%s %s) %s', - $state eq 'closed' ? - _('Forwarded to external body') : - _('Forwarded wish to external body'), - $external_body->name, - $external_message, - ), - user => $c->user->obj, - state => 'hidden', # seems best fit, should not be shown publicly - mark_fixed => 0, - anonymous => 1, - extra => { is_internal_note => 1, is_external_message => 1 }, - } ); - # set the external_message in extra, so that it will be picked up - # later by send-reports - $problem->set_extra_metadata( external_message => $external_message ); - } - my $template = ($state eq 'investigating') ? 'problem-wish.txt' : 'problem-external.txt'; - _admin_send_email( $c, $template, $problem ); - $redirect = 1; } else { if ($state) { - if ($problem->state eq 'unconfirmed' and $state ne 'unconfirmed') { + if ($oldstate eq 'unconfirmed' and $state ne 'unconfirmed') { # only set this for the first state change $problem->set_extra_metadata_if_undefined( moderated_overdue => $self->overdue( $problem ) ); } - $self->set_problem_state($c, $problem, $state); + $self->set_problem_state($c, $problem, $state) + unless $closure_states{$state}; # in closure-states case, we'll defer to clause below if ($self->problem_is_closed($problem)) { $problem->set_extra_metadata_if_undefined( closed_overdue => $self->overdue( $problem ) ); + $c->stash->{problem_is_closed} = 1; } - if ( $state eq 'hidden' && $c->get_param('send_rejected_email') ) { - _admin_send_email( $c, 'problem-rejected.txt', $problem ); + } + } + + if ($problem->state eq 'planned') { + # Rueckmeldung ausstehend + # override $state from the metadata set above + $state = $problem->get_extra_metadata('closure_status') || ''; + my $closed = 0; + + if ($state eq 'hidden' && $c->req->params->{publish_response} ) { + _admin_send_email( $c, 'problem-rejected.txt', $problem ); + $problem->set_extra_metadata_if_undefined( moderated_overdue => $self->overdue( $problem ) ); + $self->set_problem_state($c, $problem, $state); + $closed++; + } + elsif ($state =~/^(closed|investigating)$/) { # Extern | Wish + # Nested if instead of `and` because in these cases, we *don't* + # want to close unless we have body_external (so we don't want + # the final elsif clause below to kick in on publish_response) + if (my $external = $c->req->params->{body_external}) { + my $external_body = $c->model('DB::Body')->find($external) + or die "Body $external not found"; + $problem->external_body( $external ); + } + if ($problem->external_body && $c->req->params->{publish_response}) { + $problem->set_extra_metadata_if_undefined( moderated_overdue => $self->overdue( $problem ) ); + $problem->whensent( undef ); + $self->set_problem_state($c, $problem, $state); + my $template = ($state eq 'investigating') ? 'problem-wish.txt' : 'problem-external.txt'; + _admin_send_email( $c, $template, $problem ); + $redirect = 1; + $closed++; } + # else should really return a message here + } + elsif ($c->req->params->{publish_response}) { + # otherwise we only set the state if publish_response is set + + # if $state wasn't set, then we are simply closing the message as fixed + $state ||= 'fixed - council'; + _admin_send_email( $c, 'problem-closed.txt', $problem ); + $redirect = 1; + $closed++; } + + if ($closed) { + # set to either the closure_status from metadata or 'fixed - council' as above + $self->set_problem_state($c, $problem, $state); + $problem->set_extra_metadata_if_undefined( closed_overdue => $self->overdue( $problem ) ); + $problem->unset_extra_metadata('closure_status'); + } + } + else { + $problem->unset_extra_metadata('closure_status'); } $problem->title( $c->get_param('title') ) if $c->get_param('title'); @@ -643,16 +695,40 @@ sub admin_report_edit { $problem->latitude( $c->get_param('latitude') ); $problem->longitude( $c->get_param('longitude') ); - # Final, public, Update from DM - if (my $update = $c->get_param('status_update')) { + # update the public update from DM + if (my $update = $c->req->param('status_update')) { $problem->set_extra_metadata(public_response => $update); - if ($c->get_param('publish_response')) { - $self->set_problem_state($c, $problem, 'fixed - council'); - $problem->set_extra_metadata( closed_overdue => $self->overdue( $problem ) ); - _admin_send_email( $c, 'problem-closed.txt', $problem ); - } } - $c->stash->{default_public_response} = "\nFreundliche Grüsse\n\nIhre Stadt Zürich\n"; + + # send external_message if provided and state is *now* Wish|Extern + # e.g. was already, or was set in the Rueckmeldung ausstehend clause above. + if ( my $external_message = $c->req->params->{external_message} + and $problem->state =~ /^(closed|investigating)$/) + { + my $external = $problem->external_body; + my $external_body = $c->model('DB::Body')->find($external) + or die "Body $external not found"; + + $problem->set_extra_metadata_if_undefined( moderated_overdue => $self->overdue( $problem ) ); + $problem->add_to_comments( { + text => ( + sprintf '(%s %s) %s', + $state eq 'closed' ? + _('Forwarded to external body') : + _('Forwarded wish to external body'), + $external_body->name, + $external_message, + ), + user => $c->user->obj, + state => 'hidden', # seems best fit, should not be shown publicly + mark_fixed => 0, + anonymous => 1, + extra => { is_internal_note => 1, is_external_message => 1 }, + } ); + # set the external_message in extra, so that it will be picked up + # later by send-reports + $problem->set_extra_metadata( external_message => $external_message ); + } $problem->lastupdate( \'current_timestamp' ); $problem->update; @@ -682,7 +758,7 @@ sub admin_report_edit { $self->update_admin_log($c, $problem); if ( $redirect ) { - $c->detach('index'); + $c->go('index'); } $c->stash->{updates} = [ $c->model('DB::Comment') @@ -708,8 +784,14 @@ sub admin_report_edit { my $not_contactable = $c->req->param('not_contactable'); $problem->bodies_str( $body->parent->id ); - my $new_state = $not_contactable ? 'partial' : 'confirmed'; - $self->set_problem_state($c, $problem, $new_state); + if ($not_contactable) { + # we can't directly set state, but mark the closure_status for DM to confirm. + $self->set_problem_state($c, $problem, 'planned'); + $problem->set_extra_metadata( closure_status => 'partial'); + } + else { + $self->set_problem_state($c, $problem, 'confirmed'); + } $problem->update; $c->forward( 'log_edit', [ $problem->id, 'problem', $not_contactable ? @@ -792,11 +874,6 @@ sub stash_states { unconfirmed => 1, }, { - # Rueckmeldung ausstehend - state => 'planned', - trans => _('Planned'), - }, - { # Unsichtbar (hidden) state => 'hidden', trans => _('Hidden'), @@ -824,7 +901,26 @@ sub stash_states { trans => _('Not contactable'), }, ); + my %state_trans = map { $_->{state} => $_->{trans} } @states; + my $state = $problem->state; + + # Rueckmeldung ausstehend may also indicate the status it's working towards. + push @states, do { + if ($state eq 'planned' and my $closure_status = $problem->get_extra_metadata('closure_status')) { + { + state => $closure_status, + trans => sprintf '%s (%s)', _('Planned'), $state_trans{$closure_status}, + }; + } + else { + { + state => 'planned', + trans => _('Planned'), + }; + } + }; + if ($state eq 'in progress') { push @states, { state => 'in progress', @@ -841,6 +937,11 @@ sub stash_states { @states = grep { $_->{$state} } @states; } $c->stash->{states} = \@states; + + # stash details about the public response + $c->stash->{default_public_response} = "\nFreundliche Grüsse\n\nIhre Stadt Zürich\n"; + $c->stash->{show_publish_response} = + ($problem->state eq 'planned'); } =head2 _admin_send_email |