PTC: Sortierung von items beachten bei Rechnungen die nachträglich geändert wurden
[kivitendo-erp.git] / t / datev / datev_format_2018.t
index 3660b28..77a800e 100644 (file)
@@ -1,6 +1,6 @@
 use strict;
 use Test::More;
-use Test::Deep qw(cmp_bag);
+use Test::Deep qw(cmp_deeply);
 
 use lib 't';
 
@@ -19,11 +19,15 @@ Support::TestSetup::login();
 my $dbh = SL::DB->client->dbh;
 
 clear_up();
+
+my $d = SL::DB::Default->get;
+$d->update_attributes(datev_export_format => 'cp1252');
+
 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 $customer        = new_customer(name => 'Test customer', ustid => 'DE12345678')->save();
 my $part1 = new_part(partnumber => '19', description => 'Part 19%')->save;
 my $part2 = new_part(
   partnumber         => '7',
@@ -42,6 +46,7 @@ my $invoice = create_sales_invoice(
                   ],
   department_id    => $department->id,
   globalproject_id => $project->id,
+  customer_id      => $customer->id,
 );
 
 # lets make a boom
@@ -68,13 +73,21 @@ $datev1->generate_datev_lines;
 # check conversion to csv
 $datev1->from($startdate);
 $datev1->to($enddate);
-$datev1->csv_buchungsexport();
-my @warnings = $datev1->warnings;
-is($warnings[0]->[0]->{untranslated},
-  'Wrong field value \'#1\' for field \'#2\' for the transaction with amount \'#3\'', 'wrong_encoding');
+my ($datev_csv, $die_message);
+eval {
+  $datev_csv = SL::DATEV::CSV->new(datev_lines  => $datev1->generate_datev_lines,
+                                   from         => $startdate,
+                                   to           => $enddate,
+                                   locked       => $datev1->locked,
+                                  );
+  my $lines_aref = $datev_csv->lines; # dies only if we assign (do stuff with the data)
+  1;
+} or do {
+  $die_message = $@;
+};
+ok($die_message =~ m/Falscher Feldwert 'ݗݘݰݶ' für Feld 'belegfeld1' bei der Transaktion mit dem Umsatz von/, 'wrong_encoding');
 
 
-# redefine invnumber, we have mixed encodings, should still generate a warning
 $invoice->invnumber('ݗݘݰݶmuh');
 $invoice->save();
 
@@ -87,14 +100,85 @@ $datev3->from($startdate);
 $datev3->to($enddate);
 $datev3->generate_datev_data;
 $datev3->generate_datev_lines;
-$datev3->csv_buchungsexport;
-@warnings = [];
-@warnings = $datev3->warnings;
-is($warnings[0]->[0]->{untranslated},
-  'Wrong field value \'#1\' for field \'#2\' for the transaction with amount \'#3\'', 'mixed_wrong_encoding');
+my ($datev_csv2, $die_message2);
+eval {
+  $datev_csv2 = SL::DATEV::CSV->new(datev_lines  => $datev3->generate_datev_lines,
+                                    from         => $startdate,
+                                    to           => $enddate,
+                                    locked       => $datev3->locked,
+                                   );
+my $lines_aref = $datev_csv2->lines; # dies only if we assign (do stuff with the data)
+
+  1;
+} or do {
+  $die_message2 = $@;
+};
 
+# redefine invnumber, we have mixed encodings, should still fail
+ok($die_message2 =~ m/Falscher Feldwert 'ݗݘݰݶmuh' für Feld 'belegfeld1' bei der Transaktion mit dem Umsatz von/, 'mixed_wrong_encoding');
 
+# check with good number
+$invoice->invnumber('meine muh');
+$invoice->save();
 
+my $datev4 = SL::DATEV->new(
+  dbh        => $dbh,
+  trans_id   => $invoice->id,
+);
+
+$datev4->from($startdate);
+$datev4->to($enddate);
+$datev4->generate_datev_data;
+$datev4->generate_datev_lines;
+my ($datev_csv4, $die_message3, $lines_aref);
+eval {
+  $datev_csv4 = SL::DATEV::CSV->new(datev_lines  => $datev4->generate_datev_lines,
+                                    from         => $startdate,
+                                    to           => $enddate,
+                                    locked       => $datev4->locked,
+                                   );
+  $lines_aref = $datev_csv4->lines; # dies only if we assign (do stuff with the data)
+
+  1;
+} or do {
+  $die_message3 = $@;
+};
+ok(!($die_message3), 'no die message');
+ok(scalar @{ $datev_csv4->warnings } == 0, 'no warnings');
+
+my @sorted =  sort { $a->[0] cmp $b->[0] } @{ $lines_aref };
+cmp_deeply $sorted[0],    [ '1963,5', 'S', 'EUR', '', '', '',
+                            '1400', '8400', '', '1907', 'meine muh',
+                            '', '', 'Test customer', '', '', '', '', '', '',
+                            '', '', '', '', '', '', '', '', '',
+                            '', '', '', '', '', '', '', "K\x{e4}stchen",
+                            '299', '','DE12345678', '', '', '',
+                            '', '', '', '', '', '', '', '', '',
+                            '', '', '', '', '', '', '', '', '',
+                            '', '', '', '', '', '', '', '', '',
+                            '', '', '', '', '', '', '', '', '',
+                            '', '', '', '', '', '', '', '', '',
+                            '', '', '', '', '', '', '', '', '',
+                            '', '', '', '', '', '', '', '', '',
+                            '', '', '', '', '', '', '', '', '',
+                            '',
+                          ];
+cmp_deeply $sorted[1],     [ '535', 'S', 'EUR', '', '', '',
+                             '1400', '8300', '', '1907','meine muh',
+                            '', '', 'Test customer', '', '', '', '', '', '',
+                            '', '', '', '', '', '', '', '', '',
+                            '', '', '', '', '', '', '', "K\x{e4}stchen",
+                            '299', '','DE12345678', '', '', '',
+                            '', '', '', '', '', '', '', '', '',
+                            '', '', '', '', '', '', '', '', '',
+                            '', '', '', '', '', '', '', '', '',
+                            '', '', '', '', '', '', '', '', '',
+                            '', '', '', '', '', '', '', '', '',
+                            '', '', '', '', '', '', '', '', '',
+                            '', '', '', '', '', '', '', '', '',
+                            '', '', '', '', '', '', '', '', '',
+                            '',
+                          ];
 # create one haben buchung with GLTransaction today
 
 my $expense_chart = SL::DB::Manager::Chart->find_by(accno => '4660'); # Reisekosten
@@ -134,7 +218,7 @@ push(@acc_trans, SL::DB::AccTransaction->new(
 ));
 
 my $gl_transaction = SL::DB::GLTransaction->new(
-  reference      => "Reisekosten März 2018",
+  reference      => "Reise März 2018",
   description    => "Reisekonsten März 2018 / Ma Schmidt",
   transdate      => $today,
   gldate         => $today,
@@ -155,25 +239,31 @@ my $datev2 = SL::DATEV->new(
 $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 ]
+
+my $datev_csv3  = SL::DATEV::CSV->new(datev_lines  => $datev2->generate_datev_lines,
+                                      from         => $startdate,
+                                      to           => $enddate,
+                                      locked       => $datev2->locked,
+                                     );
+
+my @data_csv    = sort { $a->[0] cmp $b->[0] } @{ $datev_csv3->lines };
+cmp_deeply($data_csv[0], [ '100', 'S', 'EUR', '', '', '', '4660', '1000', 9, '1703', 'Reise März 2',
+                     '', '', 'Reisekonsten März 2018 / Ma Schmidt', '', '', '', '', '', '', '', '',
+                     '', '', '', '', '', '', '', '', '', '', '', '', '',
+                     '', '', '', '', '', '', '', '', '', '', '',
+                     '', '', '', '', '', '', '', '', '', '', '', '', '',
+                     '', '', '', '', '', '', '', '', '', '', '', '', '',
+                     '', '', '', '', '', '', '', '', '', '', '', '', '',
+                     '', '', '', '', '', '', '', '', '', '', '', '', '',
+                     '', '', '', '', '', '', '', '', '', '', '', '', '',
+                     '', '', '', '', '' ]
        );
 
+# TODO warnings are not yet tested
+# currently most of the valid_checks are senseless because of
+# the strict input_checks before. Maybe something like encoding mismatch of invnumber,
+# can be altered to just a warning (not a mandantory field!)
+
 done_testing();
 clear_up();