commit fc4e61993d9234665db7391ed5aec7aa1b6d6ea9
Author: Jan Büren <jan@kivitendo-premium.de>
Date:   Fri Nov 18 15:36:20 2016 +0100

    optionales Feature für SEPA Überweisungen
    
    Nach der Rechnungsnummer im Verwendungszweck zusätzlich Kunden- oder Lieferantennummer angeben.
    Optional konfigurierbar in der Mandatenkonfiguration und übersetzbar für alle verfügbaren Sprachen.

diff --git a/SL/DB/MetaSetup/Default.pm b/SL/DB/MetaSetup/Default.pm
index 775961593..0ef66db25 100644
--- a/SL/DB/MetaSetup/Default.pm
+++ b/SL/DB/MetaSetup/Default.pm
@@ -110,6 +110,7 @@ __PACKAGE__->meta->columns(
   sales_purchase_order_ship_missing_column  => { type => 'boolean', default => 'false' },
   sdonumber                                 => { type => 'text' },
   sepa_creditor_id                          => { type => 'text' },
+  sepa_reference_add_vc_vc_id               => { type => 'boolean', default => 'false' },
   servicenumber                             => { type => 'text' },
   show_bestbefore                           => { type => 'boolean', default => 'false' },
   show_longdescription_select_item          => { type => 'boolean', default => 'false' },
diff --git a/SL/SEPA.pm b/SL/SEPA.pm
index a9ba2f3da..7724a52aa 100644
--- a/SL/SEPA.pm
+++ b/SL/SEPA.pm
@@ -24,6 +24,7 @@ sub retrieve_open_invoices {
   my $dbh      = $params{dbh} || $form->get_standard_dbh($myconfig);
   my $arap     = $params{vc} eq 'customer' ? 'ar'       : 'ap';
   my $vc       = $params{vc} eq 'customer' ? 'customer' : 'vendor';
+  my $vc_vc_id = $params{vc} eq 'customer' ? 'c_vendor_id' : 'v_customer_id';
 
   my $mandate  = $params{vc} eq 'customer' ? " AND COALESCE(vc.mandator_id, '') <> '' AND vc.mandate_date_of_signature IS NOT NULL " : '';
 
@@ -43,6 +44,7 @@ sub retrieve_open_invoices {
          (${arap}.amount - (${arap}.amount * pt.percent_skonto)) as amount_less_skonto,
          (${arap}.amount * pt.percent_skonto) as skonto_amount,
          vc.name AS vcname, vc.language_id, ${arap}.duedate as duedate, ${arap}.direct_debit,
+         vc.${vc_vc_id} as vc_vc_id,
 
          COALESCE(vc.iban, '') <> '' AND COALESCE(vc.bic, '') <> '' ${mandate} AS vc_bank_info_ok,
 
diff --git a/bin/mozilla/generictranslations.pl b/bin/mozilla/generictranslations.pl
index 7b8d4a196..d4d59d8b0 100644
--- a/bin/mozilla/generictranslations.pl
+++ b/bin/mozilla/generictranslations.pl
@@ -84,10 +84,14 @@ sub edit_sepa_strings {
   my $translation_list = GenericTranslations->list(translation_type => 'sepa_remittance_info_pfx');
   my %translations     = map { ( ($_->{language_id} || 'default') => $_->{translation} ) } @{ $translation_list };
 
+  my $translation_list_vc = GenericTranslations->list(translation_type => 'sepa_remittance_vc_no_pfx');
+  my %translations_vc     =  map { ( ($_->{language_id} || 'default') => $_->{translation} ) } @{ $translation_list_vc };
+
   unshift @{ $form->{LANGUAGES} }, { 'id' => 'default', };
 
   foreach my $language (@{ $form->{LANGUAGES} }) {
-    $language->{translation} = $translations{$language->{id}};
+    $language->{translation}    = $translations{$language->{id}};
+    $language->{translation_vc} = $translations_vc{$language->{id}};
   }
 
   $form->{title} = $locale->text('Edit SEPA strings');
@@ -114,6 +118,10 @@ sub save_sepa_strings {
                               'translation_id'   => undef,
                               'language_id'      => $language->{id},
                               'translation'      => $form->{"translation__" . ($language->{id} || 'default')},);
+    GenericTranslations->save('translation_type' => 'sepa_remittance_vc_no_pfx',
+                              'translation_id'   => undef,
+                              'language_id'      => $language->{id},
+                              'translation'      => $form->{"translation__" . ($language->{id} || 'default') . "__vc" },);
   }
 
   $form->{message} = $locale->text('The SEPA strings have been saved.');
diff --git a/bin/mozilla/sepa.pl b/bin/mozilla/sepa.pl
index 2e45511c7..0f5a242a8 100755
--- a/bin/mozilla/sepa.pl
+++ b/bin/mozilla/sepa.pl
@@ -24,6 +24,7 @@ sub bank_transfer_add {
   my $form          = $main::form;
   my $locale        = $main::locale;
   my $vc            = $form->{vc} eq 'customer' ? 'customer' : 'vendor';
+  my $vc_no         = $form->{vc} eq 'customer' ? $::locale->text('VN') : $::locale->text('CN');
 
   $form->{title}    = $vc eq 'customer' ? $::locale->text('Prepare bank collection via SEPA XML') : $locale->text('Prepare bank transfer via SEPA XML');
 
@@ -56,6 +57,13 @@ sub bank_transfer_add {
     my $prefix                    = $translations{ $invoice->{language_id} } || $translations{default} || $::locale->text('Invoice');
     $prefix                      .= ' ' unless $prefix =~ m/ $/;
     $invoice->{reference_prefix}  = $prefix;
+
+    # add c_vendor_id or v_vendor_id as a prefix if a entry exists
+    next unless $invoice->{vc_vc_id};
+
+    my $prefix_vc_number             = $translations{ $invoice->{language_id} } || $translations{default} || $vc_no;
+    $prefix_vc_number               .= ' ' unless $prefix_vc_number =~ m/ $/;
+    $invoice->{reference_prefix_vc}  = ' '  . $prefix_vc_number unless $prefix_vc_number =~ m/^ /;
   }
 
   $form->header();
diff --git a/doc/changelog b/doc/changelog
index 2b77b59a5..90cd476f6 100644
--- a/doc/changelog
+++ b/doc/changelog
@@ -6,6 +6,8 @@
 
 kleinere neue Features und Detailverbesserungen:
 
+  - SEPA Überweisungen zusätzlich Kunden- oder Lieferantennummer im Verwendungszweck vorbelegen
+
   - Verfeinerung der Rechte für Finanzbuchhaltung: Es können nun für Dialogbuchungen,
     Debitoren- und Kreditorenbuchungen extra Rechte vergeben werden
 
@@ -13,7 +15,7 @@ kleinere neue Features und Detailverbesserungen:
     Gibt eine Statistik über Lagerbewegungen, pro Monat/Quartal/Jahr.
 
   - Für UStVA Voranmeldung über Elster gibt es die Anbindung über Geierlein (Installation/Config siehe Commit)
-  
+
   - CSV-Import von Artikel hat nun für existierende Artikel folgende Optionen:
      1. Eigenschaften von existierenden Einträgen aktualisieren
      2. Eigenschaften von existierenden Artikeln aktualisieren / Nicht vorhandene überspringen
@@ -25,7 +27,7 @@ kleinere neue Features und Detailverbesserungen:
     sowie Übersetzungen z.B. als 'description_EN' oder 'description_IT'.
     Auch cvars können als 'cvars_<name>' importiert werden.
     Ebenfalls sind zusätzliche Bemerkungen an den einzelnen Importzeilen eingebaut.
- 
+
   - In der Lager-Mandantenkonfig gibt es das Feature "Zum Fertigen Standardlager des Bestandteils verwenden".
     Statt das Ziellager des Erzeugnisses zu Verwenden, wird nun zur Prüfung der Fertigung das
     Standardlager der einzelnen Bestandteile verwendet.
diff --git a/locale/de/all b/locale/de/all
index db133be9d..9c662f815 100755
--- a/locale/de/all
+++ b/locale/de/all
@@ -150,6 +150,7 @@ $self->{texts} = {
   'Add Client'                  => 'Neuer Mandant',
   'Add Credit Note'             => 'Gutschrift erfassen',
   'Add Customer'                => 'Kunde erfassen',
+  'Add Customer/Vendor Number as a reference add-on for SEPA export.' => 'Kunden- Lieferantennummer im Verwendungszweck bei SEPA-Überweisungen anhängen',
   'Add Delivery Note'           => 'Lieferschein erfassen',
   'Add Delivery Order'          => 'Lieferschein erfassen',
   'Add Dunning'                 => 'Mahnung erzeugen',
@@ -460,6 +461,7 @@ $self->{texts} = {
   'CB Transaction'              => 'SB-Buchung',
   'CB Transactions'             => 'SB-Buchungen',
   'CB/OB Transactions'          => 'SB/EB buchen',
+  'CN'                          => 'Kd-Nr.',
   'CR'                          => 'H',
   'CSS style for pictures'      => 'CSS Style für Bilder',
   'CSV export -- options'       => 'CSV-Export -- Optionen',
@@ -2300,6 +2302,7 @@ $self->{texts} = {
   'Remaining'                   => 'Rest',
   'Remaining Amount'            => 'abzurechnender Betrag',
   'Remaining Net Amount'        => 'abzurechnender Nettobetrag',
+  'Remittance information optional Vendor/Customer No postfix' => 'optionale Verwendungszweckvorbelegung Kd./Lief.-Nummer',
   'Remittance information prefix' => 'Verwendungszweckvorbelegung (Präfix)',
   'Remote Bank Code'            => 'Fremde Bankleitzahl',
   'Remote Name/Customer/Description' => 'Kunden/Lieferantenname und Beschreibung',
@@ -2392,6 +2395,7 @@ $self->{texts} = {
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
+  'SEPA'                        => 'SEPA',
   'SEPA XML download'           => 'SEPA-XML-Download',
   'SEPA creditor ID'            => 'SEPA-Kreditoren-Identifikation',
   'SEPA exports'                => 'SEPA-Exporte',
@@ -3343,6 +3347,7 @@ $self->{texts} = {
   'Users, Clients and User Groups' => 'Benutzer, Mandanten und Benutzergruppen',
   'Usually the sales quotation is valid until the next working day. If a value is set here then the quotation will be valid for at least that many days. The resulting date will be adjusted to the next working day if it ends up on a weekend.' => 'Standardmäßig ist ein Verkaufsangebot bis zum nächsten Werktag gültig. Ist hier ein Wert angegeben, so ist ein Angebot mindestens so viele Tage gültig. Sollte das dabei herauskommende Datum auf ein Wochenende fallen, so wird statt dessen der nachfolgende Arbeitstag genommen.',
   'VAT ID'                      => 'UStdID-Nr',
+  'VN'                          => 'Kred.-Nr.',
   'Valid'                       => 'Gültig',
   'Valid from'                  => 'Gültig ab',
   'Valid until'                 => 'gültig bis',
diff --git a/sql/Pg-upgrade2/sepa_reference_add_vc_vc_id.sql b/sql/Pg-upgrade2/sepa_reference_add_vc_vc_id.sql
new file mode 100644
index 000000000..f454c0698
--- /dev/null
+++ b/sql/Pg-upgrade2/sepa_reference_add_vc_vc_id.sql
@@ -0,0 +1,5 @@
+-- @tag: sepa_reference_add_vc_vc_id
+-- @description: Einstellung, ob bei SEPA Überweisungen zusätzlich die Lieferanten-/Kundennummer im Verwendungszweck angezeigt wird
+-- @depends: release_3_4_1
+
+ALTER TABLE defaults ADD COLUMN sepa_reference_add_vc_vc_id boolean DEFAULT FALSE;
diff --git a/templates/webpages/client_config/_features.html b/templates/webpages/client_config/_features.html
index c95c6e5db..324c0c588 100644
--- a/templates/webpages/client_config/_features.html
+++ b/templates/webpages/client_config/_features.html
@@ -218,6 +218,10 @@
       </div>
     </td>
   </tr>
-
+  <tr><td class="listheading" colspan="4">[% LxERP.t8("SEPA") %]</td></tr>
+  <tr>
+   <td align="right">[% LxERP.t8('Add Customer/Vendor Number as a reference add-on for SEPA export.') %]</td>
+   <td>[% L.yes_no_tag('defaults.sepa_reference_add_vc_vc_id', SELF.defaults.sepa_reference_add_vc_vc_id) %]</td>
+  </tr>
  </table>
 </div>
diff --git a/templates/webpages/generictranslations/edit_sepa_strings.html b/templates/webpages/generictranslations/edit_sepa_strings.html
index e9875b0f3..c974cf791 100644
--- a/templates/webpages/generictranslations/edit_sepa_strings.html
+++ b/templates/webpages/generictranslations/edit_sepa_strings.html
@@ -29,6 +29,23 @@
     <td><input name="translation__[% language.id %]" size="40" value="[% HTML.escape(language.translation) %]"></td>
    </tr>
    [%- END %]
+   <tr>
+    <th class="listheading">&nbsp;</th>
+    <th class="listheading">[% 'Remittance information optional Vendor/Customer No postfix' | $T8 %]</th>
+   </tr>
+
+   [%- FOREACH language = LANGUAGES %]
+   <tr>
+    <td>
+     [%- IF language.id == 'default' %]
+     [% 'Default (no language selected)' | $T8 %]
+     [%- ELSE %]
+     [%- HTML.escape(language.description) %]
+     [%- END %]
+    </td>
+    <td><input name="translation__[% language.id %]__vc" size="40" value="[% HTML.escape(language.translation_vc) %]"></td>
+   </tr>
+   [%- END %]
 
   </table>
 
diff --git a/templates/webpages/sepa/bank_transfer_add.html b/templates/webpages/sepa/bank_transfer_add.html
index 4b2502242..89c36e38b 100644
--- a/templates/webpages/sepa/bank_transfer_add.html
+++ b/templates/webpages/sepa/bank_transfer_add.html
@@ -86,8 +86,12 @@
       <td align="right">[% invoice.transdate %]</td>
       <td align="right">[% invoice.duedate %]</td>
       <td>
+    [% IF INSTANCE_CONF.get_sepa_reference_add_vc_vc_id %]
+       [%- SET reference = invoice.reference_prefix _ invoice.invnumber _ invoice.reference_prefix_vc _ invoice.vc_vc_id %]
+    [% ELSE %]
        [%- SET reference = invoice.reference_prefix _ invoice.invnumber %]
-       <input name="bank_transfers[].reference" value="[% HTML.escape(reference.substr(0, 140)) %]" maxlength="140" size="20">
+    [% END %]
+       <input name="bank_transfers[].reference" value="[% HTML.escape(reference.substr(0, 140)) %]" maxlength="140" size="30">
       </td>
       <td align="right">
        <input id=[% loop.count %] name="bank_transfers[].amount" id="amount_[% loop.count %]" value="[% LxERP.format_amount(invoice.invoice_amount_suggestion, 2) %]" style="text-align: right" size="12">
