Sammelcommit Bankerweiterung und Skonto
[kivitendo-erp.git] / SL / DB / CsvImportProfile.pm
1 package SL::DB::CsvImportProfile;
2
3 use strict;
4
5 use List::Util qw(first);
6
7 require SL::DB::MetaSetup::CsvImportProfile;
8 use Rose::DB::Object::Helpers qw(clone_and_reset);
9
10 __PACKAGE__->meta->add_relationship(
11   settings => {
12     type       => 'one to many',
13     class      => 'SL::DB::CsvImportProfileSetting',
14     column_map => { id      => 'csv_import_profile_id' },
15   },
16 );
17
18 __PACKAGE__->meta->initialize;
19
20 __PACKAGE__->meta->make_manager_class;
21
22 __PACKAGE__->before_save('_before_save_unset_default_on_others');
23
24 #
25 # public functions
26 #
27
28 sub new_with_default {
29   my ($class, $type) = @_;
30
31   return $class->new(type => $type)->set_defaults;
32 }
33
34 sub set_defaults {
35   my ($self) = @_;
36
37
38   if ($self->type eq 'parts') {
39     my $bugru = SL::DB::Manager::Buchungsgruppe->find_by(description => { like => 'Standard%19%' });
40
41     $self->_set_defaults(sellprice_places          => 2,
42                          sellprice_adjustment      => 0,
43                          sellprice_adjustment_type => 'percent',
44                          article_number_policy     => 'update_prices',
45                          shoparticle_if_missing    => '0',
46                          parts_type                => 'part',
47                          default_buchungsgruppe    => ($bugru ? $bugru->id : undef),
48                          apply_buchungsgruppe      => 'all',
49                         );
50   } elsif ($self->type eq 'orders') {
51     $self->_set_defaults(order_column    => $::locale->text('Order'),
52                          item_column     => $::locale->text('OrderItem'),
53                          max_amount_diff => 0.02,
54                         );
55   } elsif ($self->type eq 'mt940') {
56     $self->_set_defaults(charset       => 'UTF8',
57                          sep_char      => ';',
58                          numberformat  => '1000.00',
59                          update_policy => 'skip',
60                         );
61   } elsif ($self->type eq 'bank_transactions') {
62     $self->_set_defaults(charset       => 'UTF8',
63                          update_policy => 'skip',
64                         );
65   } else {
66     $self->_set_defaults(table => 'customer');
67   }
68
69   # TODO: move the defaults into their own controller
70   # defaults can only be set once, so use these values as default if they
71   # haven't already been set above for one of the special import types
72   # If the values have been set above they won't be overwritten here:
73
74   $self->_set_defaults(sep_char     => ',',
75                        quote_char   => '"',
76                        escape_char  => '"',
77                        charset      => 'CP850',
78                        numberformat => $::myconfig{numberformat},
79                        duplicates   => 'no_check',
80                       );
81
82   return $self;
83 }
84
85 sub set {
86   my ($self, %params) = @_;
87
88   while (my ($key, $value) = each %params) {
89     my $setting = $self->_get_setting($key);
90
91     if (!$setting) {
92       $setting = SL::DB::CsvImportProfileSetting->new(key => $key);
93       $self->settings(@{ $self->settings || [] }, $setting);
94     }
95
96     $setting->value($value);
97   }
98
99   return $self;
100 }
101
102 sub get {
103   my ($self, $key, $default) = @_;
104
105   my $setting = $self->_get_setting($key);
106   return $setting ? $setting->value : $default;
107 }
108
109 sub _set_defaults {
110   my ($self, %params) = @_;
111
112   while (my ($key, $value) = each %params) {
113     $self->settings(@{ $self->settings || [] }, { key => $key, value => $value }) if !$self->_get_setting($key);
114   }
115
116   return $self;
117 }
118
119 sub clone_and_reset_deep {
120   my ($self) = @_;
121
122   my $clone = $self->clone_and_reset;
123   $clone->settings(map { $_->clone_and_reset } $self->settings);
124   $clone->name('');
125
126   return $clone;
127 }
128
129 sub flatten {
130   my ($self) = @_;
131
132   return map {
133     $_->key => $_->value
134   } $self->settings;
135 }
136
137 #
138 # hooks
139 #
140
141 sub _before_save_unset_default_on_others {
142   my ($self) = @_;
143
144   if ($self->is_default) {
145     SL::DB::Manager::CsvImportProfile->update_all(set   => { is_default => 0 },
146                                                   where => [ type       => $self->type,
147                                                              '!id'      => $self->id ]);
148   }
149
150   return 1;
151 }
152
153 #
154 # helper functions
155 #
156
157 sub _get_setting {
158   my ($self, $key) = @_;
159   return first { $_->key eq $key } @{ $self->settings || [] };
160 }
161
162 1;