5 changed files with 531 additions and 37 deletions
@ -0,0 +1,70 @@ |
|||||||
|
class BulkUpload::Sales::LogCreator |
||||||
|
attr_reader :bulk_upload, :path |
||||||
|
|
||||||
|
def initialize(bulk_upload:, path:) |
||||||
|
@bulk_upload = bulk_upload |
||||||
|
@path = path |
||||||
|
end |
||||||
|
|
||||||
|
def call |
||||||
|
row_parsers.each do |row_parser| |
||||||
|
row_parser.valid? |
||||||
|
|
||||||
|
next if row_parser.blank_row? |
||||||
|
|
||||||
|
row_parser.log.blank_invalid_non_setup_fields! |
||||||
|
row_parser.log.bulk_upload = bulk_upload |
||||||
|
row_parser.log.skip_update_status = true |
||||||
|
row_parser.log.status = "pending" |
||||||
|
|
||||||
|
row_parser.log.status_cache = row_parser.log.calculate_status |
||||||
|
|
||||||
|
begin |
||||||
|
row_parser.log.save! |
||||||
|
rescue StandardError => e |
||||||
|
Sentry.capture_exception(e) |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
private |
||||||
|
|
||||||
|
def csv_parser |
||||||
|
@csv_parser ||= case bulk_upload.year |
||||||
|
when 2022 |
||||||
|
BulkUpload::Sales::Year2022::CsvParser.new(path:) |
||||||
|
when 2023 |
||||||
|
BulkUpload::Sales::Year2023::CsvParser.new(path:) |
||||||
|
else |
||||||
|
raise "csv parser not found" |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
def row_offset |
||||||
|
csv_parser.row_offset |
||||||
|
end |
||||||
|
|
||||||
|
def col_offset |
||||||
|
csv_parser.col_offset |
||||||
|
end |
||||||
|
|
||||||
|
def row_parsers |
||||||
|
return @row_parsers if @row_parsers |
||||||
|
|
||||||
|
@row_parsers = csv_parser.row_parsers |
||||||
|
|
||||||
|
@row_parsers.each do |row_parser| |
||||||
|
row_parser.bulk_upload = bulk_upload |
||||||
|
end |
||||||
|
|
||||||
|
@row_parsers |
||||||
|
end |
||||||
|
|
||||||
|
def body_rows |
||||||
|
csv_parser.body_rows |
||||||
|
end |
||||||
|
|
||||||
|
def rows |
||||||
|
csv_parser.rows |
||||||
|
end |
||||||
|
end |
||||||
@ -0,0 +1,99 @@ |
|||||||
|
require "rails_helper" |
||||||
|
|
||||||
|
RSpec.describe BulkUpload::Sales::LogCreator do |
||||||
|
subject(:service) { described_class.new(bulk_upload:, path:) } |
||||||
|
|
||||||
|
let(:owning_org) { create(:organisation, old_visible_id: 123) } |
||||||
|
let(:user) { create(:user, organisation: owning_org) } |
||||||
|
|
||||||
|
let(:bulk_upload) { create(:bulk_upload, :sales, user:) } |
||||||
|
let(:path) { file_fixture("2022_23_sales_bulk_upload.csv") } |
||||||
|
|
||||||
|
describe "#call" do |
||||||
|
context "when a valid csv with new log" do |
||||||
|
it "creates a new log" do |
||||||
|
expect { service.call }.to change(SalesLog, :count) |
||||||
|
end |
||||||
|
|
||||||
|
it "create a log with pending status" do |
||||||
|
service.call |
||||||
|
expect(SalesLog.last.status).to eql("pending") |
||||||
|
end |
||||||
|
|
||||||
|
it "associates log with bulk upload" do |
||||||
|
service.call |
||||||
|
|
||||||
|
log = SalesLog.last |
||||||
|
expect(log.bulk_upload).to eql(bulk_upload) |
||||||
|
expect(bulk_upload.sales_logs).to include(log) |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
context "when a valid csv with several blank rows" do |
||||||
|
let(:file) { Tempfile.new } |
||||||
|
let(:path) { file.path } |
||||||
|
let(:log) { SalesLog.new } |
||||||
|
|
||||||
|
before do |
||||||
|
file.write(BulkUpload::LogToCsv.new(log:, col_offset: 0).to_2022_sales_csv_row) |
||||||
|
file.write(BulkUpload::LogToCsv.new(log:, col_offset: 0).to_2022_sales_csv_row) |
||||||
|
file.write(BulkUpload::LogToCsv.new(log:, col_offset: 0).to_2022_sales_csv_row) |
||||||
|
file.rewind |
||||||
|
end |
||||||
|
|
||||||
|
it "ignores them and does not create the logs" do |
||||||
|
expect { service.call }.not_to change(SalesLog, :count) |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
context "when a valid csv with row with one invalid non setup field" do |
||||||
|
let(:file) { Tempfile.new } |
||||||
|
let(:path) { file.path } |
||||||
|
let(:log) do |
||||||
|
build( |
||||||
|
:sales_log, |
||||||
|
:completed, |
||||||
|
age1: 5, |
||||||
|
owning_organisation: owning_org, |
||||||
|
) |
||||||
|
end |
||||||
|
|
||||||
|
before do |
||||||
|
file.write(BulkUpload::LogToCsv.new(log:, col_offset: 0).to_2022_sales_csv_row) |
||||||
|
file.rewind |
||||||
|
end |
||||||
|
|
||||||
|
it "creates the log" do |
||||||
|
expect { service.call }.to change(SalesLog, :count).by(1) |
||||||
|
end |
||||||
|
|
||||||
|
it "blanks invalid field" do |
||||||
|
service.call |
||||||
|
|
||||||
|
record = SalesLog.last |
||||||
|
expect(record.age1).to be_blank |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
context "when pre-creating logs" do |
||||||
|
subject(:service) { described_class.new(bulk_upload:, path:) } |
||||||
|
|
||||||
|
it "creates a new log" do |
||||||
|
expect { service.call }.to change(SalesLog, :count) |
||||||
|
end |
||||||
|
|
||||||
|
it "creates a log with correct states" do |
||||||
|
service.call |
||||||
|
|
||||||
|
last_log = SalesLog.last |
||||||
|
|
||||||
|
expect(last_log.status).to eql("pending") |
||||||
|
expect(last_log.status_cache).to eql("completed") |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
context "when valid csv with existing log" do |
||||||
|
xit "what should happen?" |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
Loading…
Reference in new issue