Merge branch 'master' of github.com:kivitendo/kivitendo-erp
[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   } else {
58     $self->_set_defaults(table => 'customer');
59   }
60
61   return $self;
62 }
63
64 sub set {
65   my ($self, %params) = @_;
66
67   while (my ($key, $value) = each %params) {
68     my $setting = $self->_get_setting($key);
69
70     if (!$setting) {
71       $setting = SL::DB::CsvImportProfileSetting->new(key => $key);
72       $self->settings(@{ $self->settings || [] }, $setting);
73     }
74
75     $setting->value($value);
76   }
77
78   return $self;
79 }
80
81 sub get {
82   my ($self, $key, $default) = @_;
83
84   my $setting = $self->_get_setting($key);
85   return $setting ? $setting->value : $default;
86 }
87
88 sub _set_defaults {
89   my ($self, %params) = @_;
90
91   while (my ($key, $value) = each %params) {
92     $self->settings(@{ $self->settings || [] }, { key => $key, value => $value }) if !$self->_get_setting($key);
93   }
94
95   return $self;
96 }
97
98 sub clone_and_reset_deep {
99   my ($self) = @_;
100
101   my $clone = $self->clone_and_reset;
102   $clone->settings(map { $_->clone_and_reset } $self->settings);
103   $clone->name('');
104
105   return $clone;
106 }
107
108 sub flatten {
109   my ($self) = @_;
110
111   return map {
112     $_->key => $_->value
113   } $self->settings;
114 }
115
116 #
117 # hooks
118 #
119
120 sub _before_save_unset_default_on_others {
121   my ($self) = @_;
122
123   if ($self->is_default) {
124     SL::DB::Manager::CsvImportProfile->update_all(set   => { is_default => 0 },
125                                                   where => [ type       => $self->type,
126                                                              '!id'      => $self->id ]);
127   }
128
129   return 1;
130 }
131
132 #
133 # helper functions
134 #
135
136 sub _get_setting {
137   my ($self, $key) = @_;
138   return first { $_->key eq $key } @{ $self->settings || [] };
139 }
140
141 1;