package FixMyStreet::App::Controller::Questionnaire; use Moose; use namespace::autoclean; #use Utils; #use Error qw(:try); #use CrossSell; #use mySociety::Locale; BEGIN { extends 'Catalyst::Controller'; } =head1 NAME FixMyStreet::App::Controller::Questionnaire - Catalyst Controller =head1 DESCRIPTION Catalyst Controller. =head1 METHODS =cut sub load_questionnaire : Private { my ( $self, $c ) = @_; my $questionnaire = $c->model('DB::Questionnaire')->find( { id => $c->stash->{id} }, { prefetch => 'problem' } ); $c->stash->{questionnaire} = $questionnaire; my $problem_id = $questionnaire->problem_id; if ( $questionnaire->whenanswered ) { my $problem_url = $c->uri_for( "/report/$problem_id" ); my $contact_url = $c->uri_for( "/contact" ); $c->stash->{message} = sprintf(_("You have already answered this questionnaire. If you have a question, please get in touch, or view your problem.\n"), $contact_url, $problem_url); $c->stash->{template} = 'questionnaire/error.html'; $c->detach; } # FIXME problem fetched information # extract(epoch from confirmed) as time, extract(epoch from whensent-confirmed) as whensent # state in ('confirmed','fixed') $c->stash->{problem} = $questionnaire->problem; # throw Error::Simple(_("I'm afraid we couldn't locate your problem in the database.\n")) unless $problem; $c->stash->{answered_ever_reported} = $c->model('DB::Questionnaire')->count( { 'problem.user_id' => $c->stash->{problem}->user_id, ever_reported => { '!=', undef }, }, { join => 'problem' } ); } sub submit : Path('submit') { my ( $self, $c ) = @_; $c->forward( '/tokens/load_questionnaire_id', [ $c->req->params->{token} ] ); $c->forward( 'load_questionnaire' ); my $questionnaire = $c->stash->{questionnaire}; my $problem = $questionnaire->problem; $c->stash->{num_questionnaire} = $c->model('DB::Questionnaire')->count( { problem_id => $problem->id } ); map { $c->stash->{$_} = $c->req->params->{$_} || '' } qw(been_fixed reported another update); # EHA questionnaires done for you if ($c->cobrand->moniker eq 'emptyhomes') { $c->stash->{another} = $c->stash->{num_questionnaire}==1 ? 'Yes' : 'No'; } my @errors; push @errors, _('Please state whether or not the problem has been fixed') unless $c->stash->{been_fixed}; my $ask_ever_reported = $c->cobrand->ask_ever_reported; if ($ask_ever_reported) { push @errors, _('Please say whether you\'ve ever reported a problem to your council before') unless $c->stash->{reported} || $c->stash->{answered_ever_reported}; } push @errors, _('Please indicate whether you\'d like to receive another questionnaire') if ($c->stash->{been_fixed} eq 'No' || $c->stash->{been_fixed} eq 'Unknown') && !$c->stash->{another}; push @errors, _('Please provide some explanation as to why you\'re reopening this report') if $c->stash->{been_fixed} eq 'No' && $problem->state eq 'fixed' && !$c->stash->{update}; if (@errors) { $c->stash->{errors} = [ @errors ]; $c->detach( 'display' ); } # my $fh = $q->upload('photo'); # my $image; # if ($fh) { # my $err = Page::check_photo($q, $fh); # push @errors, $err if $err; # try { # $image = Page::process_photo($fh) unless $err; # } catch Error::Simple with { # my $e = shift; # push(@errors, "That image doesn't appear to have uploaded correctly ($e), please try again."); # }; # } # push @errors, _('Please provide some text as well as a photo') # if $image && !$input{update}; # return display_questionnaire($q, @errors) if @errors; # # my $new_state = ''; # $new_state = 'fixed' if $input{been_fixed} eq 'Yes' && $problem->{state} eq 'confirmed'; # $new_state = 'confirmed' if $input{been_fixed} eq 'No' && $problem->{state} eq 'fixed'; # # # Record state change, if there was one # dbh()->do("update problem set state=?, lastupdate=ms_current_timestamp() # where id=?", {}, $new_state, $problem->{id}) # if $new_state; # # # If it's not fixed and they say it's still not been fixed, record time update # dbh()->do("update problem set lastupdate=ms_current_timestamp() # where id=?", {}, $problem->{id}) # if $input{been_fixed} eq 'No' && $problem->{state} eq 'confirmed'; # # # Record questionnaire response # my $reported = $input{reported} # ? ($input{reported} eq 'Yes' ? 't' : ($input{reported} eq 'No' ? 'f' : undef)) # : undef; # dbh()->do('update questionnaire set whenanswered=ms_current_timestamp(), # ever_reported=?, old_state=?, new_state=? where id=?', {}, # $reported, $problem->{state}, $input{been_fixed} eq 'Unknown' # ? 'unknown' # : ($new_state ? $new_state : $problem->{state}), # $questionnaire->{id}); # # # Record an update if they've given one, or if there's a state change # my $name = $problem->{anonymous} ? undef : $problem->{name}; # my $update = $input{update} ? $input{update} : _('Questionnaire filled in by problem reporter'); # Utils::workaround_pg_bytea("insert into comment # (problem_id, name, email, website, text, state, mark_fixed, mark_open, photo, lang, cobrand, cobrand_data, confirmed) # values (?, ?, ?, '', ?, 'confirmed', ?, ?, ?, ?, ?, ?, ms_current_timestamp())", 7, # $problem->{id}, $name, $problem->{email}, $update, # $new_state eq 'fixed' ? 't' : 'f', $new_state eq 'confirmed' ? 't' : 'f', # $image, $mySociety::Locale::lang, $cobrand, $c->cobrand->extra_data # ) # if $new_state || $input{update}; # # # If they've said they want another questionnaire, mark as such # dbh()->do("update problem set send_questionnaire = 't' where id=?", {}, $problem->{id}) # if ($input{been_fixed} eq 'No' || $input{been_fixed} eq 'Unknown') && $input{another} eq 'Yes'; # dbh()->commit(); # # my $out; # my $message; # my $advert_outcome = 1; # if ($input{been_fixed} eq 'Unknown') { # $message = _(<Thank you very much for filling in our questionnaire; if you # get some more information about the status of your problem, please come back to the # site and leave an update.

# EOF # } elsif ($new_state eq 'confirmed' || (!$new_state && $problem->{state} eq 'confirmed')) { # my $wtt_url = Cobrand::writetothem_url($cobrand, $c->cobrand->extra_data); # $wtt_url = "http://www.writetothem.com" if (! $wtt_url); # $message = sprintf(_(<We're sorry to hear that. We have two suggestions: why not try # writing direct to your councillor(s) # or, if it's a problem that could be fixed by local people working together, # why not make and publicise a pledge? #

# EOF # $advert_outcome = 0; # } else { # $message = _(<Thank you very much for filling in our questionnaire; glad to hear it's been fixed.

# EOF # } # $out = $message; # my $display_advert = Cobrand::allow_crosssell_adverts($cobrand); # if ($display_advert && $advert_outcome) { # $out .= CrossSell::display_advert($q, $problem->{email}, $problem->{name}, # council => $problem->{council}); # } # my %vars = (message => $message); # my $template_page = Page::template_include('questionnaire-completed', $q, Page::template_root($q), %vars); # return $template_page if ($template_page); # return $out; } # Sent here from email token action. Simply load and display questionnaire. sub index : Private { my ( $self, $c ) = @_; $c->forward( 'load_questionnaire' ); $c->forward( 'display' ); } # Displays the questionnaire, either after bad submission or from email token sub display : Private { my ( $self, $c ) = @_; $c->stash->{template} = 'questionnaire/index.html'; my $problem = $c->stash->{questionnaire}->problem; my $problem_text = ''; # Page::display_problem_text($c->fake_q, $problem); # FIXME This needs to be in the template $c->stash->{updates} = ''; # FIXME Should be database ResultSet of problem's pdates $c->stash->{map_start_html} = FixMyStreet::Map::display_map( $c->fake_q, latitude => $problem->latitude, longitude => $problem->longitude, pins => [ [ $problem->latitude, $problem->longitude, $problem->state eq 'fixed' ? 'green' : 'red' ] ], pre => $problem_text, ); $c->stash->{map_js} = FixMyStreet::Map::header_js(); $c->stash->{cobrand_form_elements} = $c->cobrand->form_elements('questionnaireForm'); } =head1 AUTHOR Matthew Somerville =head1 LICENSE Copyright (c) 2011 UK Citizens Online Democracy. All rights reserved. Licensed under the Affero GPL. =cut __PACKAGE__->meta->make_immutable; 1;