Enthält Upgrade-Script für eindeutige Artikelnummern
authorNiclas Zimmermann <niclas@kivitendo-premium.de>
Mon, 15 Apr 2013 16:10:38 +0000 (18:10 +0200)
committerNiclas Zimmermann <niclas@kivitendo-premium.de>
Thu, 18 Apr 2013 09:30:28 +0000 (11:30 +0200)
Dieses Upgrade Script setzt einen Unique-Constraint auf die Spale
partnumer in der Tabelle parts. Falls es doppelte Artikelnummern
gibt, wird das Update abgebrochen.

Weiterhin wird ein neuer Nummernkreis für Erzeugnisse in die defaults
eingefügt.

locale/de/all
sql/Pg-upgrade2/erzeugnisnummern.pl [new file with mode: 0644]
templates/webpages/dbupgrade/erzeugnisnummern.html [new file with mode: 0644]

index dbfe48d..4b0b6d7 100644 (file)
@@ -681,6 +681,7 @@ $self->{texts} = {
   'Documentation (in German)'   => 'Dokumentation',
   'Documents in the WebDAV repository' => 'Dokumente im WebDAV-Repository',
   'Done'                        => 'Fertig',
+  'Double partnumbers'          => 'Doppelte Artikelnummern',
   'Download SEPA XML export file' => 'SEPA-XML-Exportdatei herunterladen',
   'Download sample file'        => 'Beispieldatei herunterladen',
   'Download the backup'         => 'Die Sicherungsdatei herunterladen',
@@ -923,6 +924,7 @@ $self->{texts} = {
   'Fristsetzung'                => 'Fristsetzung',
   'From'                        => 'Von',
   'From Date'                   => 'Von',
+  'From this version on the partnumer of articles and assemblies have to be unique.' => 'Ab dieser Version muss die Artikelnummer eindeutig sein.',
   'From this version on the taxkey 0 must have a tax rate of 0 (for DATEV compatibility).' => 'Ab dieser Version muss der Steuerschlüssel 0 einen Steuersatz von 0% haben (auf Grund der DATEV-Kompatibilität).',
   'Full Access'                 => 'Vollzugriff',
   'Full Preview'                => 'Alles',
@@ -1384,6 +1386,7 @@ $self->{texts} = {
   'Part Notes'                  => 'Bemerkungen',
   'Part Number'                 => 'Artikelnummer',
   'Part Number missing!'        => 'Artikelnummer fehlt!',
+  'Partnumber'                  => 'Artikelnummer',
   'Partnumber must not be set to empty!' => 'Die Artikelnummer darf nicht auf leer ge&auml;ndert werden.',
   'Partnumber not unique!'      => 'Artikelnummer bereits vorhanden!',
   'Parts'                       => 'Waren',
@@ -1431,6 +1434,7 @@ $self->{texts} = {
   'Please Check the bank information for each customer:' => 'Bitte überprüfen Sie die Bankinformationen der Kunden:',
   'Please Check the bank information for each vendor:' => 'Bitte überprüfen Sie die Kontoinformationen der Lieferanten:',
   'Please ask your administrator to create warehouses and bins.' => 'Bitten Sie Ihren Administrator, dass er Lager und Lagerpl&auml;tze anlegt.',
+  'Please change the partnumber of the following parts and run the update again:' => 'Bitte ändern Sie daher die Artikelnumer folgender Artikel:',
   'Please contact your administrator or a service provider.' => 'Bitte kontaktieren Sie Ihren Administrator oder einen Dienstleister.',
   'Please contact your administrator.' => 'Bitte wenden Sie sich an Ihren Administrator.',
   'Please define a taxkey for the following taxes and run the update again:' => 'Bitte definieren Sie einen Steuerschlüssel für die folgenden Steuern und starten Sie dann das Update erneut:',
@@ -1729,6 +1733,7 @@ $self->{texts} = {
   'Service Items'               => 'Dienstleistungen',
   'Service Number missing!'     => 'Dienstleistungsnummer fehlt!',
   'Service unit'                => 'Dienstleistungseinheit',
+  'Service, assembly or part'   => 'Dienstleistung, Erzeugnis oder Ware',
   'Services'                    => 'Dienstleistungen',
   'Set Language Values'         => 'Spracheinstellungen',
   'Set eMail text'              => 'eMail Text eingeben',
@@ -2077,6 +2082,7 @@ $self->{texts} = {
   'There are #1 more open invoices from this vendor with other currencies.' => 'Es gibt #1 weitere offene Rechnungen von diesem Lieferanten, die in anderen Währungen ausgestellt wurden.',
   'There are #1 unfinished follow-ups of which #2 are due.' => 'Es gibt #1 Wiedervorlage(n), von denen #2 fällig ist/sind.',
   'There are bookings to the account 3803 after 01.01.2007. If you didn\'t change this account manually to 19% the bookings are probably incorrect.' => 'Das Konto 3803 wurde nach dem 01.01.2007 bebucht. Falls Sie dieses Konto nicht manuell auf 19% gestellt haben sind die Buchungen wahrscheinlich mit falscher Umsatzsteuer gebucht worden.',
+  'There are double partnumbers in your database.' => 'In ihrer Datenbank befinden sich mehrfach vergebene Artikelnummern.',
   'There are entries in tax where taxkey is NULL.' => 'In der Datenbank sind Steuern ohne Steuerschlüssel vorhanden (in der Tabelle tax Spalte taxkey).',
   'There are four tax zones.'   => 'Es gibt vier Steuerzonen.',
   'There are invalid taxnumbers in use.' => 'Es werden ungültige Steuerautomatik-Konten benutzt.',
@@ -2360,6 +2366,7 @@ $self->{texts} = {
   'ap_aging_list'               => 'liste_offene_verbindlichkeiten',
   'ar_aging_list'               => 'liste_offene_forderungen',
   'as at'                       => 'zum Stand',
+  'assembly'                    => 'Erzeugnis',
   'assembly_list'               => 'erzeugnisliste',
   'averaged values, in invoice mode only useful when filtered by a part' => 'gemittelte Werte, im Rechnungsmodus nur sinnvoll wenn nach Artikel gefiltert wird',
   'back'                        => 'zurück',
@@ -2475,6 +2482,7 @@ $self->{texts} = {
   'order'                       => 'Reihenfolge',
   'our vendor number at customer' => 'Unsere Lieferanten-Nr. beim Kunden',
   'parsing csv'                 => 'Parse CSV Daten',
+  'part'                        => 'Ware',
   'part_list'                   => 'Warenliste',
   'percental'                   => 'prozentual',
   'periodic'                    => 'Aufwandsmethode',
diff --git a/sql/Pg-upgrade2/erzeugnisnummern.pl b/sql/Pg-upgrade2/erzeugnisnummern.pl
new file mode 100644 (file)
index 0000000..11ba2ef
--- /dev/null
@@ -0,0 +1,62 @@
+# @tag: erzeugnisnummern
+# @description: Erzeugnisnummern und Artikelnummern sollen eindeutig sein.
+# @depends: release_3_0_0
+# @charset: utf-8
+
+use utf8;
+use strict;
+use SL::Locale;
+
+die("This script cannot be run from the command line.") unless ($main::form);
+
+sub mydberror {
+  my ($msg) = @_;
+  die($dbup_locale->text("Database update error:") . "<br>$msg<br>" . $DBI::errstr);
+}
+
+sub do_query {
+  my ($query, $may_fail) = @_;
+
+  if (!$dbh->do($query)) {
+    mydberror($query) unless ($may_fail);
+    $dbh->rollback();
+    $dbh->begin_work();
+  }
+}
+
+sub do_update {
+    my $query = qq|SELECT id, partnumber, description, unit, notes, assembly, ean, inventory_accno_id
+                   FROM parts pa
+                   WHERE (SELECT COUNT(*)
+                          FROM parts p
+                          WHERE p.partnumber=pa.partnumber)
+                          > 1
+                   ORDER BY partnumber;|;
+
+  my $sth = $dbh->prepare($query);
+  $sth->execute || $main::form->dberror($query);
+
+  $main::form->{PARTS} = [];
+  while (my $ref = $sth->fetchrow_hashref("NAME_lc")) {
+    push @{ $main::form->{PARTS} }, $ref;
+  }
+
+  if ( scalar @{ $main::form->{PARTS} } > 0 ) {
+    &print_error_message;
+    return 0;
+  }
+
+  $query = qq|ALTER TABLE parts ADD UNIQUE (partnumber)|;
+  do_query($query);
+
+  $query = qq|ALTER TABLE defaults ADD assemblynumber TEXT|;
+  do_query($query);
+  return 1;
+}; # end do_update
+
+
+sub print_error_message {
+  print $main::form->parse_html_template("dbupgrade/erzeugnisnummern");
+}
+
+return do_update();
diff --git a/templates/webpages/dbupgrade/erzeugnisnummern.html b/templates/webpages/dbupgrade/erzeugnisnummern.html
new file mode 100644 (file)
index 0000000..6b465d0
--- /dev/null
@@ -0,0 +1,33 @@
+[%- USE T8 %]
+[% USE HTML %]<div class="listtop">[% 'Double partnumbers' | $T8 %]</div>
+
+<form name="Form" method="post" action="login.pl">
+<input type="hidden" name="action" value="login">
+
+<p>[% 'There are double partnumbers in your database.' | $T8 %]</p>
+<p>[% 'From this version on the partnumer of articles and assemblies have to be unique.' | $T8 %]</p>
+
+<p>[% 'Please change the partnumber of the following parts and run the update again:' | $T8 %]</p>
+<table>
+  <tr>
+    <th class="listheading">[% 'Partnumber' | $T8 %]</th>
+    <th class="listheading">[% 'Description' | $T8 %]</th>
+    <th class="listheading">[% 'Unit' | $T8 %]</th>
+    <th class="listheading">[% 'Notes' | $T8 %]</th>
+    <th class="listheading">[% 'EAN' | $T8 %]</th>
+    <th class="listheading">[% 'Service, assembly or part' | $T8 %]</th>
+  </tr>
+
+  [% SET row_odd = '1' %][% FOREACH row = PARTS %]
+  <tr class="listrow[% IF row_odd %]1[% SET row_odd = '0' %][% ELSE %]0[% SET row_odd = '1' %][% END %]">
+    <td align="right">[% HTML.escape(row.partnumber) %]</td>
+    <td align="left"> [% HTML.escape(row.description) %]</a></td>
+    <td align="right">[% HTML.escape(row.unit) %]</td>
+    <td align="right">[% HTML.escape(row.notes) %]</td>
+    <td align="right">[% HTML.escape(row.ean) %]</td>
+    <td align="right">[% IF row.assembly %] [% 'assembly' | $T8 %] [% ELSE %] [% IF row.inventory_accno_id %] [% 'part' | $T8 %] [% ELSE %] [% 'service' %] [% END %] [% END %]</td>
+  </tr>
+  [% END %]
+</table>
+
+</form>