DATEV Format 2018 Backend, Musterdateien und Tests
authorJan Büren <jan@kivitendo-premium.de>
Thu, 21 Sep 2017 11:49:48 +0000 (13:49 +0200)
committerJan Büren <jan@kivitendo-premium.de>
Thu, 21 Sep 2017 12:12:30 +0000 (14:12 +0200)
Technischer Einstieg: perldoc SL::DATEV::CSV

14 files changed:
SL/DATEV.pm
SL/DATEV/CSV.pm [new file with mode: 0644]
doc/DATEV-2015/EXTF_Anlag-Buchungen.csv [new file with mode: 0644]
doc/DATEV-2015/EXTF_Anlag-Filialen.csv [new file with mode: 0644]
doc/DATEV-2015/EXTF_Buchungsstapel.csv [new file with mode: 0644]
doc/DATEV-2015/EXTF_Buchungstextkonstanten.csv [new file with mode: 0644]
doc/DATEV-2015/EXTF_Div-Adressen.csv [new file with mode: 0644]
doc/DATEV-2015/EXTF_Sachkontobeschriftungen.csv [new file with mode: 0644]
doc/DATEV-2015/EXTF_Stammdaten-Deb-Kred.csv [new file with mode: 0644]
doc/DATEV-2015/EXTF_Textschluessel.csv [new file with mode: 0644]
doc/DATEV-2015/EXTF_Wiederkehrende-Buchungen.csv [new file with mode: 0644]
doc/DATEV-2015/EXTF_Zahlungsbedingungen.csv [new file with mode: 0644]
t/datev/datev_format_2018.t [new file with mode: 0644]
t/datev/invoices.t

index d33692e..6f222b5 100644 (file)
@@ -32,9 +32,11 @@ use strict;
 
 use SL::DBUtils;
 use SL::DATEV::KNEFile;
+use SL::DATEV::CSV;
 use SL::DB;
 use SL::HTML::Util ();
 use SL::Locale::String qw(t8);
+use SL::Iconv qw(convert);
 
 use Data::Dumper;
 use DateTime;
@@ -345,7 +347,26 @@ sub kne_export {
 }
 
 sub csv_export {
-  die 'not yet implemented';
+  my ($self) = @_;
+  my $result;
+
+  die 'no exporttype set!' unless $self->has_exporttype;
+
+  if ($self->exporttype == DATEV_ET_BUCHUNGEN) {
+    _csv_buchungsexport_to_file($self, data => $self->csv_buchungsexport);
+
+  } elsif ($self->exporttype == DATEV_ET_STAMM) {
+    die 'will never be implemented';
+    # 'Background: Export should only contain non
+    #  DATEV-Charts and DATEV import will only
+    #  import new Charts.'
+  } elsif ($self->exporttype == DATEV_ET_CSV) {
+    $result = $self->csv_export_for_tax_accountant;
+  } else {
+    die 'unrecognized exporttype';
+  }
+
+return $result;
 }
 
 sub obe_export {
@@ -800,9 +821,6 @@ sub datetofour {
 
   my ($day, $month, $year) = split(/\./, $date);
 
-  if ($day =~ /^0/) {
-    $day = substr($day, 1, 1);
-  }
   if (length($month) < 2) {
     $month = "0" . $month;
   }
@@ -949,7 +967,7 @@ sub generate_datev_lines {
         $datev_data{belegfeld2} = $transaction->[$haben]->{'duedate'};
       }
     }
-
+    $datev_data{soll_haben_kennzeichen} = (0 < $umsatz) ? 'H' : 'S';
     $datev_data{umsatz} = abs($umsatz); # sales invoices without tax have a different sign???
 
     # Dies ist die einzige Stelle die datevautomatik auswertet. Was soll gesagt werden?
@@ -1325,6 +1343,98 @@ sub csv_export_for_tax_accountant {
   return { download_token => $self->download_token, filenames => \@filenames };
 }
 
+sub csv_buchungsexport {
+  my $self = shift;
+  my %params = @_;
+
+  $self->generate_datev_data(from_to => $self->fromto);
+  return if $self->errors;
+
+  my @datev_lines = @{ $self->generate_datev_lines };
+
+  my @csv_columns = SL::DATEV::CSV->kivitendo_to_datev();
+  my @csv_headers = SL::DATEV::CSV->generate_csv_header(
+                      from                     => $self->from->ymd(''),
+                      to                       => $self->to->ymd(''),
+                      first_day_of_fiscal_year => $self->to->year . '0101',
+                      locked                   => 0
+                    );
+
+  my @array_of_datev;
+
+  # 2 Headers
+  push @array_of_datev, \@csv_headers;
+  push @array_of_datev, [ map { $_->{csv_header_name} } @csv_columns ];
+
+  foreach my $row ( @datev_lines ) {
+    my @current_datev_row;
+
+    # format transformation
+    foreach (qw(belegfeld1 kost1 kost2)) {
+      $row->{$_} = SL::Iconv::convert("UTF-8", "CP1252", $row->{$_}) if $row->{$_};
+    }
+    # shorten strings
+    if ($row->{belegfeld1}) {
+      $row->{buchungsbes} = $row->{belegfeld1} if $row->{belegfeld1};
+      $row->{belegfeld1}  = substr($row->{belegfeld1}, 0, 12);
+      $row->{buchungsbes} = substr($row->{buchungsbes}, 0, 60);
+    }
+
+    $row->{datum}       = datetofour($row->{datum}, 0);
+    $row->{kost1}       = substr($row->{kost1}, 0, 8) if $row->{kost1};
+    $row->{kost2}       = substr($row->{kost2}, 0, 8) if $row->{kost2};
+
+    # , as decimal point and trim for UstID
+    $row->{umsatz}      =~ s/\./,/;
+    $row->{ustid}       =~ s/\s//g if $row->{ustid}; # trim whitespace
+
+    foreach my $column (@csv_columns) {
+      if (exists $column->{max_length} && $column->{kivi_datev_name} ne 'not yet implemented') {
+        # check max length
+        die "Incorrect lenght of field" if length($row->{ $column->{kivi_datev_name} }) > $column->{max_length};
+      }
+      if (exists $column->{valid_check} && $column->{kivi_datev_name} ne 'not yet implemented') {
+        # more checks
+        die "Not a valid value: '$row->{ $column->{kivi_datev_name} }'" .
+            " for '$column->{kivi_datev_name}' with amount '$row->{umsatz}'"
+              unless ($column->{valid_check}->($row->{ $column->{kivi_datev_name} }));
+      }
+      push @current_datev_row, $row->{ $column->{kivi_datev_name} };
+    }
+    push @array_of_datev, \@current_datev_row;
+  }
+  return \@array_of_datev;
+}
+
+sub _csv_buchungsexport_to_file {
+  my $self   = shift;
+  my %params = @_;
+
+  # we can definitely deny shorter data structures
+  croak ("Need at least 2 rows for header info") unless scalar @{ $params{data} } > 1;
+
+  my $filename = "EXTF_DATEV_kivitendo" . $self->from->ymd() . '-' . $self->to->ymd() . ".csv";
+  my @data = \$params{data};
+
+  # EXTF_Buchungsstapel.csv: ISO-8859 text, with very long lines, with CRLF line terminators
+  my $csv = Text::CSV_XS->new({
+              binary       => 1,
+              sep_char     => ";",
+              always_quote => 1,
+              eol          => "\r\n",
+            }) or die "Cannot use CSV: ".Text::CSV_XS->error_diag();
+
+  if ($csv->version >= 1.18) {
+    # get rid of stupid datev warnings in "Validity program"
+    $csv->quote_empty(1);
+  }
+
+  my $csv_file = IO::File->new($self->export_path . '/' . $filename, '>:encoding(iso-8859-1)') or die "Can't open: $!";
+  $csv->print($csv_file, $_) for @{ $params{data} };
+  $csv_file->close;
+
+  return { download_token => $self->download_token, filenames => $params{filename} };
+}
 sub DESTROY {
   clean_temporary_directories();
 }
@@ -1522,6 +1632,35 @@ Example:
   #                  ]
   # };
 
+
+=item csv_buchungsexport
+
+Generates the CSV-Format data for the CSV DATEV export and returns
+an 2-dimensional array as an array_ref.
+
+Requires $self->fromto for a valid DATEV header.
+
+Furthermore we assume that the first day of the fiscal year is
+the first of January and we cannot guarantee that our data in kivitendo
+is locked, that means a booking cannot be modified after a defined (vat tax)
+period.
+Some validity checks (max_length and regex) will be done if the
+data structure contains them and the field is defined.
+
+To add or alter the structure of the data take a look at SL::DATEV::CSV.pm
+
+=item _csv_buchungsexport_to_file
+
+Generates one downloadable csv file wrapped in a zip archive.
+Basically this method is just a thin wrapper for TEXT::CSV_XS.pm
+
+Generates a CSV-file with the same encodings as defined in DATEV Format CSV 2015:
+ $ file
+ $ EXTF_Buchungsstapel.csv: ISO-8859 text, with very long lines, with CRLF line terminators
+
+Usage: _csv_buchungsexport_to_file($self, data => $self->csv_buchungsexport);
+
+
 =back
 
 =head1 ATTRIBUTES
@@ -1650,6 +1789,7 @@ OBE export is currently not implemented.
 =head1 SEE ALSO
 
 L<SL::DATEV::KNEFile>
+L<SL::DATEV::CSV>
 
 =head1 AUTHORS
 
diff --git a/SL/DATEV/CSV.pm b/SL/DATEV/CSV.pm
new file mode 100644 (file)
index 0000000..9792d83
--- /dev/null
@@ -0,0 +1,371 @@
+package SL::DATEV::CSV;
+
+use strict;
+
+use SL::Locale::String qw(t8);
+use SL::DB::Datev;
+
+use Carp;
+use DateTime;
+
+
+my @kivitendo_to_datev = (
+                            {
+                              kivi_datev_name => 'umsatz',
+                              csv_header_name => t8('Transaction Value'),
+                              max_length      => 13,
+                              type            => 'Value',
+                              valid_check     => sub { return (shift =~ m/^\d{1,10}(\,\d{1,2})?$/) },
+                            },
+                            {
+                              kivi_datev_name => 'soll_haben_kennzeichen',
+                              csv_header_name => t8('Debit/Credit Label'),
+                              max_length      => 1,
+                              type            => 'Text',
+                              valid_check     => sub { return (shift =~ m/^(S|H)$/) },
+                            },
+                            {
+                              kivi_datev_name => 'waehrung',
+                              csv_header_name => t8('Transaction Value Currency Code'),
+                              max_length      => 3,
+                              type            => 'Text',
+                              valid_check     => sub { return (shift =~ m/^[A-Z]{3}$/) },
+                            },
+                            {
+                              kivi_datev_name => 'wechselkurs',
+                              csv_header_name => t8('Exchange Rate'),
+                              max_length      => 11,
+                              type            => 'Number',
+                              valid_check     => sub { return (shift =~ m/^[0-9]*\.?[0-9]*$/) },
+                            },
+                            {
+                              kivi_datev_name => 'not yet implemented',
+                              csv_header_name => t8('Base Transaction Value'),
+                            },
+                            {
+                              kivi_datev_name => 'not yet implemented',
+                              csv_header_name => t8('Base Transaction Value Currency Code'),
+                            },
+                            {
+                              kivi_datev_name => 'konto',
+                              csv_header_name => t8('Account'),
+                              max_length      => 9, # May contain a maximum of 8 or 9 digits -> perldoc
+                              type            => 'Account',
+                              valid_check     => sub { return (shift =~ m/^[0-9]{4,9}$/) },
+                            },
+                            {
+                              kivi_datev_name => 'gegenkonto',
+                              csv_header_name => t8('Contra Account'),
+                              max_length      => 9, # May contain a maximum of 8 or 9 digits -> perldoc
+                              type            => 'Account',
+                              valid_check     => sub { return (shift =~ m/^[0-9]{4,9}$/) },
+                            },
+                            {
+                              kivi_datev_name => 'buchungsschluessel',
+                              csv_header_name => t8('Posting Key'),
+                              max_length      => 2,
+                              type            => 'Text',
+                              valid_check     => sub { return (shift =~ m/^[0-9]{0,2}$/) },
+                            },
+                            {
+                              kivi_datev_name => 'datum',
+                              csv_header_name => t8('Invoice Date'),
+                              max_length      => 4,
+                              type            => 'Date',
+                              valid_check     => sub { return (shift =~ m/^[0-9]{4}$/) },
+                            },
+                            {
+                              kivi_datev_name => 'belegfeld1',
+                              csv_header_name => t8('Invoice Field 1'),
+                              max_length      => 12,
+                              type            => 'Text',
+                              valid_check     => sub { my $text = shift; check_encoding($text); },
+                            },
+                            {
+                              kivi_datev_name => 'not yet implemented',
+                              csv_header_name => t8('Invoice Field 2'),
+                             max_length      => 12,
+                              type            => 'Text',
+                              valid_check     => sub { return (shift =~ m/[ -~]{1,12}/) },
+                            },
+                            {
+                              kivi_datev_name => 'not yet implemented',
+                              csv_header_name => t8('Discount'),
+                              type            => 'Value',
+                            },
+                            {
+                              kivi_datev_name => 'buchungsbes',
+                              csv_header_name => t8('Posting Text'),
+                              max_length      => 60,
+                              type            => 'Text',
+                              valid_check     => sub { my $text = shift; return 1 unless $text; check_encoding($text);  },
+                            },  # pos 14
+                            {
+                              kivi_datev_name => 'not yet implemented',
+                            },
+                            {
+                              kivi_datev_name => 'not yet implemented',
+                            },
+                            {
+                              kivi_datev_name => 'not yet implemented',
+                            },
+                            {
+                              kivi_datev_name => 'not yet implemented',
+                            },
+                            {
+                              kivi_datev_name => 'not yet implemented',
+                            },
+                            {
+                              kivi_datev_name => 'not yet implemented',
+                              csv_header_name => t8('Link to invoice'),
+                              max_length      => 210, # DMS Application shortcut and GUID
+                                                      # Example: "BEDI"
+                                                      # "8DB85C02-4CC3-FF3E-06D7-7F87EEECCF3A".
+                            }, # pos 20
+                            {
+                              kivi_datev_name => 'not yet implemented',
+                            },
+                            {
+                              kivi_datev_name => 'not yet implemented',
+                            },
+                            {
+                              kivi_datev_name => 'not yet implemented',
+                            },
+                            {
+                              kivi_datev_name => 'not yet implemented',
+                            },
+                            {
+                              kivi_datev_name => 'not yet implemented',
+                            },
+                            {
+                              kivi_datev_name => 'not yet implemented',
+                            },
+                            {
+                              kivi_datev_name => 'not yet implemented',
+                            },
+                            {
+                              kivi_datev_name => 'not yet implemented',
+                            },
+                            {
+                              kivi_datev_name => 'not yet implemented',
+                            },
+                            {
+                              kivi_datev_name => 'not yet implemented',
+                            },
+                            {
+                              kivi_datev_name => 'not yet implemented',
+                            },
+                            {
+                              kivi_datev_name => 'not yet implemented',
+                            },
+                            {
+                              kivi_datev_name => 'not yet implemented',
+                            },
+                            {
+                              kivi_datev_name => 'not yet implemented',
+                            },
+                            {
+                              kivi_datev_name => 'not yet implemented',
+                            },
+                            {
+                              kivi_datev_name => 'not yet implemented',
+                            },
+                            {
+                              kivi_datev_name => 'kost1',
+                              csv_header_name => t8('Cost Center'),
+                              max_length      => 8,
+                              type            => 'Text',
+                              valid_check     => sub { my $text = shift; return 1 unless $text; check_encoding($text);  },
+                            }, # pos 37
+                            {
+                              kivi_datev_name => 'kost2',
+                              csv_header_name => t8('Cost Center'),
+                              max_length      => 8,
+                              type            => 'Text',
+                              valid_check     => sub { my $text = shift; return 1 unless $text; check_encoding($text);  },
+                            }, # pos 38
+                            {
+                              kivi_datev_name => 'not yet implemented',
+                              csv_header_name => t8('KOST Quantity'),
+                              max_length      => 9,
+                              type            => 'Number',
+                              valid_check     => sub { return (shift =~ m/^[0-9]{0,9}$/) },
+                            }, # pos 39
+                            {
+                              kivi_datev_name => 'ustid',
+                              csv_header_name => t8('EU Member State and VAT ID Number'),
+                              max_length      => 15,
+                              type            => 'Text',
+                              valid_check     => sub {
+                                                       my $ustid = shift;
+                                                       return 1 unless defined($ustid);
+                                                       return ($ustid =~ m/^CH|^[A-Z]{2}\w{5,13}$/);
+                                                     },
+                            }, # pos 40
+  );
+
+sub check_encoding {
+  use Encode qw( decode );
+  # counter test: arabic doesnt work: ݐ
+  my $test = shift;
+  return undef unless $test;
+  if (eval {
+    decode('Windows-1252', $test, Encode::FB_CROAK|Encode::LEAVE_SRC);
+    1
+  }) {
+    return 1;
+  }
+}
+
+sub kivitendo_to_datev {
+  my $self = shift;
+
+  my $entries = scalar (@kivitendo_to_datev);
+  push @kivitendo_to_datev, { kivi_datev_name => 'not yet implemented' } for 1 .. (116 - $entries);
+  return @kivitendo_to_datev;
+}
+
+sub generate_csv_header {
+  my ($self, %params)   = @_;
+
+  # we need from and to in YYYYDDMM
+  croak "Wrong format for from" unless $params{from} =~ m/^[0-9]{8}$/;
+  croak "Wrong format for to"   unless $params{to} =~ m/^[0-9]{8}$/;
+
+  # who knows if we want locking and when our fiscal year starts
+  croak "Wrong state of locking"      unless $params{locked} =~ m/(0|1)/;
+  croak "No startdate of fiscal year" unless $params{first_day_of_fiscal_year} =~ m/^[0-9]{8}$/;
+
+
+  # we can safely set these defaults
+  my $today              = DateTime->now(time_zone => "local");
+  my $created_on         = $today->ymd('') . $today->hms('') . '000';
+  my $length_of_accounts = length(SL::DB::Manager::Chart->get_first(where => [charttype => 'A'])->accno) // 4;
+  my $default_curr       = SL::DB::Default->get_default_currency;
+
+  # datev metadata and the string lenght limits
+  my %meta_datev;
+  my %meta_datev_to_valid_length = (
+    beraternr   =>  7,
+    beratername => 25,
+    mandantennr =>  5,
+  );
+
+  my $datev = SL::DB::Manager::Datev->get_first();
+
+  while (my ($k, $v) = each %meta_datev_to_valid_length) {
+    $meta_datev{$k} = substr $datev->{$k}, 0, $v;
+  }
+
+  my @header = (
+    "EXTF", "300", 21, "Buchungsstapel", 7, $created_on, "", "ki",
+    "kivitendo-datev", "", $meta_datev{beraternr}, $meta_datev{mandantennr},
+    $params{first_day_of_fiscal_year}, $length_of_accounts,
+    $params{from}, $params{to}, "", "", 1, "", $params{locked},
+    $default_curr, "", "", "",""
+  );
+
+  return @header;
+}
+1;
+
+__END__
+
+=encoding utf-8
+
+=head1 NAME
+
+SL::DATEV::CSV - kivitendo DATEV CSV Specification
+
+=head1 SYNOPSIS
+
+The parsing of the DATEV CSV is index based, therefore the correct
+column must be present at the corresponding index, i.e.:
+ Index 2
+ Field Name   : Debit/Credit Label
+ Valid Values : 'S' or 'H'
+ Length:      : 1
+
+The columns in C<@kivi_datev> are in the correct order and the
+specific attributes are defined as a key value hash list for each entry.
+
+The key names are the english translation according to the DATEV specs
+(Leitfaden DATEV englisch).
+
+The two attributes C<max_length> and C<type> are also set as specified
+by the DATEV specs.
+
+To link the structure to kivitendo data, each entry has the attribute C<kivi_datev_name>
+which is by convention the key name as generated by DATEV->generate_datev_data.
+A value of C<'not yet implemented'> indicates that this field has no
+corresponding kivitendo data and will be given an empty value by DATEV->csv_buchungsexport.
+
+
+=head1 SPECIFICATION
+
+This is an excerpt of the DATEV Format 2015 Specification for CSV-Header
+and CSV-Data lines.
+
+=head2 FILENAME
+
+The filename is subject to the following restrictions:
+1. The filename must begin with the prefix DTVF_ or EXTF_.
+2. The filename must end with .csv.
+
+When exporting from or importing into DATEV applications, the filename is
+marked with the prefix "DTVF_" (DATEV Format).
+The prefix "DTVF_" is reserved for DATEV applications.
+If you are using a third-party application to create a file in the DATEV format
+that you want to import using batch processing, use the prefix "EXTF_"
+(External Format).
+
+=head2 File Structure
+
+The file structure of the text file exported/imported is defined as follows
+
+Line 1: Header (serves to assist in the interpretation of the following data)
+
+Line 2: Headline (headline of the user data)
+
+Line 3 – n: Records (user data)
+
+For an valid example file take a look at doc/DATEV-2015/EXTF_Buchungsstapel.csv
+
+
+=head2 Detailed Description
+
+Line 1 must contain 11 fields.
+
+Line 2 must contain 26 fields.
+
+Line 3 - n:  must contain 116 fields, a smaller subset is mandatory.
+
+=head1 FUNCTIONS
+
+=over 4
+
+=item check_encoding
+
+Helper function, returns true if a string is not empty and cp1252 encoded
+
+=item generate_csv_header(from => 'YYYYDDMM', to => 'YYYYDDMM', locked => 0,
+                          first_day_of_fiscal_year => 'YYYYDDMM')
+
+Mostly all other header information are constants or metadata loaded
+from SL::DB::Datev.pm.
+
+Returns the first two entries for the header (see above: File Structure)
+as an array.
+
+All params are mandatory:
+C<params{from}>,  C<params{to}>
+and C<params{first_day_of_fiscal_year}> have to be in YYYYDDMM date string
+format.
+Furthermore C<params{locked}> needs to be a boolean in number format (0|1).
+
+
+=item kivitendo_to_datev
+
+Returns the data structure C<@datev_data> as an array
+
+=back
diff --git a/doc/DATEV-2015/EXTF_Anlag-Buchungen.csv b/doc/DATEV-2015/EXTF_Anlag-Buchungen.csv
new file mode 100644 (file)
index 0000000..12d51fd
--- /dev/null
@@ -0,0 +1,3 @@
+"EXTF";510;63;"Anlagenbuchführung - Buchungssatzvorlagen";1;20150729103107277;;"RE";"Admin";"";29098;55003;20150101;4;;;"";"";;;;"";;"";;;"";;;"";""\r
+Bereich;Kontonummer;Buchungssatztyp;KontonummerSoll;KontonummerHaben;Buchungstext\r
+30;400;"N";4830;400;"Normalabschreibung"\r
diff --git a/doc/DATEV-2015/EXTF_Anlag-Filialen.csv b/doc/DATEV-2015/EXTF_Anlag-Filialen.csv
new file mode 100644 (file)
index 0000000..3f75ae9
--- /dev/null
@@ -0,0 +1,3 @@
+"EXTF";510;62;"Anlagenbuchführung - Filialen";1;20150729103107277;;"RE";"Admin";"";29098;55003;20150101;4;;;"";"";;;;"";;"";;;"";;;"";""\r
+Filialnummer;Filialbezeichnung\r
+1;"Hauptbetrieb"\r
diff --git a/doc/DATEV-2015/EXTF_Buchungsstapel.csv b/doc/DATEV-2015/EXTF_Buchungsstapel.csv
new file mode 100644 (file)
index 0000000..debb060
--- /dev/null
@@ -0,0 +1,40 @@
+"EXTF";510;21;"Buchungsstapel";7;20150729093158705;;"SV";"Admin";"";55003;63021;20160101;4;20160101;20160331;"Kasse";"";1;0;0;"EUR";;"KP";;"";;;"";"";\r
+Umsatz (ohne Soll/Haben-Kz);Soll/Haben-Kennzeichen;WKZ Umsatz;Kurs;Basis-Umsatz;WKZ Basis-Umsatz;Konto;Gegenkonto (ohne BU-Schlüssel);BU-Schlüssel;Belegdatum;Belegfeld 1;Belegfeld 2;Skonto;Buchungstext;Postensperre;Diverse Adressnummer;Geschäftspartnerbank;Sachverhalt;Zinssperre;Beleglink;Beleginfo - Art 1;Beleginfo - Inhalt 1;Beleginfo - Art 2;Beleginfo - Inhalt 2;Beleginfo - Art 3;Beleginfo - Inhalt 3;Beleginfo - Art 4;Beleginfo - Inhalt 4;Beleginfo - Art 5;Beleginfo - Inhalt 5;Beleginfo - Art 6;Beleginfo - Inhalt 6;Beleginfo - Art 7;Beleginfo - Inhalt 7;Beleginfo - Art 8;Beleginfo - Inhalt 8;KOST1 - Kostenstelle;KOST2 - Kostenstelle;Kost-Menge;EU-Land u. UStID;EU-Steuersatz;Abw. Versteuerungsart;Sachverhalt L+L;Funktionsergänzung L+L;BU 49 Hauptfunktionstyp;BU 49 Hauptfunktionsnummer;BU 49 Funktionsergänzung;Zusatzinformation - Art 1;Zusatzinformation- Inhalt 1;Zusatzinformation - Art 2;Zusatzinformation- Inhalt 2;Zusatzinformation - Art 3;Zusatzinformation- Inhalt 3;Zusatzinformation - Art 4;Zusatzinformation- Inhalt 4;Zusatzinformation - Art 5;Zusatzinformation- Inhalt 5;Zusatzinformation - Art 6;Zusatzinformation- Inhalt 6;Zusatzinformation - Art 7;Zusatzinformation- Inhalt 7;Zusatzinformation - Art 8;Zusatzinformation- Inhalt 8;Zusatzinformation - Art 9;Zusatzinformation- Inhalt 9;Zusatzinformation - Art 10;Zusatzinformation- Inhalt 10;Zusatzinformation - Art 11;Zusatzinformation- Inhalt 11;Zusatzinformation - Art 12;Zusatzinformation- Inhalt 12;Zusatzinformation - Art 13;Zusatzinformation- Inhalt 13;Zusatzinformation - Art 14;Zusatzinformation- Inhalt 14;Zusatzinformation - Art 15;Zusatzinformation- Inhalt 15;Zusatzinformation - Art 16;Zusatzinformation- Inhalt 16;Zusatzinformation - Art 17;Zusatzinformation- Inhalt 17;Zusatzinformation - Art 18;Zusatzinformation- Inhalt 18;Zusatzinformation - Art 19;Zusatzinformation- Inhalt 19;Zusatzinformation - Art 20;Zusatzinformation- Inhalt 20;Stück;Gewicht;Zahlweise;Forderungsart;Veranlagungsjahr;Zugeordnete Fälligkeit;Skontotyp;Auftragsnummer;Buchungstyp;Ust-Schlüssel (Anzahlungen);EU-Land (Anzahlungen);Sachverhalt L+L (Anzahlungen);EU-Steuersatz (Anzahlungen);Erlöskonto (Anzahlungen);Herkunft-Kz;Leerfeld;KOST-Datum;Mandatsreferenz;Skontosperre;Gesellschaftername;Beteiligtennummer;Identifikationsnummer;Zeichnernummer;Postensperre bis;Bezeichnung SoBil-Sachverhalt;Kennzeichen SoBil-Buchung;Festschreibung;Leistungsdatum;Datum Zuord.Steuerperiode\r
+100,18;"S";"";;;"";48400;8401;"";3101;"";"";;"Test Anzahlung";;"";1;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"50";"";;"";;"";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";2012;;1;"Projekt 4711";"AG";3;"";;;8070;"WK";"";;"";;"";;"";"";;"";;1;;\r
+10,00;"S";"";;;"";48220;8400;"";3103;"";"";;"Normalabschr. immater. VermG";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"90";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;10022016;\r
+64083;"S";"";;;"";4400;85;"";3101;"";"";;"Normalabschreibung Gebäude";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"50";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;0;;\r
+3584,56;"S";"";;;"";4831;100;"";3101;"";"";;"Normalabschreibung Gebäude";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"50";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;0;;\r
+3745,56;"S";"";;;"";4830;210;"";3101;"";"";;"Normalabschreibung Sachanlagen";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"50";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+531,16;"S";"";;;"";4832;320;"";3101;"";"";;"Normalabschreibung Kfz";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"20";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";0;"";;;0;"WK";"";;"";;"";;"";"";;"";;1;;\r
+4979,65;"H";"";;;"";8400;30200;"";0902;"201202010";"";;"";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"202";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+11687,62;"H";"";;;"";8120;40000;"";0902;"201202011";"";;"";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"299";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+13968,83;"H";"";;;"";8125;40100;"";1602;"201202023";"";;"";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"299";"889";5;"DE133546770";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+11807,63;"H";"";;;"";8125;40100;"";1702;"201202024";"";;"";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"299";"";;"DE133546770";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+4120,51;"H";"";;;"";8405;30100;"";1702;"201202025";"";;"";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"201";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+16585,28;"H";"";;;"";8405;10200;"";1702;"201202026";"";;"";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"202";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+15301,67;"H";"";;;"";8400;10300;"";2002;"201202027";"";;"";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"201";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+7404,94;"H";"";;;"";8400;60391;"";2102;"201202028";"";;"";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"199";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+66976,12;"H";"";;;"";8407;10400;"";2202;"201202029";"";;"";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"201";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+118,55;"H";"";;;"";1000;1369;"";0202;"4";"";;"Test-Shop";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;"";;"";;;;;;"Beleg fehlt";"Post";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+26,87;"H";"";;;"";1000;4930;"9";0102;"";"";;"Schreibwaren";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"90";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+460,00;"S";"";;;"";1000;1360;"";0702;"";"";;"Kasseneinlage";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+124,00;"H";"CHF";1,240402;100,00;"EUR";21100;8050;"";2702;"";"";;"Umsatz Schweiz";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+70,96;"H";"";;;"";1100;4530;"9";2702;"";"";;"Diesel";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"20";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+17107,00;"S";"";;;"";31100;8125;"";2702;"201202007";"";;"Ausland EU";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"520";"45";30;"ATU36251489";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";0;"";;;0;"WK";"";;"";;"";;"";"";;"";;0;;\r
+5856,00;"H";"";;;"";1100;980;"";2802;"";"";;"Gebäudeversicherung 03/12-02/13";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+70,27;"H";"";;;"";1100;4530;"9";2802;"";"";;"Benzin";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"20";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+1763,58;"H";"";;;"";1100;4580;"9";2802;"";"";;"Leasing Van";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"20";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+1190,00;"H";"";;;"";8050;10100;"3";1403;"AR1234";"";;"Aufteilung AR ohne Automatikkonto";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+700,00;"S";"";;;"";8050;8060;"";1403;"AR1234";"";;"Aufteilung auf Erlöskonto";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+300,00;"S";"";;;"";8050;8070;"";1403;"AR1234";"";;"Aufteilung auf Erlöskonto";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+1190,00;"H";"";;;"";8400;10100;"";1403;"AR2345";"";;"Aufteilung AR mit Automatikkonto";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+600,00;"S";"";;;"";8400;8401;"40";1403;"AR2345";"";;"Auftreilung auf Erlöskonto";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+400,00;"S";"";;;"";8400;8405;"40";1403;"AR2345";"";;"Auftreilung auf Erlöskonto";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+2500,00;"S";"";;;"";10100;8400;"";0103;"AR-78/13";"160316";;"Holzlieferung";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+2500,00;"S";"";;;"";1200;10100;"";0103;"AR-78/13";"";;"Bezahlung";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+119,00;"S";"";;;"";10100;8400;"";0103;"AR-456/13";"";;"Rechnung mit Skontogewährung";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+116,62;"S";"";;;"";1200;10100;"";0103;"AR-456/13";"";2,38;"Zahlung mit 2% Skonto";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+35,00;"S";"";;;"";10001;8400;"";0103;"AR-2013";"";;"falscher Debitor";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+35,00;"H";"";;;"";10001;8400;"20";0103;"AR-2013";"";;"Berichtigung";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+35,00;"S";"";;;"";10100;8400;"";0103;"AR-2013";"";;"richtiger Debitor";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
+488,00;"H";"";;;"";980;4360;"";0101;"";"";;"Gebäudeversicherung";;"";;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"10";"";;"";;"";;;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;;"";;;;"";"";;"";;;;"WK";"";;"";;"";;"";"";;"";;1;;\r
diff --git a/doc/DATEV-2015/EXTF_Buchungstextkonstanten.csv b/doc/DATEV-2015/EXTF_Buchungstextkonstanten.csv
new file mode 100644 (file)
index 0000000..2700c8a
--- /dev/null
@@ -0,0 +1,9 @@
+"EXTF";510;67;"Buchungstextkonstanten";1;20150729093349782;;"RE";"Admin";"";29098;55003;20150101;4;;;"";"";;;;"";;"";;;"";;;"";""\r
+Nummer;Buchungstext\r
+10;"Postwertzeichen"\r
+11;"Bürobedarf"\r
+20;"Benzin"\r
+21;"Diesel"\r
+22;"Kundendienst"\r
+90;"Kasseneinlage"\r
+91;"für Kasse"\r
diff --git a/doc/DATEV-2015/EXTF_Div-Adressen.csv b/doc/DATEV-2015/EXTF_Div-Adressen.csv
new file mode 100644 (file)
index 0000000..53d3285
--- /dev/null
@@ -0,0 +1,5 @@
+"EXTF";510;48;"Diverse Adressen";2;20150729103107277;;"RE";"Admin";"";55003;63021;20150101;4;;;"";"";;;;"";;"";;"";;;"";"";\r
+Adressnummer;Konto;Anrede;Name (Adressattyp Unternehmen);Unternehmensgegenstand;Kurzbezeichnung;Name (Adressattyp natürl. Person);Vorname (Adressattyp natürl. Person);Name (Adressattyp keine Angabe);Adressattyp;Titel/Akad. Grad;Adelstitel;Namensvorsatz;Abweichende Anrede;Adressart;Straße;Postfach;Postleitzahl;Ort;Land;Versandzusatz;Adresszusatz;Abw. Zustellbezeichnung 1;Abw. Zustellbezeichnung 2;Kennz. Korrespondenzadresse;Adresse Gültig von;Adresse Gültig bis;Abweichende Anrede (Rechnungsadresse);Adressart (Rechnungsadresse);Straße (Rechnungsadresse);Postfach (Rechnungsadresse);Postleitzahl (Rechnungsadresse);Ort (Rechnungsadresse);Land (Rechnungsadresse);Versandzusatz (Rechnungsadresse);Adresszusatz (Rechnungsadresse);Abw. Zustellbezeichnung 1 (Rechnungsadresse);Abw. Zustellbezeichnung 2 (Rechnungsadresse);Adresse Gültig von (Rechnungsadresse);Adresse Gültig bis (Rechnungsadresse);Telefon;Bemerkung (Telefon);Telefon GL;Bemerkung (Telefon GL);E-Mail;Bemerkung (E-Mail);Internet;Bemerkung (Internet);Fax;Bemerkung (Fax);Sonstige;Bemerkung (Sonstige);Bankleitzahl 1;Bankbezeichnung 1;Bank-Kontonummer 1;Länderkennzeichen 1;IBAN-Nr. 1;Leerfeld;SWIFT-Code 1;Abw. Kontoinhaber 1;Kennz. Hauptbankverb. 1;Bankverb 1 Gültig von;Bankverb 1 Gültig bis;Bankleitzahl 2;Bankbezeichnung 2;Bank-Kontonummer 2;Länderkennzeichen 2;IBAN-Nr. 2;Leerfeld;SWIFT-Code 2;Abw. Kontoinhaber 2;Kennz. Hauptbankverb. 2;Bankverb 2 Gültig von;Bankverb 2 Gültig bis;Bankleitzahl 3;Bankbezeichnung 3;Bank-Kontonummer 3;Länderkennzeichen 3;IBAN-Nr. 3;Leerfeld;SWIFT-Code 3;Abw. Kontoinhaber 3;Kennz. Hauptbankverb. 3;Bankverb 3 Gültig von;Bankverb 3 Gültig bis;Bankleitzahl 4;Bankbezeichnung 4;Bank-Kontonummer 4;Länderkennzeichen 4;IBAN-Nr. 4;Leerfeld;SWIFT-Code 4;Abw. Kontoinhaber 4;Kennz. Hauptbankverb. 4;Bankverb 4 Gültig von;Bankverb 4 Gültig bis;Bankleitzahl 5;Bankbezeichnung 5;Bank-Kontonummer 5;Länderkennzeichen 5;IBAN-Nr. 5;Leerfeld;SWIFT-Code 5;Abw. Kontoinhaber 5;Kennz. Hauptbankverb. 5;Bankverb 5 Gültig von;Bankverb 5 Gültig bis;Bankleitzahl 6;Bankbezeichnung 6;Bank-Kontonummer 6;Länderkennzeichen 6;IBAN-Nr. 6;Leerfeld;SWIFT-Code 6;Abw. Kontoinhaber 6;Kennz. Hauptbankverb. 6;Bankverb 6 Gültig von;Bankverb 6 Gültig bis;Bankleitzahl 7;Bankbezeichnung 7;Bank-Kontonummer 7;Länderkennzeichen 7;IBAN-Nr. 7;Leerfeld;SWIFT-Code 7;Abw. Kontoinhaber 7;Kennz. Hauptbankverb. 7;Bankverb 7 Gültig von;Bankverb 7 Gültig bis;Bankleitzahl 8;Bankbezeichnung 8;Bank-Kontonummer 8;Länderkennzeichen 8;IBAN-Nr. 8;Leerfeld;SWIFT-Code 8;Abw. Kontoinhaber 8;Kennz. Hauptbankverb. 8;Bankverb 8 Gültig von;Bankverb 8 Gültig bis;Bankleitzahl 9;Bankbezeichnung 9;Bank-Kontonummer 9;Länderkennzeichen 9;IBAN-Nr. 9;Leerfeld;SWIFT-Code 9;Abw. Kontoinhaber 9;Kennz. Hauptbankverb. 9;Bankverb 9 Gültig von;Bankverb 9 Gültig bis;Bankleitzahl 10;Bankbezeichnung 10;Bank-Kontonummer 10;Länderkennzeichen 10;IBAN-Nr. 10;Leerfeld;SWIFT-Code 10;Abw. Kontoinhaber 10;Kennz. Hauptbankverb. 10;Bankverb 10 Gültig von;Bankverb 10 Gültig bis;Kundennummer;Ansprechpartner;Vertreter;Sachbearbeiter;Briefanrede;Grußformel;Sprache;Ausgabeziel;Indiv. Feld 1;Indiv. Feld 2;Indiv. Feld 3;Indiv. Feld 4;Indiv. Feld 5;Indiv. Feld 6;Indiv. Feld 7;Indiv. Feld 8;Indiv. Feld 9;Indiv. Feld 10;Mandatsreferenz 1;Mandatsreferenz 2;Mandatsreferenz 3;Mandatsreferenz 4;Mandatsreferenz 5;Mandatsreferenz 6;Mandatsreferenz 7;Mandatsreferenz 8;Mandatsreferenz 9;Mandatsreferenz 10;Nummer Fremdsystem\r
+"DIV500";30000;"Firma";"Testmöbel GmbH";"";"Testmöbel GmbH";"";"";"";"2";"";"";"";"";"STR";"Feldweg 28";"";"90409";"Nürnberg";"DE";"";"";"";"";1;;;"";"";"";"";"";"";"";"";"";"";"";;;"+49 911 12345678";"";"+49 911 12345678";"";"test@testmöbel.de";"";"www.testmöbel.de";"";"+49 911 987654321";"";"";"";"76069512";"Raiffbk Knoblauchsland";"1122334455";"DE";"";"0";"GENODEF1N08";"Herr Muster";"1";01012013;31122013;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"KDN 75";"Herr Müllermuster";"Frau Mustermann";"Herr Testmann";"";"Mit freundlichen Grüßen";1;3;"kein Muster";"Beispiel";"Testeingabe";"";"";"";"";"";"";"Muster vorhanden";"";"";"";"";"";"";"";"";"";"";""\r
+"DIV600";30000;"Herrn";"";"";"Mustermann";"Mustermann";"";"";"1";"Dr.";"Baron";"zu";"";"STR";"Musterweg 5";"";"90000";"Nürnberg";"DE";"Nicht nachsenden";"";"";"";1;;;"";"";"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";""\r
+"DIV700";30000;"Frau";"";"";"Testmann, Elke";"Testmann";"Elke";"";"1";"";"Landgräfin";"vom und zu";"";"STR";"Wiesenweg 125";"";"90600";"Fürth";"DE";"Bei Umzug bitte mit neuer Anschrift zurück";"";"";"";1;;;"";"";"";"";"";"";"";"";"";"";"";;;"+49 911 505050";"immer erreichbar";"+49 911 505050";"immer erreichbar";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"76000000";"BBk Nürnberg";"998877";"DE";"DE83760000000000998877";"1";"MARKDEF1760";"Frau Beispiel";"1";01012013;12122013;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"Mit den besten Empfehlungen";4;1;"nur zum Test";"nur als Beispiel";"";"nur als Beispiel";"";"nur als Beispiel";"nur zum Test";"nur zum Test";"";"nur als Beispiel";"";"";"";"";"";"";"";"";"";"";""\r
diff --git a/doc/DATEV-2015/EXTF_Sachkontobeschriftungen.csv b/doc/DATEV-2015/EXTF_Sachkontobeschriftungen.csv
new file mode 100644 (file)
index 0000000..0984bdf
--- /dev/null
@@ -0,0 +1,178 @@
+"EXTF";510;20;"Kontenbeschriftungen";2;;;"RE";"Admin";"";55003;63021;20150101;4;;;"";"";;;;"";;"";;"";;;"";"";\r
+Konto;Kontobeschriftung;SprachId\r
+27;"EDV-Software";"de-DE"\r
+35;"Geschäfts- oder Firmenwert";"de-DE"\r
+40;"Verschmorungsmehrwertt";"de-DE"\r
+44;"EDV-Software";"de-DE"\r
+65;"Grundstück Schleifmustermühle 25";"de-DE"\r
+85;"Grundstückswert bebauter Grundstücke";"de-DE"\r
+100;"Fabrikbauten";"de-DE"\r
+210;"Maschinen";"de-DE"\r
+320;"PKW";"de-DE"\r
+350;"LKW";"de-DE"\r
+400;"Betriebsausstattung";"de-DE"\r
+420;"Büroeinrichtung";"de-DE"\r
+440;"Werkzeuge";"de-DE"\r
+480;"Geringwertige Wirtschaftsgüter";"de-DE"\r
+485;"Wirtschaftsgüter Sammelposten";"de-DE"\r
+525;"Wertpapiere des Anlagevermögens";"de-DE"\r
+690;"Darlehen 1 Deutsche Bank";"de-DE"\r
+691;"Darlehen 2 Deutsche Bank";"de-DE"\r
+692;"Darlehen Postbank";"de-DE"\r
+693;"Darlehen Deutsche Bank";"de-DE"\r
+694;"Darlehen Deutsche Bank";"de-DE"\r
+695;"Ratenkredit Pritschenwagen";"de-DE"\r
+696;"Darlehen Schleifmustermühle 25";"de-DE"\r
+860;"Gewinnvortrag vor Verwendung";"de-DE"\r
+980;"Aktive Rechnungsabgrenzung";"de-DE"\r
+986;"Damnum/Disagio";"de-DE"\r
+992;"Abgrenzung unterjährige AfA für BWA";"de-DE"\r
+1000;"Kasse";"de-DE"\r
+1010;"Kasse Werkstatt";"de-DE"\r
+1100;"Postbank Nürnberg";"de-DE"\r
+1111;"Fremdwährung1";"de-DE"\r
+1200;"Deutsche Bank";"de-DE"\r
+1201;"HypoVereinsbank Nürnberg";"de-DE"\r
+1202;"Deutsche Bank";"de-DE"\r
+1203;"USD-Bank";"de-DE"\r
+1210;"Dresdner Bank";"de-DE"\r
+1220;"SchmidtBank";"de-DE"\r
+1230;"Sparkasse";"de-DE"\r
+1250;"Deutsche Bank";"de-DE"\r
+1260;"Stadtspk. Nürnberg";"de-DE"\r
+1270;"Commerzbank Nbg.";"de-DE"\r
+1290;"Finanzmittelanlagen kurzfr. Disposition";"de-DE"\r
+1361;"Geldtransit";"de-DE"\r
+1369;"Unklare Posten";"de-DE"\r
+1400;"Forderungen aus Lieferungen u.Leistung";"de-DE"\r
+1447;"Forderg. aus stfr., n. steuerbaren L+L";"de-DE"\r
+1500;"Sonstige Vermögensgegenstände";"de-DE"\r
+1540;"Steuerüberzahlungen";"de-DE"\r
+1549;"Körperschaftsteuerrückforderung";"de-DE"\r
+1571;"Abziehbare Vorsteuer 7%";"de-DE"\r
+1574;"Abziehbare Vorsteuer aus EU-Erwerb 19%";"de-DE"\r
+1576;"Abziehbare Vorsteuer 19%";"de-DE"\r
+1577;"Abziehbare Vorsteuer § 13b UStG 19%";"de-DE"\r
+1593;"Verrechnung erhaltene Anzahlungen";"de-DE"\r
+1600;"Verbindl. aus Lieferungen u. Leistungen";"de-DE"\r
+1700;"Sonstige Verbindlichkeiten";"de-DE"\r
+1710;"Erhaltene Anzahlungen";"de-DE"\r
+1718;"Erhaltene Anzahlungen 19% USt";"de-DE"\r
+1736;"Verbindl. Steuern und Abgaben";"de-DE"\r
+1741;"Verbindlichk. Lohn- und Kirchensteuer";"de-DE"\r
+1774;"Umsatzsteuer aus EU-Erwerb 19%";"de-DE"\r
+1776;"Umsatzsteuer 19%";"de-DE"\r
+1780;"Umsatzsteuervorauszahlungen";"de-DE"\r
+1781;"Umsatzsteuervorauszahlungen 1/11";"de-DE"\r
+1787;"Umsatzsteuer nach § 13b UStG 19%";"de-DE"\r
+2110;"Zinsaufwendungen f.kfr.Verbindlichkeit.";"de-DE"\r
+2120;"Zinsaufwendungen f.lfr.Verbindlichkeit.";"de-DE"\r
+2126;"Zinsen zur Finanzierung Anlagevermögen";"de-DE"\r
+2200;"Körperschaftsteuer";"de-DE"\r
+2208;"Solidaritätszuschlag";"de-DE"\r
+2315;"Abgänge Sachanlagen Restbuchwert";"de-DE"\r
+2375;"Grundsteuer";"de-DE"\r
+2381;"Spenden kulturelle Zwecke";"de-DE"\r
+2382;"Spenden mildtätige Zwecke";"de-DE"\r
+2650;"Sonstige Zinsen und ähnliche Erträge";"de-DE"\r
+2670;"Diskonterträge";"de-DE"\r
+2701;"Sonstige Erträge Mahngebühren";"de-DE"\r
+2702;"Sonstige Erträge Zinsen";"de-DE"\r
+2860;"Gewinnvortrag nach Verwendung";"de-DE"\r
+3100;"Fremdleistungen";"de-DE"\r
+3123;"Sonst. Leistung EU 19% Vorst., 19% USt";"de-DE"\r
+3300;"Wareneingang 7% Vorsteuer";"de-DE"\r
+3400;"Wareneingang Furnier";"de-DE"\r
+3401;"Wareneingang Spanplatten";"de-DE"\r
+3402;"Wareneingang Farben und Lacke";"de-DE"\r
+3405;"Wareneingang beschichtete Platten";"de-DE"\r
+3406;"Wareneingang Modellbau";"de-DE"\r
+3407;"Wareneingang Messebau";"de-DE"\r
+3409;"Sonstiger Wareneingang";"de-DE"\r
+3425;"EU-Erwerb 19% Vorsteuer und 19% USt";"de-DE"\r
+3736;"Erhaltene Skonti 19% Vorsteuer";"de-DE"\r
+3748;"Erhalt. Skonti EU-Erwerb 19% Vorst/USt";"de-DE"\r
+3961;"Bestandsveränd. Furniere";"de-DE"\r
+3962;"Bestandsveränd. Spanplatten";"de-DE"\r
+3963;"Bestandsveränd. Farben und Lacke";"de-DE"\r
+3964;"Bestandsveränd. beschichtete Platten";"de-DE"\r
+3965;"Bestandsveränd. Sonstige RHB-Stoffe";"de-DE"\r
+3971;"Bestand Furniere";"de-DE"\r
+3972;"Bestand Spanplatten";"de-DE"\r
+3973;"Bestand Farben und Lacke";"de-DE"\r
+3974;"Bestand beschichtete Platten";"de-DE"\r
+3975;"Sonstiger Bestand";"de-DE"\r
+4110;"Löhne";"de-DE"\r
+4120;"Gehälter";"de-DE"\r
+4127;"Geschäftsführergehälter";"de-DE"\r
+4130;"Gesetzliche Sozialaufwendungen";"de-DE"\r
+4138;"Beiträge zur Berufsgenossenschaft";"de-DE"\r
+4145;"Freiwillige soziale Aufwendung. LSt-pfl.";"de-DE"\r
+4149;"Pauschale Steuer für Zuschüsse";"de-DE"\r
+4175;"Fahrtkostenerstatt. Whg./Arbeitsstätte";"de-DE"\r
+4190;"Aushilfslöhne";"de-DE"\r
+4199;"Pauschale Steuer für Aushilfen";"de-DE"\r
+4200;"Raumkosten";"de-DE"\r
+4210;"Miete, unbewegliche Wirtschaftsgüter";"de-DE"\r
+4240;"Gas, Strom, Wasser";"de-DE"\r
+4250;"Reinigung";"de-DE"\r
+4260;"Instandhaltung betrieblicher Räume";"de-DE"\r
+4270;"Abgaben betrieblich genutzt. Grundbesitz";"de-DE"\r
+4280;"Sonstige Raumkosten";"de-DE"\r
+4320;"Gewerbesteuer";"de-DE"\r
+4360;"Versicherungen";"de-DE"\r
+4366;"Versicherung für Gebäude";"de-DE"\r
+4510;"Kfz-Steuern";"de-DE"\r
+4520;"Kfz-Versicherungen";"de-DE"\r
+4530;"Laufende Kfz-Betriebskosten";"de-DE"\r
+4540;"Kfz-Reparaturen";"de-DE"\r
+4580;"Sonstige Kfz-Kosten";"de-DE"\r
+4600;"Werbekosten";"de-DE"\r
+4630;"Geschenke abzugsfähig";"de-DE"\r
+4640;"Repräsentationskosten";"de-DE"\r
+4651;"abzugsfähige Bewirtungskosten";"de-DE"\r
+4654;"Nicht abzugsfähige Bewirtungskosten";"de-DE"\r
+4663;"Reisekosten Arbeitnehmer, Fahrtkosten";"de-DE"\r
+4664;"Reisekosten AN Verpfleg.mehraufwand";"de-DE"\r
+4666;"Reisekosten AN Übernachtungsaufwand";"de-DE"\r
+4710;"Verpackungsmaterial";"de-DE"\r
+4730;"Ausgangsfrachten";"de-DE"\r
+4750;"Transportversicherungen";"de-DE"\r
+4800;"Reparatur/Instandh. Anlagen u. Maschinen";"de-DE"\r
+4810;"Mietleasing bewegliche Wirtschaftsgüter";"de-DE"\r
+4822;"Abschreibung immaterielle VermG";"de-DE"\r
+4830;"Abschreibungen auf Sachanlagen";"de-DE"\r
+4831;"Abschreibungen auf Gebäude";"de-DE"\r
+4832;"Abschreibungen auf Kfz";"de-DE"\r
+4862;"Abschreibungen auf WG Sammelposten";"de-DE"\r
+4901;"Getränke für Getränkeautomat";"de-DE"\r
+4910;"Porto";"de-DE"\r
+4920;"Telefon";"de-DE"\r
+4921;"Mobilfunk";"de-DE"\r
+4930;"Bürobedarf";"de-DE"\r
+4940;"Zeitschriften, Bücher";"de-DE"\r
+4945;"Fortbildungskosten";"de-DE"\r
+4950;"Rechts- und Beratungskosten";"de-DE"\r
+4955;"Buchführungskosten";"de-DE"\r
+4969;"Aufwand Abraum-/Abfallbeseitigung";"de-DE"\r
+4970;"Nebenkosten des Geldverkehrs";"de-DE"\r
+4980;"Betriebsbedarf";"de-DE"\r
+4993;"Kalkulatorische Abschreibungen";"de-DE"\r
+8000;"indiv., Erlöse";"de-DE"\r
+8120;"Steuerfr. Erlöse Furniere Drittland";"de-DE"\r
+8125;"Steuerfr. EG-Erlöse Furniere";"de-DE"\r
+8336;"Nicht steuerbare s. Leistung § 18b UStG";"de-DE"\r
+8400;"Erlöse Furniere";"de-DE"\r
+8401;"Erlöse Kleinmöbel";"de-DE"\r
+8405;"Erlöse beschichtete Platten";"de-DE"\r
+8406;"Erlöse Modellbau";"de-DE"\r
+8407;"Erlöse Messebau";"de-DE"\r
+8611;"Verrechn. sonstige Sachbezüge 19% USt";"de-DE"\r
+8730;"Gewährte Skonti";"de-DE"\r
+8736;"Gewährte Skonti 19% USt";"de-DE"\r
+8741;"Gewährte Skonti Leistungen §13b UStG";"de-DE"\r
+8743;"Gewährte Skonti stfr. EU-Lieferung";"de-DE"\r
+8820;"Erlöse Sachanlageverkäufe 19% USt";"de-DE"\r
+9000;"Saldenvorträge Sachkonten";"de-DE"\r
+9008;"Saldenvorträge Debitoren";"de-DE"\r
+9009;"Saldenvorträge Kreditoren";"de-DE"\r
diff --git a/doc/DATEV-2015/EXTF_Stammdaten-Deb-Kred.csv b/doc/DATEV-2015/EXTF_Stammdaten-Deb-Kred.csv
new file mode 100644 (file)
index 0000000..4678566
--- /dev/null
@@ -0,0 +1,6 @@
+"EXTF";510;16;"Debitoren/Kreditoren";4;20150729093352970;;"RE";"Admin";"";55003;63021;20150101;4;;;"";"";;;;"";;"";;"";;;"";"";\r
+Konto;Name (Adressattyp Unternehmen);Unternehmensgegenstand;Name (Adressattyp natürl. Person);Vorname (Adressattyp natürl. Person);Name (Adressattyp keine Angabe);Adressattyp;Kurzbezeichnung;EU-Land;EU-UStID;Anrede;Titel/Akad. Grad;Adelstitel;Namensvorsatz;Adressart;Straße;Postfach;Postleitzahl;Ort;Land;Versandzusatz;Adresszusatz;Abweichende Anrede;Abw. Zustellbezeichnung 1;Abw. Zustellbezeichnung 2;Kennz. Korrespondenzadresse;Adresse Gültig von;Adresse Gültig bis;Telefon;Bemerkung (Telefon);Telefon GL;Bemerkung (Telefon GL);E-Mail;Bemerkung (E-Mail);Internet;Bemerkung (Internet);Fax;Bemerkung (Fax);Sonstige;Bemerkung (Sonstige);Bankleitzahl 1;Bankbezeichnung 1;Bank-Kontonummer 1;Länderkennzeichen 1;IBAN-Nr. 1;IBAN1 korrekt;SWIFT-Code 1;Abw. Kontoinhaber 1;Kennz. Hauptbankverb. 1;Bankverb 1 Gültig von;Bankverb 1 Gültig bis;Bankleitzahl 2;Bankbezeichnung 2;Bank-Kontonummer 2;Länderkennzeichen 2;IBAN-Nr. 2;IBAN2 korrekt;SWIFT-Code 2;Abw. Kontoinhaber 2;Kennz. Hauptbankverb. 2;Bankverb 2 Gültig von;Bankverb 2 Gültig bis;Bankleitzahl 3;Bankbezeichnung 3;Bank-Kontonummer 3;Länderkennzeichen 3;IBAN-Nr. 3;IBAN3 korrekt;SWIFT-Code 3;Abw. Kontoinhaber 3;Kennz. Hauptbankverb. 3;Bankverb 3 Gültig von;Bankverb 3 Gültig bis;Bankleitzahl 4;Bankbezeichnung 4;Bank-Kontonummer 4;Länderkennzeichen 4;IBAN-Nr. 4;IBAN4 korrekt;SWIFT-Code 4;Abw. Kontoinhaber 4;Kennz. Hauptbankverb. 4;Bankverb 4 Gültig von;Bankverb 4 Gültig bis;Bankleitzahl 5;Bankbezeichnung 5;Bank-Kontonummer 5;Länderkennzeichen 5;IBAN-Nr. 5;IBAN5 korrekt;SWIFT-Code 5;Abw. Kontoinhaber 5;Kennz. Hauptbankverb. 5;Bankverb 5 Gültig von;Bankverb 5 Gültig bis;Leerfeld;Briefanrede;Grußformel;Kundennummer;Steuernummer;Sprache;Ansprechpartner;Vertreter;Sachbearbeiter;Diverse-Konto;Ausgabeziel;Währungssteuerung;Kreditlimit (Debitor);Zahlungsbedingung;Fälligkeit in Tagen (Debitor);Skonto in Prozent (Debitor);Kreditoren-Ziel 1 Tg.;Kreditoren-Skonto 1 %;Kreditoren-Ziel 2 Tg.;Kreditoren-Skonto 2 %;Kreditoren-Ziel 3 Brutto Tg.;Kreditoren-Ziel 4 Tg.;Kreditoren-Skonto 4 %;Kreditoren-Ziel 5 Tg.;Kreditoren-Skonto 5 %;Mahnung;Kontoauszug;Mahntext 1;Mahntext 2;Mahntext 3;Kontoauszugstext;Mahnlimit Betrag;Mahnlimit %;Zinsberechnung;Mahnzinssatz 1;Mahnzinssatz 2;Mahnzinssatz 3;Lastschrift;Verfahren;Mandantenbank;Zahlungsträger;Indiv. Feld 1;Indiv. Feld 2;Indiv. Feld 3;Indiv. Feld 4;Indiv. Feld 5;Indiv. Feld 6;Indiv. Feld 7;Indiv. Feld 8;Indiv. Feld 9;Indiv. Feld 10;Indiv. Feld 11;Indiv. Feld 12;Indiv. Feld 13;Indiv. Feld 14;Indiv. Feld 15;Abweichende Anrede (Rechnungsadresse);Adressart (Rechnungsadresse);Straße (Rechnungsadresse);Postfach (Rechnungsadresse);Postleitzahl (Rechnungsadresse);Ort (Rechnungsadresse);Land (Rechnungsadresse);Versandzusatz (Rechnungsadresse);Adresszusatz (Rechnungsadresse);Abw. Zustellbezeichnung 1 (Rechnungsadresse);Abw. Zustellbezeichnung 2 (Rechnungsadresse);Adresse Gültig von (Rechnungsadresse);Adresse Gültig bis (Rechnungsadresse);Bankleitzahl 6;Bankbezeichnung 6;Bank-Kontonummer 6;Länderkennzeichen 6;IBAN-Nr. 6;IBAN6 korrekt;SWIFT-Code 6;Abw. Kontoinhaber 6;Kennz. Hauptbankverb. 6;Bankverb 6 Gültig von;Bankverb 6 Gültig bis;Bankleitzahl 7;Bankbezeichnung 7;Bank-Kontonummer 7;Länderkennzeichen 7;IBAN-Nr. 7;IBAN7 korrekt;SWIFT-Code 7;Abw. Kontoinhaber 7;Kennz. Hauptbankverb. 7;Bankverb 7 Gültig von;Bankverb 7 Gültig bis;Bankleitzahl 8;Bankbezeichnung 8;Bank-Kontonummer 8;Länderkennzeichen 8;IBAN-Nr. 8;IBAN8 korrekt;SWIFT-Code 8;Abw. Kontoinhaber 8;Kennz. Hauptbankverb. 8;Bankverb 8 Gültig von;Bankverb 8 Gültig bis;Bankleitzahl 9;Bankbezeichnung 9;Bank-Kontonummer 9;Länderkennzeichen 9;IBAN-Nr. 9;IBAN9 korrekt;SWIFT-Code 9;Abw. Kontoinhaber 9;Kennz. Hauptbankverb. 9;Bankverb 9 Gültig von;Bankverb 9 Gültig bis;Bankleitzahl 10;Bankbezeichnung 10;Bank-Kontonummer 10;Länderkennzeichen 10;IBAN-Nr. 10;IBAN10 korrekt;SWIFT-Code 10;Abw. Kontoinhaber 10;Kennz. Hauptbankverb. 10;Bankverb 10 Gültig von;Bankverb 10 Gültig bis;Nummer Fremdsystem;Insolvent;Mandatsreferenz 1;Mandatsreferenz 2;Mandatsreferenz 3;Mandatsreferenz 4;Mandatsreferenz 5;Mandatsreferenz 6;Mandatsreferenz 7;Mandatsreferenz 8;Mandatsreferenz 9;Mandatsreferenz 10;Verknüpftes OPOS-Konto;Mahnsperre bis;Lastschriftsperre bis;Zahlungssperre bis;Gebührenberechnung;Mahngebühr 1;Mahngebühr 2;Mahngebühr 3;Pauschalenberechnung;Verzugspauschale 1;Verzugspauschale 2;Verzugspauschale 3\r
+10000;"Möbel Testgruber";"Schreinerei";"";"";"";"2";"Möbel Testgrube";"DE";"133546770";"Firma";"";"";"";"STR";"Nelkenteststraße 125";"";"90482";"Nürnberg";"";"";"";"Firma";"";"";1;01012012;;"";"";"";"";"";"";"";"";"";"";"";"";"50090500";"Sparda-Bank Hessen";"2345678";"DE";"DE49100102220002222222";"";"GENODEF1S12";"Herr Testmüller";"1";01012012;01012013;"50090500";"Sparda-Bank Hessen";"2345678";"DE";"DE49100102220002222222";"";"GENODEF1S12";"Herr Testmüller";"0";01012012;01012013;"50090500";"Sparda-Bank Hessen";"2345678";"DE";"DE49100102220002222222";"";"GENODEF1S12";"Herr Testmüller";"0";01012012;01012013;"50090500";"Sparda-Bank Hessen";"2345678";"DE";"DE49100102220002222222";"";"GENODEF1S12";"Herr Testmüller";"0";01012012;01012013;"50090500";"Sparda-Bank Hessen";"2345678";"DE";"DE49100102220002222222";"";"GENODEF1S12";"Herr Testmüller";"0";01012012;01012013;"";"Sehr geehrte Frau";"Hallo";"KDN 12345";"DE776655";"2";"Frau Huber";"Herr Schmid";"Frau Tester";;;"";0;0;0;0,00;0;0,00;0;0,00;0;0;0,00;0;0,00;7;;;;;;23,30;20,25;1;10,50;11,11;12,12;"7";"1";1;"9";"ind. Feld";"";"";"";"";"";"";"";"";"";"";"individuelle Beschriftung";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"50050000";"Testbank";"454545";"GB";"GB4545454545";"";"GENODEF1S12";"Herr Muster";"0";01012012;01012013;"76060618";"VR-Bank";"121212";"DE";"DE706060660125";"";"GE0987";"Herr Testmeier";"0";01012012;01012014;"";0;"1234-AB-56787";"";"";"";"";"";"";"";"";"778259637";75000;03122015;02122015;01122015;1;5,1;5,2;5,3;;0,9;0,2;0,5\r
+20000;"Einrichtungshaus Muster";"Möbelhaus";"";"";"";"2";"Muster";"";"";"Firma";"";"";"";"STR";"Feldgasse 15";"";"90409";"Nürnberg";"";"";"";"Firma";"";"";1;01012012;;"";"";"";"";"";"";"";"";"";"";"";"";"50090500";"Sparda-Bank Hessen";"2345678";"DE";"DE49100102220002222222";"";"GENODEF1S12";"Herr Testmüller";"1";01012012;01012013;"50090500";"Sparda-Bank Hessen";"2345678";"DE";"DE49100102220002222222";"";"GENODEF1S12";"Herr Testmüller";"0";01012012;01012013;"50090500";"Sparda-Bank Hessen";"2345678";"DE";"DE49100102220002222222";"";"GENODEF1S12";"Herr Testmüller";"0";01012012;01012013;"50090500";"Sparda-Bank Hessen";"2345678";"DE";"DE49100102220002222222";"";"GENODEF1S12";"Herr Testmüller";"0";01012012;01012013;"50090500";"Sparda-Bank Hessen";"2345678";"DE";"DE49100102220002222222";"";"GENODEF1S12";"Herr Testmüller";"0";01012012;01012013;"";"Sehr geehrte Frau";"Hallo";"KDN 12345";"DE776655";"2";"Frau Huber";"Herr Schmid";"Frau Tester";;;"";0;0;0;0,00;0;0,00;0;0,00;0;0;0,00;0;0,00;7;;;;;;23,30;;;;;;"";"";0;"";"";"";"";"";"";"";"";"";"";"";"";"individuelle Beschriftung";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"50050000";"Testbank";"454545";"GB";"GB4545454545";"";"GENODEF1S12";"Herr Muster";"0";01012012;01012013;"76060618";"VR-Bank";"121212";"DE";"DE706060660125";"";"GE0987";"Herr Testmeier";"0";01012012;01012014;"";0;"";"";"";"";"";"";"";"";"";"";75000;03122015;02122015;01122015;1;5,1;5,2;5,3;;0,9;0,2;0,5\r
+30000;"";"";"Mustermeier";"Hans";"";"1";"";"";"";"Herr";"";"";"";"STR";"Musterweg 14b";"";"90489";"Nürnberg";"";"";"";"Firma";"";"";1;01012012;;"";"";"";"";"";"";"";"";"";"";"";"";"50090500";"Sparda-Bank Hessen";"2345678";"DE";"DE49100102220002222222";"";"GENODEF1S12";"Herr Testmüller";"1";01012012;01012013;"50090500";"Sparda-Bank Hessen";"2345678";"DE";"DE49100102220002222222";"";"GENODEF1S12";"Herr Testmüller";"0";01012012;01012013;"50090500";"Sparda-Bank Hessen";"2345678";"DE";"DE49100102220002222222";"";"GENODEF1S12";"Herr Testmüller";"0";01012012;01012013;"50090500";"Sparda-Bank Hessen";"2345678";"DE";"DE49100102220002222222";"";"GENODEF1S12";"Herr Testmüller";"0";01012012;01012013;"50090500";"Sparda-Bank Hessen";"2345678";"DE";"DE49100102220002222222";"";"GENODEF1S12";"Herr Testmüller";"0";01012012;01012013;"";"Sehr geehrte Frau";"Hallo";"KDN 12345";"DE776655";"2";"Frau Huber";"Herr Schmid";"Frau Tester";;;"";0;0;0;0,00;0;0,00;0;0,00;0;0;0,00;0;0,00;7;;;;;;23,30;;;;;;"";"";0;"";"";"";"";"";"";"";"";"";"";"";"";"individuelle Beschriftung";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"50050000";"Testbank";"454545";"GB";"GB4545454545";"";"GENODEF1S12";"Herr Muster";"0";01012012;01012013;"76060618";"VR-Bank";"121212";"DE";"DE706060660125";"";"GE0987";"Herr Testmeier";"0";01012012;01012014;"";0;"";"";"";"";"";"";"";"";"";"";75000;03122015;02122015;01122015;1;5,1;5,2;5,3;;0,9;0,2;0,5\r
+40000;"";"";"Testhuber";"Susanne";"";"1";"";"";"";"Frau";"";"";"";"STR";"Beispielstr. 56";"";"90512";"Nürnberg";"";"";"";"Firma";"";"";1;01012012;;"";"";"";"";"";"";"";"";"";"";"";"";"50090500";"Sparda-Bank Hessen";"2345678";"DE";"DE49100102220002222222";"";"GENODEF1S12";"Herr Testmüller";"1";01012012;01012013;"50090500";"Sparda-Bank Hessen";"2345678";"DE";"DE49100102220002222222";"";"GENODEF1S12";"Herr Testmüller";"0";01012012;01012013;"50090500";"Sparda-Bank Hessen";"2345678";"DE";"DE49100102220002222222";"";"GENODEF1S12";"Herr Testmüller";"0";01012012;01012013;"50090500";"Sparda-Bank Hessen";"2345678";"DE";"DE49100102220002222222";"";"GENODEF1S12";"Herr Testmüller";"0";01012012;01012013;"50090500";"Sparda-Bank Hessen";"2345678";"DE";"DE49100102220002222222";"";"GENODEF1S12";"Herr Testmüller";"0";01012012;01012013;"";"Sehr geehrte Frau";"Hallo";"KDN 12345";"DE776655";"2";"Frau Huber";"Herr Schmid";"Frau Tester";;;"";0;0;0;0,00;0;0,00;0;0,00;0;0;0,00;0;0,00;7;;;;;;23,30;;;;;;"";"";0;"";"";"";"";"";"";"";"";"";"";"";"";"individuelle Beschriftung";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"";"";"";"";"";"";"";"";"";;;"50050000";"Testbank";"454545";"GB";"GB4545454545";"";"GENODEF1S12";"Herr Muster";"0";01012012;01012013;"76060618";"VR-Bank";"121212";"DE";"DE706060660125";"";"GE0987";"Herr Testmeier";"0";01012012;01012014;"";0;"";"";"";"";"";"";"";"";"";"";75000;03122015;02122015;01122015;1;5,1;5,2;5,3;;0,9;0,2;0,5\r
diff --git a/doc/DATEV-2015/EXTF_Textschluessel.csv b/doc/DATEV-2015/EXTF_Textschluessel.csv
new file mode 100644 (file)
index 0000000..d3955d3
--- /dev/null
@@ -0,0 +1,10 @@
+"EXTF";510;44;"Textschlüssel";2;20150729103107277;;"RE";"Admin";"";29098;55003;20150101;7;;;"";"";;;;"";;"";;;"";;;"";""\r
+TS-Nr.;Beschriftung;Ref.-TS;Konto Soll;Konto Haben;Sprach-ID\r
+30;"Weizen";30;5005000;4000000;"de-DE"\r
+31;"Winterweizen";30;5005000;4000000;"de-DE"\r
+32;"Dinkel";30;5005000;4000000;"de-DE"\r
+33;"Sommerweizen";33;5005000;4000000;"de-DE"\r
+34;"corn";30;5005000;4000000;"en-GB"\r
+35;"oat";35;5005000;4000000;"en-GB"\r
+38;"Energiegetreide";38;5005000;4100000;"de-DE"\r
+39;"durum wheat";39;5005000;4000000;"en-GB"
\ No newline at end of file
diff --git a/doc/DATEV-2015/EXTF_Wiederkehrende-Buchungen.csv b/doc/DATEV-2015/EXTF_Wiederkehrende-Buchungen.csv
new file mode 100644 (file)
index 0000000..2138caf
--- /dev/null
@@ -0,0 +1,4 @@
+"EXTF";510;65;"Wiederkehrende Buchungen";2;20150729093200673;;"RE";"Admin";"";55003;63021;20150101;4;;;"";"";;;;"";;"";;"";;;"";"";\r
+B1;WKZ (Umsatz);Umsatz (ohne Soll/Haben-Kz);Soll/Haben-Kennzeichen;Kurs;Basis-Umsatz;WKZ Basis-Umsatz;BU-Schlüssel;Gegenkonto (ohne BU-Schlüssel);Belegfeld1;Belegfeld2;Beginndatum;Kontonummer;Stück;Gewicht;KOST1-Kostenstelle;KOST2-Kostenstelle;KOST-Menge;Skonto;Buchungstext;Postensperre;Diverse Adressnummer;Geschäftspartnerbank;Sachverhalt;Zinssperre;Beleglink;EU-Land u. UStId;EU-Steuersatz;Abw. Versteuerungsart;Sachverhalt L+L;BU 49 Hauptfunktionstyp;BU 49 Hauptfunktionsnummer;BU 49 Funktionsergänzung;Zusatzinformation - Art 1;Zusatzinformation- Inhalt 1;Zusatzinformation - Art 2;Zusatzinformation- Inhalt 2;Zusatzinformation - Art 3;Zusatzinformation- Inhalt 3;Zusatzinformation - Art 4;Zusatzinformation- Inhalt 4;Zusatzinformation - Art 5;Zusatzinformation- Inhalt 5;Zusatzinformation - Art 6;Zusatzinformation- Inhalt 6;Zusatzinformation - Art 7;Zusatzinformation- Inhalt 7;Zusatzinformation - Art 8;Zusatzinformation- Inhalt 8;Zusatzinformation - Art 9;Zusatzinformation- Inhalt 9;Zusatzinformation - Art 10;Zusatzinformation- Inhalt 10;Zusatzinformation - Art 11;Zusatzinformation- Inhalt 11;Zusatzinformation - Art 12;Zusatzinformation- Inhalt 12;Zusatzinformation - Art 13;Zusatzinformation- Inhalt 13;Zusatzinformation - Art 14;Zusatzinformation- Inhalt 14;Zusatzinformation - Art 15;Zusatzinformation- Inhalt 15;Zusatzinformation - Art 16;Zusatzinformation- Inhalt 16;Zusatzinformation - Art 17;Zusatzinformation- Inhalt 17;Zusatzinformation - Art 18;Zusatzinformation- Inhalt 18;Zusatzinformation - Art 19;Zusatzinformation- Inhalt 19;Zusatzinformation - Art 20;Zusatzinformation- Inhalt 20;Zahlweise;Forderungsart;Veranlagungsjahr;Zugeordnete Fälligkeit;Zuletzt per;Nächste Fälligkeit;Enddatum;Zeitintervallart;Zeitabstand;Wochentag;Monat;Ordnungszahl Tag im Monat;Ordnungszahl Wochentag;EndeTyp;Gesellschaftername;Beteiligtennummer;Identifikationsnummer;Zeichnernummer;SEPA-Mandatsreferenz;Postensperre bis;KOST-Datum;Bezeichnung SoBil-Sachverhalt;Kennzeichen SoBil-Buchung\r
+2;"";488,00;"H";;;"";"";4360;"";"";01032013;980;;;"10";"";;;"Gebäudeversicherung";;"";;;;"";"";;"";;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;"";;;01032013;01042013;01022014;"MON";1;;;1;;2;"";;"";"";"1259887";;;"";\r
+2;"";333,52;"H";;;"";"";4360;"";"";31082012;980;;;"10";"";;;"Brandversicherung";;"";;;;"";"";;"";;;;;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";;"";;;01032013;01042013;01082013;"MON";1;;;1;;2;"Mustermann";4711;"130263d";"";"77789-AB-789";25032016;23122015;"Sonderbilanz";2\r
diff --git a/doc/DATEV-2015/EXTF_Zahlungsbedingungen.csv b/doc/DATEV-2015/EXTF_Zahlungsbedingungen.csv
new file mode 100644 (file)
index 0000000..c84c647
--- /dev/null
@@ -0,0 +1,10 @@
+"EXTF";510;46;"Zahlungsbedingungen";2;20150729093357008;;"RE";"Admin";"";55003;63021;20150101;4;;;"";"";;;;"";;"";;"";;;"";"";\r
+Nummer;Bezeichnung;Fälligkeitstyp;Skonto 1%;Skonto 1 Tage;Skonto 2 %;Skonto 2 Tage;Fällig Tage;Rechnung bis / Zeitraum 1;Skonto1 Datum / Zeitraum 1;Skonto 1 Monat / Zeitraum 1;Skonto 2 Datum / Zeitraum 1;Skonto 2 Monat / Zeitraum 1;Fällig Datum / Zeitraum 1;Fällig Monat / Zeitraum 1;Rechnung bis / Zeitraum 2;Skonto1 Datum / Zeitraum 2;Skonto 1 Monat / Zeitraum 2;Skonto 2 Datum / Zeitraum 2;Skonto 2 Monat / Zeitraum 2;Fällig Datum / Zeitraum 2;Fällig Monat / Zeitraum 2;Rechnung bis / Zeitraum 3;Skonto1 Datum / Zeitraum 3;Skonto1 Monat / Zeitraum 3;Skonto 2 Datum / Zeitraum 3;Skonto 2 Monat / Zeitraum 3;Fällig Datum / Zeitraum 3;Fällig Monat / Zeitraum 3;Leerfeld;Verwendung\r
+10;"14 Tage 2% oder 30 Tage Netto";1;200;14;;;30;;;0;;0;;0;;;0;;0;;0;;;0;;0;;0;"";\r
+11;"14 Tage 3% oder 30 Tage Netto";1;300;14;200;10;30;;;0;;0;;0;;;0;;0;;0;;;0;;0;;0;"";\r
+12;"30 Tage Netto";1;300;10;;;30;;;0;;0;;0;;;0;;0;;0;;;0;;0;;0;"";\r
+13;"14 Tage 3% oder 60 Tage Netto";1;300;14;;;60;;;0;;0;;0;;;0;;0;;0;;;0;;0;;0;"";\r
+14;"10 Tage 2% oder 30 Tage Netto";1;200;10;;;30;10;20;0;;0;31;0;20;31;0;;0;10;0;31;10;0;;0;20;0;"";\r
+15;"10 Tage 3% oder 30 Tage Netto";1;300;10;;;30;;;0;;0;;0;;;0;;0;;0;;;0;;0;;0;"";\r
+16;"sofort ohne Abzug";1;;;;;;;;0;;0;;0;;;0;;0;;0;;;0;;0;;0;"";\r
+17;"Vorkasse";1;;;;;;;;0;;0;;0;;;0;;0;;0;;;0;;0;;0;"";\r
diff --git a/t/datev/datev_format_2018.t b/t/datev/datev_format_2018.t
new file mode 100644 (file)
index 0000000..aeb9979
--- /dev/null
@@ -0,0 +1,181 @@
+use strict;
+use Test::More;
+use Test::Deep qw(cmp_bag);
+
+use lib 't';
+
+use_ok 'Support::TestSetup';
+use SL::DATEV qw(:CONSTANTS);
+use SL::Dev::ALL qw(:ALL);
+use List::Util qw(sum);
+use SL::DB::Buchungsgruppe;
+use SL::DB::Chart;
+use DateTime;
+use Data::Dumper;
+use utf8;
+
+Support::TestSetup::login();
+
+my $dbh = SL::DB->client->dbh;
+
+clear_up();
+my $buchungsgruppe7 = SL::DB::Manager::Buchungsgruppe->find_by(description => 'Standard 7%') || die "No accounting group for 7\%";
+my $date            = DateTime->new(year => 2017, month =>  7, day => 19);
+my $department      = create_department(description => 'Kästchenweiße heiße Preise');
+my $project         = create_project(projectnumber => 2017, description => '299');
+
+my $part1 = new_part(partnumber => '19', description => 'Part 19%')->save;
+my $part2 = new_part(
+  partnumber         => '7',
+  description        => 'Part 7%',
+  buchungsgruppen_id => $buchungsgruppe7->id,
+)->save;
+
+my $invoice = create_sales_invoice(
+  invnumber    => "ݗݘݰݶ",
+  itime        => $date,
+  gldate       => $date,
+  taxincluded  => 0,
+  transdate    => $date,
+  invoiceitems => [ create_invoice_item(part => $part1, qty =>  3, sellprice => 550),
+                    create_invoice_item(part => $part2, qty => 10, sellprice => 50),
+                  ],
+  department_id    => $department->id,
+  globalproject_id => $project->id,
+);
+
+# lets make a boom
+# generate_datev_* doesnt care about encoding but
+# csv_buchungsexport does! all arabic will be deleted
+# and no string will be left as invnumber
+
+my $datev1 = SL::DATEV->new(
+  dbh        => $dbh,
+  trans_id   => $invoice->id,
+);
+
+my $startdate = DateTime->new(year => 2017, month =>  1, day =>  1);
+my $enddate   = DateTime->new(year => 2017, month =>  12, day => 31);
+my $today     = DateTime->new(year => 2017, month =>  3, day => 17);
+
+
+$datev1->from($startdate);
+$datev1->to($enddate);
+
+$datev1->generate_datev_data;
+$datev1->generate_datev_lines;
+
+# check conversion to csv
+$datev1->from($startdate);
+$datev1->to($enddate);
+eval {
+  $datev1->csv_buchungsexport();
+  1;  };
+like($@, qr/^Not a valid value: '' for 'belegfeld1' with .*/, "wrong encoding");
+
+# redefine invnumber, but still broken
+$invoice->invnumber('ݗݘݰݶmuh');
+$invoice->save();
+$datev1->generate_datev_data;
+$datev1->generate_datev_lines;
+eval {
+  $datev1->csv_buchungsexport();
+  1;  };
+like($@, qr/^Not a valid value: '' for 'belegfeld1' with amount/, "mixed encoding");
+
+
+# create one haben buchung with GLTransaction today
+
+my $expense_chart = SL::DB::Manager::Chart->find_by(accno => '4660'); # Reisekosten
+my $cash_chart    = SL::DB::Manager::Chart->find_by(accno => '1000'); # Kasse
+my $tax_chart     = SL::DB::Manager::Chart->find_by(accno => '1576'); # Vorsteuer
+my $tax_9         = SL::DB::Manager::Tax->find_by(taxkey => 9, rate => 0.19) || die "No tax";
+
+my @acc_trans;
+push(@acc_trans, SL::DB::AccTransaction->new(
+                                      chart_id   => $expense_chart->id,
+                                      chart_link => $expense_chart->link,
+                                      amount     => -84.03,
+                                      transdate  => $today,
+                                      source     => '',
+                                      taxkey     => 9,
+                                      tax_id     => $tax_9->id,
+                                      project_id => $project->id,
+));
+push(@acc_trans, SL::DB::AccTransaction->new(
+                                      chart_id   => $tax_chart->id,
+                                      chart_link => $tax_chart->link,
+                                      amount     => -15.97,
+                                      transdate  => $today,
+                                      source     => '',
+                                      taxkey     => 9,
+                                      tax_id     => $tax_9->id,
+                                      project_id => $project->id,
+));
+push(@acc_trans, SL::DB::AccTransaction->new(
+                                      chart_id   => $cash_chart->id,
+                                      chart_link => $cash_chart->link,
+                                      amount     => 100,
+                                      transdate  => $today,
+                                      source     => '',
+                                      taxkey     => 0,
+                                      tax_id     => 0,
+));
+
+my $gl_transaction = SL::DB::GLTransaction->new(
+  reference      => "Reisekosten März 2018",
+  description    => "Reisekonsten März 2018 / Ma Schmidt",
+  transdate      => $today,
+  gldate         => $today,
+  employee_id    => SL::DB::Manager::Employee->current->id,
+  taxincluded    => 1,
+  type           => undef,
+  ob_transaction => 0,
+  cb_transaction => 0,
+  storno         => 0,
+  storno_id      => undef,
+  transactions   => \@acc_trans,
+)->save;
+my $datev2 = SL::DATEV->new(
+  dbh        => $dbh,
+  trans_id   => $gl_transaction->id,
+);
+
+$datev2->from($startdate);
+$datev2->to($enddate);
+$datev2->generate_datev_data;
+$datev2->generate_datev_lines;
+
+my @data_csv = splice @{ $datev2->csv_buchungsexport() }, 2, 5;
+@data_csv    = sort { $a->[0] <=> $b->[0] } @data_csv;
+
+
+my $cp1252_posting_text   = SL::Iconv::convert("UTF-8", "CP1252", 'Reisekosten März 2018');
+cmp_bag($data_csv[0], [ 100, 'H', 'EUR', undef, undef, undef, '4660', '1000', 9, '1703', 'Reisekosten ',
+                     undef, undef, $cp1252_posting_text, undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, undef, '', undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, undef, undef, undef, undef ]
+       );
+
+done_testing();
+clear_up();
+
+
+sub clear_up {
+  SL::DB::Manager::AccTransaction->delete_all( all => 1);
+  SL::DB::Manager::InvoiceItem->delete_all(    all => 1);
+  SL::DB::Manager::Invoice->delete_all(        all => 1);
+  SL::DB::Manager::Customer->delete_all(       all => 1);
+  SL::DB::Manager::Part->delete_all(           all => 1);
+  SL::DB::Manager::Project->delete_all(        all => 1);
+  SL::DB::Manager::Department->delete_all(     all => 1);
+  SL::DATEV->clean_temporary_directories;
+};
+
+1;
index 50398fc..52c665e 100644 (file)
@@ -34,7 +34,7 @@ my $part2 = new_part(
 )->save;
 
 my $invoice = create_sales_invoice(
-  invnumber    => "1 sales invoice",
+  invnumber    => "Þ sales ¥& invöice",
   itime        => $gldate,
   gldate       => $gldate,
   intnotes     => 'booked in February',
@@ -59,7 +59,7 @@ my $datev1 = SL::DATEV->new(
 $datev1->generate_datev_data;
 cmp_bag $datev1->generate_datev_lines, [
                                          {
-                                           'belegfeld1'   => '1 sales invoice',
+                                           'belegfeld1'   => "\x{de} sales \x{a5}& inv\x{f6}ice",
                                            'buchungstext' => 'Testcustomer',
                                            'datum'        => '01.01.2017',
                                            'gegenkonto'   => '8400',
@@ -67,10 +67,11 @@ cmp_bag $datev1->generate_datev_lines, [
                                            'kost1'        => 'Kostenstelle DATEV-Schnittstelle 2018',
                                            'kost2'        => 'Crowd-Funding September 2017',
                                            'umsatz'       => '249.9',
-                                           'waehrung'     => 'EUR'
+                                           'waehrung'     => 'EUR',
+                                           'soll_haben_kennzeichen' => 'S',
                                          },
                                          {
-                                           'belegfeld1'   => '1 sales invoice',
+                                           'belegfeld1'   => "\x{de} sales \x{a5}& inv\x{f6}ice",
                                            'buchungstext' => 'Testcustomer',
                                            'datum'        => '01.01.2017',
                                            'gegenkonto'   => '8300',
@@ -78,10 +79,11 @@ cmp_bag $datev1->generate_datev_lines, [
                                            'kost1'        => 'Kostenstelle DATEV-Schnittstelle 2018',
                                            'kost2'        => 'Crowd-Funding September 2017',
                                            'umsatz'       => 535,
-                                           'waehrung'     => 'EUR'
+                                           'waehrung'     => 'EUR',
+                                           'soll_haben_kennzeichen' => 'S',
                                          },
                                          {
-                                           'belegfeld1'   => '1 sales invoice',
+                                           'belegfeld1'   => "\x{de} sales \x{a5}& inv\x{f6}ice",
                                            'buchungstext' => 'Testcustomer',
                                            'datum'        => '05.01.2017',
                                            'gegenkonto'   => '1400',
@@ -89,10 +91,60 @@ cmp_bag $datev1->generate_datev_lines, [
                                            'kost1'        => 'Kostenstelle DATEV-Schnittstelle 2018',
                                            'kost2'        => 'Crowd-Funding September 2017',
                                            'umsatz'       => '784.9',
-                                           'waehrung'     => 'EUR'
+                                           'waehrung'     => 'EUR',
+                                           'soll_haben_kennzeichen' => 'S',
                                          },
                                        ], "trans_id datev check ok";
 
+my $startdate = DateTime->new(year => 2017, month =>  1, day =>  1);
+my $enddate   = DateTime->new(year => 2017, month => 12, day => 31);
+
+# check conversion to csv
+$datev1->from($startdate);
+$datev1->to($enddate);
+
+# splice away the header, because sort won't do
+# we need sort, because pay_invoice is not acc_trans_id order safe
+my @data_csv = splice @{ $datev1->csv_buchungsexport() }, 2, 5;
+@data_csv    = sort { $a->[0] <=> $b->[0] } @data_csv;
+
+my $cp1252_belegfeld1   = SL::Iconv::convert("UTF-8", "CP1252", 'Þ sales ¥& i');
+my $cp1252_buchungstext = SL::Iconv::convert("UTF-8", "CP1252", 'Þ sales ¥& invöice');
+
+cmp_bag($data_csv[1], [ 535, 'S', 'EUR', undef, undef, undef, '1400', '8300', undef, '0101', $cp1252_belegfeld1,
+                     undef, undef, $cp1252_buchungstext, undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, 'Crowd-Fu', 'Kostenst', undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, undef, undef, undef, undef ]
+       );
+
+cmp_bag($data_csv[0], [ '249,9', 'S', 'EUR', undef, undef, undef, '1400', '8400', undef, '0101', $cp1252_belegfeld1,
+                     undef, undef, $cp1252_buchungstext, undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, 'Crowd-Fu', 'Kostenst', undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, undef, undef, undef, undef ]
+       );
+cmp_bag($data_csv[2], [ '784,9', 'S', 'EUR', undef, undef, undef, '1200', '1400', undef, '0501', $cp1252_belegfeld1,
+                     undef, undef, $cp1252_buchungstext, undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, 'Crowd-Fu', 'Kostenst', undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef,
+                     undef, undef, undef, undef, undef ]
+        );
 my $march_9 = DateTime->new(year => 2017, month =>  3, day => 9);
 my $invoice2 = create_sales_invoice(
   invnumber    => "2 sales invoice",
@@ -118,9 +170,6 @@ my $credit_note = create_credit_note(
                   ]
 );
 
-my $startdate = DateTime->new(year => 2017, month =>  1, day =>  1);
-my $enddate   = DateTime->new(year => 2017, month => 12, day => 31);
-
 my $datev = SL::DATEV->new(
   dbh        => $dbh,
   from       => $startdate,
@@ -161,6 +210,7 @@ sub clear_up {
   SL::DB::Manager::Part->delete_all(          all => 1);
   SL::DB::Manager::Project->delete_all(       all => 1);
   SL::DB::Manager::Department->delete_all(    all => 1);
+  SL::DATEV->clean_temporary_directories;
 };
 
 1;