From: Sven Schöling Date: Wed, 29 Dec 2010 10:21:10 +0000 (+0100) Subject: Merge branch 'master' of ssh://lx-office/~/lx-office-erp X-Git-Tag: release-2.6.2beta1~51 X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/commitdiff_plain/e3b8d5321e86ba3ea9dbe3997e21202935f3d140?hp=596cb5d6b26c139b7e6669546d76f4c3c0f6ee58 Merge branch 'master' of ssh://lx-office/~/lx-office-erp --- diff --git a/SL/IS.pm b/SL/IS.pm index e9e4711b1..3896277c9 100644 --- a/SL/IS.pm +++ b/SL/IS.pm @@ -46,6 +46,7 @@ use SL::GenericTranslations; use SL::MoreCommon; use SL::IC; use SL::IO; +use SL::TransNumber; use Data::Dumper; use strict; @@ -515,7 +516,7 @@ sub post_invoice { my ($self, $myconfig, $form, $provided_dbh, $payments_only) = @_; # connect to database, turn off autocommit - my $dbh = $provided_dbh ? $provided_dbh : $form->dbconnect_noauto($myconfig); + my $dbh = $provided_dbh ? $provided_dbh : $form->get_standard_dbh; my ($query, $sth, $null, $project_id, @values); my $exchangerate = 0; @@ -538,6 +539,9 @@ sub post_invoice { &reverse_invoice($dbh, $form); } else { + my $trans_number = SL::TransNumber->new(type => $form->{type}, dbh => $dbh, number => $form->{invnumber}, save => 1); + $form->{invnumber} = $trans_number->create_unique unless $trans_number->is_unique; + $query = qq|SELECT nextval('glid')|; ($form->{"id"}) = selectrow_query($form, $dbh, $query); diff --git a/SL/InstallationCheck.pm b/SL/InstallationCheck.pm index 15db0cb70..c395f1de5 100644 --- a/SL/InstallationCheck.pm +++ b/SL/InstallationCheck.pm @@ -20,6 +20,10 @@ BEGIN { { name => "FCGI", url => "http://search.cpan.org/~mstrout/" }, { name => "List::MoreUtils", version => '0.21', url => "http://search.cpan.org/~vparseval/" }, { name => "PDF::API2", version => '2.000', url => "http://search.cpan.org/~areibens/" }, + { name => "Readonly", url => "http://search.cpan.org/~roode/" }, + { name => "Rose::Object", url => "http://search.cpan.org/~jsiracusa/" }, + { name => "Rose::DB", url => "http://search.cpan.org/~jsiracusa/" }, + { name => "Rose::DB::Object", url => "http://search.cpan.org/~jsiracusa/" }, { name => "Template", version => '2.18', url => "http://search.cpan.org/~abw/" }, { name => "Text::CSV_XS", version => '0.23', url => "http://search.cpan.org/~hmbrand/" }, { name => "Text::Iconv", version => '1.2', url => "http://search.cpan.org/~mpiotr/" }, diff --git a/SL/TransNumber.pm b/SL/TransNumber.pm new file mode 100644 index 000000000..14795e4f7 --- /dev/null +++ b/SL/TransNumber.pm @@ -0,0 +1,148 @@ +package SL::TransNumber; + +use strict; + +use parent qw(Rose::Object); + +use Carp; +use List::MoreUtils qw(any none); +use Readonly; +use SL::DBUtils; + +use Rose::Object::MakeMethods::Generic +( + scalar => [ qw(type id number save dbh dbh_provided) ], +); + +# has 'type' => ( is => 'rw', required => 1 ); +# has 'id' => ( is => 'rw' ); +# has 'number' => ( is => 'rw' ); +# has 'save' => ( is => 'rw', default => 1 ); +# has 'dbh' => ( is => 'rw' ); +# has 'dbh_provided' => ( is => 'rw' ); + +Readonly my @SUPPORTED_TYPES => qw(invoice credit_note customer vendor sales_delivery_order purchase_delivery_order sales_order purchase_order sales_quotation request_quotation); + +sub new { + my $class = shift; + my $self = $class->SUPER::new(@_); + + croak "Invalid type " . $self->type if none { $_ eq $self->type } @SUPPORTED_TYPES; + + $self->dbh_provided($self->dbh); + $self->dbh($::form->get_standard_dbh) if !$self->dbh; + $self->save(1) unless defined $self->save; + + return $self; +} + +sub _get_filters { + my $self = shift; + + my $type = $self->type; + my %filters = ( where => '' ); + + if (any { $_ eq $type } qw(invoice credit_note)) { + $filters{trans_number} = "invnumber"; + $filters{numberfield} = $type eq 'credit_note' ? "cnnumber" : "invnumber"; + $filters{table} = "ar"; + + } elsif (any { $_ eq $type } qw(customer vendor)) { + $filters{trans_number} = "${type}number"; + $filters{numberfield} = "${type}number"; + $filters{table} = $type; + + } elsif ($type =~ /_delivery_order$/) { + $filters{trans_number} = "donumber"; + $filters{numberfield} = $type eq 'sales_delivery_order' ? "sdonumber" : "pdonumber"; + $filters{table} = "delivery_orders"; + $filters{where} = $type =~ /^sales/ ? '(customer_id IS NOT NULL)' : '(vendor_id IS NOT NULL)'; + + } elsif ($type =~ /_order$/) { + $filters{trans_number} = "ordnumber"; + $filters{numberfield} = $type eq 'sales_order' ? "sonumber" : "ponumber"; + $filters{table} = "oe"; + $filters{where} = 'NOT COALESCE(quotation, FALSE)'; + $filters{where} .= $type =~ /^sales/ ? ' AND (customer_id IS NOT NULL)' : ' AND (vendor_id IS NOT NULL)'; + + } else { + $filters{trans_number} = "quonumber"; + $filters{numberfield} = $type eq 'sales_quotation' ? "sqnumber" : "rfqnumber"; + $filters{table} = "oe"; + $filters{where} = 'COALESCE(quotation, FALSE)'; + $filters{where} .= $type =~ /^sales/ ? ' AND (customer_id IS NOT NULL)' : ' AND (vendor_id IS NOT NULL)'; + } + + return %filters; +} + +sub is_unique { + my $self = shift; + + return undef if !$self->number; + + my %filters = $self->_get_filters(); + + my @where; + my @values = ($self->number); + + push @where, $filters{where} if $filters{where}; + + if ($self->id) { + push @where, qq|id <> ?|; + push @values, conv_i($self->id); + } + + my $where_str = @where ? join(' AND ', map { "($_)" } @where) : ''; + my $query = <dbh, $query, @values); + + return $existing_number ? 0 : 1; +} + +sub create_unique { + my $self = shift; + + my $form = $main::form; + my %filters = $self->_get_filters(); + + do_query($form, $self->dbh, qq|LOCK TABLE defaults|); + + my $where = $filters{where} ? ' WHERE ' . $filters{where} : ''; + my $query = <dbh, $query, $filters{trans_number}, 'in_use'); + + my ($number) = selectfirst_array_query($form, $self->dbh, qq|SELECT $filters{numberfield} FROM defaults|); + $number ||= ''; + + do { + if ($number =~ m/\d+$/) { + my $new_number = substr($number, $-[0]) * 1 + 1; + my $len_diff = length($number) - $-[0] - length($new_number); + $number = substr($number, 0, $-[0]) . ($len_diff > 0 ? '0' x $len_diff : '') . $new_number; + + } else { + $number = $number . '1'; + } + } while ($numbers_in_use{$number}); + + if ($self->save) { + do_query($form, $self->dbh, qq|UPDATE defaults SET $filters{numberfield} = ?|, $number); + $self->dbh->commit if !$self->dbh_provided; + } + + return $number; +} + +1; diff --git a/bin/mozilla/do.pl b/bin/mozilla/do.pl index 120606acd..8299a1abf 100644 --- a/bin/mozilla/do.pl +++ b/bin/mozilla/do.pl @@ -179,9 +179,9 @@ sub order_links { # get customer / vendor if ($form->{vc} eq 'vendor') { IR->get_vendor(\%myconfig, \%$form); + $form->{discount} = $form->{vendor_discount}; } else { IS->get_customer(\%myconfig, \%$form); - # OFFEN tritt bug 1284 auch bei vendor auf? $form->{discount} = $form->{customer_discount}; } @@ -733,9 +733,9 @@ sub invoice { for my $i (1 .. $form->{rowcount}) { # für bug 1284 - if ($form->{discount}){ # Falls wir einen Kundenrabatt haben + if ($form->{discount}){ # Falls wir einen Lieferanten-/Kundenrabatt haben # und keinen anderen discount wert an $i ... - $form->{"discount_$i"} ||= $form->{discount}*100; # ... nehmen wir den kundenrabatt + $form->{"discount_$i"} ||= $form->{discount}*100; # ... nehmen wir diesen Rabatt } map { $form->{"${_}_${i}"} = $form->parse_amount(\%myconfig, $form->{"${_}_${i}"}) if $form->{"${_}_${i}"} } qw(ship qty sellprice listprice lastcost basefactor); } @@ -846,15 +846,35 @@ sub invoice_multi { map { delete $form->{$_} } qw(id subject message cc bcc printed emailed queued); + # get vendor or customer discount + my $vc_discount; + my $saved_form = save_form(); + if ($form->{vc} eq 'vendor') { + IR->get_vendor(\%myconfig, \%$form); + $vc_discount = $form->{vendor_discount}; + } else { + IS->get_customer(\%myconfig, \%$form); + $vc_discount = $form->parse_amount(\%myconfig, $form->{customer_discount}); + } + restore_form($saved_form); + $form->{rowcount} = 0; foreach my $ref (@{ $form->{form_details} }) { $form->{rowcount}++; $ref->{reqdate} ||= $ref->{dord_transdate}; # copy transdates into each invoice row map { $form->{"${_}_$form->{rowcount}"} = $ref->{$_} } keys %{ $ref }; - map { $form->{"${_}_$form->{rowcount}"} = $form->format_amount(\%myconfig, $ref->{$_}) } qw(qty sellprice discount lastcost); + map { $form->{"${_}_$form->{rowcount}"} = $form->format_amount(\%myconfig, $ref->{$_}) } qw(qty sellprice lastcost); + + if ($vc_discount){ # falls wir einen Lieferanten/Kundenrabatt haben + # und keinen anderen discount wert an $i ... + $form->{"discount_$form->{rowcount}"} ||= $vc_discount; # ... nehmen wir diesen Rabatt + } + $form->{"discount_$form->{rowcount}"} = $form->{"discount_$form->{rowcount}"} * 100; #s.a. Bug 1151 # Anm.: Eine Änderung des discounts in der SL/DO.pm->retrieve (select (doi.discount * 100) as discount) ergibt in psql einen # Wert von 10.0000001490116. Ferner ist der Rabatt in der Rechnung dann bei 1.0 (?). Deswegen lasse ich das hier. jb 10.10.09 + + $form->{"discount_$form->{rowcount}"} = $form->format_amount(\%myconfig, $form->{"discount_$form->{rowcount}"}); } delete $form->{form_details}; diff --git a/bin/mozilla/is.pl b/bin/mozilla/is.pl index b38cfd1d5..b5e0927fe 100644 --- a/bin/mozilla/is.pl +++ b/bin/mozilla/is.pl @@ -513,7 +513,11 @@ sub update { my $rows = scalar @{ $form->{item_list} }; - $form->{"discount_$i"} = $form->format_amount(\%myconfig, $form->{customer_discount} * 100); + # Falls kein Kundenrabatt vorhanden ist, den aktuellen Rabatt nicht mit 0% überschreiben, + # da hier der Anwender schon manual einen Wert eingetragen haben könnte (analog zu qty) Bugfix: 1412 + if ($form->{customer_discount}){ + $form->{"discount_$i"} = $form->format_amount(\%myconfig, $form->{customer_discount} * 100); + } if ($rows) { $form->{"qty_$i"} = ($form->{"qty_$i"} * 1) ? $form->{"qty_$i"} : 1; diff --git a/bin/mozilla/rp.pl b/bin/mozilla/rp.pl index b0831022c..e3c64b0c6 100644 --- a/bin/mozilla/rp.pl +++ b/bin/mozilla/rp.pl @@ -1064,8 +1064,9 @@ sub generate_income_statement { last SWITCH; }; } - } - + hotfix_reformat_date(); + } # Ende Bericht für vorgewählten Zeitraum (warum auch immer die Prüfung (custom eq true) ist ... + RP->income_statement(\%myconfig, \%$form); ($form->{department}) = split /--/, $form->{department}; @@ -1294,6 +1295,7 @@ sub generate_trial_balance { last SWITCH; }; } + hotfix_reformat_date(); } @@ -2728,6 +2730,7 @@ sub generate_bwa { last SWITCH; }; } + hotfix_reformat_date(); } else { # die konvertierungen nur dann durchführen, wenn auch daten gesetzt sind. # ansonsten ist die prüfung in RP.pm @@ -2735,12 +2738,12 @@ sub generate_bwa { # immer wahr if ($form->{fromdate}){ my ($yy, $mm, $dd) = $locale->parse_date(\%myconfig, $form->{fromdate}); - $form->{fromdate} = "${dd}.${mm}.${yy}"; - $form->{comparefromdate} = "01.01.$yy"; + my $datetime = $locale->parse_date_to_object(\%myconfig, $form->{fromdate}); + $datetime->set( month => 1, + day => 1); + $form->{comparefromdate} = $locale->format_date(\%::myconfig, $datetime); } if ($form->{todate}){ - my ($yy, $mm, $dd) = $locale->parse_date(\%myconfig, $form->{todate}); - $form->{todate} = "${dd}.${mm}.${yy}"; $form->{comparetodate} = $form->{todate}; } } @@ -2787,5 +2790,32 @@ sub generate_bwa { $main::lxdebug->leave_sub(); } +### +# Hotfix, um das Datumsformat, die unten hart auf deutsches Datumsformat eingestellt +# sind, entsprechend mit anderem Formaten (z.B. iso-kodiert) zum Laufen zu bringen (S.a.: Bug 1388) +sub hotfix_reformat_date { + + $main::lxdebug->enter_sub(); + + my $form = $main::form; + my %myconfig = %main::myconfig; + my $locale = $main::locale; + + if ($myconfig{dateformat} ne 'dd.mm.yyyy'){ + my $current_dateformat = $myconfig{dateformat}; + $myconfig{dateformat} = 'dd.mm.yyyy'; + $form->{fromdate} = $main::locale->reformat_date(\%myconfig, $form->{fromdate}, $current_dateformat); + $form->{todate} = $main::locale->reformat_date(\%myconfig, $form->{todate}, $current_dateformat); + $form->{comparefromdate} = $main::locale->reformat_date(\%myconfig, $form->{comparefromdate}, $current_dateformat) + unless (!defined ($form->{comparefromdate})); + $form->{comparetodate} = $main::locale->reformat_date(\%myconfig, $form->{comparetodate}, $current_dateformat) + unless (!defined ($form->{comparetodate})); + + # Und wieder zurücksetzen + $myconfig{dateformat} = $current_dateformat; #'dd.mm.yyyy'; + } # Ende Hotifx Bug 1388 + + $main::lxdebug->leave_sub(); +} 1; diff --git a/bin/mozilla/vk.pl b/bin/mozilla/vk.pl index 16fcc78b7..73a7a6921 100644 --- a/bin/mozilla/vk.pl +++ b/bin/mozilla/vk.pl @@ -35,6 +35,7 @@ use POSIX qw(strftime); use List::Util qw(sum first); use SL::VK; +use SL::IS; use SL::ReportGenerator; use Data::Dumper; @@ -88,7 +89,23 @@ sub invoice_transactions { $form->{customer} = $form->unescape($form->{customer}); - ($form->{customername}, $form->{customer_id}) = split(/--/, $form->{customer}); + if ( $form->{customer} =~ /--/ ) { + # Felddaten kommen aus Dropdownbox + ($form->{customername}, $form->{customer_id}) = split(/--/, $form->{customer}); + } else { + # Felddaten kommen aus Freitextfeld + + # check_name wird mit no_select => 1 ausgeführt, ist die Abfrage nicht eindeutig kommt ein Fehler + # und die Abfrage muß erneut ausgeführt werden + + # Ohne no_select kommt bei Auswahl des Kunden ein Aufruf von update der ins + # Nichts führt, daher diese Zwischenlösung + + &check_name('customer', no_select => 1); + + # $form->{customer_id} wurde schon von check_name gesetzt + $form->{customername} = $form->{customer}; + }; # decimalplaces überprüfen oder auf Default 2 setzen $form->{decimalplaces} = 2 unless $form->{decimalplaces} > 0 && $form->{decimalplaces} < 6; diff --git a/doc/INSTALL.texi b/doc/INSTALL.texi index 7368d95f8..2f7437dd5 100644 --- a/doc/INSTALL.texi +++ b/doc/INSTALL.texi @@ -80,6 +80,14 @@ List::MoreUtils @item PDF::API2 @item +Readonly (benötigt) und Readonly::XS (optional) +@item +Rose::Object +@item +Rose::DB +@item +Rose::DB::Object +@item Template @item Text::CSV_XS diff --git a/doc/INSTALL.txt b/doc/INSTALL.txt index 92c59f99e..89b8f15e0 100644 --- a/doc/INSTALL.txt +++ b/doc/INSTALL.txt @@ -72,6 +72,14 @@ Bestandteil einer Standard-Perl-Installation sind: * PDF::API2 + * Readonly (benötigt) und Readonly::XS (optional) + + * Rose::Object + + * Rose::DB + + * Rose::DB::Object + * Template * Text::CSV_XS @@ -106,7 +114,9 @@ Distributionen unterschiedlich heißen. libdatetime-perl libdbi-perl libdbd-pg-perl libpg-perl libemail-address-perl libio-stringy-perl liblist-moreutils-perl libpdf-api2-perl libtemplate-perl libtext-csv-xs-perl -libtext-iconv-perl liburi-perl libxml-writer-perl libyaml-perl' +libtext-iconv-perl liburi-perl libxml-writer-perl libyaml-perl +librose-object-perl librose-db-perl librose-db-object-perl +libreadonly-xs-perl' Für Fedora Core benötigen Sie diese Pakete: diff --git a/doc/INSTALL/Ben_00c3_00b6tigte-Software-und-Pakete.html b/doc/INSTALL/Ben_00c3_00b6tigte-Software-und-Pakete.html index a852abace..90c9a2021 100644 --- a/doc/INSTALL/Ben_00c3_00b6tigte-Software-und-Pakete.html +++ b/doc/INSTALL/Ben_00c3_00b6tigte-Software-und-Pakete.html @@ -48,6 +48,10 @@ Up: Top
  • Email::Address
  • List::MoreUtils
  • PDF::API2 +
  • Readonly (benötigt) und Readonly::XS (optional) +
  • Rose::Object +
  • Rose::DB +
  • Rose::DB::Object
  • Template
  • Text::CSV_XS
  • Text::Iconv diff --git a/doc/UPGRADE b/doc/UPGRADE index 190181850..6f9a9ec5f 100644 --- a/doc/UPGRADE +++ b/doc/UPGRADE @@ -4,6 +4,30 @@ Wichtige Hinweise zum Upgrade von älteren Versionen ** BITTE FERTIGEN SIE VOR DEM UPGRADE EIN BACKUP IHRER DATENBANK(EN) AN! ** +Upgrade auf v2.6.2 +================== + + Vor dem Einloggen + ----------------- + +Mit Version 2.6.2 sind einige Abhängigkeiten von Perl-Modulen hinzugekommen. +Bitte führen sie vor dem ersten Aufrufen der einmal den folgenden Befehl im +Lx-Office Verzeichnis aus: + +$ scripts/installation_check.pl + +Sollten Module als fehlend markiert sein, folgen Sie bitte den Anweisungen in +der Installationsanweisung. + +Zumindest folgende Module sind neu benötigt: + +* Readonly (optional mit Begleitermodul Readonly::XS) +* Rose::Object, Rose::DB und Rose::DB::Object (die Installation von + Rose::DB::Object via CPAN oder den Paketmechanismus Ihrer + Distribution sollte für die automatische Installation der anderen + zwei Pakete sorgen) + + Upgrade auf v2.6.1 ================== diff --git a/locale/de_DE/all b/locale/de_DE/all index 9cf56b7c6..16db51adf 100644 --- a/locale/de_DE/all +++ b/locale/de_DE/all @@ -155,7 +155,6 @@ $self->{texts} = { 'Add bank account' => 'Bankkonto erfassen', 'Add custom variable' => 'Erweitertes Datenfeld anlegen.', 'Add note' => 'Notiz erfassen', - 'Add to group' => 'Zu Gruppe hinzufügen', 'Add unit' => 'Einheit hinzufügen', 'Address' => 'Adresse', 'Administration' => 'Administration', @@ -171,6 +170,7 @@ $self->{texts} = { 'All of the exports you have selected were already closed.' => 'Alle von Ihnen ausgewählten Exporte sind bereits abgeschlossen.', 'All reports' => 'Alle Berichte (Kontenübersicht, Summen- u. Saldenliste, GuV, BWA, Bilanz, Projektbuchungen)', 'All the selected exports have already been closed, or all of their items have already been executed.' => 'Alle ausgewählten Exporte sind als abgeschlossen markiert, oder für alle Einträge wurden bereits Zahlungen verbucht.', + 'All users' => 'Nichtmitglieder', 'Allow access' => 'Zugriff erlauben', 'Allow the following users access to my follow-ups:' => 'Erlaube den folgenden Benutzern Zugriff auf meine Wiedervorlagen:', 'Alternatively you can create a new part which will then be selected.' => 'Sie können auch einen neuen Artikel anlegen, der dann automatisch ausgewählt wird.', @@ -669,6 +669,7 @@ $self->{texts} = { 'Edit group ' => 'Gruppe bearbeiten', 'Edit group membership' => 'Gruppenmitgliedschaften bearbeiten', 'Edit groups' => 'Gruppen bearbeiten', + 'Edit membership' => 'Mitglieder', 'Edit note' => 'Notiz bearbeiten', 'Edit rights' => 'Rechte bearbeiten', 'Edit templates' => 'Vorlagen bearbeiten', @@ -1011,8 +1012,6 @@ $self->{texts} = { 'May ' => 'Mai', 'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen', 'Medium Number' => 'Datenträgernummer', - 'Members not of' => 'Nicht Mitglied in', - 'Members of' => 'Mitglied in', 'Memo' => 'Memo', 'Menu' => 'Menü', 'Message' => 'Nachricht', @@ -1091,7 +1090,6 @@ $self->{texts} = { 'No transaction selected!' => 'Bitte mindestens einen Haken in der Spalte "auswählen" setzen.', 'No transfers were executed in this export.' => 'In diesem SEPA-Export wurden keine Überweisungen ausgeführt.', 'No unknown units where found.' => 'Es wurden keine unbekannten Einheiten gefunden.', - 'No user has been selected.' => 'Es wurde kein Benutzer ausgewählt.', 'No valid number entered for pricegroup "#1".' => 'Für Preisgruppe "#1" wurde keine gültige Nummer eingegeben.', 'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.', 'No warehouse has been created yet or the quantity of the bins is not configured yet.' => 'Es wurde noch kein Lager angelegt, bzw. die dazugehörigen Lagerplätze sind noch nicht konfiguriert.', @@ -1359,7 +1357,6 @@ $self->{texts} = { 'Remove' => 'Entfernen', 'Remove Draft' => 'Entwurf löschen', 'Remove draft when posting' => 'Entwurf beim Buchen löschen', - 'Remove from group' => 'Aus Gruppe entfernen', 'Removed spoolfiles!' => 'Druckdateien entfernt!', 'Removing marked entries from queue ...' => 'Markierte Einträge werden von der Warteschlange entfernt ...', 'Rename the group' => 'Gruppe umbenennen', @@ -1699,8 +1696,6 @@ $self->{texts} = { 'The unit in row %d has been deleted in the meantime.' => 'Die Einheit in Zeile %d ist in der Zwischentzeit gelöscht worden.', 'The unit in row %d has been used in the meantime and cannot be changed anymore.' => 'Die Einheit in Zeile %d wurde in der Zwischenzeit benutzt und kann nicht mehr geändert werden.', 'The units have been saved.' => 'Die Einheiten wurden gespeichert.', - 'The user has been added to this group.' => 'Der Benutzer wurde der Gruppe hinzugefügt.', - 'The user has been removed from this group.' => 'Der Benutzer wurde aus der Gruppe entfernt.', 'The user is a member in the following group(s):' => 'Der Benutzer ist Mitglied in den folgenden Gruppen:', 'The user migration process is complete.' => 'Der Prozess der Benutzerdatenmigration ist abgeschlossen.', 'The variable name must only consist of letters, numbers and underscores. It must begin with a letter. Example: send_christmas_present' => 'Der Datenfeldname darf nur aus Zeichen (keine Umlaute), Ziffern und Unterstrichen bestehen. Er muss mit einem Buchstaben beginnen.
        Beispiel: cebit_teilnahme_2011', @@ -1839,6 +1834,7 @@ $self->{texts} = { 'User name' => 'Benutzername', 'User saved!' => 'Benutzer gespeichert!', 'Username' => 'Benutzername', + 'Users in this group' => 'Mitglieder dieser Gruppe', 'Ust-IDNr' => 'USt-IdNr.', 'Valid from' => 'Gültig ab', 'Valid until' => 'gültig bis',