X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FController%2FClientConfig.pm;h=ded1a33fb9d3d5ca231a180528bf52562a8dbfef;hb=eb07117b26f569d689835471cab6665e510e123e;hp=148054e4e810fac0b84dafbaf25a6fbe13d62bf3;hpb=c6b2257945060625bcb86fa7e2efd27c737480ff;p=kivitendo-erp.git diff --git a/SL/Controller/ClientConfig.pm b/SL/Controller/ClientConfig.pm index 148054e4e..ded1a33fb 100644 --- a/SL/Controller/ClientConfig.pm +++ b/SL/Controller/ClientConfig.pm @@ -3,103 +3,212 @@ package SL::Controller::ClientConfig; use strict; use parent qw(SL::Controller::Base); +use File::Copy::Recursive (); +use List::Util qw(first); + +use SL::DB::Chart; +use SL::DB::Currency; use SL::DB::Default; +use SL::DB::Language; +use SL::DB::Part; +use SL::DB::Unit; use SL::Helper::Flash; +use SL::Locale::String qw(t8); +use SL::PriceSource::ALL; +use SL::Template; __PACKAGE__->run_before('check_auth'); +use Rose::Object::MakeMethods::Generic ( + 'scalar --get_set_init' => [ qw(defaults all_warehouses all_weightunits all_languages all_currencies all_templates all_price_sources h_unit_name + posting_options payment_options accounting_options inventory_options profit_options balance_startdate_method_options) ], +); sub action_edit { my ($self, %params) = @_; - $self->{posting_options} = [ { title => $::locale->text("never"), value => 0 }, - { title => $::locale->text("every time"), value => 1 }, - { title => $::locale->text("on the same day"), value => 2 }, ]; - $self->{payment_options} = [ { title => $::locale->text("never"), value => 0 }, - { title => $::locale->text("every time"), value => 1 }, - { title => $::locale->text("on the same day"), value => 2 }, ]; - $self->{accounting_options} = [ { title => $::locale->text("Accrual"), value => "accrual" }, - { title => $::locale->text("cash"), value => "cash" }, ]; - $self->{inventory_options} = [ { title => $::locale->text("perpetual"), value => "perpetual" }, - { title => $::locale->text("periodic"), value => "periodic" }, ]; - $self->{profit_options} = [ { title => $::locale->text("balance"), value => "balance" }, - { title => $::locale->text("income"), value => "income" }, ]; + $::form->{use_templates} = $self->defaults->templates ? 'existing' : 'new'; + $self->edit_form; +} - map { $self->{$_} = SL::DB::Default->get->$_ } qw(is_changeable ir_changeable ar_changeable ap_changeable gl_changeable); +sub action_save { + my ($self, %params) = @_; - $self->{payments_changeable} = SL::DB::Default->get->payments_changeable; + my $defaults = delete($::form->{defaults}) || {}; + my $entered_currencies = delete($::form->{currencies}) || []; + my $original_currency_id = $self->defaults->currency_id; + $defaults->{disabled_price_sources} ||= []; - map { $self->{$_} = SL::DB::Default->get->$_ } qw(is_show_mark_as_paid ir_show_mark_as_paid ar_show_mark_as_paid ap_show_mark_as_paid); + # undef several fields if an empty value has been selected. + foreach (qw(warehouse_id bin_id warehouse_id_ignore_onhand bin_id_ignore_onhand)) { + undef $defaults->{$_} if !$defaults->{$_}; + } - map { $self->{$_} = SL::DB::Default->get->$_ } qw(accounting_method inventory_system profit_determination); + $defaults->{$_} = $::form->parse_amount(\%::myconfig, $defaults->{$_}) for qw(customer_hourly_rate); - $self->{show_bestbefore} = SL::DB::Default->get->show_bestbefore; + $self->defaults->assign_attributes(%{ $defaults }); - map { $self->{$_} = SL::DB::Default->get->$_ } qw(datev_check_on_sales_invoice datev_check_on_purchase_invoice datev_check_on_ar_transaction datev_check_on_ap_transaction datev_check_on_gl_transaction); - # datev check: not implemented yet: - #check_on_cash_and_receipt = 0 - #check_on_dunning = 0 - #check_on_sepa_import = 0 + my %errors_idx; - map { $self->{$_} = SL::DB::Default->get->$_ } qw(sales_order_show_delete purchase_order_show_delete sales_delivery_order_show_delete purchase_delivery_order_show_delete); + # Handle currencies + my (%new_currency_names); + foreach my $existing_currency (@{ $self->all_currencies }) { + my $new_name = $existing_currency->name; + my $new_currency = first { $_->{id} == $existing_currency->id } @{ $entered_currencies }; + $new_name = $new_currency->{name} if $new_currency; - map { $self->{$_} = SL::DB::Default->get->$_ } qw(warehouse_id bin_id); - $::form->get_lists('warehouses' => { 'key' => 'WAREHOUSES', - 'bins' => 'BINS', }); - $self->{WAREHOUSES} = $::form->{WAREHOUSES}; - # leerer lagerplatz mit id 0 - my $no_default_bin_entry = { 'id' => '0', description => '--', 'BINS' => [ { id => '0', description => ''} ] }; - push @ { $self->{WAREHOUSES} }, $no_default_bin_entry; + if (!$new_name) { + $errors_idx{0} = t8('Currency names must not be empty.'); + } elsif ($new_currency_names{$new_name}) { + $errors_idx{1} = t8('Currency names must be unique.'); + } - if (my $max = scalar @{ $self->{WAREHOUSES} }) { - $self->{warehouse_id} ||= $self->{WAREHOUSES}->[$max -1]->{id}; - $self->{bin_id} ||= $self->{WAREHOUSES}->[$max -1]->{BINS}->[0]->{id}; + if ($new_name) { + $new_currency_names{$new_name} = 1; + $existing_currency->name($new_name); + } } - $self->{show_weight} = SL::DB::Default->get->show_weight; + if ($::form->{new_currency} && $new_currency_names{ $::form->{new_currency} }) { + $errors_idx{1} = t8('Currency names must be unique.'); + } - $self->render('client_config/form', title => $::locale->text('Client Configuration')); -} + my @errors = map { $errors_idx{$_} } sort keys %errors_idx; + # Check templates + $::form->{new_templates} =~ s:/::g; + $::form->{new_master_templates} =~ s:/::g; -sub action_save { - my ($self, %params) = @_; + if (($::form->{use_templates} eq 'existing') && ($self->defaults->templates !~ m:^templates/[^/]+$:)) { + push @errors, t8('You must select existing print templates or create a new set.'); - map { SL::DB::Default->get->update_attributes($_ => $::form->{$_}); } qw(is_changeable ir_changeable ar_changeable ap_changeable gl_changeable); + } elsif ($::form->{use_templates} eq 'new') { + if (!$::form->{new_templates}) { + push @errors, t8('You must enter a name for your new print templates.'); + } elsif (-d "templates/" . $::form->{new_templates}) { + push @errors, t8('A directory with the name for the new print templates exists already.'); + } elsif (! -d "templates/print/" . $::form->{new_master_templates}) { + push @errors, t8('The master templates where not found.'); + } + } - SL::DB::Default->get->update_attributes('payments_changeable' => $::form->{payments_changeable}); + # Show form again if there were any errors. Nothing's been changed + # yet in the database. + if (@errors) { + flash('error', @errors); + return $self->edit_form; + } - map { SL::DB::Default->get->update_attributes($_ => $::form->{$_}); } qw(is_show_mark_as_paid ir_show_mark_as_paid ar_show_mark_as_paid ap_show_mark_as_paid); + # Save currencies. As the names must be unique we cannot simply save + # them as they are -- the user might want to swap to names. So make + # them unique first and assign the actual names in a second step. + my %currency_names_by_id = map { ($_->id => $_->name) } @{ $self->all_currencies }; + $_->update_attributes(name => '__039519735__' . $_->{id}) for @{ $self->all_currencies }; + $_->update_attributes(name => $currency_names_by_id{ $_->{id} }) for @{ $self->all_currencies }; + + # Create new currency if required + my $new_currency; + if ($::form->{new_currency}) { + $new_currency = SL::DB::Currency->new(name => $::form->{new_currency}); + $new_currency->save; + } - map { SL::DB::Default->get->update_attributes($_ => $::form->{$_}); } qw(accounting_method inventory_system profit_determination); + # If the user wants the new currency to be the default then replace + # the ID placeholder with the proper value. However, if no new + # currency has been created then don't change the value at all. + if (-1 == $self->defaults->currency_id) { + $self->defaults->currency_id($new_currency ? $new_currency->id : $original_currency_id); + } - SL::DB::Default->get->update_attributes('show_bestbefore' => $::form->{show_bestbefore}); + # Create new templates if requested. + if ($::form->{use_templates} eq 'new') { + local $File::Copy::Recursive::SkipFlop = 1; + File::Copy::Recursive::dircopy('templates/print/' . $::form->{new_master_templates}, 'templates/' . $::form->{new_templates}); + $self->defaults->templates('templates/' . $::form->{new_templates}); + } - map { SL::DB::Default->get->update_attributes($_ => $::form->{$_}); } qw(datev_check_on_sales_invoice datev_check_on_purchase_invoice datev_check_on_ar_transaction datev_check_on_ap_transaction datev_check_on_gl_transaction); + # Finally save defaults. + $self->defaults->save; - map { SL::DB::Default->get->update_attributes($_ => $::form->{$_}); } qw(sales_order_show_delete purchase_order_show_delete sales_delivery_order_show_delete purchase_delivery_order_show_delete); + flash_later('info', t8('Client Configuration saved!')); -<<<<<<< HEAD - # undef warehouse_id if the empty value is selected - if ( ($::form->{warehouse_id} == 0) && ($::form->{bin_id} == 0) ) { - undef $::form->{warehouse_id}; - undef $::form->{bin_id}; - } - map { SL::DB::Default->get->update_attributes($_ => $::form->{$_}); } qw(warehouse_id bin_id); -======= - SL::DB::Default->get->update_attributes('show_weight' => $::form->{show_weight}); ->>>>>>> gewicht + $self->redirect_to(action => 'edit'); +} - flash_later('info', $::locale->text('Client Configuration saved!')); +# +# initializers +# + +sub init_defaults { SL::DB::Default->get } +sub init_all_warehouses { SL::DB::Manager::Warehouse->get_all_sorted } +sub init_all_languages { SL::DB::Manager::Language->get_all_sorted } +sub init_all_currencies { SL::DB::Manager::Currency->get_all_sorted } +sub init_all_weightunits { my $unit = SL::DB::Manager::Unit->find_by(name => 'kg'); $unit ? $unit->convertible_units : [] } +sub init_all_templates { +{ SL::Template->available_templates } } +sub init_h_unit_name { first { SL::DB::Manager::Unit->find_by(name => $_) } qw(Std h Stunde) }; + +sub init_posting_options { + [ { title => t8("never"), value => 0 }, + { title => t8("every time"), value => 1 }, + { title => t8("on the same day"), value => 2 }, ] +} - $self->redirect_to(action => 'edit'); +sub init_payment_options { + [ { title => t8("never"), value => 0 }, + { title => t8("every time"), value => 1 }, + { title => t8("on the same day"), value => 2 }, ] +} + +sub init_accounting_options { + [ { title => t8("Accrual"), value => "accrual" }, + { title => t8("cash"), value => "cash" }, ] +} + +sub init_inventory_options { + [ { title => t8("perpetual"), value => "perpetual" }, + { title => t8("periodic"), value => "periodic" }, ] +} + +sub init_profit_options { + [ { title => t8("balance"), value => "balance" }, + { title => t8("income"), value => "income" }, ] +} + +sub init_balance_startdate_method_options { + [ { title => t8("After closed period"), value => "closed_to" }, + { title => t8("Start of year"), value => "start_of_year" }, + { title => t8("All transactions"), value => "all_transactions" }, + { title => t8("Last opening balance or all transactions"), value => "last_ob_or_all_transactions" }, + { title => t8("Last opening balance or start of year"), value => "last_ob_or_start_of_year" }, ] } +sub init_all_price_sources { + my @classes = SL::PriceSource::ALL->all_price_sources; + + [ map { [ $_->name, $_->description ] } @classes ]; +} -#################### private stuff ########################## +# +# filters +# sub check_auth { $::auth->assert('admin'); } +# +# helpers +# + +sub edit_form { + my ($self) = @_; + + $::request->layout->use_javascript("${_}.js") for qw(jquery.selectboxes jquery.multiselect2side); + + $self->render('client_config/form', title => t8('Client Configuration'), + make_chart_title => sub { $_[0]->accno . '--' . $_[0]->description }, + make_templates_value => sub { 'templates/' . $_[0] }, + ); +} + 1;