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