1902a51ec4ca5cba76eee76cb25a9b4289db19d0
[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   $self->_set_defaults(sep_char     => ',',
38                        quote_char   => '"',
39                        escape_char  => '"',
40                        charset      => 'CP850',
41                        numberformat => $::myconfig{numberformat},
42                        duplicates   => 'no_check',
43                       );
44
45   if ($self->type eq 'parts') {
46     my $bugru = SL::DB::Manager::Buchungsgruppe->find_by(description => { like => 'Standard%19%' });
47
48     $self->_set_defaults(sellprice_places          => 2,
49                          sellprice_adjustment      => 0,
50                          sellprice_adjustment_type => 'percent',
51                          article_number_policy     => 'update_prices',
52                          shoparticle_if_missing    => '0',
53                          parts_type                => 'part',
54                          default_buchungsgruppe    => ($bugru ? $bugru->id : undef),
55                          apply_buchungsgruppe      => 'all',
56                         );
57   } elsif ($self->type eq 'orders') {
58     $self->_set_defaults(order_column    => $::locale->text('Order'),
59                          item_column     => $::locale->text('OrderItem'),
60                          max_amount_diff => 0.02,
61                         );
62   } else {
63     $self->_set_defaults(table => 'customer');
64   }
65
66   return $self;
67 }
68
69 sub set {
70   my ($self, %params) = @_;
71
72   while (my ($key, $value) = each %params) {
73     my $setting = $self->_get_setting($key);
74
75     if (!$setting) {
76       $setting = SL::DB::CsvImportProfileSetting->new(key => $key);
77       $self->settings(@{ $self->settings || [] }, $setting);
78     }
79
80     $setting->value($value);
81   }
82
83   return $self;
84 }
85
86 sub get {
87   my ($self, $key, $default) = @_;
88
89   my $setting = $self->_get_setting($key);
90   return $setting ? $setting->value : $default;
91 }
92
93 sub _set_defaults {
94   my ($self, %params) = @_;
95
96   while (my ($key, $value) = each %params) {
97     $self->settings(@{ $self->settings || [] }, { key => $key, value => $value }) if !$self->_get_setting($key);
98   }
99
100   return $self;
101 }
102
103 sub clone_and_reset_deep {
104   my ($self) = @_;
105
106   my $clone = $self->clone_and_reset;
107   $clone->settings(map { $_->clone_and_reset } $self->settings);
108   $clone->name('');
109
110   return $clone;
111 }
112
113 sub flatten {
114   my ($self) = @_;
115
116   return map {
117     $_->key => $_->value
118   } $self->settings;
119 }
120
121 #
122 # hooks
123 #
124
125 sub _before_save_unset_default_on_others {
126   my ($self) = @_;
127
128   if ($self->is_default) {
129     SL::DB::Manager::CsvImportProfile->update_all(set   => { is_default => 0 },
130                                                   where => [ type       => $self->type,
131                                                              '!id'      => $self->id ]);
132   }
133
134   return 1;
135 }
136
137 #
138 # helper functions
139 #
140
141 sub _get_setting {
142   my ($self, $key) = @_;
143   return first { $_->key eq $key } @{ $self->settings || [] };
144 }
145
146 1;