Interaktives Datenbankupgrade zur Einfuehrung von Mass- und Dienstleistungseinheiten.
authorMoritz Bunkus <m.bunkus@linet-services.de>
Wed, 29 Nov 2006 14:33:31 +0000 (14:33 +0000)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Wed, 29 Nov 2006 14:33:31 +0000 (14:33 +0000)
21 files changed:
SL/User.pm
css/lx-office-erp.css
locale/de/all
locale/de/dbupgrade [new file with mode: 0644]
sql/Pg-upgrade/Pg-upgrade-2.2.0.25-2.2.0.26.pl [new file with mode: 0644]
templates/webpages/dbupgrade/units_error_de.html [new file with mode: 0644]
templates/webpages/dbupgrade/units_error_master.html [new file with mode: 0644]
templates/webpages/dbupgrade/units_header_de.html [new file with mode: 0644]
templates/webpages/dbupgrade/units_header_master.html [new file with mode: 0644]
templates/webpages/dbupgrade/units_parts_de.html [new file with mode: 0644]
templates/webpages/dbupgrade/units_parts_done_de.html [new file with mode: 0644]
templates/webpages/dbupgrade/units_parts_done_master.html [new file with mode: 0644]
templates/webpages/dbupgrade/units_parts_master.html [new file with mode: 0644]
templates/webpages/dbupgrade/units_services_de.html [new file with mode: 0644]
templates/webpages/dbupgrade/units_services_done_de.html [new file with mode: 0644]
templates/webpages/dbupgrade/units_services_done_master.html [new file with mode: 0644]
templates/webpages/dbupgrade/units_services_master.html [new file with mode: 0644]
templates/webpages/dbupgrade/units_set_default_de.html [new file with mode: 0644]
templates/webpages/dbupgrade/units_set_default_done_de.html [new file with mode: 0644]
templates/webpages/dbupgrade/units_set_default_done_master.html [new file with mode: 0644]
templates/webpages/dbupgrade/units_set_default_master.html [new file with mode: 0644]

index 7754536..d756a2a 100644 (file)
@@ -114,8 +114,12 @@ sub login {
   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;
@@ -169,7 +173,7 @@ sub login {
 $!";
 
       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;
index ac67cf3..8d8ad3d 100644 (file)
@@ -151,6 +151,12 @@ body.menu {
 }
        
        
+.subsubheading {
+  color: black;
+  font-weight: bolder;
+  text-decoration: underline;
+}
+
 .optionen {
        border:dashed;
 /*     padding-top:10px;
index 87464cb..0ccd701 100644 (file)
@@ -110,6 +110,8 @@ aktualisieren wollen?',
   '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',
@@ -128,6 +130,7 @@ aktualisieren wollen?',
   'BLZ: '                       => 'BLZ: ',
   'BOM'                         => 'Stückliste',
   'BWA'                         => 'BWA',
+  'Back'                        => 'Zur&uuml;ck',
   'Back to user config...'      => 'Benutzereinstellungen',
   'Backup sent to'              => 'Eine Sicherungskopie wurde gesandt an',
   'Balance'                     => 'Bilanz',
@@ -259,6 +262,7 @@ aktualisieren wollen?',
   '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',
@@ -281,6 +285,7 @@ aktualisieren wollen?',
   '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!',
@@ -317,6 +322,7 @@ aktualisieren wollen?',
   'Description missing!'        => 'Beschreibung fehlt.',
   'Description must not be empty!' => 'Beschreibung darf nicht leer sein',
   'Difference'                  => 'Differenz',
+  'Dimension unit'              => 'Ma&szlig;einheit',
   'Dimension units'             => 'Ma&szlig;einheiten',
   'Directory'                   => 'Verzeichnis',
   'Discount'                    => 'Rabatt',
@@ -402,6 +408,7 @@ gestartet',
   'Erlöse EU m. UStId'          => 'Erl&ouml;se EU m. UStId',
   'Erlöse EU o. UStId'          => 'Erl&ouml;se EU o. UStId',
   'Erlöse Inland'               => 'Erl&ouml;se Inland',
+  'Error'                       => 'Fehler',
   'Error!'                      => 'Fehler!',
   'Exch'                        => 'Wechselkurs.',
   'Exchangerate'                => 'Wechselkurs',
@@ -429,6 +436,7 @@ gestartet',
   '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 &quot;smaller&quot; one. A factor may not be less than 1. Therefore you may define &quot;kg&quot; with the base unit &quot;g&quot; and a factor of &quot;1&quot;, 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&auml;hlen, dann m&uuml;ssen Sie auch einen Faktor eingeben. Sie m&uuml;ssen Einheiten als ein Vielfaches einer kleineren Einheit eingeben. So ist die Definition von &quot;kg&quot; mit der Basiseinheit &quot;g&quot; und dem Faktor 1000 zul&auml;ssig, die Definition von &quot;g&quot; mit der Basiseinheit &quot;kg&quot; und dem Faktor &quot;0,001&quot; hingegen nicht.',
   'Foreign Exchange Gain'       => 'Wechselkurserträge',
   'Foreign Exchange Loss'       => 'Wechselkursaufwendungen',
   'Formula'                     => '',
@@ -473,6 +481,7 @@ gestartet',
   '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',
@@ -489,6 +498,7 @@ gestartet',
   'Interest Rate'               => 'Zinssatz',
   'Internal Notes'              => 'interne Bemerkungen',
   'Internet'                    => 'Internet',
+  'Introduction of units'       => 'Einf&uuml;hrung von Einheiten',
   'Inv. Duedate'                => '',
   'Invdate'                     => 'Rechnungsdatum',
   'Invdate from'                => 'Rechnungen von',
@@ -510,6 +520,7 @@ gestartet',
   '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&uuml;r einige Einheiten automatisch m&ouml;glich, aber bei anderen muss der Benutzer die neue Einheit ausw&auml;hlen.',
   'Item deleted!'               => 'Artikel gelöscht!',
   'Item not on file!'           => 'Dieser Artikel ist nicht in der Datenbank!',
   'Jan'                         => 'Jan',
@@ -611,6 +622,7 @@ gestartet',
   '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',
@@ -619,9 +631,11 @@ gestartet',
   '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&auml;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',
@@ -734,6 +748,7 @@ gestartet',
   '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',
@@ -839,6 +854,7 @@ gestartet',
   'Service'                     => 'Dienstleistung',
   'Service Items'               => 'Dienstleistungen',
   'Service Number missing!'     => 'Dienstleistungsnummer fehlt!',
+  'Service unit'                => 'Dienstleistungseinheit',
   'Service units'               => 'Dienstleistungseinheiten',
   'Services'                    => 'Dienstleistungen',
   'Set Language Values'         => 'Spracheinstellungen',
@@ -870,6 +886,9 @@ gestartet',
   '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: ',
@@ -911,10 +930,13 @@ gestartet',
   '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&uuml;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&uuml;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&uuml;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&auml;nge: x<br>Gewicht/m: y<br>x ist die Gesamtl&auml;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.',
@@ -924,7 +946,10 @@ gestartet',
   'The unit in row %d has been deleted in the meantime.' => 'Die Einheit in Zeile %d ist in der Zwischentzeit gel&ouml;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&auml;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&auml;ge in der Datenbank, f&uuml;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&ouml;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.',
@@ -1059,7 +1084,11 @@ gestartet',
   'Yearly'                      => 'jährlich',
   'Yes'                         => 'Ja',
   'You are logged out!'         => 'Auf Wiedersehen!',
+  'You can also create new units now.' => 'Sie k&ouml;nnen jetzt auch neue Einheiten anlegen.',
+  'You cannot continue until all unknown units have been mapped to known ones.' => 'Sie k&ouml;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&uuml;ssen eine Ma&szlig;- und eine Dienstleistungseinheit ausw&auml;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&uuml;ssen f&uuml;r jeden Artikel die neue Einheit ausw&auml;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',
diff --git a/locale/de/dbupgrade b/locale/de/dbupgrade
new file mode 100644 (file)
index 0000000..8853113
--- /dev/null
@@ -0,0 +1,24 @@
+$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&uuml;gen'     => 'add_unit',
+  'einheiten_zuweisen'          => 'assign_units',
+};
+
+1;
diff --git a/sql/Pg-upgrade/Pg-upgrade-2.2.0.25-2.2.0.26.pl b/sql/Pg-upgrade/Pg-upgrade-2.2.0.25-2.2.0.26.pl
new file mode 100644 (file)
index 0000000..1d7f9a1
--- /dev/null
@@ -0,0 +1,297 @@
+#!/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);
diff --git a/templates/webpages/dbupgrade/units_error_de.html b/templates/webpages/dbupgrade/units_error_de.html
new file mode 100644 (file)
index 0000000..4c785a8
--- /dev/null
@@ -0,0 +1,5 @@
+<p><b>Fehler:</b> <TMPL_VAR message></p>
+
+<form>
+<input type="button" onclick="history.back()" value="Zur&uuml;ck">
+</form>
diff --git a/templates/webpages/dbupgrade/units_error_master.html b/templates/webpages/dbupgrade/units_error_master.html
new file mode 100644 (file)
index 0000000..d62657e
--- /dev/null
@@ -0,0 +1,5 @@
+<p><b><translate>Error</translate>:</b> <TMPL_VAR message></p>
+
+<form>
+<input type="button" onclick="history.back()" value="<translate>Back</translate>">
+</form>
diff --git a/templates/webpages/dbupgrade/units_header_de.html b/templates/webpages/dbupgrade/units_header_de.html
new file mode 100644 (file)
index 0000000..e035ef3
--- /dev/null
@@ -0,0 +1,14 @@
+<div class="listtop">Einf&uuml;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&ouml;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&uuml;r einige Einheiten automatisch m&ouml;glich, aber bei anderen muss der Benutzer die neue Einheit ausw&auml;hlen.
+ Sie k&ouml;nnen nicht fortfahren, bis alle unbekannten Einheiten in neue Einheiten umgewandelt wurden.
+ Sie k&ouml;nnen jetzt auch neue Einheiten anlegen.
+</p>
diff --git a/templates/webpages/dbupgrade/units_header_master.html b/templates/webpages/dbupgrade/units_header_master.html
new file mode 100644 (file)
index 0000000..c0bc13c
--- /dev/null
@@ -0,0 +1,22 @@
+<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>
diff --git a/templates/webpages/dbupgrade/units_parts_de.html b/templates/webpages/dbupgrade/units_parts_de.html
new file mode 100644 (file)
index 0000000..954a786
--- /dev/null
@@ -0,0 +1,83 @@
+<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&uuml;gen</div>
+
+ <p>
+  Einheiten haben entweder keine oder genau eine Basiseinheit, von der sie ein Vielfaches sind. Wenn Sie eine Basiseinheit ausw&auml;hlen, dann m&uuml;ssen Sie auch einen Faktor eingeben. Sie m&uuml;ssen Einheiten als ein Vielfaches einer kleineren Einheit eingeben. So ist die Definition von &quot;kg&quot; mit der Basiseinheit &quot;g&quot; und dem Faktor 1000 zul&auml;ssig, die Definition von &quot;g&quot; mit der Basiseinheit &quot;kg&quot; und dem Faktor &quot;0,001&quot; 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&uuml;gen">
+
+ <hr>
+
+ <div class="subsubheading">Neue Einheiten zuweisen</div>
+
+ <p>
+  Die folgenden Einheiten sind unbekannt.
+  Sie m&uuml;ssen f&uuml;r jeden Artikel die neue Einheit ausw&auml;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>
+
diff --git a/templates/webpages/dbupgrade/units_parts_done_de.html b/templates/webpages/dbupgrade/units_parts_done_de.html
new file mode 100644 (file)
index 0000000..3fb2784
--- /dev/null
@@ -0,0 +1,3 @@
+<div class="listtop">Schritt 1 von 3: Waren</div>
+
+<p>Es wurden keine unbekannten Einheiten gefunden.</p>
diff --git a/templates/webpages/dbupgrade/units_parts_done_master.html b/templates/webpages/dbupgrade/units_parts_done_master.html
new file mode 100644 (file)
index 0000000..908a7a7
--- /dev/null
@@ -0,0 +1,3 @@
+<div class="listtop"><translate>Step 1 of 3: Parts</translate></div>
+
+<p><translate>No unknown units where found.</translate></p>
diff --git a/templates/webpages/dbupgrade/units_parts_master.html b/templates/webpages/dbupgrade/units_parts_master.html
new file mode 100644 (file)
index 0000000..3455658
--- /dev/null
@@ -0,0 +1,89 @@
+<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 &quot;smaller&quot; one. A
+   factor may not be less than 1. Therefore you may define
+   &quot;kg&quot; with the base unit &quot;g&quot; and a factor of
+   &quot;1&quot;, 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>
+
diff --git a/templates/webpages/dbupgrade/units_services_de.html b/templates/webpages/dbupgrade/units_services_de.html
new file mode 100644 (file)
index 0000000..662dbaa
--- /dev/null
@@ -0,0 +1,83 @@
+<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&uuml;gen</div>
+
+ <p>
+  Einheiten haben entweder keine oder genau eine Basiseinheit, von der sie ein Vielfaches sind. Wenn Sie eine Basiseinheit ausw&auml;hlen, dann m&uuml;ssen Sie auch einen Faktor eingeben. Sie m&uuml;ssen Einheiten als ein Vielfaches einer kleineren Einheit eingeben. So ist die Definition von &quot;kg&quot; mit der Basiseinheit &quot;g&quot; und dem Faktor 1000 zul&auml;ssig, die Definition von &quot;g&quot; mit der Basiseinheit &quot;kg&quot; und dem Faktor &quot;0,001&quot; 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&uuml;gen">
+
+ <hr>
+
+ <div class="subsubheading">Neue Einheiten zuweisen</div>
+
+ <p>
+  Die folgenden Einheiten sind unbekannt.
+  Sie m&uuml;ssen f&uuml;r jeden Artikel die neue Einheit ausw&auml;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>
+
diff --git a/templates/webpages/dbupgrade/units_services_done_de.html b/templates/webpages/dbupgrade/units_services_done_de.html
new file mode 100644 (file)
index 0000000..fd671a0
--- /dev/null
@@ -0,0 +1,3 @@
+<div class="listtop">Schritt 2 von 3: Dienstleistungen</div>
+
+<p>Es wurden keine unbekannten Einheiten gefunden.</p>
diff --git a/templates/webpages/dbupgrade/units_services_done_master.html b/templates/webpages/dbupgrade/units_services_done_master.html
new file mode 100644 (file)
index 0000000..21aef14
--- /dev/null
@@ -0,0 +1,3 @@
+<div class="listtop"><translate>Step 2 of 3: Services</translate></div>
+
+<p><translate>No unknown units where found.</translate></p>
diff --git a/templates/webpages/dbupgrade/units_services_master.html b/templates/webpages/dbupgrade/units_services_master.html
new file mode 100644 (file)
index 0000000..65ded52
--- /dev/null
@@ -0,0 +1,89 @@
+<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 &quot;smaller&quot; one. A
+   factor may not be less than 1. Therefore you may define
+   &quot;kg&quot; with the base unit &quot;g&quot; and a factor of
+   &quot;1&quot;, 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>
+
diff --git a/templates/webpages/dbupgrade/units_set_default_de.html b/templates/webpages/dbupgrade/units_set_default_de.html
new file mode 100644 (file)
index 0000000..a93d5aa
--- /dev/null
@@ -0,0 +1,39 @@
+<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&auml;ge in der Datenbank, f&uuml;r die keine Einheit zugeordnet ist.
+  Sie m&uuml;ssen eine Ma&szlig;- und eine Dienstleistungseinheit ausw&auml;hlen, die diesen Waren und Dienstleistungen, denen noch keine Einheit zugeordnet ist, zugeordnet wird.
+ </p>
+
+ <table>
+  <tr>
+   <td>Ma&szlig;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>
diff --git a/templates/webpages/dbupgrade/units_set_default_done_de.html b/templates/webpages/dbupgrade/units_set_default_done_de.html
new file mode 100644 (file)
index 0000000..799ba6f
--- /dev/null
@@ -0,0 +1,7 @@
+<div class="listtop">Schritt 3 von 3: Standardeinheiten</div>
+
+<p>Es wurden keine Eintr&auml;ge gefunden, denen keine Einheit zugeordnet war.</p>
+
+<p>Das Datenbankupgrade zwecks Einf&uuml;hrung von Einheiten ist nun beendet.</p>
+
+<hr>
diff --git a/templates/webpages/dbupgrade/units_set_default_done_master.html b/templates/webpages/dbupgrade/units_set_default_done_master.html
new file mode 100644 (file)
index 0000000..0a6801d
--- /dev/null
@@ -0,0 +1,7 @@
+<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>
diff --git a/templates/webpages/dbupgrade/units_set_default_master.html b/templates/webpages/dbupgrade/units_set_default_master.html
new file mode 100644 (file)
index 0000000..8452c4f
--- /dev/null
@@ -0,0 +1,41 @@
+<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>