]> wagnertech.de Git - kivitendo-erp.git/commitdiff
Merge branch 'erzeugnisnummern'
authorNiclas Zimmermann <niclas@kivitendo-premium.de>
Thu, 18 Apr 2013 11:50:05 +0000 (13:50 +0200)
committerNiclas Zimmermann <niclas@kivitendo-premium.de>
Thu, 18 Apr 2013 11:50:05 +0000 (13:50 +0200)
SL/AM.pm
SL/TransNumber.pm
locale/de/all
sql/Pg-upgrade2/erzeugnisnummern.pl [new file with mode: 0644]
templates/webpages/am/edit_defaults.html
templates/webpages/dbupgrade/erzeugnisnummern.html [new file with mode: 0644]

index af2c25f91e327ed1eedde8f7f378bc7195dc9343..502ebd905f04c2f5b49c2702e37fee4c70c28e44 100644 (file)
--- a/SL/AM.pm
+++ b/SL/AM.pm
@@ -1084,6 +1084,7 @@ sub save_defaults {
         vendornumber       = ?,
         articlenumber      = ?,
         servicenumber      = ?,
+        assemblynumber     = ?,
         sdonumber          = ?,
         pdonumber          = ?,
         curr               = ?,
@@ -1097,6 +1098,7 @@ sub save_defaults {
                 $form->{sqnumber},        $form->{rfqnumber},
                 $form->{customernumber},  $form->{vendornumber},
                 $form->{articlenumber},   $form->{servicenumber},
+                $form->{assemblynumber},
                 $form->{sdonumber},       $form->{pdonumber},
                 $currency,
                 $form->{businessnumber},  $form->{weightunit},
index 210abc091fa253e2c16f348f6f74e2db18f65a91..859ca68659246868619b4b11a149ac732b7ce6d8 100644 (file)
@@ -69,8 +69,9 @@ sub _get_filters {
   } elsif ($type =~ /part|service|assembly/) {
     $filters{trans_number}  = "partnumber";
     $filters{numberfield}   = $type eq 'service' ? 'servicenumber' : 'articlenumber';
+    $filters{numberfield}   = $type eq 'assembly' ? 'assemblynumber' : $filters{numberfield};
     $filters{table}         = "parts";
-    $filters{where}         = 'COALESCE(inventory_accno_id, 0) ' . ($type eq 'service' ? '=' : '<>') . ' 0';
+    $filters{where}         = 'COALESCE(inventory_accno_id, 0) ' . ($type eq 'service' ? '= 0' : '<> 0 OR assembly');
   }
 
   return %filters;
@@ -129,6 +130,10 @@ SQL
   ($business_number) = selectfirst_array_query($form, $self->dbh, qq|SELECT customernumberinit FROM business WHERE id = ?|, $self->business_id) if $self->business_id;
   my $number         = $business_number;
   ($number)          = selectfirst_array_query($form, $self->dbh, qq|SELECT $filters{numberfield} FROM defaults|)                               if !$number;
+  if ($filters{numberfield} eq 'assemblynumber' and length($number) < 1) {
+    $filters{numberfield} = 'articlenumber';
+    ($number)          = selectfirst_array_query($form, $self->dbh, qq|SELECT $filters{numberfield} FROM defaults|)                               if !$number;
+  }
   $number          ||= '';
   my $sequence       = SL::PrefixedNumber->new(number => $number);
 
index fc4697814065514a03d30666163197a22ae503fb..d75c99ff3affebacd27c07648c0334e3bcdba9bc 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',
@@ -924,6 +925,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',
@@ -1111,6 +1113,7 @@ $self->{texts} = {
   'Languages and translations'  => 'Sprachen und Übersetzungen',
   'Last Action'                 => 'Letzte Aktivität',
   'Last Article Number'         => 'Letzte Artikelnummer',
+  'Last Assembly Number'        => 'Letzte Erzeugnisnummer',
   'Last Cost'                   => 'Einkaufspreis',
   'Last Credit Note Number'     => 'Letzte Gutschriftnummer',
   'Last Customer Number'        => 'Letzte Kundennummer',
@@ -1387,6 +1390,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',
@@ -1434,6 +1438,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:',
@@ -1732,6 +1737,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',
@@ -2080,6 +2086,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.',
@@ -2365,6 +2372,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',
@@ -2480,6 +2488,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();
index 36033dbdf30cb5bf1fbe1951fd05d7cc0ea48e9d..248953cf31af13f0c17778854b4aa5a999c160e6 100644 (file)
     <tr>
      <th align="right" nowrap>[% 'Last RFQ Number' | $T8 %]</th>
      <td><input name="rfqnumber" size="10" value="[% HTML.escape(defaults_rfqnumber) %]"></td>
+     <th align="right" nowrap>[% 'Last Assembly Number' | $T8 %]</th>
+     <td><input name="assemblynumber" size="10" value="[% HTML.escape(defaults_assemblynumber) %]"></td>
     </tr>
 
     <tr>
      <th align="right" nowrap>[% 'Last Sales Delivery Order Number' | $T8 %]</th>
      <td><input name="sdonumber" size="10" value="[% HTML.escape(defaults_sdonumber) %]"></td>
+    </tr>
+
+    <tr>
      <th align="right" nowrap>[% 'Last Purchase Delivery Order Number' | $T8 %]</th>
      <td><input name="pdonumber" size="10" value="[% HTML.escape(defaults_pdonumber) %]"></td>
     </tr>
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>