epic-s6ts
[kivitendo-erp.git] / SL / BackgroundJob / CsvImport.pm
1 package SL::BackgroundJob::CsvImport;
2
3 use strict;
4
5 use parent qw(SL::BackgroundJob::Base);
6
7 use SL::JSON;
8 use SL::YAML;
9 use SL::DB::CsvImportProfile;
10
11 sub create_job {
12   my ($self_or_class, %params) = @_;
13
14   my $package       = ref($self_or_class) || $self_or_class;
15   $package          =~ s/SL::BackgroundJob:://;
16
17   my %data = (
18     %params,
19     session_id => $::auth->get_session_id,
20   );
21
22   my $job = SL::DB::BackgroundJob->new(
23     type         => 'once',
24     active       => 1,
25     package_name => $package,
26     data         => SL::YAML::Dump(\%data),
27   );
28
29   return $job;
30 }
31
32 sub profile {
33   my ($self) = @_;
34
35   if (!$self->{profile}) {
36     my $data = SL::YAML::Load($self->{db_obj}->data);
37     $self->{profile} = SL::DB::Manager::CsvImportProfile->find_by(id => $data->{profile_id});
38   }
39
40   return $self->{profile};
41 }
42
43 sub run {
44   my $self        = shift;
45   $self->{db_obj} = shift;
46
47   $self->do_import;
48 }
49
50 sub do_import {
51   my ($self) = @_;
52
53   require SL::Controller::CsvImport;
54   my $c = SL::Controller::CsvImport->new;
55   my $job = $self->{db_obj};
56
57   $c->profile($self->profile);
58   $c->mappings(SL::JSON::from_json($self->profile->get('json_mappings'))) if $self->profile->get('json_mappings');
59   $c->type($job->data_as_hash->{type});
60   $c->{employee_id} = $job->data_as_hash->{employee_id};
61
62   my $test = $job->data_as_hash->{test};
63
64
65   # $::locale->text('parsing csv')
66   # $::locale->text('building data')
67   # $::locale->text('saving data')
68   # $::locale->text('building report')
69   $self->track_progress(
70     progress => 0,
71     plan => {
72       'parsing csv'     => 1,
73       'building data'   => 2,
74     ( 'saving data'     => 3, )x!$test,
75       'building report' => ($test ? 3 : 4),
76     },
77     num_phases => ($test ? 3 : 4),
78   );
79   $c->add_progress_tracker($self);
80
81   my $session_id = $job->data_as_hash->{session_id};
82
83   $c->test_and_import(test => $test, session_id => $session_id);
84   my $result;
85   if ($c->errors) {
86     $job->set_data(
87       errors   => $c->errors,
88     )->save;
89     $result = $::locale->text('Import finished with errors.');
90   } else {
91
92     my $report_id = $c->save_report(session_id => $session_id, test => $test);
93     $job->set_data(report_id => $report_id)->save;
94
95     $c->track_progress(finished => 1);
96     $result = $::locale->text('Import finished without errors.');
97   }
98
99   return $result;
100 }
101
102 sub track_progress {
103   my ($self, %params) = @_;
104
105   my $data = $self->{db_obj}->data_as_hash;
106   my $progress = $data->{progress} || {};
107
108   $progress->{$_} = $params{$_} for keys %params;
109   $self->{db_obj}->set_data(progress => $progress);
110   $self->{db_obj}->save;
111 }
112
113 1;
114
115 __END__
116
117 =encoding utf-8
118
119 =head1 NAME
120
121 SL::Background::CsvImport - backend for automatic imports of csv data
122
123 =head1 SYNOPSIS
124
125
126 use SL::BackgroundJob::CsvImport;
127
128
129 From a controller or external source:
130
131   my $job = SL::BackgroundJob::CsvImport->create_job(
132     file => $file,
133     %import_options
134   );
135
136 =head1 DESCRIPTION
137
138 =head1 FUNCTIONS
139
140 =head1 BUGS
141
142 =head1 AUTHOR
143
144 Sven Schoeling E<lt>s.schoeling@linet-services.deE<gt>
145
146 =cut