if ($self->{login}) {
if ($self->{password}) {
- $form->{password} = crypt $form->{password},
- substr($self->{login}, 0, 2);
+ if ($form->{hashed_password}) {
+ $form->{password} = $form->{hashed_password};
+ } else {
+ $form->{password} = crypt($form->{password},
+ substr($self->{login}, 0, 2));
+ }
if ($self->{password} ne $form->{password}) {
$main::lxdebug->leave_sub();
return -1;
$!";
map { $form->{$_} = $myconfig{$_} }
- qw(dbname dbhost dbport dbdriver dbuser dbpasswd);
+ qw(dbname dbhost dbport dbdriver dbuser dbpasswd dbconnect);
$form->{dbupdate} = "db$myconfig{dbname}";
$form->{ $form->{dbupdate} } = 1;
}
+.subsubheading {
+ color: black;
+ font-weight: bolder;
+ text-decoration: underline;
+}
+
.optionen {
border:dashed;
/* padding-top:10px;
'Assemblies restocked!' => 'Erzeugnisse sind im Lager!',
'Assembly Number missing!' => 'Erzeugnisnummer fehlt!',
'Asset' => 'Aktiva/Mittelverwendung',
+ 'Assign new units' => 'Neue Einheiten zuweisen',
+ 'Assign units' => 'Einheiten zuweisen',
'Attach PDF:' => 'PDF anhängen',
'Attachment' => 'als Anhang',
'Audit Control' => 'Bücherkontrolle',
'BLZ: ' => 'BLZ: ',
'BOM' => 'Stückliste',
'BWA' => 'BWA',
+ 'Back' => 'Zurück',
'Back to user config...' => 'Benutzereinstellungen',
'Backup sent to' => 'Eine Sicherungskopie wurde gesandt an',
'Balance' => 'Bilanz',
'Current' => 'Betrag',
'Current / Next Level' => 'Aktuelles / Nächstes Mahnlevel',
'Current Earnings' => 'Gewinn',
+ 'Current unit' => 'Aktuelle Einheit',
'Customer' => 'Kunde',
'Customer Number' => 'Kundennummer',
'Customer Order Number' => 'Bestellnummer des Kunden',
'Database Driver not checked!' => 'Kein Datenbanktreiber ausgewählt!',
'Database Host' => 'Datenbankcomputer',
'Database User missing!' => 'Datenbankbenutzer fehlt!',
+ 'Database update error:' => '',
'Datapreis' => '',
'Dataset' => 'Datenbank',
'Dataset missing!' => 'Datenbank fehlt!',
'Description missing!' => 'Beschreibung fehlt.',
'Description must not be empty!' => 'Beschreibung darf nicht leer sein',
'Difference' => 'Differenz',
+ 'Dimension unit' => 'Maßeinheit',
'Dimension units' => 'Maßeinheiten',
'Directory' => 'Verzeichnis',
'Discount' => 'Rabatt',
'Erlöse EU m. UStId' => 'Erlöse EU m. UStId',
'Erlöse EU o. UStId' => 'Erlöse EU o. UStId',
'Erlöse Inland' => 'Erlöse Inland',
+ 'Error' => 'Fehler',
'Error!' => 'Fehler!',
'Exch' => 'Wechselkurs.',
'Exchangerate' => 'Wechselkurs',
'Finanzamt - Einstellungen' => 'Finanzamt - Einstellungen',
'Firma' => 'Firma',
'Folgekonto' => 'Folgekonto',
+ 'For each unit there\'s either no or exactly one base unit. If you chose a base unit then you also have to chose a factor. That way the new unit will be defined as a multiple of the base unit. The base unit must be the "smaller" one. A factor may not be less than 1. Therefore you may define "kg" with the base unit "g" and a factor of "1", but not the other way round.' => 'Einheiten haben entweder keine oder genau eine Basiseinheit, von der sie ein Vielfaches sind. Wenn Sie eine Basiseinheit auswählen, dann müssen Sie auch einen Faktor eingeben. Sie müssen Einheiten als ein Vielfaches einer kleineren Einheit eingeben. So ist die Definition von "kg" mit der Basiseinheit "g" und dem Faktor 1000 zulässig, die Definition von "g" mit der Basiseinheit "kg" und dem Faktor "0,001" hingegen nicht.',
'Foreign Exchange Gain' => 'Wechselkurserträge',
'Foreign Exchange Loss' => 'Wechselkursaufwendungen',
'Formula' => '',
'Import Datanorm' => '',
'Impossible to create yearly Tax Report as PDF or PS.<br \> Not yet implemented!' => 'Umsatzsteuer Jahreserklärung als PDF wird noch nicht unterstützt.<br \> Bitte benutzen Sie das Ausgabeformat Vorschau.',
'Impossible to create yearly Tax Report via Winston.<br \> Not yet implemented!' => 'Umsatzsteuer Jahreserklärung via Winston wird noch nicht unterstützt.<br \> Bitte benutzen Sie das Ausgabeformat Vorschau.',
+ 'In Lx-Office 2.4.0 the administrator has to enter a list of units in the administrative section.' => 'In Lx-Office 2.4.0 muss der Administrator in den Systemeinstellungen eine Liste von verwendbaren Einheiten angeben.',
'In-line' => 'im Text',
'Include Exchangerate Difference' => 'Wechselkursunterschied einbeziehen',
'Include in Report' => 'In Bericht aufnehmen',
'Interest Rate' => 'Zinssatz',
'Internal Notes' => 'interne Bemerkungen',
'Internet' => 'Internet',
+ 'Introduction of units' => 'Einführung von Einheiten',
'Inv. Duedate' => '',
'Invdate' => 'Rechnungsdatum',
'Invdate from' => 'Rechnungen von',
'Invoices' => 'Rechnungen',
'Is this a summary account to record' => 'Buchungskonto in',
'Ist dies eine berichtigte Anmeldung? (Nr. 10/Zeile 15 Steuererklärung)' => 'Ist dies eine berichtigte Anmeldung? (Nr. 10/Zeile 15 Steuererklärung)',
+ 'It is possible to do this automatically for some units, but for others the user has to chose the new unit.' => 'Das ist für einige Einheiten automatisch möglich, aber bei anderen muss der Benutzer die neue Einheit auswählen.',
'Item deleted!' => 'Artikel gelöscht!',
'Item not on file!' => 'Dieser Artikel ist nicht in der Datenbank!',
'Jan' => 'Jan',
'Name missing!' => 'Name fehlt!',
'Netto Terms' => 'Zahlungsziel netto',
'New Templates' => 'neue Vorlagen',
+ 'New unit' => 'Neue Einheit',
'Next Dunning Level' => 'Nächste Mahnstufe',
'No' => 'Nein',
'No Customer was found matching the search parameters.' => 'Zu dem Suchbegriff wurde kein Endkunde gefunden',
'No Vendor was found matching the search parameters.' => 'Zu dem Suchbegriff wurde kein Händler gefunden',
'No email address for' => 'Keine eMailaddresse für',
'No employee was found matching the search parameters.' => 'Es wurde kein Angestellter gefunden, auf den die Suchparameter zutreffen.',
+ 'No entries were found which had no unit assigned to them.' => 'Es wurden keine Einträge gefunden, denen keine Einheit zugeordnet war.',
'No licenses were found that match the search criteria.' => 'Es wurden keine Lizenzen gefunden, auf die die Suchkriterien zutreffen.',
'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
'No project was found matching the search parameters.' => 'Es wurde kein Projekt gefunden, auf das die Suchparameter zutreffen.',
+ 'No unknown units where found.' => 'Es wurden keine unbekannten Einheiten gefunden.',
'No.' => 'Position',
'Non-taxable Purchases' => 'Nicht zu versteuernde Einkäufe',
'Non-taxable Sales' => 'Nicht zu versteuernde Verkäufe',
'Printer deleted!' => 'Drucker gelöscht!',
'Printer saved!' => 'Drucker gespeichert!',
'Printing ... ' => 'Es wird gedruckt.',
+ 'Prior to Lx-Office v2.4.0 the user could enter arbitrary strings as units for parts, services and in invoices, sales quotations etc.' => 'Vor Lx-Office 2.4.0 konnte der Benutzer bei Artikeln, Dienstleistungen und Rechnungen, Angeboten etc beliebige Einheiten angeben.',
'Private E-mail' => 'Private eMail',
'Private Phone' => 'Privates Tel.',
'Profit Center' => 'Erfolgsbereich',
'Service' => 'Dienstleistung',
'Service Items' => 'Dienstleistungen',
'Service Number missing!' => 'Dienstleistungsnummer fehlt!',
+ 'Service unit' => 'Dienstleistungseinheit',
'Service units' => 'Dienstleistungseinheiten',
'Services' => 'Dienstleistungen',
'Set Language Values' => 'Spracheinstellungen',
'Statement Balance' => 'Sammelrechnungsbilanz',
'Statement sent to' => 'Sammelrechnung verschickt an',
'Statements sent to printer!' => 'Sammelrechnungen an Drucker geschickt!',
+ 'Step 1 of 3: Parts' => 'Schritt 1 von 3: Waren',
+ 'Step 2 of 3: Services' => 'Schritt 2 von 3: Dienstleistungen',
+ 'Step 3 of 3: Default units' => 'Schritt 3 von 3: Standardeinheiten',
'Steuerberater/-in' => 'Steuerberater/-in',
'Steuernummer' => 'Steuernummer',
'Steuernummer: ' => 'Steuernummer: ',
'The base unit does not exist.' => 'Die Basiseinheit existiert nicht.',
'The base unit relations must not contain loops (e.g. by saying that unit A\'s base unit is B, B\'s base unit is C and C\'s base unit is A) in row %d.' => 'Die Beziehungen der Einheiten dürfen keine Schleifen beinhalten (z.B. wenn gesagt wird, dass Einheit As Basiseinheit B, Bs Basiseinheit C und Cs Basiseinheit A ist) in Zeile %d.',
'The database update/creation did not succeed. The file <TMPL_VAR file ESCAPE=HTML> contained the following error:' => 'Die Datenbankaktualisierung/erstellung schlug fehl. Die Datei <TMPL_VAR file ESCAPE=HTML> enthielt den folgenden Fehler:',
+ 'The database upgrade for the introduction of units is now complete.' => 'Das Datenbankupgrade zwecks Einführung von Einheiten ist nun beendet.',
'The factor is missing in row %d.' => 'Der Faktor fehlt in Zeile %d.',
'The factor is missing.' => 'Der Faktor fehlt.',
'The following Datasets are not in use and can be deleted' => 'Die folgenden Datenbanken sind nicht in Verwendung und können gelöscht werden',
'The following Datasets need to be updated' => 'Folgende Datenbanken müssen aktualisiert werden',
+ 'The following units are unknown.' => 'Die folgenden Einheiten sind unbekannt.',
+ 'The following units exist already:' => 'Die folgenden Einheiten existieren bereits:',
'The formula needs the following syntax:<br>For regular article:<br>Variablename= Variable Unit;<br>Variablename2= Variable2 Unit2;<br>...<br>###<br>Variable + ( Variable2 / Variable )<br><b>Please be beware of the spaces in the formula</b><br><br>For alu article:<br>Length:<br>Weight/m:<br>Length ist total length of article and weight/m ist the weight pro meter' => 'Die Formeln müssen in der folgenden Syntax eingegeben werden:<br>Bei normalen Artikeln:<br>Variablenname= Variable Einheit;<br>Variablenname2= Variable2 Einheit2;<br>...<br>###<br>Variable + Variable2 * ( Variable - Variable2 )<br>Bitte achten Sie auf die Leerzeichen in der Formel<br><br>Bei Aluminiumartikeln:<br>Länge: x<br>Gewicht/m: y<br>x ist die Gesamtlänge des Artikels in Meter und y das Gewicht pro Meter. Es muss jeweils die Gesamtezeile eingegeben werden',
'The licensing module has been deactivated in lx-erp.conf.' => 'Das Lizenzverwaltungsmodul wurde in lx-erp.conf deaktiviert.',
'The name in row %d has already been used before.' => 'Der Name in Zeile %d wurde vorher bereits benutzt.',
'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.',
+ 'There are still entries in the database for which no unit has been assigned.' => 'Es gibt noch Einträge in der Datenbank, für die keine Einheit zugeordnet ist.',
+ 'These units can be based on other units so that Lx-Office can convert prices when the user switches from one unit to another.' => 'Diese Einheiten können auf anderen Einheiten basieren, sodass Lx-Office Preise umrechnen kann, wenn der Benutzer von einer Einheit zu einer anderen Wechselt.',
'This is a preliminary check for existing sources. Nothing will be created or deleted at this stage!' => 'In diesem Schritt werden bestehende Datenbanken gesucht. Es werden noch keine Änderungen vorgenommen!',
+ 'This upgrade script tries to map all existing units in the database to the newly created units.' => 'Dieses Update-Script versucht, alle bestehenden Einheiten automatisch in die neuen Einheiten umzuwandeln.',
'Title' => 'Titel',
'To' => 'An',
'To add a user to a group edit a name, change the login name and save. A new user with the same variables will then be saved under the new login name.' => 'Um einer Gruppe einen neuen Benutzer hinzuzufügen, ändern und speichern Sie am einfachsten einen bestehen den Zugriffsnamen. Unter dem neuen Namen wird dann ein Benutzer mit denselben Einstellungen angelegt.',
'Yearly' => 'jährlich',
'Yes' => 'Ja',
'You are logged out!' => 'Auf Wiedersehen!',
+ 'You can also create new units now.' => 'Sie können jetzt auch neue Einheiten anlegen.',
+ 'You cannot continue until all unknown units have been mapped to known ones.' => 'Sie können nicht fortfahren, bis alle unbekannten Einheiten in neue Einheiten umgewandelt wurden.',
'You did not enter a name!' => 'Sie haben keinen Namen eingegeben!',
+ 'You have to chose a dimension unit and a service unit which will then be assigned to those entries.' => 'Sie müssen eine Maß- und eine Dienstleistungseinheit auswählen, die diesen Waren und Dienstleistungen, denen noch keine Einheit zugeordnet ist, zugeordnet wird.',
+ 'You have to chose which unit to save for each of them.' => 'Sie müssen für jeden Artikel die neue Einheit auswählen.',
'You must enter a host and port for local and remote connections!' => '"Rechner" und "Port" müssen für lokale und externe Verbindungen eingetragen werden!',
'Zeitraum' => 'Zeitraum',
'Zipcode' => 'PLZ',
--- /dev/null
+$self{texts} = {
+ 'A unit with this name does already exist.' => 'Eine Einheit mit diesem Namen existiert bereits.',
+ 'Database update error:' => 'Database update error:',
+ 'The base unit does not exist.' => 'Die Basiseinheit existiert nicht.',
+ 'The factor is missing.' => 'Der Faktor fehlt.',
+ 'The name is missing.' => 'Der Name fehlt.',
+ 'The unit has been saved.' => 'Die Einheit wurde gespeichert.',
+};
+
+$self{subs} = {
+ 'mydberror' => 'mydberror',
+ 'myshowerror' => 'myshowerror',
+ 'update_units' => 'update_units',
+ 'update_units_add_unit' => 'update_units_add_unit',
+ 'update_units_assign_known' => 'update_units_assign_known',
+ 'update_units_assign_units' => 'update_units_assign_units',
+ 'update_units_set_default' => 'update_units_set_default',
+ 'update_units_step_3' => 'update_units_step_3',
+ 'update_units_steps_1_2' => 'update_units_steps_1_2',
+ 'einheit_hinzufügen' => 'add_unit',
+ 'einheiten_zuweisen' => 'assign_units',
+};
+
+1;
--- /dev/null
+#!/usr/bin/perl
+
+die("This script cannot be run from the command line.") unless ($main::form);
+
+use SL::AM;
+
+%dbup_myconfig = ();
+map({ $dbup_myconfig{$_} = $main::form->{$_}; }
+ qw(dbname dbuser dbpasswd dbhost dbport dbconnect));
+
+sub mydberror {
+ my ($dbup_locale, $msg) = @_;
+ die($dbup_locale->text("Database update error:") .
+ "<br>$msg<br>" . $DBI::errstr);
+}
+
+sub myshowerror {
+ my ($msg) = @_;
+
+ print($main::form->parse_html_template("dbupgrade/units_error",
+ { "message" => $msg }));
+ return 2;
+}
+
+sub update_units_add_unit {
+ my ($dbup_locale, $dbh) = @_;
+
+ my $form = $main::form;
+
+ return 0 unless ($form->{"new_name"});
+
+ return myshowerror($dbup_locale->text("The name is missing."))
+ if ($form->{"new_name"} eq "");
+ my $units = AM->retrieve_units(\%dbup_myconfig, $form);
+ return myshowerror($dbup_locale->text("A unit with this name does already exist."))
+ if ($units->{$form->{"new_name"}});
+ $units = AM->retrieve_units(\%dbup_myconfig, $form, $form->{"unit_type"});
+
+ my ($base_unit, $factor);
+ if ($form->{"new_base_unit"}) {
+ return myshowerror($dbup_locale->text("The base unit does not exist."))
+ unless (defined($units->{$form->{"new_base_unit"}}));
+
+ return myshowerror($dbup_locale->text("The factor is missing."))
+ if ($form->{"new_factor"} eq "");
+ $factor = $form->parse_amount(\%dbup_myconfig, $form->{"new_factor"});
+ return myshowerror($dbup_locale->text("The factor is missing."))
+ unless ($factor);
+ $base_unit = $form->{"new_base_unit"};
+ }
+
+ my $query = "INSERT INTO units " .
+ "(name, base_unit, factor, type) " .
+ "VALUES (?, ?, ?, ?)";
+ $dbh->do($query, undef, $form->{"new_name"}, $base_unit, $factor,
+ $form->{"unit_type"}) ||
+ mydberror($dbup_locale, $query .
+ " ($form->{new_name}, $base_unit, $factor, $form->{unit_type})");
+ $dbh->commit();
+ $dbh->begin_work();
+
+ $form->{"saved_message"} = $dbup_locale->text("The unit has been saved.");
+
+ return 0;
+}
+
+sub update_units_assign_units {
+ my ($dbup_locale, $dbh) = @_;
+
+ my ($query, $sth, @values);
+
+ my $form = $main::form;
+
+ foreach my $table (qw(parts invoice orderitems rmaitems)) {
+ $query = "UPDATE $table SET unit = ? WHERE lower(unit) = ?";
+ $sth = $dbh->prepare($query);
+
+ for (my $i = 1; $i <= $form->{"rowcount"}; $i++) {
+ next unless ($form->{"new_unit_$i"} && $form->{"old_unit_$i"});
+ @values = ($form->{"new_unit_$i"}, lc($form->{"old_unit_$i"}));
+ $sth->execute(@values) ||
+ mydberror($dbup_locale, $query . " (" . join(", ", @values) . ")");
+ }
+ }
+
+ $sth->finish();
+ $dbh->commit();
+ $dbh->begin_work();
+}
+
+sub update_units_assign_known {
+ my ($dbup_locale, $dbh) = @_;
+
+ my $form = $main::form;
+
+ my %unit_name_mapping = (
+ "st" => "Stck",
+ "st." => "Stck",
+ "pc" => "Stck",
+ "pcs" => "Stck",
+ "ea" => "Stck",
+ );
+
+ my $i = 1;
+ foreach my $k (keys(%unit_name_mapping)) {
+ $form->{"old_unit_$i"} = $k;
+ $form->{"new_unit_$i"} = $unit_name_mapping{$k};
+ $i++;
+ }
+ $form->{"rowcount"} = scalar(keys(%unit_name_mapping));
+
+ update_units_assign_units($dbup_locale, $dbh);
+}
+
+sub update_units_steps_1_2 {
+ my ($dbup_locale, $dbh) = @_;
+
+ my (%unknown_dimension_units, %unknown_service_units);
+
+ my $form = $main::form;
+
+ foreach my $table (qw(parts invoice orderitems rmaitems)) {
+ my ($query, $sth, $ref);
+
+ if ($table eq "parts") {
+ $query = "SELECT unit, inventory_accno_id FROM parts " .
+ "WHERE NOT ((unit = '') OR unit ISNULL OR " .
+ " unit IN (SELECT name FROM units))";
+
+ } else {
+ $query = "SELECT t.unit, p.inventory_accno_id " .
+ "FROM $table t " .
+ "LEFT JOIN parts p ON p.id = t.parts_id " .
+ "WHERE NOT ((t.unit = '') OR t.unit ISNULL OR " .
+ " t.unit IN (SELECT name FROM units))";
+ }
+ $sth = $dbh->prepare($query);
+ $sth->execute() || mydberror($dbup_locale, $query);
+
+ while ($ref = $sth->fetchrow_hashref()) {
+ if ($ref->{"inventory_accno_id"}) {
+ $unknown_dimension_units{$ref->{"unit"}} = 1;
+
+ } else {
+ $unknown_service_units{$ref->{"unit"}} = 1;
+ }
+ }
+
+ $sth->finish();
+ }
+
+ if (scalar(keys(%unknown_dimension_units)) != 0) {
+ my $units = AM->retrieve_units(\%dbup_myconfig, $form, "dimension");
+ my $ddbox = AM->unit_select_data($units, undef, 1);
+
+ my @unknown_parts;
+ map({ push(@unknown_parts, { "name" => $_, "NEW_UNITS" => $ddbox }); }
+ sort({ lc($a) cmp lc($b) } keys(%unknown_dimension_units)));
+
+ print($form->parse_html_template("dbupgrade/units_parts",
+ { "NEW_BASE_UNIT_DDBOX" => $ddbox,
+ "UNKNOWN_PART_UNITS" => \@unknown_parts,
+ }));
+
+ return 2;
+
+ } else {
+ print($form->parse_html_template("dbupgrade/units_parts_done"));
+ }
+
+ if (scalar(keys(%unknown_service_units)) != 0) {
+ my $units = AM->retrieve_units(\%dbup_myconfig, $form, "service");
+ my $ddbox = AM->unit_select_data($units, undef, 1);
+
+ my @unknown_services;
+ map({ push(@unknown_services, { "name" => $_, "NEW_UNITS" => $ddbox }); }
+ sort({ lc($a) cmp lc($b) } keys(%unknown_service_units)));
+
+ print($form->parse_html_template("dbupgrade/units_services",
+ { "NEW_BASE_UNIT_DDBOX" => $ddbox,
+ "UNKNOWN_PART_UNITS" => \@unknown_services,
+ }));
+
+ return 2;
+
+ } else {
+ print($form->parse_html_template("dbupgrade/units_services_done"));
+ }
+
+ return 0;
+}
+
+sub update_units_step_3 {
+ my ($dbup_locale, $dbh) = @_;
+
+ my $form = $main::form;
+
+ my $query = "SELECT ";
+ foreach my $table (qw(parts invoice orderitems rmaitems)) {
+ $query .= "(SELECT COUNT(*) FROM $table " .
+ "WHERE (unit ISNULL) OR (unit = '')) +";
+ }
+ substr($query, -1, 1) = "AS has_unassigned";
+ my ($has_unassigned) = $dbh->selectrow_array($query);
+
+ if ($has_unassigned) {
+ my $dimension_units = AM->retrieve_units(\%dbup_myconfig, $form,
+ "dimension");
+ my $dimension_ddbox = AM->unit_select_data($dimension_units);
+
+ my $service_units = AM->retrieve_units(\%dbup_myconfig, $form, "service");
+ my $service_ddbox = AM->unit_select_data($service_units);
+
+ print($form->parse_html_template("dbupgrade/units_set_default",
+ { "DIMENSION_DDBOX" => $dimension_ddbox,
+ "SERVICE_DDBOX" => $service_ddbox }));
+ return 2;
+
+ } else {
+ print($form->parse_html_template("dbupgrade/units_set_default_done"));
+ return 1;
+ }
+}
+
+sub update_units_set_default {
+ my ($dbup_locale, $dbh) = @_;
+
+ my $form = $main::form;
+
+ foreach my $table (qw(parts invoice orderitems rmaitems)) {
+ my $base_query = "UPDATE $table SET unit = " .
+ $dbh->quote($form->{"default_service_unit"}) . " " .
+ "WHERE ((unit ISNULL) OR (unit = '')) AND ";
+ my $query;
+
+ if ($table eq "parts") {
+ $query = "UPDATE $table SET unit = " .
+ $dbh->quote($form->{"default_dimension_unit"}) . " " .
+ "WHERE ((unit ISNULL) OR (unit = '')) AND (inventory_accno_id > 0)";
+ } else {
+ $query = "UPDATE $table SET unit = " .
+ $dbh->quote($form->{"default_dimension_unit"}) . " " .
+ "WHERE ((unit ISNULL) OR (unit = '')) AND " .
+ "parts_id IN (SELECT id FROM parts WHERE (inventory_accno_id > 0))";
+ }
+
+ $dbh->do($query) || mydberror($dbup_locale, $query);
+
+ if ($table eq "parts") {
+ $query = "UPDATE $table SET unit = " .
+ $dbh->quote($form->{"default_service_unit"}) . " " .
+ "WHERE ((unit ISNULL) OR (unit = '')) AND " .
+ "(inventory_accno_id ISNULL) OR (inventory_accno_id = 0)";
+ } else {
+ $query = "UPDATE $table SET unit = " .
+ $dbh->quote($form->{"default_service_unit"}) . " " .
+ "WHERE ((unit ISNULL) OR (unit = '')) AND " .
+ "parts_id IN (SELECT id FROM parts " .
+ "WHERE (inventory_accno_id ISNULL) OR (inventory_accno_id = 0))";
+ }
+
+ $dbh->do($query) || mydberror($dbup_locale, $query);
+ }
+}
+
+sub update_units {
+ my (@dbh) = @_;
+
+ my $form = $main::form;
+
+ my $res;
+
+ my $dbup_locale = Locale->new($main::language, "dbupgrade");
+
+ print($form->parse_html_template("dbupgrade/units_header"));
+
+ if ($form->{"action2"} eq "add_unit") {
+ $res = update_units_add_unit($dbup_locale, $dbh);
+ return $res if ($res);
+
+ } elsif ($form->{"action2"} eq "assign_units") {
+ update_units_assign_units($dbup_locale, $dbh);
+
+ } elsif ($form->{"action2"} eq "set_default") {
+ update_units_set_default($dbup_locale, $dbh);
+
+ }
+
+ update_units_assign_known($dbup_locale, $dbh);
+
+ $res = update_units_steps_1_2($dbup_locale, $dbh);
+ return $res if ($res);
+
+ return update_units_step_3($dbup_locale, $dbh);
+}
+
+update_units($dbh);
--- /dev/null
+<p><b>Fehler:</b> <TMPL_VAR message></p>
+
+<form>
+<input type="button" onclick="history.back()" value="Zurück">
+</form>
--- /dev/null
+<p><b><translate>Error</translate>:</b> <TMPL_VAR message></p>
+
+<form>
+<input type="button" onclick="history.back()" value="<translate>Back</translate>">
+</form>
--- /dev/null
+<div class="listtop">Einführung von Einheiten</div>
+
+<p>
+ Vor Lx-Office 2.4.0 konnte der Benutzer bei Artikeln, Dienstleistungen und Rechnungen, Angeboten etc beliebige Einheiten angeben.
+ In Lx-Office 2.4.0 muss der Administrator in den Systemeinstellungen eine Liste von verwendbaren Einheiten angeben.
+ Diese Einheiten können auf anderen Einheiten basieren, sodass Lx-Office Preise umrechnen kann, wenn der Benutzer von einer Einheit zu einer anderen Wechselt.
+</p>
+
+<p>
+ Dieses Update-Script versucht, alle bestehenden Einheiten automatisch in die neuen Einheiten umzuwandeln.
+ Das ist für einige Einheiten automatisch möglich, aber bei anderen muss der Benutzer die neue Einheit auswählen.
+ Sie können nicht fortfahren, bis alle unbekannten Einheiten in neue Einheiten umgewandelt wurden.
+ Sie können jetzt auch neue Einheiten anlegen.
+</p>
--- /dev/null
+<div class="listtop"><translate>Introduction of units</translate></div>
+
+<p>
+ <translate>Prior to Lx-Office v2.4.0 the user could enter arbitrary
+ strings as units for parts, services and in invoices, sales quotations
+ etc.</translate>
+ <translate>In Lx-Office 2.4.0 the administrator has to enter a list
+ of units in the administrative section.</translate>
+ <translate>These units can be based on other units so that Lx-Office
+ can convert prices when the user switches from one unit to
+ another.</translate>
+</p>
+
+<p>
+ <translate>This upgrade script tries to map all existing units in the
+ database to the newly created units.</translate>
+ <translate>It is possible to do this automatically for some units,
+ but for others the user has to chose the new unit.</translate>
+ <translate>You cannot continue until all unknown units have been
+ mapped to known ones.</translate>
+ <translate>You can also create new units now.</translate>
+</p>
--- /dev/null
+<div class="listtop">Schritt 1 von 3: Waren</div>
+
+<form name="Form" method="post" action="login.pl">
+
+ <input type="hidden" name="path" value="<TMPL_VAR path ESCAPE=HTML>">
+ <input type="hidden" name="login" value="<TMPL_VAR login ESCAPE=HTML>">
+ <input type="hidden" name="hashed_password" value="<TMPL_VAR password ESCAPE=HTML>">
+ <input type="hidden" name="unit_type" value="dimension">
+ <input type="hidden" name="action" value="login">
+ <input type="hidden" name="action2" value="">
+
+ <TMPL_IF saved_message>
+ <p><TMPL_VAR saved_message></p>
+ </TMPL_IF>
+
+ <div class="subsubheading">Einheit hinzufügen</div>
+
+ <p>
+ Einheiten haben entweder keine oder genau eine Basiseinheit, von der sie ein Vielfaches sind. Wenn Sie eine Basiseinheit auswählen, dann müssen Sie auch einen Faktor eingeben. Sie müssen Einheiten als ein Vielfaches einer kleineren Einheit eingeben. So ist die Definition von "kg" mit der Basiseinheit "g" und dem Faktor 1000 zulässig, die Definition von "g" mit der Basiseinheit "kg" und dem Faktor "0,001" hingegen nicht.
+ </p>
+
+ <p>
+ Die folgenden Einheiten existieren bereits:
+ <TMPL_LOOP NEW_BASE_UNIT_DDBOX><TMPL_IF name><TMPL_VAR name ESCAPE=HTML><TMPL_UNLESS __last__>; </TMPL_UNLESS></TMPL_IF></TMPL_LOOP>
+ </p>
+
+ <hr>
+
+ <table>
+ <tr>
+ <th align="right">Einheit</th>
+ <td><input name="new_name" size="20" maxlength="20"></td>
+ </tr>
+ <tr>
+ <th align="right">Basiseinheit</th>
+ <td>
+ <select name="new_base_unit">
+ <TMPL_LOOP NEW_BASE_UNIT_DDBOX><option <TMPL_VAR selected>><TMPL_VAR name></option></TMPL_LOOP>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <th align="right">Faktor</th>
+ <td><input name="new_factor"></td>
+ </tr>
+ </table>
+
+ <input type="submit" onclick="document.Form.action2.value = 'add_unit'; document.Form.submit();" name="dummy" value="Einheit hinzufügen">
+
+ <hr>
+
+ <div class="subsubheading">Neue Einheiten zuweisen</div>
+
+ <p>
+ Die folgenden Einheiten sind unbekannt.
+ Sie müssen für jeden Artikel die neue Einheit auswählen.
+ </p>
+
+ <table>
+ <tr>
+ <th class="listheading">Aktuelle Einheit</th>
+ <th class="listheading">Neue Einheit</th>
+ </tr>
+
+ <TMPL_LOOP UNKNOWN_PART_UNITS>
+ <tr class="listrow<TMPL_VAR __counter__>">
+ <td>
+ <TMPL_VAR name ESCAPE=HTML>
+ <input type="hidden" name="old_unit_<TMPL_VAR __counter__>" value="<TMPL_VAR name ESCAPE=HTML>">
+ </td>
+ <td>
+ <select name="new_unit_<TMPL_VAR __counter__>">
+ <TMPL_LOOP NEW_UNITS><option><TMPL_VAR name ESCAPE=HTML></option></TMPL_LOOP>
+ </select>
+ </td>
+ <TMPL_IF __last__><input type="hidden" name="rowcount" value="<TMPL_VAR __counter__>"></TMPL_IF>
+ </TMPL_LOOP>
+ </table>
+
+ <input type="submit" onclick="document.Form.action2.value = 'assign_units'; document.Form.submit();" name="dummy" value="Einheiten zuweisen">
+
+</form>
+
--- /dev/null
+<div class="listtop">Schritt 1 von 3: Waren</div>
+
+<p>Es wurden keine unbekannten Einheiten gefunden.</p>
--- /dev/null
+<div class="listtop"><translate>Step 1 of 3: Parts</translate></div>
+
+<p><translate>No unknown units where found.</translate></p>
--- /dev/null
+<div class="listtop"><translate>Step 1 of 3: Parts</translate></div>
+
+<form name="Form" method="post" action="login.pl">
+
+ <input type="hidden" name="path" value="<TMPL_VAR path ESCAPE=HTML>">
+ <input type="hidden" name="login" value="<TMPL_VAR login ESCAPE=HTML>">
+ <input type="hidden" name="hashed_password" value="<TMPL_VAR password ESCAPE=HTML>">
+ <input type="hidden" name="unit_type" value="dimension">
+ <input type="hidden" name="action" value="login">
+ <input type="hidden" name="action2" value="">
+
+ <TMPL_IF saved_message>
+ <p><TMPL_VAR saved_message></p>
+ </TMPL_IF>
+
+ <div class="subsubheading"><translate>Add unit</translate></div>
+
+ <p>
+ <translate>For each unit there's either no or exactly one base
+ unit. If you chose a base unit then you also have to chose a
+ factor. That way the new unit will be defined as a multiple of the
+ base unit. The base unit must be the "smaller" one. A
+ factor may not be less than 1. Therefore you may define
+ "kg" with the base unit "g" and a factor of
+ "1", but not the other way round.</translate>
+ </p>
+
+ <p>
+ <translate>The following units exist already:</translate>
+ <TMPL_LOOP NEW_BASE_UNIT_DDBOX><TMPL_IF name><TMPL_VAR name ESCAPE=HTML><TMPL_UNLESS __last__>; </TMPL_UNLESS></TMPL_IF></TMPL_LOOP>
+ </p>
+
+ <hr>
+
+ <table>
+ <tr>
+ <th align="right"><translate>Unit</translate></th>
+ <td><input name="new_name" size="20" maxlength="20"></td>
+ </tr>
+ <tr>
+ <th align="right"><translate>Base unit</translate></th>
+ <td>
+ <select name="new_base_unit">
+ <TMPL_LOOP NEW_BASE_UNIT_DDBOX><option <TMPL_VAR selected>><TMPL_VAR name></option></TMPL_LOOP>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <th align="right"><translate>Factor</translate></th>
+ <td><input name="new_factor"></td>
+ </tr>
+ </table>
+
+ <input type="submit" onclick="document.Form.action2.value = 'add_unit'; document.Form.submit();" name="dummy" value="<translate>Add unit</translate>">
+
+ <hr>
+
+ <div class="subsubheading"><translate>Assign new units</translate></div>
+
+ <p>
+ <translate>The following units are unknown.</translate>
+ <translate>You have to chose which unit to save for each of them.</translate>
+ </p>
+
+ <table>
+ <tr>
+ <th class="listheading"><translate>Current unit</translate></th>
+ <th class="listheading"><translate>New unit</translate></th>
+ </tr>
+
+ <TMPL_LOOP UNKNOWN_PART_UNITS>
+ <tr class="listrow<TMPL_VAR __counter__>">
+ <td>
+ <TMPL_VAR name ESCAPE=HTML>
+ <input type="hidden" name="old_unit_<TMPL_VAR __counter__>" value="<TMPL_VAR name ESCAPE=HTML>">
+ </td>
+ <td>
+ <select name="new_unit_<TMPL_VAR __counter__>">
+ <TMPL_LOOP NEW_UNITS><option><TMPL_VAR name ESCAPE=HTML></option></TMPL_LOOP>
+ </select>
+ </td>
+ <TMPL_IF __last__><input type="hidden" name="rowcount" value="<TMPL_VAR __counter__>"></TMPL_IF>
+ </TMPL_LOOP>
+ </table>
+
+ <input type="submit" onclick="document.Form.action2.value = 'assign_units'; document.Form.submit();" name="dummy" value="<translate>Assign units</translate>">
+
+</form>
+
--- /dev/null
+<div class="listtop">Schritt 2 von 3: Dienstleistungen</div>
+
+<form name="Form" method="post" action="login.pl">
+
+ <input type="hidden" name="path" value="<TMPL_VAR path ESCAPE=HTML>">
+ <input type="hidden" name="login" value="<TMPL_VAR login ESCAPE=HTML>">
+ <input type="hidden" name="hashed_password" value="<TMPL_VAR password ESCAPE=HTML>">
+ <input type="hidden" name="unit_type" value="service">
+ <input type="hidden" name="action" value="login">
+ <input type="hidden" name="action2" value="">
+
+ <TMPL_IF saved_message>
+ <p><TMPL_VAR saved_message></p>
+ </TMPL_IF>
+
+ <div class="subsubheading">Einheit hinzufügen</div>
+
+ <p>
+ Einheiten haben entweder keine oder genau eine Basiseinheit, von der sie ein Vielfaches sind. Wenn Sie eine Basiseinheit auswählen, dann müssen Sie auch einen Faktor eingeben. Sie müssen Einheiten als ein Vielfaches einer kleineren Einheit eingeben. So ist die Definition von "kg" mit der Basiseinheit "g" und dem Faktor 1000 zulässig, die Definition von "g" mit der Basiseinheit "kg" und dem Faktor "0,001" hingegen nicht.
+ </p>
+
+ <p>
+ Die folgenden Einheiten existieren bereits:
+ <TMPL_LOOP NEW_BASE_UNIT_DDBOX><TMPL_IF name><TMPL_VAR name ESCAPE=HTML><TMPL_UNLESS __last__>; </TMPL_UNLESS></TMPL_IF></TMPL_LOOP>
+ </p>
+
+ <hr>
+
+ <table>
+ <tr>
+ <th align="right">Einheit</th>
+ <td><input name="new_name" size="20" maxlength="20"></td>
+ </tr>
+ <tr>
+ <th align="right">Basiseinheit</th>
+ <td>
+ <select name="new_base_unit">
+ <TMPL_LOOP NEW_BASE_UNIT_DDBOX><option <TMPL_VAR selected>><TMPL_VAR name></option></TMPL_LOOP>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <th align="right">Faktor</th>
+ <td><input name="new_factor"></td>
+ </tr>
+ </table>
+
+ <input type="submit" onclick="document.Form.action2.value = 'add_unit'; document.Form.submit();" name="dummy" value="Einheit hinzufügen">
+
+ <hr>
+
+ <div class="subsubheading">Neue Einheiten zuweisen</div>
+
+ <p>
+ Die folgenden Einheiten sind unbekannt.
+ Sie müssen für jeden Artikel die neue Einheit auswählen.
+ </p>
+
+ <table>
+ <tr>
+ <th class="listheading">Aktuelle Einheit</th>
+ <th class="listheading">Neue Einheit</th>
+ </tr>
+
+ <TMPL_LOOP UNKNOWN_PART_UNITS>
+ <tr class="listrow<TMPL_VAR __counter__>">
+ <td>
+ <TMPL_VAR name ESCAPE=HTML>
+ <input type="hidden" name="old_unit_<TMPL_VAR __counter__>" value="<TMPL_VAR name ESCAPE=HTML>">
+ </td>
+ <td>
+ <select name="new_unit_<TMPL_VAR __counter__>">
+ <TMPL_LOOP NEW_UNITS><option><TMPL_VAR name ESCAPE=HTML></option></TMPL_LOOP>
+ </select>
+ </td>
+ <TMPL_IF __last__><input type="hidden" name="rowcount" value="<TMPL_VAR __counter__>"></TMPL_IF>
+ </TMPL_LOOP>
+ </table>
+
+ <input type="submit" onclick="document.Form.action2.value = 'assign_units'; document.Form.submit();" name="dummy" value="Einheiten zuweisen">
+
+</form>
+
--- /dev/null
+<div class="listtop">Schritt 2 von 3: Dienstleistungen</div>
+
+<p>Es wurden keine unbekannten Einheiten gefunden.</p>
--- /dev/null
+<div class="listtop"><translate>Step 2 of 3: Services</translate></div>
+
+<p><translate>No unknown units where found.</translate></p>
--- /dev/null
+<div class="listtop"><translate>Step 2 of 3: Services</translate></div>
+
+<form name="Form" method="post" action="login.pl">
+
+ <input type="hidden" name="path" value="<TMPL_VAR path ESCAPE=HTML>">
+ <input type="hidden" name="login" value="<TMPL_VAR login ESCAPE=HTML>">
+ <input type="hidden" name="hashed_password" value="<TMPL_VAR password ESCAPE=HTML>">
+ <input type="hidden" name="unit_type" value="service">
+ <input type="hidden" name="action" value="login">
+ <input type="hidden" name="action2" value="">
+
+ <TMPL_IF saved_message>
+ <p><TMPL_VAR saved_message></p>
+ </TMPL_IF>
+
+ <div class="subsubheading"><translate>Add unit</translate></div>
+
+ <p>
+ <translate>For each unit there's either no or exactly one base
+ unit. If you chose a base unit then you also have to chose a
+ factor. That way the new unit will be defined as a multiple of the
+ base unit. The base unit must be the "smaller" one. A
+ factor may not be less than 1. Therefore you may define
+ "kg" with the base unit "g" and a factor of
+ "1", but not the other way round.</translate>
+ </p>
+
+ <p>
+ <translate>The following units exist already:</translate>
+ <TMPL_LOOP NEW_BASE_UNIT_DDBOX><TMPL_IF name><TMPL_VAR name ESCAPE=HTML><TMPL_UNLESS __last__>; </TMPL_UNLESS></TMPL_IF></TMPL_LOOP>
+ </p>
+
+ <hr>
+
+ <table>
+ <tr>
+ <th align="right"><translate>Unit</translate></th>
+ <td><input name="new_name" size="20" maxlength="20"></td>
+ </tr>
+ <tr>
+ <th align="right"><translate>Base unit</translate></th>
+ <td>
+ <select name="new_base_unit">
+ <TMPL_LOOP NEW_BASE_UNIT_DDBOX><option <TMPL_VAR selected>><TMPL_VAR name></option></TMPL_LOOP>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <th align="right"><translate>Factor</translate></th>
+ <td><input name="new_factor"></td>
+ </tr>
+ </table>
+
+ <input type="submit" onclick="document.Form.action2.value = 'add_unit'; document.Form.submit();" name="dummy" value="<translate>Add unit</translate>">
+
+ <hr>
+
+ <div class="subsubheading"><translate>Assign new units</translate></div>
+
+ <p>
+ <translate>The following units are unknown.</translate>
+ <translate>You have to chose which unit to save for each of them.</translate>
+ </p>
+
+ <table>
+ <tr>
+ <th class="listheading"><translate>Current unit</translate></th>
+ <th class="listheading"><translate>New unit</translate></th>
+ </tr>
+
+ <TMPL_LOOP UNKNOWN_PART_UNITS>
+ <tr class="listrow<TMPL_VAR __counter__>">
+ <td>
+ <TMPL_VAR name ESCAPE=HTML>
+ <input type="hidden" name="old_unit_<TMPL_VAR __counter__>" value="<TMPL_VAR name ESCAPE=HTML>">
+ </td>
+ <td>
+ <select name="new_unit_<TMPL_VAR __counter__>">
+ <TMPL_LOOP NEW_UNITS><option><TMPL_VAR name ESCAPE=HTML></option></TMPL_LOOP>
+ </select>
+ </td>
+ <TMPL_IF __last__><input type="hidden" name="rowcount" value="<TMPL_VAR __counter__>"></TMPL_IF>
+ </TMPL_LOOP>
+ </table>
+
+ <input type="submit" onclick="document.Form.action2.value = 'assign_units'; document.Form.submit();" name="dummy" value="<translate>Assign units</translate>">
+
+</form>
+
--- /dev/null
+<div class="listtop">Schritt 3 von 3: Standardeinheiten</div>
+
+<form name="Form" method="post" action="login.pl">
+
+ <input type="hidden" name="path" value="<TMPL_VAR path ESCAPE=HTML>">
+ <input type="hidden" name="login" value="<TMPL_VAR login ESCAPE=HTML>">
+ <input type="hidden" name="hashed_password" value="<TMPL_VAR password ESCAPE=HTML>">
+ <input type="hidden" name="unit_type" value="dimension">
+ <input type="hidden" name="action" value="login">
+ <input type="hidden" name="action2" value="">
+
+ <p>
+ Es gibt noch Einträge in der Datenbank, für die keine Einheit zugeordnet ist.
+ Sie müssen eine Maß- und eine Dienstleistungseinheit auswählen, die diesen Waren und Dienstleistungen, denen noch keine Einheit zugeordnet ist, zugeordnet wird.
+ </p>
+
+ <table>
+ <tr>
+ <td>Maßeinheit:</td>
+ <td>
+ <select name="default_dimension_unit">
+ <TMPL_LOOP DIMENSION_DDBOX><option><TMPL_VAR name ESCAPE=HTML></option></TMPL_LOOP>
+ </select>
+ </td>
+ </tr>
+ <tr>
+
+ <td>Dienstleistungseinheit:</td>
+ <td>
+ <select name="default_service_unit">
+ <TMPL_LOOP SERVICE_DDBOX><option><TMPL_VAR name ESCAPE=HTML></option></TMPL_LOOP>
+ </select>
+ </td>
+ </tr>
+ </table>
+
+ <p><input type="submit" onclick="document.Form.action2.value = 'set_default'; document.Form.submit();" name="dummy" value="Einheiten zuweisen"></p>
+
+</form>
--- /dev/null
+<div class="listtop">Schritt 3 von 3: Standardeinheiten</div>
+
+<p>Es wurden keine Einträge gefunden, denen keine Einheit zugeordnet war.</p>
+
+<p>Das Datenbankupgrade zwecks Einführung von Einheiten ist nun beendet.</p>
+
+<hr>
--- /dev/null
+<div class="listtop"><translate>Step 3 of 3: Default units</translate></div>
+
+<p><translate>No entries were found which had no unit assigned to them.</translate></p>
+
+<p><translate>The database upgrade for the introduction of units is now complete.</translate></p>
+
+<hr>
--- /dev/null
+<div class="listtop"><translate>Step 3 of 3: Default units</translate></div>
+
+<form name="Form" method="post" action="login.pl">
+
+ <input type="hidden" name="path" value="<TMPL_VAR path ESCAPE=HTML>">
+ <input type="hidden" name="login" value="<TMPL_VAR login ESCAPE=HTML>">
+ <input type="hidden" name="hashed_password" value="<TMPL_VAR password ESCAPE=HTML>">
+ <input type="hidden" name="unit_type" value="dimension">
+ <input type="hidden" name="action" value="login">
+ <input type="hidden" name="action2" value="">
+
+ <p>
+ <translate>There are still entries in the database for which no unit
+ has been assigned.</translate>
+ <translate>You have to chose a dimension unit and a service unit
+ which will then be assigned to those entries.</translate>
+ </p>
+
+ <table>
+ <tr>
+ <td><translate>Dimension unit</translate>:</td>
+ <td>
+ <select name="default_dimension_unit">
+ <TMPL_LOOP DIMENSION_DDBOX><option><TMPL_VAR name ESCAPE=HTML></option></TMPL_LOOP>
+ </select>
+ </td>
+ </tr>
+ <tr>
+
+ <td><translate>Service unit</translate>:</td>
+ <td>
+ <select name="default_service_unit">
+ <TMPL_LOOP SERVICE_DDBOX><option><TMPL_VAR name ESCAPE=HTML></option></TMPL_LOOP>
+ </select>
+ </td>
+ </tr>
+ </table>
+
+ <p><input type="submit" onclick="document.Form.action2.value = 'set_default'; document.Form.submit();" name="dummy" value="<translate>Assign units</translate>"></p>
+
+</form>