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