+ # the data in @kne_lines is now ready to be transformed to a kne file, or even to csv
+
+ my $iconv = $::locale->{iconv_utf8};
+ my %umlaute = ($iconv->convert('ä') => 'ae',
+ $iconv->convert('ö') => 'oe',
+ $iconv->convert('ü') => 'ue',
+ $iconv->convert('Ä') => 'Ae',
+ $iconv->convert('Ö') => 'Oe',
+ $iconv->convert('Ü') => 'Ue',
+ $iconv->convert('ß') => 'sz');
+
+ my $header = $self->make_kne_data_header($form);
+
+ my $kne_file = SL::DATEV::KNEFile->new();
+ $kne_file->add_block($header);
+ # add the data from @kne_lines to the kne_file, formatting as needed
+ foreach my $kne (@kne_lines) {
+
+ $kne_file->add_block("+" . $kne_file->format_amount(abs($kne->{umsatz}), 0));
+
+ # only add buchungsschluessel if it was previously defined
+ $kne_file->add_block("\x6C" . $kne->{buchungsschluessel}) if defined $kne->{buchungsschluessel};
+
+ # ($kne->{gegenkonto}) = $kne->{gegenkonto} =~ /^(\d+)/;
+ $kne_file->add_block("a" . trim_leading_zeroes($kne->{gegenkonto}));
+
+ if ( $kne->{belegfeld1} ) {
+ my $invnumber = $kne->{belegfeld1};
+ foreach my $umlaut (keys(%umlaute)) {
+ $invnumber =~ s/${umlaut}/${umlaute{$umlaut}}/g;
+ }
+ $invnumber =~ s/[^0-9A-Za-z\$\%\&\*\+\-\/]//g;
+ $invnumber = substr($invnumber, 0, 12);
+ $invnumber =~ s/\ *$//;
+ $kne_file->add_block("\xBD" . $invnumber . "\x1C");
+ }
+
+ $kne_file->add_block("\xBE" . &datetofour($kne->{belegfeld2},1) . "\x1C");
+
+ $kne_file->add_block("d" . &datetofour($kne->{datum},0));
+
+ # ($kne->{konto}) = $kne->{konto} =~ /^(\d+)/;
+ $kne_file->add_block("e" . trim_leading_zeroes($kne->{konto}));
+
+ my $name = $kne->{buchungstext};
+ foreach my $umlaut (keys(%umlaute)) {
+ $name =~ s/${umlaut}/${umlaute{$umlaut}}/g;
+ }
+ $name =~ s/[^0-9A-Za-z\$\%\&\*\+\-\ \/]//g;
+ $name = substr($name, 0, 30);
+ $name =~ s/\ *$//;
+ $kne_file->add_block("\x1E" . $name . "\x1C");
+
+ $kne_file->add_block("\xBA" . $kne->{'ustid'} . "\x1C") if $kne->{'ustid'};
+
+ $kne_file->add_block("\xB3" . $kne->{'waehrung'} . "\x1C" . "\x79");
+ };
+
+ $umsatzsumme = $kne_file->format_amount(abs($umsatzsumme), 0);