Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 9a578c8b

Von Jan Büren vor fast 12 Jahren hinzugefügt

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

Trac 2300 / 2301 zweiter Versuch
;-)

Unterschiede anzeigen:

SL/Common.pm
use Carp;
use Time::HiRes qw(gettimeofday);
use Data::Dumper;
use File::Copy;
use File::stat;
use File::Slurp;
use SL::DBUtils;
......
$main::lxdebug->leave_sub();
}
#
# Legt ein entsprechendes Webdav-Verzeichnis an, falls
# Webdav als Option konfiguriert ist. Falls schon ein
# Ordner vorhanden ist, werden alle Dateien alphabetisch
# sortiert ausgelesen und an der Oberfläche angezeigt
#
sub webdav_folder {
$main::lxdebug->enter_sub();
my ($form) = @_;
return $main::lxdebug->leave_sub()
unless ($::lx_office_conf{features}->{webdav} && $form->{id});
unless ($::instance_conf->get_webdav && $form->{id});
croak "No client set in \$::auth" unless $::auth->client;
my ($path, $number);
$form->{WEBDAV} = [];
if ($form->{type} eq "sales_quotation") {
($path, $number) = ("angebote", $form->{quonumber});
} elsif ($form->{type} eq "sales_order") {
($path, $number) = ("bestellungen", $form->{ordnumber});
} elsif ($form->{type} eq "request_quotation") {
($path, $number) = ("anfragen", $form->{quonumber});
} elsif ($form->{type} eq "purchase_order") {
($path, $number) = ("lieferantenbestellungen", $form->{ordnumber});
} elsif ($form->{type} eq "sales_delivery_order") {
($path, $number) = ("verkaufslieferscheine", $form->{donumber});
} elsif ($form->{type} eq "purchase_delivery_order") {
($path, $number) = ("einkaufslieferscheine", $form->{donumber});
} elsif ($form->{type} eq "credit_note") {
($path, $number) = ("gutschriften", $form->{invnumber});
} elsif ($form->{vc} eq "customer") {
($path, $number) = ("rechnungen", $form->{invnumber});
} else {
($path, $number) = ("einkaufsrechnungen", $form->{invnumber});
}
my ($path, $number) = get_webdav_folder($form); # ausgelagert
return $main::lxdebug->leave_sub() unless ($path && $number);
$number =~ s|[/\\]|_|g;
$path = "webdav/" . $::auth->client->{id} . "/${path}/${number}";
if (!-d $path) {
mkdir_with_parents($path);
......
my $base_path = $ENV{'SCRIPT_NAME'};
$base_path =~ s|[^/]+$||;
if (opendir my $dir, $path) {
# alphabetisch sortiert.
foreach my $file (sort { lc $a cmp lc $b } readdir $dir) {
next if (($file eq '.') || ($file eq '..'));
......
}
}
#
# Diese Routine baut aus dem Masken-Typ und der
# Beleg-Nummer, das entsprechende Webdav-Verzeichnis zusammen
# Nimmt leider noch die ganze Form entgegen und den if-elsif-Block
# sollte man schöner "dispatchen"
# Ergänzung 6.5.2011, den else-Zweig defensiver gestaltet und mit
# -1 als n.i.O. Rückgabewert versehen
#
sub get_webdav_folder {
$main::lxdebug->enter_sub();
my ($form) = @_;
croak "No client set in \$::auth" unless $::auth->client;
my ($path, $number);
# dispatch table
if ($form->{type} eq "sales_quotation") {
($path, $number) = ("angebote", $form->{quonumber});
} elsif ($form->{type} eq "sales_order") {
($path, $number) = ("bestellungen", $form->{ordnumber});
} elsif ($form->{type} eq "request_quotation") {
($path, $number) = ("anfragen", $form->{quonumber});
} elsif ($form->{type} eq "purchase_order") {
($path, $number) = ("lieferantenbestellungen", $form->{ordnumber});
} elsif ($form->{type} eq "sales_delivery_order") {
($path, $number) = ("verkaufslieferscheine", $form->{donumber});
} elsif ($form->{type} eq "purchase_delivery_order") {
($path, $number) = ("einkaufslieferscheine", $form->{donumber});
} elsif ($form->{type} eq "credit_note") {
($path, $number) = ("gutschriften", $form->{invnumber});
} elsif ($form->{vc} eq "customer") {
($path, $number) = ("rechnungen", $form->{invnumber});
} elsif ($form->{vc} eq "vendor") {
($path, $number) = ("einkaufsrechnungen", $form->{invnumber});
} else {
# wir befinden uns nicht in einer belegmaske
# scheinbar wird diese routine auch bspw. bei waren
# aufgerufen - naja, steuerung über die $form halt ...
$main::lxdebug->leave_sub();
return undef;
}
$number =~ s|[/\\]|_|g;
$path = "webdav/" . $::auth->client->{id} . "/${path}/${number}";
$main::lxdebug->leave_sub();
return ($path, $number);
}
#
# Falls Webdav aktiviert ist, auch den generierten Beleg in das
# Webdav-Verzeichnis kopieren
#
#
sub copy_file_to_webdav_folder {
$main::lxdebug->enter_sub();
my ($form) = @_;
my ($last_mod_time, $latest_file_name, $complete_path);
# checks
foreach my $item (qw(tmpdir tmpfile type)){
if (!$form->{$item}){
$main::lxdebug->message(0, 'Missing parameter');
$main::form->error($main::locale->text("Missing parameter for webdav file copy"));
}
}
# Den Webdav-Ordner ÜBER exakt denselben Mechanismus wie beim
# Anlegen des Ordners bestimmen
my ($webdav_folder, $document_name) = get_webdav_folder($form);
if (! $webdav_folder){
$main::lxdebug->leave_sub();
$main::form->error($main::locale->text("Cannot check correct webdav folder"));
return undef; # s.o. erstmal so ...
}
# kompletter pfad
$complete_path = join('/', $form->{cwd}, $webdav_folder);
opendir my $dh, $complete_path or die "Could not open $complete_path: $!";
my ($newest_name, $newest_time);
while ( defined( my $file = readdir( $dh ) ) ) {
my $path = File::Spec->catfile( $complete_path, $file );
next if -d $path; # skip directories, or anything else you like
( $newest_name, $newest_time ) = ( $file, -M _ )
if( ! defined $newest_time or -M $path < $newest_time );
}
$latest_file_name = $complete_path .'/' . $newest_name;
my $filesize = stat($latest_file_name)->size;
# prüfung auf identisch oder nicht
my ($ext) = $form->{tmpfile} =~ /(\.[^.]+)$/;
my $current_file = join('/', $form->{tmpdir}, $form->{tmpfile});
my $current_filesize = stat($current_file)->size;
if ($current_filesize == $filesize) { # bei gleicher größe copy deaktivieren
$main::lxdebug->leave_sub();
return;
}
# zeitstempel und dateinamen holen
my $timestamp = get_current_formatted_time();
my $myfilename = $form->generate_attachment_filename();
# entsprechend vor der endung hinzufügen
$myfilename =~ s/\./$timestamp\./;
if (!copy(join('/', $form->{tmpdir}, $form->{tmpfile}), join('/', $form->{cwd}, $webdav_folder, $myfilename))) {
my $j = join('/', $form->{tmpdir}, $form->{tmpfile});
my $k = join('/', $form->{cwd}, $webdav_folder);
$main::lxdebug->message(0, "Copy file from $j to $k failed");
$main::form->error($main::locale->text("Copy file from #1 to #2 failed", $j, $k));
}
$main::lxdebug->leave_sub();
}
sub get_current_formatted_time {
$main::lxdebug->enter_sub();
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
my $formatted_current_time = sprintf ( "_%04d%02d%02d_%02d%02d%02d",
$year+1900,$mon+1,$mday,$hour,$min,$sec);
$main::lxdebug->leave_sub();
return $formatted_current_time;
}
1;
__END__
SL/DB/AuthClient.pm
sub _after_save_ensure_webdav_symlink_correctness {
my ($self) = @_;
$self->ensure_webdav_symlink_correctness($self->{__before_save_remember_old_name}) if $self->id && $::lx_office_conf{features}->{webdav};
$self->ensure_webdav_symlink_correctness($self->{__before_save_remember_old_name}) if $self->id && $::instance_conf->get_webdav;
return 1;
}
sub _after_delete_delete_webdav_symlink {
my ($self) = @_;
return 1 if !$::lx_office_conf{features}->{webdav};
return 1 if !$::instance_conf->get_webdav;
my $name = $self->webdav_symlink_basename;
unlink "webdav/links/${name}";
return 1;
......
sub ensure_webdav_symlink_correctness {
my ($self, $old_name) = @_;
return unless $::lx_office_conf{features}->{webdav};
return unless $::instance_conf->get_webdav;
croak "Need object ID" unless $self->id;
SL/DB/MetaSetup/Default.pm
mtime => { type => 'timestamp' },
rmanumber => { type => 'text' },
cnnumber => { type => 'text' },
accounting_method => { type => 'text' },
inventory_system => { type => 'text' },
profit_determination => { type => 'text' },
dunning_ar_amount_fee => { type => 'integer' },
dunning_ar_amount_interest => { type => 'integer' },
dunning_ar => { type => 'integer' },
pdonumber => { type => 'text' },
sdonumber => { type => 'text' },
id => { type => 'serial', not_null => 1 },
ar_paid_accno_id => { type => 'integer' },
id => { type => 'serial', not_null => 1 },
language_id => { type => 'integer' },
accounting_method => { type => 'text' },
inventory_system => { type => 'text' },
profit_determination => { type => 'text' },
datev_check_on_sales_invoice => { type => 'boolean', default => 'true' },
datev_check_on_purchase_invoice => { type => 'boolean', default => 'true' },
datev_check_on_ar_transaction => { type => 'boolean', default => 'true' },
......
ir_show_mark_as_paid => { type => 'boolean', default => 'true' },
ar_show_mark_as_paid => { type => 'boolean', default => 'true' },
ap_show_mark_as_paid => { type => 'boolean', default => 'true' },
assemblynumber => { type => 'text' },
currency_id => { type => 'integer', not_null => 1 },
warehouse_id => { type => 'integer' },
bin_id => { type => 'integer' },
max_future_booking_interval => { type => 'integer', default => 360 },
assemblynumber => { type => 'text' },
show_weight => { type => 'boolean', default => 'false', not_null => 1 },
transfer_default => { type => 'boolean', default => 'true' },
transfer_default_use_master_default_bin => { type => 'boolean', default => 'false' },
transfer_default_ignore_onhand => { type => 'boolean', default => 'false' },
warehouse_id_ignore_onhand => { type => 'integer' },
bin_id_ignore_onhand => { type => 'integer' },
currency_id => { type => 'integer', not_null => 1 },
company => { type => 'text' },
address => { type => 'text' },
taxnumber => { type => 'text' },
......
duns => { type => 'text' },
sepa_creditor_id => { type => 'text' },
templates => { type => 'text' },
max_future_booking_interval => { type => 'integer', default => 360 },
webdav => { type => 'boolean', default => 'false' },
webdav_documents => { type => 'boolean', default => 'false' },
vertreter => { type => 'boolean', default => 'false' },
parts_show_image => { type => 'boolean', default => 'true' },
parts_listing_image => { type => 'boolean', default => 'true' },
parts_image_css => { type => 'text', default => 'border:0;float:left;max-width:250px;margin-top:20px:margin-right:10px;margin-left:10px;' },
);
__PACKAGE__->meta->primary_key_columns([ 'id' ]);
SL/Form.pm
map { $additional_params->{"myconfig_${_}"} = $main::myconfig{$_}; } keys %::myconfig;
}
$additional_params->{"conf_webdav"} = $::lx_office_conf{features}->{webdav};
$additional_params->{"conf_webdav"} = $::instance_conf->get_webdav;
$additional_params->{"conf_latex_templates"} = $::lx_office_conf{print_templates}->{latex};
$additional_params->{"conf_opendocument_templates"} = $::lx_office_conf{print_templates}->{opendocument};
$additional_params->{"conf_vertreter"} = $::lx_office_conf{features}->{vertreter};
$additional_params->{"conf_parts_image_css"} = $::lx_office_conf{features}->{parts_image_css};
$additional_params->{"conf_parts_listing_images"} = $::lx_office_conf{features}->{parts_listing_images};
$additional_params->{"conf_parts_show_image"} = $::lx_office_conf{features}->{parts_show_image};
$additional_params->{"conf_vertreter"} = $::instance_conf->get_vertreter;
$additional_params->{"conf_parts_image_css"} = $::instance_conf->get_parts_image_css;
$additional_params->{"conf_parts_listing_images"} = $::instance_conf->get_parts_listing_images;
$additional_params->{"conf_parts_show_image"} = $::instance_conf->get_parts_show_image;
$additional_params->{"INSTANCE_CONF"} = $::instance_conf;
if (my $debug_options = $::lx_office_conf{debug}{options}) {
......
$self->cleanup();
$self->error("$self->{IN} : " . $template->get_error());
}
Common::copy_file_to_webdav_folder($self) if ($::instance_conf->get_webdav
and $::instance_conf->get_webdav_documents and not $self->{preview});
close OUT if $self->{OUT};
if ($self->{media} eq 'file') {
SL/InstanceConfiguration.pm
return ($self->{data}->{max_future_booking_interval});
}
sub get_webdav {
my ($self) = @_;
return ($self->{data}->{webdav});
}
sub get_webdav_documents {
my ($self) = @_;
return ($self->{data}->{webdav_documents});
}
sub get_vertreter {
my ($self) = @_;
return ($self->{data}->{vertreter});
}
sub get_parts_show_image {
my ($self) = @_;
return ($self->{data}->{parts_show_image});
}
sub get_parts_listing_images{
my ($self) = @_;
return ($self->{data}->{parts_listing_image});
}
sub get_parts_image_css {
my ($self) = @_;
return ($self->{data}->{parts_image_css});
}
1;
......
Returns the maximum interval value for future bookings
=item C<get_webdav>
Returns the configuration for webdav
=item C<get_webdav_documents>
Returns the configuration for storing documents in the corresponding webdav folder
=item C<get_vertreter>
Returns the configuration for "vertreter"
=item C<get_parts_show_image>
Returns the configuarion for show image in parts
=item C<get_parts_image_css>
Returns the css format string for images shown in parts
=item C<get_parts_listing_image>
Returns the configuartion for showing the picture in the results when you search for parts
=back
=head1 BUGS
bin/mozilla/ct.pl
my @columns = (
'id', 'name', "$form->{db}number", 'contact', 'phone',
'fax', 'email', 'taxnumber', 'street', 'zipcode' , 'city',
'business', 'invnumber', 'ordnumber', 'quonumber', 'salesman', 'country'
'business', 'invnumber', 'ordnumber', 'quonumber', 'salesman', 'country'
);
my @includeable_custom_variables = grep { $_->{includeable} } @{ $cvar_configs };
......
currencies => "ALL_CURRENCIES");
$form->get_pricegroup(\%myconfig, { all => 1 });
$form->get_lists(customers => { key => "ALL_SALESMAN_CUSTOMERS", business_is_salesman => 1 }) if $::lx_office_conf{features}->{vertreter};
$form->get_lists(customers => { key => "ALL_SALESMAN_CUSTOMERS", business_is_salesman => 1 }) if $::instance_conf->get_vertreter;
$form->{ALL_EMPLOYEES} = SL::DB::Manager::Employee->get_all(query => [ or => [ id => $::form->{FU_created_for_user}, deleted => 0 ] ]);
$form->{ALL_SALESMEN} = SL::DB::Manager::Employee->get_all(query => [ or => [ id => $::form->{salesman_id}, deleted => 0 ] ]);
$form->{USER} = SL::DB::Manager::Employee->current;
......
$::form->isblank("name", $::locale->text("Name missing!"));
if ($::form->{new_salesman_id} && $::lx_office_conf{features}->{vertreter}) {
if ($::form->{new_salesman_id} && $::instance_conf->get_vertreter) {
$::form->{salesman_id} = $::form->{new_salesman_id};
delete $::form->{new_salesman_id};
}
bin/mozilla/do.pl
$form->all_vc(\%myconfig, $form->{vc}, ($form->{vc} eq 'customer') ? "AR" : "AP");
# retrieve order/quotation
$form->{webdav} = $::lx_office_conf{features}->{webdav};
$form->{webdav} = $::instance_conf->get_webdav;
$form->{jsscript} = 1;
my $editing = $form->{id};
bin/mozilla/ir.pl
$form->{vc} = 'vendor';
# create links
$form->{webdav} = $::lx_office_conf{features}->{webdav};
$form->{webdav} = $::instance_conf->get_webdav;
$form->{jsscript} = 1;
$form->create_links("AP", \%myconfig, "vendor");
bin/mozilla/is.pl
$form->{vc} = 'customer';
# create links
$form->{webdav} = $::lx_office_conf{features}->{webdav};
$form->{webdav} = $::instance_conf->get_webdav;
$form->create_links("AR", \%myconfig, "customer");
bin/mozilla/oe.pl
$form->all_vc(\%myconfig, $form->{vc}, ($form->{vc} eq 'customer') ? "AR" : "AP");
# retrieve order/quotation
$form->{webdav} = $::lx_office_conf{features}->{webdav};
$form->{webdav} = $::instance_conf->get_webdav;
$form->{jsscript} = 1;
my $editing = $form->{id};
......
print $form->parse_html_template("oe/form_footer", {
%TMPL_VAR,
webdav => $::lx_office_conf{features}->{webdav},
webdav => $::instance_conf->get_webdav,
print_options => print_options(inline => 1),
label_edit => $locale->text("Edit the $form->{type}"),
label_workflow => $locale->text("Workflow $form->{type}"),
config/kivitendo.conf.default
# and "en" (English, not perfect) are available.
language = de
[features]
# Activate certain optional features and modules.
webdav = 0
vertreter = 0
## Pictures for parts
# Show the picture in the part form
parts_show_image = 1
# Style the picture with the following CSS code:
parts_image_css = border:0;float:left;max-width:250px;margin-top:20px:margin-right:10px;margin-left:10px;
# Show the picture in the results when you search for parts
parts_listing_images = 0
[paths]
# path to temporary files (must be writeable by the web server)
userspath = users
doc/changelog
- #1897 implementiert. Zukunfts-Buchungen verhindern, durch einen konfigurierbaren
maximalen Zeitraum in dem in die Zukunft gebucht werden darf (default 360 Tage)
- #2300 Alle Feature-Konfigurationen sind jetzt in der Mandantenkonfiguration eingestellt
- #2301 Dokumentenbelege optional in webdav-Ordner speichern
Wichtige Änderungen:
locale/de/all
'CRM status' => 'Admin Status',
'CRM termin' => 'Termine',
'CRM user' => 'Admin Benutzer',
'CSS style for pictures' => 'CSS Style für Bilder',
'CSV export -- options' => 'CSV-Export -- Optionen',
'CSV import: contacts' => 'CSV-Import: Ansprechpersonen',
'CSV import: customers and vendors' => 'CSV-Import: Kunden und Lieferanten',
......
'Cancel' => 'Abbrechen',
'Cancel Accounts Payables Transaction' => 'Kreditorenbuchung stornieren',
'Cancel Accounts Receivables Transaction' => 'Debitorenbuchung stornieren',
'Cannot check correct webdav folder' => 'Kann nicht den richtigen webdav Pfad überprüfen',
'Cannot delete account!' => 'Konto kann nicht gelöscht werden!',
'Cannot delete customer!' => 'Kunde kann nicht gelöscht werden!',
'Cannot delete default account!' => 'Das Standard-Konto kann nicht gelöscht werden!',
......
'Contra' => 'gegen',
'Conversion of "birthday" contact person attribute' => 'Umstellung des Kontaktpersonenfeldes "Geburtstag"',
'Copies' => 'Kopien',
'Copy file from #1 to #2 failed' => 'Datei von #1 nach #2 kopieren fehlgeschlagen',
'Correct taxkey' => 'Richtiger Steuerschlüssel',
'Costs' => 'Kosten',
'Could not load class #1 (#2): "#3"' => 'Konnte Klasse #1 (#2) nicht laden: "#3"',
......
'Factor missing!' => 'Der Faktor fehlt.',
'Falsches Datumsformat!' => 'Falsches Datumsformat!',
'Fax' => 'Fax',
'Features' => 'Features',
'Feb' => 'Feb',
'February' => 'Februar',
'Fee' => 'Gebühr',
......
'Missing amount' => 'Fehlbetrag',
'Missing parameter #1 in call to sub #2.' => 'Fehlender Parameter \'#1\' in Funktionsaufruf \'#2\'.',
'Missing parameter (at least one of #1) in call to sub #2.' => 'Fehlernder Parameter (mindestens einer aus \'#1\') in Funktionsaufruf \'#2\'.',
'Missing parameter for webdav file copy' => 'Fehlender Parameter für webdav Datei kopieren',
'Missing taxkeys in invoices with taxes.' => 'Fehlende Steuerschl&uuml;ssel in Rechnungen mit Steuern',
'Mitarbeiter' => 'Mitarbeiter',
'Mixed (requires column "type")' => 'Gemischt (erfordert Spalte "type")',
......
'Phone1' => 'Telefon 1 ',
'Phone2' => 'Telefon 2',
'Pick List' => 'Sammelliste',
'Pictures for parts' => 'Bilder für Waren',
'Pictures for search parts' => 'Bilder für Warensuche',
'Please Check the bank information for each customer:' => 'Bitte überprüfen Sie die Bankinformationen der Kunden:',
'Please Check the bank information for each vendor:' => 'Bitte überprüfen Sie die Kontoinformationen der Lieferanten:',
'Please ask your administrator to create warehouses and bins.' => 'Bitten Sie Ihren Administrator, dass er Lager und Lagerpl&auml;tze anlegt.',
......
'Report for' => 'Bericht für',
'Reports' => 'Berichte',
'Representative' => 'Vertreter',
'Representative for Customer' => 'Vertreter für Kunden',
'Reqdate' => 'Liefertermin',
'Request Quotations' => 'Preisanfragen',
'Request for Quotation' => 'Anfrage',
......
'Save and close' => 'Speichern und schlie&szlig;en',
'Save and execute' => 'Speichern und ausführen',
'Save as new' => 'als neu speichern',
'Save document in webdav repository' => 'Dokument in webdav-Ablage speichern',
'Save draft' => 'Entwurf speichern',
'Save profile' => 'Profil speichern',
'Save settings as' => 'Einstellungen speichern unter',
......
'Show overdue sales quotations and requests for quotations...' => 'Überfällige Angebote und Preisanfragen anzeigen...',
'Show parts' => 'Artikel anzeigen',
'Show settings' => 'Einstellungen anzeigen',
'Show the picture in the part form' => 'Bild in Warenmaske anzeigen',
'Show the pictures in the result for search parts' => 'Bilder in Suchergebnis für Stammdaten -> Berichte -> Waren anzeigen',
'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?',
'Show weights' => 'Gewichte anzeigen',
'Show your TODO list after loggin in' => 'Aufgabenliste nach dem Anmelden anzeigen',
......
'Storno (one letter abbreviation)' => 'S',
'Storno Invoice' => 'Stornorechnung',
'Street' => 'Straße',
'Style the picture with the following CSS code' => 'Bildeigenschaft mit folgendem CSS-Style versehen',
'Stylesheet' => 'Stilvorlage',
'Subject' => 'Betreff',
'Subject:' => 'Betreff:',
......
'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.',
'Uploaded on #1, size #2 kB' => 'Am #1 hochgeladen, Größe #2 kB',
'Use As New' => 'Als neu verwenden',
'Use Webdav Repository' => 'Webdav-Ablage verwenden',
'Use existing templates' => 'Vorhandene Druckvorlagen verwenden',
'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',
'User' => 'Benutzer',
......
'Vendors' => 'Lieferanten',
'Verrechnungseinheit' => 'Verrechnungseinheit',
'Version' => 'Version',
'Vertreter' => 'Vertreter',
'View SEPA export' => 'SEPA-Export-Details ansehen',
'View background job execution result' => 'Verlauf der Hintergrund-Job-Ausführungen anzeigen',
'View background job history' => 'Hintergrund-Job-Verlauf anzeigen',
......
'Warning' => 'Warnung',
'WebDAV' => 'WebDAV',
'WebDAV link' => 'WebDAV-Link',
'Webdav' => 'Webdav',
'Webdav save documents' => 'Belege in Webdav-Ablage speichern',
'Webserver interface' => 'Webserverschnittstelle',
'Weight' => 'Gewicht',
'Weight unit' => 'Gewichtseinheit',
sql/Pg-upgrade2/defaults_feature.pl
# check current configuration and set default variables accordingly, so that
# kivitendo's behaviour isn't changed by this update
# if checks are not set in config set it to true
# if checks are not set in config leave it to the default value
foreach my $check (qw(webdav vertreter parts_show_image parts_listing_image)) {
my $check_set = $::lx_office_conf{features}->{$check} ? 1 : 0;
$self->db_query("UPDATE defaults SET $check = ?", bind => [ $check_set ]);
$self->db_query("UPDATE defaults SET $check = ?", bind => [ $check_set ]) if $check_set;
}
my $update_column = "UPDATE defaults SET parts_image_css = ?";
templates/webpages/client_config/form.html
<li><a href="#datev_check_configuration">[% LxERP.t8('DATEV check configuration') %]</a></li>
<li><a href="#orders_deleteable">[% LxERP.t8('Orders / Delivery Orders deleteable') %]</a></li>
<li><a href="#warehouse">[% LxERP.t8('Warehouse') %]</a></li>
<li><a href="#features">[% LxERP.t8('Features') %]</a></li>
</ul>
[% PROCESS 'client_config/_ranges_of_numbers.html' %]
......
[% PROCESS 'client_config/_datev_check_configuration.html' %]
[% PROCESS 'client_config/_orders_deleteable.html' %]
[% PROCESS 'client_config/_warehouse.html' %]
[% PROCESS 'client_config/_features.html' %]
[% PROCESS 'client_config/_miscellaneous.html' %]
<div>

Auch abrufbar als: Unified diff