10 changed files with 296 additions and 0 deletions
@ -0,0 +1,43 @@
|
||||
class BulkUploadSalesDataCheckController < ApplicationController |
||||
include ActionView::Helpers::TextHelper |
||||
|
||||
before_action :authenticate_user! |
||||
|
||||
def show |
||||
@bulk_upload = current_user.bulk_uploads.find(params[:id]) |
||||
|
||||
render form.view_path |
||||
end |
||||
|
||||
def update |
||||
@bulk_upload = current_user.bulk_uploads.find(params[:id]) |
||||
|
||||
if form.valid? && form.save! |
||||
if params[:page] == "confirm" |
||||
n_logs = pluralize(@bulk_upload.logs.count, "log") |
||||
flash[:notice] = "You’ve successfully uploaded #{n_logs}" |
||||
end |
||||
|
||||
redirect_to form.next_path |
||||
else |
||||
render form.view_path |
||||
end |
||||
end |
||||
|
||||
private |
||||
|
||||
def form |
||||
@form ||= case params[:page] |
||||
when "soft-errors-valid" |
||||
Forms::BulkUploadSalesDataCheck::SoftErrorsValid.new(form_params.merge(bulk_upload: @bulk_upload)) |
||||
when "confirm" |
||||
Forms::BulkUploadSalesDataCheck::Confirm.new(form_params.merge(bulk_upload: @bulk_upload)) |
||||
else |
||||
raise "invalid form" |
||||
end |
||||
end |
||||
|
||||
def form_params |
||||
params.fetch(:form, {}).permit(:soft_errors_valid) |
||||
end |
||||
end |
||||
@ -0,0 +1,30 @@
|
||||
module Forms |
||||
module BulkUploadSalesDataCheck |
||||
class Confirm |
||||
include ActiveModel::Model |
||||
include ActiveModel::Attributes |
||||
include Rails.application.routes.url_helpers |
||||
|
||||
attribute :bulk_upload |
||||
|
||||
def view_path |
||||
"bulk_upload_sales_data_check/confirm" |
||||
end |
||||
|
||||
def back_path |
||||
page_bulk_upload_sales_data_check_path(bulk_upload, page: "soft-errors-valid") |
||||
end |
||||
|
||||
def next_path |
||||
sales_logs_path |
||||
end |
||||
|
||||
def save! |
||||
processor = BulkUpload::Processor.new(bulk_upload:) |
||||
processor.approve_and_confirm_soft_validations |
||||
|
||||
true |
||||
end |
||||
end |
||||
end |
||||
end |
||||
@ -0,0 +1,40 @@
|
||||
module Forms |
||||
module BulkUploadSalesDataCheck |
||||
class SoftErrorsValid |
||||
include ActiveModel::Model |
||||
include ActiveModel::Attributes |
||||
include Rails.application.routes.url_helpers |
||||
|
||||
attribute :bulk_upload |
||||
attribute :soft_errors_valid, :string |
||||
|
||||
validates :soft_errors_valid, presence: true |
||||
|
||||
def options |
||||
[ |
||||
OpenStruct.new(id: "yes", name: "Yes, some of these are errors"), |
||||
OpenStruct.new(id: "no", name: "No, all the data is correct"), |
||||
] |
||||
end |
||||
|
||||
def view_path |
||||
"bulk_upload_sales_data_check/soft_errors_valid" |
||||
end |
||||
|
||||
def next_path |
||||
case soft_errors_valid |
||||
when "yes" |
||||
page_bulk_upload_sales_resume_path(bulk_upload, page: "fix-choice") |
||||
when "no" |
||||
page_bulk_upload_sales_data_check_path(bulk_upload, page: "confirm") |
||||
else |
||||
raise "invalid choice" |
||||
end |
||||
end |
||||
|
||||
def save! |
||||
true |
||||
end |
||||
end |
||||
end |
||||
end |
||||
@ -0,0 +1,22 @@
|
||||
<% content_for :before_content do %> |
||||
<%= govuk_back_link href: @form.back_path %> |
||||
<% end %> |
||||
|
||||
<div class="govuk-grid-row"> |
||||
<div class="govuk-grid-column-two-thirds"> |
||||
<span class="govuk-caption-l">Bulk upload for sales (<%= @bulk_upload.year_combo %>)</span> |
||||
<h1 class="govuk-heading-l">Are you sure you want to upload all logs from this bulk upload?</h1> |
||||
|
||||
<p class="govuk-body">There are <%= pluralize(@bulk_upload.logs.count, "log") %> in this bulk upload, and <%= pluralize(@bulk_upload.bulk_upload_errors.count, "unexpected answer") %> will be marked as correct.</p> |
||||
|
||||
<%= govuk_warning_text(icon_fallback_text: "Danger") do %> |
||||
You can not delete logs once you create them |
||||
<% end %> |
||||
|
||||
<%= form_with model: @form, scope: :form, url: page_bulk_upload_sales_data_check_path(@bulk_upload, page: "confirm"), method: :patch do |f| %> |
||||
<%= f.govuk_submit %> |
||||
|
||||
<%= govuk_button_link_to "Cancel", @form.back_path, secondary: true %> |
||||
<% end %> |
||||
</div> |
||||
</div> |
||||
@ -0,0 +1,24 @@
|
||||
<div class="govuk-grid-row"> |
||||
<div class="govuk-grid-column-two-thirds"> |
||||
<%= form_with model: @form, scope: :form, url: page_bulk_upload_sales_data_check_path(@bulk_upload, page: "soft-errors-valid"), method: :patch do |f| %> |
||||
<%= f.govuk_error_summary %> |
||||
|
||||
<span class="govuk-caption-l">Bulk upload for sales (<%= @bulk_upload.year_combo %>)</span> |
||||
<h1 class="govuk-heading-l">Check these <%= pluralize(@bulk_upload.bulk_upload_errors.count, "answer") %> </h1> |
||||
|
||||
<p class="govuk-body">Some data from your bulk upload might not be right. Check your file for any errors in the fields below.</p> |
||||
|
||||
<div class="govuk-body-l"> |
||||
<%= @bulk_upload.filename %> |
||||
</div> |
||||
|
||||
<%= f.govuk_collection_radio_buttons :soft_errors_valid, |
||||
@form.options, |
||||
:id, |
||||
:name, |
||||
legend: { text: "Are there any errors in these fields?", size: "l" } %> |
||||
|
||||
<%= f.govuk_submit %> |
||||
<% end %> |
||||
</div> |
||||
</div> |
||||
@ -0,0 +1,82 @@
|
||||
require "rails_helper" |
||||
|
||||
RSpec.describe BulkUploadSalesDataCheckController, type: :request do |
||||
let(:user) { create(:user) } |
||||
let(:bulk_upload) { create(:bulk_upload, :sales, user:, bulk_upload_errors:) } |
||||
let(:bulk_upload_errors) { create_list(:bulk_upload_error, 2) } |
||||
|
||||
before do |
||||
create_list(:sales_log, 2, bulk_upload:) |
||||
sign_in user |
||||
end |
||||
|
||||
describe "GET /sales-logs/bulk-upload-data-check/:ID/soft-errors-valid" do |
||||
it "shows the soft validation errors with confirmation question" do |
||||
get "/sales-logs/bulk-upload-data-check/#{bulk_upload.id}/soft-errors-valid" |
||||
|
||||
expect(response.body).to include("Bulk upload for sales") |
||||
expect(response.body).to include("2022/23") |
||||
expect(response.body).to include("Check these 2 answers") |
||||
expect(response.body).to include(bulk_upload.filename) |
||||
expect(response.body).to include("Are there any errors in these fields?") |
||||
end |
||||
end |
||||
|
||||
describe "PATCH /sales-logs/bulk-upload-data-check/:ID/soft-errors-valid" do |
||||
context "when no option selected" do |
||||
it "renders error message" do |
||||
patch "/sales-logs/bulk-upload-data-check/#{bulk_upload.id}/soft-errors-valid" |
||||
|
||||
expect(response).to be_successful |
||||
|
||||
expect(response.body).to include("You must select if there are errors in these fields") |
||||
end |
||||
end |
||||
|
||||
context "when yes is selected" do |
||||
it "sends them to the fix choice page" do |
||||
patch "/sales-logs/bulk-upload-data-check/#{bulk_upload.id}/soft-errors-valid", params: { form: { soft_errors_valid: "yes" } } |
||||
|
||||
expect(response).to redirect_to("/sales-logs/bulk-upload-resume/#{bulk_upload.id}/fix-choice") |
||||
end |
||||
end |
||||
|
||||
context "when no is selected" do |
||||
it "sends them to confirm choice" do |
||||
patch "/sales-logs/bulk-upload-data-check/#{bulk_upload.id}/soft-errors-valid", params: { form: { soft_errors_valid: "no" } } |
||||
|
||||
expect(response).to redirect_to("/sales-logs/bulk-upload-data-check/#{bulk_upload.id}/confirm") |
||||
follow_redirect! |
||||
expect(response.body).not_to include("You’ve successfully uploaded") |
||||
end |
||||
end |
||||
end |
||||
|
||||
describe "GET /sales-logs/bulk-upload-data-check/:ID/confirm" do |
||||
it "renders page" do |
||||
get "/sales-logs/bulk-upload-data-check/#{bulk_upload.id}/confirm" |
||||
|
||||
expect(response).to be_successful |
||||
|
||||
expect(response.body).to include("Are you sure you want to upload all logs from this bulk upload?") |
||||
expect(response.body).to include("There are 2 logs in this bulk upload, and 2 unexpected answers will be marked as correct.") |
||||
expect(response.body).not_to include("You’ve successfully uploaded") |
||||
end |
||||
end |
||||
|
||||
describe "PATCH /sales-logs/bulk-upload-data-check/:ID/confirm" do |
||||
let(:mock_processor) { instance_double(BulkUpload::Processor, approve_and_confirm_soft_validations: nil) } |
||||
|
||||
it "approves logs for creation" do |
||||
allow(BulkUpload::Processor).to receive(:new).with(bulk_upload:).and_return(mock_processor) |
||||
|
||||
patch "/sales-logs/bulk-upload-data-check/#{bulk_upload.id}/confirm" |
||||
|
||||
expect(mock_processor).to have_received(:approve_and_confirm_soft_validations) |
||||
|
||||
expect(response).to redirect_to("/sales-logs") |
||||
follow_redirect! |
||||
expect(response.body).to include("You’ve successfully uploaded 2 logs") |
||||
end |
||||
end |
||||
end |
||||
Loading…
Reference in new issue