+sub save_report {
+ my ($self, $report_id) = @_;
+
+ $self->track_progress(phase => 'building report', progress => 0);
+
+ my $clone_profile = $self->profile->clone_and_reset_deep;
+ $clone_profile->save; # weird bug. if this isn't saved before adding it to the report, it will default back to the last profile.
+
+ my $report = SL::DB::CsvImportReport->new(
+ session_id => $::auth->create_or_refresh_session,
+ profile => $clone_profile,
+ type => $self->type,
+ file => '',
+ )->save(cascade => 1);
+
+ my $dbh = $::form->get_standard_dbh;
+ $dbh->begin_work;
+
+ my $query = 'INSERT INTO csv_import_report_rows (csv_import_report_id, col, row, value) VALUES (?, ?, ?, ?)';
+ my $query2 = 'INSERT INTO csv_import_report_status (csv_import_report_id, row, type, value) VALUES (?, ?, ?, ?)';
+
+ my $sth = $dbh->prepare($query);
+ my $sth2 = $dbh->prepare($query2);
+
+ # save headers
+ my (@headers, @info_methods, @raw_methods, @methods);
+
+ for my $i (0 .. $#{ $self->info_headers->{headers} }) {
+ next unless $self->info_headers->{used}->{ $self->info_headers->{headers}->[$i] };
+ push @headers, $self->info_headers->{headers}->[$i];
+ push @info_methods, $self->info_headers->{methods}->[$i];
+ }
+ for my $i (0 .. $#{ $self->headers->{headers} }) {
+ next unless $self->headers->{used}->{ $self->headers->{headers}->[$i] };
+ push @headers, $self->headers->{headers}->[$i];
+ push @methods, $self->headers->{methods}->[$i];
+ }
+ for my $i (0 .. $#{ $self->raw_data_headers->{headers} }) {
+ next unless $self->raw_data_headers->{used}->{ $self->raw_data_headers->{headers}->[$i] };
+ push @headers, $self->raw_data_headers->{headers}->[$i];
+ push @raw_methods, $self->raw_data_headers->{headers}->[$i];
+ }
+
+ $::lxdebug->dump(0, "methods",
+ [ \@info_methods,
+ \@methods,
+ \@raw_methods ]
+ );
+
+ $sth->execute($report->id, $_, 0, $headers[$_]) for 0 .. $#headers;
+
+ # col offsets
+ my $o1 = @info_methods;
+ my $o2 = $o1 + @methods;
+
+ for my $row (0 .. $#{ $self->data }) {
+ $self->track_progress(progress => $row / @{ $self->data } * 100) if $row % 100 == 0;
+ my $data_row = $self->{data}[$row];
+
+ $sth->execute($report->id, $_, $row + 1, $data_row->{info_data}{ $info_methods[$_] }) for 0 .. $#info_methods;
+ $sth->execute($report->id, $o1 + $_, $row + 1, $data_row->{object}->${ \ $methods[$_] }) for 0 .. $#methods;
+ $sth->execute($report->id, $o2 + $_, $row + 1, $data_row->{raw_data}{ $raw_methods[$_] }) for 0 .. $#raw_methods;
+
+ $sth2->execute($report->id, $row + 1, 'information', $_) for @{ $data_row->{information} || [] };
+ $sth2->execute($report->id, $row + 1, 'errors', $_) for @{ $data_row->{errors} || [] };
+ }
+
+ $dbh->commit;
+
+ return $report->id;
+}
+