Bankerweiterung - Zwischenstand, erster Entwurf
[kivitendo-erp.git] / SL / Controller / CsvImport / BankTransaction.pm
1 package SL::Controller::CsvImport::BankTransaction;
2
3 use strict;
4
5 use SL::Helper::Csv;
6 use SL::Controller::CsvImport::Helper::Consistency;
7 use SL::DB::BankTransaction;
8
9 use Data::Dumper;
10
11 use parent qw(SL::Controller::CsvImport::Base);
12
13 use Rose::Object::MakeMethods::Generic
14 (
15  'scalar --get_set_init' => [ qw(table bank_accounts_by) ],
16 );
17
18 sub init_class {
19   my ($self) = @_;
20   $self->class('SL::DB::BankTransaction');
21 }
22
23 sub init_bank_accounts_by {
24   my ($self) = @_;
25
26   return { map { my $col = $_; ( $col => { map { ( $_->$col => $_ ) } @{ $self->all_bank_accounts } } ) } qw(id account_number) };
27 }
28
29 sub check_objects {
30   my ($self) = @_;
31
32   $self->controller->track_progress(phase => 'building data', progress => 0);
33
34   my $i;
35   my $num_data = scalar @{ $self->controller->data };
36   foreach my $entry (@{ $self->controller->data }) {
37     $self->controller->track_progress(progress => $i/$num_data * 100) if $i % 100 == 0;
38
39     $self->check_bank_account($entry);
40     $self->check_currency($entry, take_default => 1);
41
42     $self->join_purposes($entry);
43     #TODO: adde checks für die Variablen
44   } continue {
45     $i++;
46   }
47
48   $self->add_cvar_raw_data_columns;
49 }
50
51 sub setup_displayable_columns {
52   my ($self) = @_;
53
54   $self->SUPER::setup_displayable_columns;
55
56   $self->add_displayable_columns({ name => 'transaction_id',   description => $::locale->text('Transaction ID') },
57                                  { name => 'local_bank_code',   description => $::locale->text('Own bank code') },
58                                  { name => 'local_account_number',   description => $::locale->text('Own bank account number') },
59                                  { name => 'local_bank_account_id',   description => $::locale->text('ID of own bank account') },
60                                  { name => 'remote_bank_code',   description => $::locale->text('Bank code of the goal/source') },
61                                  { name => 'remote_account_number',   description => $::locale->text('Account number of the goal/source') },
62                                  { name => 'transdate',   description => $::locale->text('Date of transaction') },
63                                  { name => 'valutadate',   description => $::locale->text('Valuta') },
64                                  { name => 'amount',   description => $::locale->text('Amount') },
65                                  { name => 'currency',   description => $::locale->text('Currency') },
66                                  { name => 'currency_id',       description => $::locale->text('Currency (database ID)')          },
67                                  { name => 'remote_name',   description => $::locale->text('Name of the goal/source') },
68                                  { name => 'remote_name_1',   description => $::locale->text('Name of the goal/source') },
69                                  { name => 'purpose',   description => $::locale->text('Purpose') },
70                                 );
71 }
72
73 sub check_bank_account {
74   my ($self, $entry) = @_;
75
76   my $object = $entry->{object};
77
78   # Check whether or not local_bank_account ID is valid.
79   if ($object->local_bank_account_id && !$self->bank_accounts_by->{id}->{ $object->local_bank_account_id }) {
80     push @{ $entry->{errors} }, $::locale->text('Error: Invalid local bank account');
81     return 0;
82   }
83
84   # Check whether or not local_bank_account ID, local_account_number and local_bank_code are consistent.
85   if ($object->local_bank_account_id && $entry->{raw_data}->{local_account_number}) {
86     my $bank_account = $self->bank_accounts_by->{id}->{ $object->local_bank_account_id };
87     if ($bank_account->account_number ne $entry->{raw_data}->{local_account_number}) {
88       push @{ $entry->{errors} }, $::locale->text('Error: Invalid local bank account');
89       return 0;
90     }
91     if ($entry->{raw_data}->{local_bank_code} && $entry->{raw_data}->{local_bank_code} ne $bank_account->bank_code) {
92       push @{ $entry->{errors} }, $::locale->text('Error: Invalid local bank account');
93       return 0;
94     }
95
96   }
97
98   # Map account information to ID if given.
99   if (!$object->local_bank_account_id && $entry->{raw_data}->{local_account_number}) {
100     my $bank_account = $self->bank_accounts_by->{account_number}->{ $entry->{raw_data}->{local_account_number} };
101     if (!$bank_account) {
102       push @{ $entry->{errors} }, $::locale->text('Error: Invalid local bank account');
103       return 0;
104     }
105     if ($entry->{raw_data}->{local_bank_code} && $entry->{raw_data}->{local_bank_code} ne $bank_account->bank_code) {
106       push @{ $entry->{errors} }, $::locale->text('Error: Invalid local bank account');
107       return 0;
108     }
109
110     $object->local_bank_account_id($bank_account->id);
111   }
112
113   return $object->local_bank_account_id ? 1 : 0;
114 }
115
116 sub join_purposes {
117   my ($self, $entry) = @_;
118
119   my $object = $entry->{object};
120
121   my $purpose = join('', $entry->{raw_data}->{purpose},
122                         $entry->{raw_data}->{purpose1},
123                         $entry->{raw_data}->{purpose2},
124                         $entry->{raw_data}->{purpose3},
125                         $entry->{raw_data}->{purpose4},
126                         $entry->{raw_data}->{purpose5},
127                         $entry->{raw_data}->{purpose6},
128                         $entry->{raw_data}->{purpose7},
129                         $entry->{raw_data}->{purpose8},
130                         $entry->{raw_data}->{purpose9},
131                         $entry->{raw_data}->{purpose10},
132                         $entry->{raw_data}->{purpose11} );
133   $object->purpose($purpose);
134 }
135
136 1;