aboutsummaryrefslogtreecommitdiffstats
path: root/perllib
diff options
context:
space:
mode:
Diffstat (limited to 'perllib')
-rw-r--r--perllib/FixMyStreet/Cobrand/Default.pm7
-rw-r--r--perllib/FixMyStreet/Cobrand/Zurich.pm64
2 files changed, 54 insertions, 17 deletions
diff --git a/perllib/FixMyStreet/Cobrand/Default.pm b/perllib/FixMyStreet/Cobrand/Default.pm
index 38efb7a35..a39a98135 100644
--- a/perllib/FixMyStreet/Cobrand/Default.pm
+++ b/perllib/FixMyStreet/Cobrand/Default.pm
@@ -295,8 +295,11 @@ to null/0.
sub uri {
my ( $self, $uri ) = @_;
- (my $map_class = $FixMyStreet::Map::map_class) =~ s/^FixMyStreet::Map:://;
- return $uri unless $map_class =~ /OSM|FMS/;
+ {
+ no warnings 'once';
+ (my $map_class = $FixMyStreet::Map::map_class) =~ s/^FixMyStreet::Map:://;
+ return $uri unless $map_class =~ /OSM|FMS/;
+ }
$uri->query_param( zoom => 3 )
if $uri->query_param('lat') && !$uri->query_param('zoom');
diff --git a/perllib/FixMyStreet/Cobrand/Zurich.pm b/perllib/FixMyStreet/Cobrand/Zurich.pm
index e15170721..690fff104 100644
--- a/perllib/FixMyStreet/Cobrand/Zurich.pm
+++ b/perllib/FixMyStreet/Cobrand/Zurich.pm
@@ -38,6 +38,7 @@ The entries will be something like this (but with different ids).
Users:
id | email | from_body
----+------------------+-----------
+ 1 | super@example.org| 1
2 | dm1@example.org | 2
3 | sdm1@example.org | 3
@@ -215,19 +216,35 @@ sub overdue {
my $w = $problem->created;
return 0 unless $w;
- if ( $problem->state eq 'unconfirmed' || $problem->state eq 'confirmed' ) {
+ # call with previous state
+ if ( $problem->state eq 'unconfirmed' ) {
# One working day
$w = add_days( $w, 1 );
return $w < DateTime->now() ? 1 : 0;
- } elsif ( $problem->state eq 'in progress' || $problem->state eq 'planned' ) {
+ } elsif ( $problem->state eq 'confirmed' || $problem->state eq 'in progress' || $problem->state eq 'planned' ) {
+ # States which affect the subdiv_overdue statistic. TODO: this may no longer be required
# Six working days from creation
$w = add_days( $w, 6 );
return $w < DateTime->now() ? 1 : 0;
+
+ # call with new state
+ } elsif ( $problem->state eq 'fixed - council' || $problem->state eq 'closed' || $problem->state eq 'hidden' ) {
+ # States which affect the closed_overdue statistic
+ # Five working days from moderation (so 6 from creation)
+ $w = add_days( $w, 6 );
+ return $w < DateTime->now() ? 1 : 0;
} else {
return 0;
}
}
+sub set_problem_state {
+ my ($self, $c, $problem, $new_state) = @_;
+ return if $new_state eq $problem->state;
+ $problem->state( $new_state );
+ $c->forward( 'log_edit', [ $problem->id, 'problem', "state change to $new_state" ] );
+}
+
sub email_indent { ''; }
# Specific administrative displays
@@ -444,23 +461,36 @@ sub admin_report_edit {
$internal_note_text = "Weitergeleitet von $old_cat an $new_cat";
$redirect = 1 if $cat->body_id ne $body->id;
} elsif ( my $subdiv = $c->req->params->{body_subdivision} ) {
- $extra->{moderated_overdue} = $self->overdue( $problem );
- $problem->state( 'in progress' );
+ $extra->{moderated_overdue} //= $self->overdue( $problem );
+ $self->set_problem_state($c, $problem, 'in progress');
$problem->external_body( undef );
$problem->bodies_str( $subdiv );
$problem->whensent( undef );
$redirect = 1;
} elsif ( my $external = $c->req->params->{body_external} ) {
- $extra->{moderated_overdue} = $self->overdue( $problem );
- $problem->state( 'closed' );
+ $extra->{moderated_overdue} //= $self->overdue( $problem );
+ $self->set_problem_state($c, $problem, 'closed');
+ $extra->{closed_overdue} //= $self->overdue( $problem );
$problem->external_body( $external );
$problem->whensent( undef );
_admin_send_email( $c, 'problem-external.txt', $problem );
$redirect = 1;
} else {
- $problem->state( $c->req->params->{state} ) if $c->req->params->{state};
- if ( $problem->state eq 'hidden' && $c->req->params->{send_rejected_email} ) {
- _admin_send_email( $c, 'problem-rejected.txt', $problem );
+ if (my $state = $c->req->params->{state}) {
+
+ if ($problem->state eq 'unconfirmed' and $state ne 'unconfirmed') {
+ # only set this for the first state change
+ $extra->{moderated_overdue} //= $self->overdue( $problem );
+ }
+
+ $self->set_problem_state($c, $problem, $state);
+
+ if ($state eq 'fixed - council' || $state eq 'closed' || $state eq 'hidden') {
+ $extra->{closed_overdue} //= $self->overdue( $problem );
+ }
+ if ( $state eq 'hidden' && $c->req->params->{send_rejected_email} ) {
+ _admin_send_email( $c, 'problem-rejected.txt', $problem );
+ }
}
}
@@ -475,7 +505,9 @@ sub admin_report_edit {
$extra->{public_response} = $update;
$problem->extra( $extra );
if ($c->req->params->{publish_response}) {
- $problem->state( 'fixed - council' );
+ $self->set_problem_state($c, $problem, 'fixed - council');
+ $extra->{closed_overdue} = $self->overdue( $problem );
+ $problem->extra( { %$extra } );
_admin_send_email( $c, 'problem-closed.txt', $problem );
}
}
@@ -523,7 +555,7 @@ sub admin_report_edit {
$c->forward('check_token');
$problem->bodies_str( $body->parent->id );
- $problem->state( 'confirmed' );
+ $self->set_problem_state($c, $problem, 'confirmed');
$problem->update;
# log here
$c->res->redirect( '/admin/summary' );
@@ -562,7 +594,7 @@ sub admin_report_edit {
$problem->extra( $extra );
$problem->bodies_str( $body->parent->id );
$problem->whensent( undef );
- $problem->state( 'planned' );
+ $self->set_problem_state($c, $problem, 'planned');
$problem->update;
$c->res->redirect( '/admin/summary' );
}
@@ -646,7 +678,7 @@ sub admin_stats {
my %date_params;
my $ym = $c->req->params->{ym};
- my ($m, $y) = $ym =~ /^(\d+)\.(\d+)$/;
+ my ($m, $y) = $ym ? ($ym =~ /^(\d+)\.(\d+)$/) : ();
$c->stash->{ym} = $ym;
if ($y && $m) {
$c->stash->{start_date} = DateTime->new( year => $y, month => $m, day => 1 );
@@ -706,8 +738,10 @@ sub admin_stats {
my $closed = $c->model('DB::Problem')->search( { state => 'closed', %date_params } )->count;
# Reports moderated within 1 day
my $moderated = $c->model('DB::Problem')->search( { extra => { like => '%moderated_overdue,I1:0%' }, %params } )->count;
- # Reports solved within 5 days
+ # Reports solved within 5 days (sent back from subdiv)
my $subdiv_dealtwith = $c->model('DB::Problem')->search( { extra => { like => '%subdiv_overdue,I1:0%' }, %params } )->count;
+ # Reports solved within 5 days (marked as 'fixed - council', 'closed', or 'hidden'
+ my $fixed_in_time = $c->model('DB::Problem')->search( { extra => { like => '%closed_overdue,I1:0%' }, %params } )->count;
# Reports per category
my $per_category = $c->model('DB::Problem')->search( \%params, {
select => [ 'category', { count => 'id' } ],
@@ -738,7 +772,7 @@ sub admin_stats {
reports_spam => $hidden,
reports_assigned => $closed,
reports_moderated => $moderated,
- reports_dealtwith => $subdiv_dealtwith,
+ reports_dealtwith => $fixed_in_time,
reports_category_changed => $changed,
pictures_taken => $pictures_taken,
pictures_published => $pictures_published,