Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 9a578c8b

Von Jan Büren vor mehr als 11 Jahren hinzugefügt

  • ID 9a578c8b55b857e41dffbaf844023efcbdd22ace
  • Vorgänger c85291ee
  • Nachfolger 891f6217

Trac 2300 / 2301 zweiter Versuch
;-)

Unterschiede anzeigen:

SL/Common.pm
14 14
use Carp;
15 15
use Time::HiRes qw(gettimeofday);
16 16
use Data::Dumper;
17
use File::Copy;
18
use File::stat;
19
use File::Slurp;
17 20

  
18 21
use SL::DBUtils;
19 22

  
......
326 329
  $main::lxdebug->leave_sub();
327 330
}
328 331

  
332
#
333
# Legt ein entsprechendes Webdav-Verzeichnis an, falls
334
# Webdav als Option konfiguriert ist. Falls schon ein
335
# Ordner vorhanden ist, werden alle Dateien alphabetisch
336
# sortiert ausgelesen und an der Oberfläche angezeigt
337
#
329 338
sub webdav_folder {
330 339
  $main::lxdebug->enter_sub();
331 340

  
332 341
  my ($form) = @_;
333 342

  
334 343
  return $main::lxdebug->leave_sub()
335
    unless ($::lx_office_conf{features}->{webdav} && $form->{id});
344
    unless ($::instance_conf->get_webdav && $form->{id});
336 345

  
337
  croak "No client set in \$::auth" unless $::auth->client;
338 346

  
339
  my ($path, $number);
340 347

  
341 348
  $form->{WEBDAV} = [];
342 349

  
343
  if ($form->{type} eq "sales_quotation") {
344
    ($path, $number) = ("angebote", $form->{quonumber});
345
  } elsif ($form->{type} eq "sales_order") {
346
    ($path, $number) = ("bestellungen", $form->{ordnumber});
347
  } elsif ($form->{type} eq "request_quotation") {
348
    ($path, $number) = ("anfragen", $form->{quonumber});
349
  } elsif ($form->{type} eq "purchase_order") {
350
    ($path, $number) = ("lieferantenbestellungen", $form->{ordnumber});
351
  } elsif ($form->{type} eq "sales_delivery_order") {
352
    ($path, $number) = ("verkaufslieferscheine", $form->{donumber});
353
  } elsif ($form->{type} eq "purchase_delivery_order") {
354
    ($path, $number) = ("einkaufslieferscheine", $form->{donumber});
355
  } elsif ($form->{type} eq "credit_note") {
356
    ($path, $number) = ("gutschriften", $form->{invnumber});
357
  } elsif ($form->{vc} eq "customer") {
358
    ($path, $number) = ("rechnungen", $form->{invnumber});
359
  } else {
360
    ($path, $number) = ("einkaufsrechnungen", $form->{invnumber});
361
  }
362

  
350
  my ($path, $number) = get_webdav_folder($form);     # ausgelagert
363 351
  return $main::lxdebug->leave_sub() unless ($path && $number);
364 352

  
365
  $number =~ s|[/\\]|_|g;
366

  
367
  $path = "webdav/" . $::auth->client->{id} . "/${path}/${number}";
368

  
369 353
  if (!-d $path) {
370 354
    mkdir_with_parents($path);
371 355

  
......
373 357
    my $base_path = $ENV{'SCRIPT_NAME'};
374 358
    $base_path =~ s|[^/]+$||;
375 359
    if (opendir my $dir, $path) {
360
      # alphabetisch sortiert.
376 361
      foreach my $file (sort { lc $a cmp lc $b } readdir $dir) {
377 362
        next if (($file eq '.') || ($file eq '..'));
378 363

  
......
574 559
  }
575 560
}
576 561

  
562
#
563
# Diese Routine baut aus dem Masken-Typ und der
564
# Beleg-Nummer, das entsprechende Webdav-Verzeichnis zusammen
565
# Nimmt leider noch die ganze Form entgegen und den if-elsif-Block
566
# sollte man schöner "dispatchen"
567
# Ergänzung 6.5.2011, den else-Zweig defensiver gestaltet und mit
568
# -1 als n.i.O. Rückgabewert versehen
569
#
570
sub get_webdav_folder {
571
  $main::lxdebug->enter_sub();
572

  
573
  my ($form) = @_;
574

  
575
  croak "No client set in \$::auth" unless $::auth->client;
576

  
577
  my ($path, $number);
578

  
579
  # dispatch table
580
  if ($form->{type} eq "sales_quotation") {
581
    ($path, $number) = ("angebote", $form->{quonumber});
582
  } elsif ($form->{type} eq "sales_order") {
583
    ($path, $number) = ("bestellungen", $form->{ordnumber});
584
  } elsif ($form->{type} eq "request_quotation") {
585
    ($path, $number) = ("anfragen", $form->{quonumber});
586
  } elsif ($form->{type} eq "purchase_order") {
587
    ($path, $number) = ("lieferantenbestellungen", $form->{ordnumber});
588
  } elsif ($form->{type} eq "sales_delivery_order") {
589
    ($path, $number) = ("verkaufslieferscheine", $form->{donumber});
590
  } elsif ($form->{type} eq "purchase_delivery_order") {
591
    ($path, $number) = ("einkaufslieferscheine", $form->{donumber});
592
  } elsif ($form->{type} eq "credit_note") {
593
    ($path, $number) = ("gutschriften", $form->{invnumber});
594
  } elsif ($form->{vc} eq "customer") {
595
    ($path, $number) = ("rechnungen", $form->{invnumber});
596
  } elsif ($form->{vc} eq "vendor") {
597
    ($path, $number) = ("einkaufsrechnungen", $form->{invnumber});
598
  } else {
599
    # wir befinden uns nicht in einer belegmaske
600
    # scheinbar wird diese routine auch bspw. bei waren
601
    # aufgerufen - naja, steuerung über die $form halt ...
602
    $main::lxdebug->leave_sub();
603
    return undef;
604
  }
605

  
606
  $number =~ s|[/\\]|_|g;
607

  
608
  $path = "webdav/" . $::auth->client->{id} . "/${path}/${number}";
609

  
610
  $main::lxdebug->leave_sub();
611

  
612
  return ($path, $number);
613
}
614

  
615
#
616
# Falls Webdav aktiviert ist, auch den generierten Beleg in das
617
# Webdav-Verzeichnis kopieren
618
#
619
#
620
sub copy_file_to_webdav_folder {
621
  $main::lxdebug->enter_sub();
622

  
623
  my ($form) = @_;
624
  my ($last_mod_time, $latest_file_name, $complete_path);
625

  
626
  # checks
627
  foreach my $item (qw(tmpdir tmpfile type)){
628
    if (!$form->{$item}){
629
      $main::lxdebug->message(0, 'Missing parameter');
630
      $main::form->error($main::locale->text("Missing parameter for webdav file copy"));
631
    }
632
  }
633

  
634
  # Den Webdav-Ordner ÜBER exakt denselben Mechanismus wie beim
635
  # Anlegen des Ordners bestimmen
636
  my ($webdav_folder, $document_name) =  get_webdav_folder($form);
637

  
638
  if (! $webdav_folder){
639
    $main::lxdebug->leave_sub();
640
    $main::form->error($main::locale->text("Cannot check correct webdav folder"));
641
    return undef; # s.o. erstmal so ...
642
  }
643
  # kompletter pfad
644
  $complete_path =  join('/', $form->{cwd},  $webdav_folder);
645
  opendir my $dh, $complete_path or die "Could not open $complete_path: $!";
646

  
647
  my ($newest_name, $newest_time);
648
  while ( defined( my $file = readdir( $dh ) ) ) {
649
    my $path = File::Spec->catfile( $complete_path, $file );
650
    next if -d $path; # skip directories, or anything else you like
651
    ( $newest_name, $newest_time ) = ( $file, -M _ )
652
        if( ! defined $newest_time or -M $path < $newest_time );
653
    }
654
  $latest_file_name = $complete_path .'/' . $newest_name;
655
  my $filesize = stat($latest_file_name)->size;
656

  
657
  # prüfung auf identisch oder nicht
658
  my ($ext) = $form->{tmpfile} =~ /(\.[^.]+)$/;
659
  my $current_file = join('/', $form->{tmpdir}, $form->{tmpfile});
660
  my $current_filesize = stat($current_file)->size;
661
  if ($current_filesize == $filesize) { # bei gleicher größe copy deaktivieren
662
    $main::lxdebug->leave_sub();
663
    return;
664
  }
665
  # zeitstempel und dateinamen holen
666
  my $timestamp = get_current_formatted_time();
667
  my $myfilename = $form->generate_attachment_filename();
668
  # entsprechend vor der endung hinzufügen
669
  $myfilename =~ s/\./$timestamp\./;
670

  
671
  if (!copy(join('/', $form->{tmpdir}, $form->{tmpfile}), join('/', $form->{cwd}, $webdav_folder, $myfilename))) {
672
    my $j = join('/', $form->{tmpdir}, $form->{tmpfile});
673
    my $k = join('/', $form->{cwd},  $webdav_folder);
674
    $main::lxdebug->message(0, "Copy file from $j to $k failed");
675
    $main::form->error($main::locale->text("Copy file from #1 to #2 failed", $j, $k));
676
  }
677

  
678
  $main::lxdebug->leave_sub();
679
}
680
sub get_current_formatted_time {
681
  $main::lxdebug->enter_sub();
682

  
683
  my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
684
  my $formatted_current_time = sprintf ( "_%04d%02d%02d_%02d%02d%02d",
685
                                   $year+1900,$mon+1,$mday,$hour,$min,$sec);
686

  
687
  $main::lxdebug->leave_sub();
688
  return $formatted_current_time;
689
}
690

  
577 691
1;
578 692
__END__
579 693

  
SL/DB/AuthClient.pm
45 45
sub _after_save_ensure_webdav_symlink_correctness {
46 46
  my ($self) = @_;
47 47

  
48
  $self->ensure_webdav_symlink_correctness($self->{__before_save_remember_old_name}) if $self->id && $::lx_office_conf{features}->{webdav};
48
  $self->ensure_webdav_symlink_correctness($self->{__before_save_remember_old_name}) if $self->id && $::instance_conf->get_webdav;
49 49
  return 1;
50 50
}
51 51

  
52 52
sub _after_delete_delete_webdav_symlink {
53 53
  my ($self) = @_;
54 54

  
55
  return 1 if !$::lx_office_conf{features}->{webdav};
55
  return 1 if !$::instance_conf->get_webdav;
56 56
  my $name = $self->webdav_symlink_basename;
57 57
  unlink "webdav/links/${name}";
58 58
  return 1;
......
85 85
sub ensure_webdav_symlink_correctness {
86 86
  my ($self, $old_name) = @_;
87 87

  
88
  return unless $::lx_office_conf{features}->{webdav};
88
  return unless $::instance_conf->get_webdav;
89 89

  
90 90
  croak "Need object ID" unless $self->id;
91 91

  
SL/DB/MetaSetup/Default.pm
34 34
  mtime                                   => { type => 'timestamp' },
35 35
  rmanumber                               => { type => 'text' },
36 36
  cnnumber                                => { type => 'text' },
37
  accounting_method                       => { type => 'text' },
38
  inventory_system                        => { type => 'text' },
39
  profit_determination                    => { type => 'text' },
37 40
  dunning_ar_amount_fee                   => { type => 'integer' },
38 41
  dunning_ar_amount_interest              => { type => 'integer' },
39 42
  dunning_ar                              => { type => 'integer' },
40 43
  pdonumber                               => { type => 'text' },
41 44
  sdonumber                               => { type => 'text' },
42
  id                                      => { type => 'serial', not_null => 1 },
43 45
  ar_paid_accno_id                        => { type => 'integer' },
46
  id                                      => { type => 'serial', not_null => 1 },
44 47
  language_id                             => { type => 'integer' },
45
  accounting_method                       => { type => 'text' },
46
  inventory_system                        => { type => 'text' },
47
  profit_determination                    => { type => 'text' },
48 48
  datev_check_on_sales_invoice            => { type => 'boolean', default => 'true' },
49 49
  datev_check_on_purchase_invoice         => { type => 'boolean', default => 'true' },
50 50
  datev_check_on_ar_transaction           => { type => 'boolean', default => 'true' },
......
65 65
  ir_show_mark_as_paid                    => { type => 'boolean', default => 'true' },
66 66
  ar_show_mark_as_paid                    => { type => 'boolean', default => 'true' },
67 67
  ap_show_mark_as_paid                    => { type => 'boolean', default => 'true' },
68
  assemblynumber                          => { type => 'text' },
69
  currency_id                             => { type => 'integer', not_null => 1 },
70 68
  warehouse_id                            => { type => 'integer' },
71 69
  bin_id                                  => { type => 'integer' },
70
  max_future_booking_interval             => { type => 'integer', default => 360 },
71
  assemblynumber                          => { type => 'text' },
72 72
  show_weight                             => { type => 'boolean', default => 'false', not_null => 1 },
73 73
  transfer_default                        => { type => 'boolean', default => 'true' },
74 74
  transfer_default_use_master_default_bin => { type => 'boolean', default => 'false' },
75 75
  transfer_default_ignore_onhand          => { type => 'boolean', default => 'false' },
76 76
  warehouse_id_ignore_onhand              => { type => 'integer' },
77 77
  bin_id_ignore_onhand                    => { type => 'integer' },
78
  currency_id                             => { type => 'integer', not_null => 1 },
78 79
  company                                 => { type => 'text' },
79 80
  address                                 => { type => 'text' },
80 81
  taxnumber                               => { type => 'text' },
......
82 83
  duns                                    => { type => 'text' },
83 84
  sepa_creditor_id                        => { type => 'text' },
84 85
  templates                               => { type => 'text' },
85
  max_future_booking_interval             => { type => 'integer', default => 360 },
86
  webdav                                  => { type => 'boolean', default => 'false' },
87
  webdav_documents                        => { type => 'boolean', default => 'false' },
88
  vertreter                               => { type => 'boolean', default => 'false' },
89
  parts_show_image                        => { type => 'boolean', default => 'true' },
90
  parts_listing_image                     => { type => 'boolean', default => 'true' },
91
  parts_image_css                         => { type => 'text', default => 'border:0;float:left;max-width:250px;margin-top:20px:margin-right:10px;margin-left:10px;' },
86 92
);
87 93

  
88 94
__PACKAGE__->meta->primary_key_columns([ 'id' ]);
SL/Form.pm
614 614
    map { $additional_params->{"myconfig_${_}"} = $main::myconfig{$_}; } keys %::myconfig;
615 615
  }
616 616

  
617
  $additional_params->{"conf_webdav"}                 = $::lx_office_conf{features}->{webdav};
617
  $additional_params->{"conf_webdav"}                 = $::instance_conf->get_webdav;
618 618
  $additional_params->{"conf_latex_templates"}        = $::lx_office_conf{print_templates}->{latex};
619 619
  $additional_params->{"conf_opendocument_templates"} = $::lx_office_conf{print_templates}->{opendocument};
620
  $additional_params->{"conf_vertreter"}              = $::lx_office_conf{features}->{vertreter};
621
  $additional_params->{"conf_parts_image_css"}        = $::lx_office_conf{features}->{parts_image_css};
622
  $additional_params->{"conf_parts_listing_images"}   = $::lx_office_conf{features}->{parts_listing_images};
623
  $additional_params->{"conf_parts_show_image"}       = $::lx_office_conf{features}->{parts_show_image};
620
  $additional_params->{"conf_vertreter"}              = $::instance_conf->get_vertreter;
621
  $additional_params->{"conf_parts_image_css"}        = $::instance_conf->get_parts_image_css;
622
  $additional_params->{"conf_parts_listing_images"}   = $::instance_conf->get_parts_listing_images;
623
  $additional_params->{"conf_parts_show_image"}       = $::instance_conf->get_parts_show_image;
624 624
  $additional_params->{"INSTANCE_CONF"}               = $::instance_conf;
625 625

  
626 626
  if (my $debug_options = $::lx_office_conf{debug}{options}) {
......
1076 1076
    $self->cleanup();
1077 1077
    $self->error("$self->{IN} : " . $template->get_error());
1078 1078
  }
1079

  
1079
  Common::copy_file_to_webdav_folder($self) if ($::instance_conf->get_webdav
1080
                                                and $::instance_conf->get_webdav_documents and not $self->{preview});
1080 1081
  close OUT if $self->{OUT};
1081 1082

  
1082 1083
  if ($self->{media} eq 'file') {
SL/InstanceConfiguration.pm
184 184
  return ($self->{data}->{max_future_booking_interval});
185 185
}
186 186

  
187
sub get_webdav {
188
  my ($self) = @_;
189
  return ($self->{data}->{webdav});
190
}
191

  
192
sub get_webdav_documents {
193
  my ($self) = @_;
194
  return ($self->{data}->{webdav_documents});
195
}
196

  
197
sub get_vertreter {
198
  my ($self) = @_;
199
  return ($self->{data}->{vertreter});
200
}
201

  
202
sub get_parts_show_image {
203
  my ($self) = @_;
204
  return ($self->{data}->{parts_show_image});
205
}
206

  
207
sub get_parts_listing_images{
208
  my ($self) = @_;
209
  return ($self->{data}->{parts_listing_image});
210
}
211

  
212
sub get_parts_image_css {
213
  my ($self) = @_;
214
  return ($self->{data}->{parts_image_css});
215
}
187 216

  
188 217

  
189 218
1;
......
330 359

  
331 360
Returns the maximum interval value for future bookings
332 361

  
362
=item C<get_webdav>
363

  
364
Returns the configuration for webdav
365

  
366
=item C<get_webdav_documents>
367

  
368
Returns the configuration for storing documents in the corresponding webdav folder
369

  
370
=item C<get_vertreter>
371

  
372
Returns the configuration for "vertreter"
373

  
374
=item C<get_parts_show_image>
375

  
376
Returns the configuarion for show image in parts
377

  
378
=item C<get_parts_image_css>
379

  
380
Returns the css format string for images shown in parts
381

  
382
=item C<get_parts_listing_image>
383

  
384
Returns the configuartion for showing the picture in the results when you search for parts
385

  
333 386
=back
334 387

  
335 388
=head1 BUGS
bin/mozilla/ct.pl
174 174
  my @columns = (
175 175
    'id',        'name',      "$form->{db}number",   'contact',   'phone',
176 176
    'fax',       'email',     'taxnumber',           'street',    'zipcode' , 'city',
177
    'business',  'invnumber', 'ordnumber',           'quonumber', 'salesman', 'country' 
177
    'business',  'invnumber', 'ordnumber',           'quonumber', 'salesman', 'country'
178 178
  );
179 179

  
180 180
  my @includeable_custom_variables = grep { $_->{includeable} } @{ $cvar_configs };
......
465 465
                   currencies => "ALL_CURRENCIES");
466 466
  $form->get_pricegroup(\%myconfig, { all => 1 });
467 467

  
468
  $form->get_lists(customers => { key => "ALL_SALESMAN_CUSTOMERS", business_is_salesman => 1 }) if $::lx_office_conf{features}->{vertreter};
468
  $form->get_lists(customers => { key => "ALL_SALESMAN_CUSTOMERS", business_is_salesman => 1 }) if $::instance_conf->get_vertreter;
469 469
  $form->{ALL_EMPLOYEES}          = SL::DB::Manager::Employee->get_all(query => [ or => [ id => $::form->{FU_created_for_user},  deleted => 0 ] ]);
470 470
  $form->{ALL_SALESMEN}           = SL::DB::Manager::Employee->get_all(query => [ or => [ id => $::form->{salesman_id},  deleted => 0 ] ]);
471 471
  $form->{USER}                   = SL::DB::Manager::Employee->current;
......
536 536

  
537 537
  $::form->isblank("name", $::locale->text("Name missing!"));
538 538

  
539
  if ($::form->{new_salesman_id} && $::lx_office_conf{features}->{vertreter}) {
539
  if ($::form->{new_salesman_id} && $::instance_conf->get_vertreter) {
540 540
    $::form->{salesman_id} = $::form->{new_salesman_id};
541 541
    delete $::form->{new_salesman_id};
542 542
  }
bin/mozilla/do.pl
165 165
  $form->all_vc(\%myconfig, $form->{vc}, ($form->{vc} eq 'customer') ? "AR" : "AP");
166 166

  
167 167
  # retrieve order/quotation
168
  $form->{webdav}   = $::lx_office_conf{features}->{webdav};
168
  $form->{webdav}   = $::instance_conf->get_webdav;
169 169
  $form->{jsscript} = 1;
170 170

  
171 171
  my $editing = $form->{id};
bin/mozilla/ir.pl
101 101
  $form->{vc} = 'vendor';
102 102

  
103 103
  # create links
104
  $form->{webdav}   = $::lx_office_conf{features}->{webdav};
104
  $form->{webdav}   = $::instance_conf->get_webdav;
105 105
  $form->{jsscript} = 1;
106 106

  
107 107
  $form->create_links("AP", \%myconfig, "vendor");
bin/mozilla/is.pl
138 138
  $form->{vc} = 'customer';
139 139

  
140 140
  # create links
141
  $form->{webdav}   = $::lx_office_conf{features}->{webdav};
141
  $form->{webdav}   = $::instance_conf->get_webdav;
142 142

  
143 143
  $form->create_links("AR", \%myconfig, "customer");
144 144

  
bin/mozilla/oe.pl
229 229
  $form->all_vc(\%myconfig, $form->{vc}, ($form->{vc} eq 'customer') ? "AR" : "AP");
230 230

  
231 231
  # retrieve order/quotation
232
  $form->{webdav}   = $::lx_office_conf{features}->{webdav};
232
  $form->{webdav}   = $::instance_conf->get_webdav;
233 233
  $form->{jsscript} = 1;
234 234

  
235 235
  my $editing = $form->{id};
......
528 528

  
529 529
  print $form->parse_html_template("oe/form_footer", {
530 530
     %TMPL_VAR,
531
     webdav          => $::lx_office_conf{features}->{webdav},
531
     webdav          => $::instance_conf->get_webdav,
532 532
     print_options   => print_options(inline => 1),
533 533
     label_edit      => $locale->text("Edit the $form->{type}"),
534 534
     label_workflow  => $locale->text("Workflow $form->{type}"),
config/kivitendo.conf.default
65 65
# and "en" (English, not perfect) are available.
66 66
language = de
67 67

  
68
[features]
69
# Activate certain optional features and modules.
70
webdav = 0
71
vertreter = 0
72

  
73
## Pictures for parts
74
# Show the picture in the part form
75
parts_show_image = 1
76
# Style the picture with the following CSS code:
77
parts_image_css = border:0;float:left;max-width:250px;margin-top:20px:margin-right:10px;margin-left:10px;
78
# Show the picture in the results when you search for parts
79
parts_listing_images = 0
80

  
81 68
[paths]
82 69
# path to temporary files (must be writeable by the web server)
83 70
userspath = users
doc/changelog
57 57
- #1897 implementiert. Zukunfts-Buchungen verhindern, durch einen konfigurierbaren
58 58
  maximalen Zeitraum in dem in die Zukunft gebucht werden darf (default 360 Tage)
59 59

  
60
- #2300 Alle Feature-Konfigurationen sind jetzt in der Mandantenkonfiguration eingestellt
61
- #2301 Dokumentenbelege optional in webdav-Ordner speichern
60 62

  
61 63
Wichtige Änderungen:
62 64

  
locale/de/all
352 352
  'CRM status'                  => 'Admin Status',
353 353
  'CRM termin'                  => 'Termine',
354 354
  'CRM user'                    => 'Admin Benutzer',
355
  'CSS style for pictures'      => 'CSS Style für Bilder',
355 356
  'CSV export -- options'       => 'CSV-Export -- Optionen',
356 357
  'CSV import: contacts'        => 'CSV-Import: Ansprechpersonen',
357 358
  'CSV import: customers and vendors' => 'CSV-Import: Kunden und Lieferanten',
......
363 364
  'Cancel'                      => 'Abbrechen',
364 365
  'Cancel Accounts Payables Transaction' => 'Kreditorenbuchung stornieren',
365 366
  'Cancel Accounts Receivables Transaction' => 'Debitorenbuchung stornieren',
367
  'Cannot check correct webdav folder' => 'Kann nicht den richtigen webdav Pfad überprüfen',
366 368
  'Cannot delete account!'      => 'Konto kann nicht gelöscht werden!',
367 369
  'Cannot delete customer!'     => 'Kunde kann nicht gelöscht werden!',
368 370
  'Cannot delete default account!' => 'Das Standard-Konto kann nicht gelöscht werden!',
......
474 476
  'Contra'                      => 'gegen',
475 477
  'Conversion of "birthday" contact person attribute' => 'Umstellung des Kontaktpersonenfeldes "Geburtstag"',
476 478
  'Copies'                      => 'Kopien',
479
  'Copy file from #1 to #2 failed' => 'Datei von #1 nach #2 kopieren fehlgeschlagen',
477 480
  'Correct taxkey'              => 'Richtiger Steuerschlüssel',
478 481
  'Costs'                       => 'Kosten',
479 482
  'Could not load class #1 (#2): "#3"' => 'Konnte Klasse #1 (#2) nicht laden: "#3"',
......
904 907
  'Factor missing!'             => 'Der Faktor fehlt.',
905 908
  'Falsches Datumsformat!'      => 'Falsches Datumsformat!',
906 909
  'Fax'                         => 'Fax',
910
  'Features'                    => 'Features',
907 911
  'Feb'                         => 'Feb',
908 912
  'February'                    => 'Februar',
909 913
  'Fee'                         => 'Gebühr',
......
1246 1250
  'Missing amount'              => 'Fehlbetrag',
1247 1251
  'Missing parameter #1 in call to sub #2.' => 'Fehlender Parameter \'#1\' in Funktionsaufruf \'#2\'.',
1248 1252
  'Missing parameter (at least one of #1) in call to sub #2.' => 'Fehlernder Parameter (mindestens einer aus \'#1\') in Funktionsaufruf \'#2\'.',
1253
  'Missing parameter for webdav file copy' => 'Fehlender Parameter für webdav Datei kopieren',
1249 1254
  'Missing taxkeys in invoices with taxes.' => 'Fehlende Steuerschl&uuml;ssel in Rechnungen mit Steuern',
1250 1255
  'Mitarbeiter'                 => 'Mitarbeiter',
1251 1256
  'Mixed (requires column "type")' => 'Gemischt (erfordert Spalte "type")',
......
1468 1473
  'Phone1'                      => 'Telefon 1 ',
1469 1474
  'Phone2'                      => 'Telefon 2',
1470 1475
  'Pick List'                   => 'Sammelliste',
1476
  'Pictures for parts'          => 'Bilder für Waren',
1477
  'Pictures for search parts'   => 'Bilder für Warensuche',
1471 1478
  'Please Check the bank information for each customer:' => 'Bitte überprüfen Sie die Bankinformationen der Kunden:',
1472 1479
  'Please Check the bank information for each vendor:' => 'Bitte überprüfen Sie die Kontoinformationen der Lieferanten:',
1473 1480
  'Please ask your administrator to create warehouses and bins.' => 'Bitten Sie Ihren Administrator, dass er Lager und Lagerpl&auml;tze anlegt.',
......
1646 1653
  'Report for'                  => 'Bericht für',
1647 1654
  'Reports'                     => 'Berichte',
1648 1655
  'Representative'              => 'Vertreter',
1656
  'Representative for Customer' => 'Vertreter für Kunden',
1649 1657
  'Reqdate'                     => 'Liefertermin',
1650 1658
  'Request Quotations'          => 'Preisanfragen',
1651 1659
  'Request for Quotation'       => 'Anfrage',
......
1720 1728
  'Save and close'              => 'Speichern und schlie&szlig;en',
1721 1729
  'Save and execute'            => 'Speichern und ausführen',
1722 1730
  'Save as new'                 => 'als neu speichern',
1731
  'Save document in webdav repository' => 'Dokument in webdav-Ablage speichern',
1723 1732
  'Save draft'                  => 'Entwurf speichern',
1724 1733
  'Save profile'                => 'Profil speichern',
1725 1734
  'Save settings as'            => 'Einstellungen speichern unter',
......
1820 1829
  'Show overdue sales quotations and requests for quotations...' => 'Überfällige Angebote und Preisanfragen anzeigen...',
1821 1830
  'Show parts'                  => 'Artikel anzeigen',
1822 1831
  'Show settings'               => 'Einstellungen anzeigen',
1832
  'Show the picture in the part form' => 'Bild in Warenmaske anzeigen',
1833
  'Show the pictures in the result for search parts' => 'Bilder in Suchergebnis für Stammdaten -> Berichte -> Waren anzeigen',
1823 1834
  'Show the weights of articles and the total weight in orders, invoices and delivery notes?' => 'Sollen Warengewichte und Gesamtgewicht in Aufträgen, Rechnungen und Lieferscheinen angezeigt werden?',
1824 1835
  'Show weights'                => 'Gewichte anzeigen',
1825 1836
  'Show your TODO list after loggin in' => 'Aufgabenliste nach dem Anmelden anzeigen',
......
1870 1881
  'Storno (one letter abbreviation)' => 'S',
1871 1882
  'Storno Invoice'              => 'Stornorechnung',
1872 1883
  'Street'                      => 'Straße',
1884
  'Style the picture with the following CSS code' => 'Bildeigenschaft mit folgendem CSS-Style versehen',
1873 1885
  'Stylesheet'                  => 'Stilvorlage',
1874 1886
  'Subject'                     => 'Betreff',
1875 1887
  'Subject:'                    => 'Betreff:',
......
2288 2300
  'Updating the client fields in the database "#1" on host "#2:#3" failed.' => 'Die Aktualisierung der Mandantenfelder in der Datenbank "#1" auf Host "#2:#3" schlug fehl.',
2289 2301
  'Uploaded on #1, size #2 kB'  => 'Am #1 hochgeladen, Größe #2 kB',
2290 2302
  'Use As New'                  => 'Als neu verwenden',
2303
  'Use Webdav Repository'       => 'Webdav-Ablage verwenden',
2291 2304
  'Use existing templates'      => 'Vorhandene Druckvorlagen verwenden',
2292 2305
  'Use master default bin for Default Transfer, if no default bin for the part is configured' => 'Standardlagerplatz für Ein- / Auslagern über Standard-Lagerplatz, falls für die Ware kein expliziter Lagerplatz konfiguriert ist',
2293 2306
  'User'                        => 'Benutzer',
......
2328 2341
  'Vendors'                     => 'Lieferanten',
2329 2342
  'Verrechnungseinheit'         => 'Verrechnungseinheit',
2330 2343
  'Version'                     => 'Version',
2344
  'Vertreter'                   => 'Vertreter',
2331 2345
  'View SEPA export'            => 'SEPA-Export-Details ansehen',
2332 2346
  'View background job execution result' => 'Verlauf der Hintergrund-Job-Ausführungen anzeigen',
2333 2347
  'View background job history' => 'Hintergrund-Job-Verlauf anzeigen',
......
2348 2362
  'Warning'                     => 'Warnung',
2349 2363
  'WebDAV'                      => 'WebDAV',
2350 2364
  'WebDAV link'                 => 'WebDAV-Link',
2365
  'Webdav'                      => 'Webdav',
2366
  'Webdav save documents'       => 'Belege in Webdav-Ablage speichern',
2351 2367
  'Webserver interface'         => 'Webserverschnittstelle',
2352 2368
  'Weight'                      => 'Gewicht',
2353 2369
  'Weight unit'                 => 'Gewichtseinheit',
sql/Pg-upgrade2/defaults_feature.pl
21 21

  
22 22
  # check current configuration and set default variables accordingly, so that
23 23
  # kivitendo's behaviour isn't changed by this update
24
  # if checks are not set in config set it to true
24
  # if checks are not set in config leave it to the default value
25 25
  foreach my $check (qw(webdav vertreter parts_show_image parts_listing_image)) {
26 26
    my $check_set = $::lx_office_conf{features}->{$check} ? 1 : 0;
27
    $self->db_query("UPDATE defaults SET $check = ?", bind => [ $check_set ]);
27
    $self->db_query("UPDATE defaults SET $check = ?", bind => [ $check_set ]) if $check_set;
28 28
  }
29 29

  
30 30
  my $update_column = "UPDATE defaults SET parts_image_css = ?";
templates/webpages/client_config/form.html
62 62
   <li><a href="#datev_check_configuration">[% LxERP.t8('DATEV check configuration') %]</a></li>
63 63
   <li><a href="#orders_deleteable">[% LxERP.t8('Orders / Delivery Orders deleteable') %]</a></li>
64 64
   <li><a href="#warehouse">[% LxERP.t8('Warehouse') %]</a></li>
65
   <li><a href="#features">[% LxERP.t8('Features') %]</a></li>
65 66
  </ul>
66 67

  
67 68
[% PROCESS 'client_config/_ranges_of_numbers.html' %]
......
70 71
[% PROCESS 'client_config/_datev_check_configuration.html' %]
71 72
[% PROCESS 'client_config/_orders_deleteable.html' %]
72 73
[% PROCESS 'client_config/_warehouse.html' %]
74
[% PROCESS 'client_config/_features.html' %]
73 75
[% PROCESS 'client_config/_miscellaneous.html' %]
74 76

  
75 77
 <div>

Auch abrufbar als: Unified diff