diff options
author | Matthew Somerville <matthew@mysociety.org> | 2020-06-29 16:08:54 +0100 |
---|---|---|
committer | M Somerville <matthew-github@dracos.co.uk> | 2020-11-11 10:29:19 +0000 |
commit | 613f45c6514ace275b3a49a5d50f7b83ed536b5f (patch) | |
tree | c447d16e87af6d74c078bf04c72aa31c64e7fe4d | |
parent | dbde76a5090e772c806bd189426ee078b9b7e4ba (diff) |
[Bromley] Add general enquiries.
This adds general enquiries to the reporting flow.
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Waste.pm | 72 | ||||
-rw-r--r-- | perllib/FixMyStreet/App/Form/Waste/Enquiry.pm | 48 | ||||
-rw-r--r-- | t/app/controller/waste.t | 25 | ||||
-rw-r--r-- | templates/web/base/waste/enquiry.html | 33 | ||||
-rw-r--r-- | templates/web/base/waste/summary_enquiry.html | 19 | ||||
-rw-r--r-- | templates/web/bromley/waste/enquiry-problem.html | 13 | ||||
-rw-r--r-- | templates/web/bromley/waste/services.html | 6 |
7 files changed, 216 insertions, 0 deletions
diff --git a/perllib/FixMyStreet/App/Controller/Waste.pm b/perllib/FixMyStreet/App/Controller/Waste.pm index 667edad10..a31c359f1 100644 --- a/perllib/FixMyStreet/App/Controller/Waste.pm +++ b/perllib/FixMyStreet/App/Controller/Waste.pm @@ -10,6 +10,7 @@ use FixMyStreet::App::Form::Waste::UPRN; use FixMyStreet::App::Form::Waste::AboutYou; use FixMyStreet::App::Form::Waste::Request; use FixMyStreet::App::Form::Waste::Report; +use FixMyStreet::App::Form::Waste::Enquiry; sub auto : Private { my ( $self, $c ) = @_; @@ -226,6 +227,77 @@ sub process_report_data : Private { return 1; } +sub enquiry : Chained('uprn') : Args(0) { + my ($self, $c) = @_; + + if (my $template = $c->get_param('template')) { + $c->stash->{template} = "waste/enquiry-$template.html"; + $c->detach; + } + + $c->forward('setup_categories_and_bodies'); + + my $category = $c->get_param('category'); + my $service = $c->get_param('service_id'); + if (!$category || !$service || !$c->stash->{services}{$service}) { + $c->res->redirect('/waste/uprn/' . $c->stash->{uprn}); + $c->detach; + } + my ($contact) = grep { $_->category eq $category } @{$c->stash->{contacts}}; + if (!$contact) { + $c->res->redirect('/waste/uprn/' . $c->stash->{uprn}); + $c->detach; + } + + my $field_list = []; + foreach (@{$contact->get_metadata_for_input}) { + next if $_->{code} eq 'service_id' || $_->{code} eq 'uprn'; + my $type = 'Text'; + $type = 'TextArea' if 'text' eq ($_->{datatype} || ''); + my $required = $_->{required} eq 'true' ? 1 : 0; + push @$field_list, "extra_$_->{code}" => { + type => $type, label => $_->{description}, required => $required + }; + } + + $c->stash->{first_page} = 'enquiry'; + $c->stash->{form_class} = 'FixMyStreet::App::Form::Waste::Enquiry'; + $c->stash->{page_list} = [ + enquiry => { + fields => [ 'category', 'service_id', grep { ! ref $_ } @$field_list, 'continue' ], + title => $category, + next => 'about_you', + update_field_list => sub { + my $form = shift; + my $c = $form->c; + return { + category => { default => $c->get_param('category') }, + service_id => { default => $c->get_param('service_id') }, + } + } + }, + ]; + $c->stash->{field_list} = $field_list; + $c->forward('form'); +} + +sub process_enquiry_data : Private { + my ($self, $c, $form) = @_; + my $data = $form->saved_data; + my $address = $c->stash->{property}->{address}; + $data->{title} = $data->{category}; + $data->{detail} = "$data->{category}\n\n$address"; + # Read extra details in loop + foreach (grep { /^extra_/ } keys %$data) { + my ($id) = /^extra_(.*)/; + $c->set_param($id, $data->{$_}); + } + $c->set_param('service_id', $data->{service_id}); + $c->forward('add_report', [ $data ]) or return; + push @{$c->stash->{report_ids}}, $c->stash->{report}->id; + return 1; +} + sub load_form { my ($c, $previous_form) = @_; diff --git a/perllib/FixMyStreet/App/Form/Waste/Enquiry.pm b/perllib/FixMyStreet/App/Form/Waste/Enquiry.pm new file mode 100644 index 000000000..fa85d5d4c --- /dev/null +++ b/perllib/FixMyStreet/App/Form/Waste/Enquiry.pm @@ -0,0 +1,48 @@ +package FixMyStreet::App::Form::Waste::Enquiry; + +use utf8; +use HTML::FormHandler::Moose; +extends 'FixMyStreet::App::Form::Waste'; + +# First page has dynamic fields, so is set in code + +has_field category => ( type => 'Hidden' ); +has_field service_id => ( type => 'Hidden' ); + +has_page about_you => ( + fields => ['name', 'phone', 'email', 'continue'], + title => 'About you', + next => 'summary', +); + +with 'FixMyStreet::App::Form::Waste::AboutYou'; + +has_page summary => ( + fields => ['submit'], + title => 'Submit missed collection', + template => 'waste/summary_enquiry.html', + finished => sub { + return $_[0]->wizard_finished('process_enquiry_data'); + }, + next => 'done', +); + +has_page done => ( + title => 'Enquiry sent', + template => 'waste/confirmation.html', +); + +has_field continue => ( + type => 'Submit', + value => 'Continue', + element_attr => { class => 'govuk-button' }, + order => 999 +); + +has_field submit => ( + type => 'Submit', + value => 'Submit', + element_attr => { class => 'govuk-button' } +); + +1; diff --git a/t/app/controller/waste.t b/t/app/controller/waste.t index 454a593a6..bbd0cd00a 100644 --- a/t/app/controller/waste.t +++ b/t/app/controller/waste.t @@ -29,6 +29,8 @@ create_contact({ category => 'Request new container', email => 'request' }, { code => 'Quantity', required => 1, automated => 'hidden_field' }, { code => 'Container_Type', required => 1, automated => 'hidden_field' }, ); +create_contact({ category => 'General enquiry', email => 'general' }, + { code => 'Notes', description => 'Notes', required => 1, datatype => 'text' }); FixMyStreet::override_config { ALLOWED_COBRANDS => ['bromley', 'fixmystreet'], @@ -106,6 +108,29 @@ FixMyStreet::override_config { is $report->get_extra_field_value('Quantity'), 2; is $report->get_extra_field_value('Container_Type'), 1; }; + subtest 'General enquiry, bad data' => sub { + $mech->get_ok('/waste/uprn/1000000002/enquiry'); + is $mech->uri->path, '/waste/uprn/1000000002'; + $mech->get_ok('/waste/uprn/1000000002/enquiry?category=Bad'); + is $mech->uri->path, '/waste/uprn/1000000002'; + $mech->get_ok('/waste/uprn/1000000002/enquiry?service=1'); + is $mech->uri->path, '/waste/uprn/1000000002'; + }; + subtest 'General enquiry, on behalf of someone else' => sub { + $mech->log_in_ok($staff_user->email); + $mech->get_ok('/waste/uprn/1000000002/enquiry?category=General+enquiry&service_id=537'); + $mech->submit_form_ok({ with_fields => { extra_Notes => 'Some notes' } }); + $mech->submit_form_ok({ with_fields => { name => "Test McTest", email => $user->email } }); + $mech->content_contains('Some notes'); + $mech->content_contains('Test McTest'); + $mech->content_contains($user->email); + $mech->submit_form_ok({ with_fields => { process => 'summary' } }); + $mech->content_contains('Your enquiry has been sent'); + my $report = FixMyStreet::DB->resultset("Problem")->search(undef, { order_by => { -desc => 'id' } })->first; + is $report->get_extra_field_value('Notes'), 'Some notes'; + is $report->user->email, $user->email; + is $report->get_extra_metadata('contributed_by'), $staff_user->id; + }; }; package SOAP::Result; diff --git a/templates/web/base/waste/enquiry.html b/templates/web/base/waste/enquiry.html new file mode 100644 index 000000000..8993b0fd8 --- /dev/null +++ b/templates/web/base/waste/enquiry.html @@ -0,0 +1,33 @@ +[% SET bodyclass = 'waste' %] +[% INCLUDE header.html %] + +[% PROCESS 'waste/govuk/fields.html' %] +[% PROCESS title %] +[% SET service_id = c.req.params.service_id %] + +<dl class="waste__address"> + <dt class="waste__address__title">Address</dt> + <dd class="waste__address__property">[% property.address %]</dd> +</dl> + +<dl class="waste__address"> + <dt class="waste__address__title">Service</dt> + <dd class="waste__address__property">[% services.$service_id.service_name %]</dd> +</dl> + +<form method="get" action="[% c.uri_for_action('waste/enquiry', [ uprn ]) %]"> + <div class="govuk-form-group"> + [% PROCESS radio field = { + id = 'category', + html_name = 'category', + label = 'Category', + options = field_options + } + %] + </div> + <div class="govuk-form-group"><input type="submit" value="Continue" class="govuk-button"></div> + + <input type="hidden" name="service_id" value="[% service_id %]"> +</form> + +[% INCLUDE footer.html %] diff --git a/templates/web/base/waste/summary_enquiry.html b/templates/web/base/waste/summary_enquiry.html new file mode 100644 index 000000000..8e5967a3b --- /dev/null +++ b/templates/web/base/waste/summary_enquiry.html @@ -0,0 +1,19 @@ +[% +title = 'Submit enquiry'; +thing = 'enquiry'; +summary_title = data.category; +step1 = 'enquiry'; +%] + +[% BLOCK answers %] + [% FOR extra IN data.keys.grep('^extra_') %] + [% NEXT UNLESS data.$extra %] + [% SET extra_name = extra.replace('extra_', '') %] + <div class="govuk-summary-list__row"> + <dt class="govuk-summary-list__key govuk-summary-list__key--sub">[% extra_name | title %]</dt> + <dd class="govuk-summary-list__value">[% data.$extra %]</dd> + </div> + [% END %] +[% END %] + +[% PROCESS waste/summary.html %] diff --git a/templates/web/bromley/waste/enquiry-problem.html b/templates/web/bromley/waste/enquiry-problem.html new file mode 100644 index 000000000..948cb91f3 --- /dev/null +++ b/templates/web/bromley/waste/enquiry-problem.html @@ -0,0 +1,13 @@ +[% PROCESS waste/enquiry.html + title = 'Report a problem' + field_options = [ + { value = 'Gate not closed', label = 'A gate or enclosure wasn’t closed after the collection' }, + { value = 'Waste spillage', label = 'Bin contents were spilled during the collection' }, + { value = 'Bin not returned', label = 'A bin wasn’t returned after the collection' }, + { value = 'Crew behaviour', label = 'There was a problem with the crew’s behaviour' }, + { value = 'Wrongful removal', label = 'Something was wrongly removed during the collection' }, + { value = 'Damage to 3rd party', label = 'Someone else’s vehicle was damaged' }, + { value = 'Damage to Property', label = 'My property was damaged' }, + { value = 'Failure to deliver bin', label = 'My bin was not delivered' }, + ] +%] diff --git a/templates/web/bromley/waste/services.html b/templates/web/bromley/waste/services.html index 2f683ab2f..2caf41738 100644 --- a/templates/web/bromley/waste/services.html +++ b/templates/web/bromley/waste/services.html @@ -4,6 +4,7 @@ <input type="hidden" name="service-[% unit.service_id %]" value="1"> <input type="submit" value="Report a [% unit.service_name FILTER lower %] collection as missed" class="waste-service-descriptor waste-service-link"> </form> + <a href="[% c.uri_for_action('waste/enquiry', [ uprn ]) %]?template=problem&service_id=[% unit.service_id %]" class="waste-service-link waste-service-descriptor">Report a problem with a [% unit.service_name FILTER lower %] collection</a> [% IF unit.request_allowed %] [% any_request_allowed = 1 %] <form method="post" action="[% c.uri_for_action('waste/request', [ uprn ]) %]"> @@ -12,3 +13,8 @@ <input type="submit" value="Request a new [% unit.service_name FILTER lower %] container" class="waste-service-descriptor waste-service-link"> </form> [% END %] + <form method="get" action="[% c.uri_for_action('waste/enquiry', [ uprn ]) %]"> + <input type="hidden" name="service_id" value="[% unit.service_id %]"> + <input type="hidden" name="category" id="category" value="General Enquiry"> + <input type="submit" value="Contact us about a [% unit.service_name FILTER lower %] collection" class="waste-service-descriptor waste-service-link"> + </form> |