1 package SL::Controller::CsvImport::CustomerVendor;
7 use SL::DB::CustomVariable;
8 use SL::DB::CustomVariableConfig;
9 use SL::DB::PaymentTerm;
11 use parent qw(SL::Controller::CsvImport::Base);
13 use Rose::Object::MakeMethods::Generic
15 'scalar --get_set_init' => [ qw(table languages_by businesses_by) ],
20 $self->table($self->controller->profile->get('table') eq 'customer' ? 'customer' : 'vendor');
25 $self->class('SL::DB::' . ucfirst($self->table));
28 sub init_all_cvar_configs {
31 return SL::DB::Manager::CustomVariableConfig->get_all(where => [ module => 'CT' ]);
34 sub init_businesses_by {
37 return { map { my $col = $_; ( $col => { map { ( $_->$col => $_ ) } @{ SL::DB::Manager::Business->get_all } } ) } qw(id description) };
40 sub init_languages_by {
43 return { map { my $col = $_; ( $col => { map { ( $_->$col => $_ ) } @{ $self->all_languages } } ) } qw(id description article_code) };
49 my $numbercolumn = $self->controller->profile->get('table') . "number";
50 my %vcs_by_number = map { ( $_->$numbercolumn => 1 ) } @{ $self->existing_objects };
52 foreach my $entry (@{ $self->controller->data }) {
53 my $object = $entry->{object};
55 next unless $self->check_name($entry);
56 next unless $self->check_language($entry);
57 next unless $self->check_business($entry);
58 next unless $self->check_payment($entry);
59 $self->handle_cvars($entry);
61 if ($vcs_by_number{ $object->$numbercolumn }) {
62 $entry->{object}->$numbercolumn('####');
64 $vcs_by_number{ $object->$numbercolumn } = $object;
68 $self->add_columns(map { "${_}_id" } grep { exists $self->controller->data->[0]->{raw_data}->{$_} } qw(language business payment));
69 $self->add_cvar_raw_data_columns;
72 sub check_duplicates {
73 my ($self, %params) = @_;
75 my $normalizer = sub { my $name = $_[0]; $name =~ s/[\s,\.\-]//g; return $name; };
78 if ('check_db' eq $self->controller->profile->get('duplicates')) {
79 %by_name = map { ( $normalizer->($_->name) => 'db' ) } @{ $self->existing_objects };
82 foreach my $entry (@{ $self->controller->data }) {
83 next if @{ $entry->{errors} };
85 my $name = $normalizer->($entry->{object}->name);
86 if (!$by_name{$name}) {
87 $by_name{$name} = 'csv';
90 push @{ $entry->{errors} }, $by_name{$name} eq 'db' ? $::locale->text('Duplicate in database') : $::locale->text('Duplicate in CSV file');
96 my ($self, $entry) = @_;
98 my $name = $entry->{object}->name;
104 push @{ $entry->{errors} }, $::locale->text('Error: Name missing');
109 my ($self, $entry) = @_;
111 my $object = $entry->{object};
113 # Check whether or not language ID is valid.
114 if ($object->language_id && !$self->languages_by->{id}->{ $object->language_id }) {
115 push @{ $entry->{errors} }, $::locale->text('Error: Invalid language');
119 # Map name to ID if given.
120 if (!$object->language_id && $entry->{raw_data}->{language}) {
121 my $language = $self->languages_by->{description}->{ $entry->{raw_data}->{language} }
122 || $self->languages_by->{article_code}->{ $entry->{raw_data}->{language} };
125 push @{ $entry->{errors} }, $::locale->text('Error: Invalid language');
129 $object->language_id($language->id);
136 my ($self, $entry) = @_;
138 my $object = $entry->{object};
140 # Check whether or not business ID is valid.
141 if ($object->business_id && !$self->businesss_by->{id}->{ $object->business_id }) {
142 push @{ $entry->{errors} }, $::locale->text('Error: Invalid business');
146 # Map name to ID if given.
147 if (!$object->business_id && $entry->{raw_data}->{business}) {
148 my $business = $self->businesses_by->{description}->{ $entry->{raw_data}->{business} };
151 push @{ $entry->{errors} }, $::locale->text('Error: Invalid business');
155 $object->business_id($business->id);
162 my ($self, %params) = @_;
164 my $numbercolumn = $self->table . 'number';
165 my $with_number = [ grep { $_->{object}->$numbercolumn ne '####' } @{ $self->controller->data } ];
166 my $without_number = [ grep { $_->{object}->$numbercolumn eq '####' } @{ $self->controller->data } ];
168 map { $_->{object}->$numbercolumn('') } @{ $without_number };
170 $self->SUPER::save_objects(data => $with_number);
171 $self->SUPER::save_objects(data => $without_number);
185 account_number => 15,
198 my $profile = $self->SUPER::init_profile;
199 delete @{$profile}{qw(language business salesman payment)};
205 # salesman_id -- Kunden mit Typ 'Verkäufer', falls $::vertreter an ist, ansonsten Employees