changelog zu Workflow zu Lieferantenauftrag
[kivitendo-erp.git] / t / datev / invoices.t
index a37c34c..3b2d4af 100644 (file)
@@ -1,8 +1,9 @@
 use strict;
 use Test::More;
-use Test::Deep qw(cmp_bag);
+use Test::Deep qw(cmp_deeply cmp_bag);
 
 use lib 't';
+use utf8;
 
 use_ok 'Support::TestSetup';
 use SL::DATEV qw(:CONSTANTS);
@@ -59,8 +60,11 @@ my $datev1 = SL::DATEV->new(
   dbh        => $invoice->db->dbh,
   trans_id   => $invoice->id,
 );
+
 $datev1->generate_datev_data;
-cmp_bag $datev1->generate_datev_lines, [
+
+my @data_datev   = sort { $a->{umsatz} <=> $b->{umsatz} } @{ $datev1->generate_datev_lines() };
+cmp_deeply \@data_datev, [
                                          {
                                            'belegfeld1'   => "\x{de} sales \x{a5}& inv\x{f6}ice",
                                            'buchungstext' => 'Testcustomer',
@@ -69,9 +73,9 @@ cmp_bag $datev1->generate_datev_lines, [
                                            'konto'        => '1400',
                                            'kost1'        => 'Kostenstelle DATEV-Schnittstelle 2018',
                                            'kost2'        => 'Crowd-Funding September 2017',
+                                           'locked'       => undef,
                                            'umsatz'       => '249.9',
                                            'waehrung'     => 'EUR',
-                                           'soll_haben_kennzeichen' => 'S',
                                          },
                                          {
                                            'belegfeld1'   => "\x{de} sales \x{a5}& inv\x{f6}ice",
@@ -81,29 +85,31 @@ cmp_bag $datev1->generate_datev_lines, [
                                            'konto'        => '1400',
                                            'kost1'        => 'Kostenstelle DATEV-Schnittstelle 2018',
                                            'kost2'        => 'Crowd-Funding September 2017',
+                                           'locked'       => undef,
                                            'umsatz'       => 535,
                                            'waehrung'     => 'EUR',
-                                           'soll_haben_kennzeichen' => 'S',
                                          },
                                          {
                                            'belegfeld1'   => "\x{de} sales \x{a5}& inv\x{f6}ice",
                                            'buchungstext' => 'Testcustomer',
+                                           'buchungstext' => 'Testcustomer',
                                            'datum'        => '05.01.2017',
                                            'gegenkonto'   => '1400',
                                            'konto'        => '1200',
                                            'kost1'        => 'Kostenstelle DATEV-Schnittstelle 2018',
                                            'kost2'        => 'Crowd-Funding September 2017',
                                            'umsatz'       => '784.9',
+                                           'locked'       => undef,
                                            'waehrung'     => 'EUR',
-                                           'soll_haben_kennzeichen' => 'S',
                                          },
                                        ], "trans_id datev check ok";
 
 $datev1->use_pk(1);
 $datev1->generate_datev_data;
+# TODO for cmp_deeply we need to sort the incoming data structure (see below)
 cmp_bag $datev1->generate_datev_lines, [
                                          {
-                                           'belegfeld1'   => Encode::decode('utf-8', "Þ sales ¥& invöice"),
+                                           'belegfeld1'   => "\x{de} sales \x{a5}& inv\x{f6}ice",
                                            'buchungstext' => 'Testcustomer',
                                            'datum'        => '01.01.2017',
                                            'gegenkonto'   => '8400',
@@ -111,11 +117,11 @@ cmp_bag $datev1->generate_datev_lines, [
                                            'kost1'        => 'Kostenstelle DATEV-Schnittstelle 2018',
                                            'kost2'        => 'Crowd-Funding September 2017',
                                            'umsatz'       => '249.9',
+                                           'locked'       => undef,
                                            'waehrung'     => 'EUR',
-                                           'soll_haben_kennzeichen' => 'S',
                                          },
                                          {
-                                           'belegfeld1'   => Encode::decode('utf-8', "Þ sales ¥& invöice"),
+                                           'belegfeld1'   => "\x{de} sales \x{a5}& inv\x{f6}ice",
                                            'buchungstext' => 'Testcustomer',
                                            'datum'        => '01.01.2017',
                                            'gegenkonto'   => '8300',
@@ -123,11 +129,11 @@ cmp_bag $datev1->generate_datev_lines, [
                                            'kost1'        => 'Kostenstelle DATEV-Schnittstelle 2018',
                                            'kost2'        => 'Crowd-Funding September 2017',
                                            'umsatz'       => 535,
+                                           'locked'       => undef,
                                            'waehrung'     => 'EUR',
-                                           'soll_haben_kennzeichen' => 'S',
                                          },
                                          {
-                                           'belegfeld1'   => Encode::decode('utf-8', "Þ sales ¥& invöice"),
+                                           'belegfeld1'   => "\x{de} sales \x{a5}& inv\x{f6}ice",
                                            'buchungstext' => 'Testcustomer',
                                            'datum'        => '05.01.2017',
                                            'gegenkonto'   => $customer->customernumber,
@@ -135,8 +141,8 @@ cmp_bag $datev1->generate_datev_lines, [
                                            'kost1'        => 'Kostenstelle DATEV-Schnittstelle 2018',
                                            'kost2'        => 'Crowd-Funding September 2017',
                                            'umsatz'       => '784.9',
+                                           'locked'       => undef,
                                            'waehrung'     => 'EUR',
-                                           'soll_haben_kennzeichen' => 'S',
                                          },
                                        ], "trans_id datev check use_pk ok";
 
@@ -147,49 +153,58 @@ my $enddate   = DateTime->new(year => 2017, month => 12, day => 31);
 # check conversion to csv
 $datev1->from($startdate);
 $datev1->to($enddate);
-$datev1->use_pk(0); # reset use_pk for csv_buchungsexport
+# reset use_pk for csv_buchungsexport
+$datev1->use_pk(0);
+$datev1->generate_datev_data;
+
+
+my $datev_csv = SL::DATEV::CSV->new(datev_lines  => $datev1->generate_datev_lines,
+                                    from         => $startdate,
+                                    to           => $enddate,
+                                    locked       => $datev1->locked,
+                                   );
+$datev_csv->lines;
+
 
-# 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 ]
+my @data_csv    = sort { $a->[0] cmp $b->[0] } @{ $datev_csv->lines };
+# warnings should be undef -> no array elements at all
+is(scalar @{ $datev_csv->warnings }, 0);
+
+
+cmp_deeply($data_csv[1], [ '535', 'S', 'EUR', '', '', '', '1400', '8300', '', '0101', "\x{de} sales \x{a5}& i",
+                     '', '', 'Testcustomer', '', '', '', '', '', '', '', '',
+                     '', '', '', '', '', '', '', '', '', '', '', '', '',
+                     '', 'Kostenst', 'Crowd-Fu', '', '', '', '', '', '', '', '',
+                     '', '', '', '', '', '', '', '', '', '', '', '', '',
+                     '', '', '', '', '', '', '', '', '', '', '', '', '',
+                     '', '', '', '', '', '', '', '', '', '', '', '', '',
+                     '', '', '', '', '', '', '', '', '', '', '', '', '',
+                     '', '', '', '', '', '', '', '', '', '', '', '', '',
+                     '', '', '1', '', '', '', '', '', '' ]
        );
 
-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_deeply($data_csv[0], [ '249,9', 'S', 'EUR', '', '', '', '1400', '8400', '', '0101', "\x{de} sales \x{a5}& i",
+                     '', '', 'Testcustomer', '', '', '', '', '', '', '', '',
+                     '', '', '', '', '', '', '', '', '', '', '', '', '',
+                     '', 'Kostenst', 'Crowd-Fu', '', '', '', '', '', '', '', '',
+                     '', '', '', '', '', '', '', '', '', '', '', '', '',
+                     '', '', '', '', '', '', '', '', '', '', '', '', '',
+                     '', '', '', '', '', '', '', '', '', '', '', '', '',
+                     '', '', '', '', '', '', '', '', '', '', '', '', '',
+                     '', '', '', '', '', '', '', '', '', '', '', '', '',
+                     '', '', '1', '', '', '', '', '', '' ]
        );
-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 ]
+cmp_deeply($data_csv[2], [ '784,9', 'S', 'EUR', '', '', '', '1200', '1400', '', '0501', "\x{de} sales \x{a5}& i",
+                     '', '', 'Testcustomer', '', '', '', '', '', '', '', '',
+                     '', '', '', '', '', '', '', '', '', '', '', '', '',
+                     '', 'Kostenst', 'Crowd-Fu', '', '', '', '', '', '', '', '',
+                     '', '', '', '', '', '', '', '', '', '', '', '', '',
+                     '', '', '', '', '', '', '', '', '', '', '', '', '',
+                     '', '', '', '', '', '', '', '', '', '', '', '', '',
+                     '', '', '', '', '', '', '', '', '', '', '', '', '',
+                     '', '', '', '', '', '', '', '', '', '', '', '', '',
+                     '', '', '1', '', '', '', '', '', '' ]
         );
 my $march_9 = DateTime->new(year => 2017, month =>  3, day => 9);
 my $invoice2 = create_sales_invoice(
@@ -232,14 +247,34 @@ $datev->generate_datev_data(use_pk => 1, from_to => $datev->fromto);
 $datev_lines = $datev->generate_datev_lines;
 
 note('testing purchase invoice');
-my $purchase_invoice = new_purchase_invoice();
+my $purchase_invoice = create_ap_transaction(
+  vendor      => $vendor,
+  invnumber   => 'ap1',
+  amount      => '226',
+  netamount   => '200',
+  transdate   => $date,
+  gldate      => $date,
+  itime       => $date, # make sure itime is 1.1., as gldatefrom tests for itime!
+  taxincluded => 0,
+  bookings    => [
+                   {
+                     chart  => SL::DB::Manager::Chart->find_by(accno => '3400'),
+                     amount => 100,
+                   },
+                   {
+                     chart  => SL::DB::Manager::Chart->find_by(accno => '3300'),
+                     amount => 100,
+                   },
+                 ],
+);
+
 $datev1 = SL::DATEV->new(
   dbh        => $purchase_invoice->db->dbh,
   trans_id   => $purchase_invoice->id,
 );
 
 $datev1->generate_datev_data;
-cmp_bag $datev1->generate_datev_lines, [
+cmp_deeply $datev1->generate_datev_lines, [
                                         {
                                           'belegfeld1'             => 'ap1',
                                           'buchungstext'           => 'Testvendor',
@@ -248,8 +283,8 @@ cmp_bag $datev1->generate_datev_lines, [
                                           'konto'                  => '3400',
                                           'kost1'                  => undef,
                                           'kost2'                  => undef,
-                                          'soll_haben_kennzeichen' => 'H',
                                           'umsatz'                 => 119,
+                                          'locked'                 => undef,
                                           'waehrung'               => 'EUR'
                                         },
                                         {
@@ -260,14 +295,14 @@ cmp_bag $datev1->generate_datev_lines, [
                                           'konto'                  => '3300',
                                           'kost1'                  => undef,
                                           'kost2'                  => undef,
-                                          'soll_haben_kennzeichen' => 'H',
                                           'umsatz'                 => 107,
+                                          'locked'                 => undef,
                                           'waehrung'               => 'EUR'
                                         }
                                        ], "trans_id datev check purchase_invoice ok";
 $datev1->use_pk(1);
 $datev1->generate_datev_data;
-cmp_bag $datev1->generate_datev_lines, [
+cmp_deeply $datev1->generate_datev_lines, [
                                         {
                                           'belegfeld1'             => 'ap1',
                                           'buchungstext'           => 'Testvendor',
@@ -276,8 +311,8 @@ cmp_bag $datev1->generate_datev_lines, [
                                           'konto'                  => '3400',
                                           'kost1'                  => undef,
                                           'kost2'                  => undef,
-                                          'soll_haben_kennzeichen' => 'H',
                                           'umsatz'                 => 119,
+                                          'locked'                 => undef,
                                           'waehrung'               => 'EUR'
                                         },
                                         {
@@ -288,13 +323,15 @@ cmp_bag $datev1->generate_datev_lines, [
                                           'konto'                  => '3300',
                                           'kost1'                  => undef,
                                           'kost2'                  => undef,
-                                          'soll_haben_kennzeichen' => 'H',
                                           'umsatz'                 => 107,
+                                          'locked'                 => undef,
                                           'waehrung'               => 'EUR'
                                         }
                                        ], "trans_id datev check purchase_invoice use_pk ok";
 
 note('testing gldatefrom');
+# test an order with transdate in january, but that was booked in march
+# gldatefrom in DATEV.pm checks for itime, not gldate!!!
 $datev = SL::DATEV->new(
   dbh        => $dbh,
   from       => $startdate,
@@ -311,112 +348,10 @@ cmp_ok($umsatzsumme, '==', 1569.8, "Sum of bookings made after March 1st (only i
 
 $::form->{gldatefrom} = DateTime->new(year => 2017, month => 5, day => 1)->to_kivitendo;
 $datev->generate_datev_data(from_to => $datev->fromto);
-cmp_bag $datev->generate_datev_lines, [], "no bookings for January made after May 1st: ok";
+cmp_deeply $datev->generate_datev_lines, [], "no bookings for January made after May 1st: ok";
 
 done_testing();
-# clear_up();
-
-sub new_purchase_invoice {
-  # manually create a Kreditorenbuchung from scratch, ap + acc_trans bookings, as no helper exists yet, like $invoice->post.
-  # arap-Booking must come last in the acc_trans order
-  # this function was essentially copied from t/db_helper/payment.t, refactor once $purchase_invoice->post exists
-  my $currency_id = $::instance_conf->get_currency_id;
-  my $employee    = SL::DB::Manager::Employee->current                          || die "No employee";
-  my $taxzone     = SL::DB::Manager::TaxZone->find_by( description => 'Inland') || die "No taxzone";
-
-  my $purchase_invoice = SL::DB::PurchaseInvoice->new(
-    amount      => '226',
-    currency_id => $currency_id,
-    employee_id => $employee->id,
-    gldate      => $date,
-    invnumber   => "ap1",
-    invoice     => 0,
-    itime       => $date,
-    mtime       => $date,
-    netamount   => '200',
-    paid        => '0',
-    taxincluded => 0,
-    taxzone_id  => $taxzone->id,
-    transdate   => $date,
-    type        => 'invoice',
-    vendor_id   => $vendor->id,
-  )->save;
-
-  my $expense_chart  = SL::DB::Manager::Chart->find_by(accno => '3400');
-  my $expense_chart_booking= SL::DB::AccTransaction->new(
-    amount     => '-100',
-    chart_id   => $expense_chart->id,
-    chart_link => $expense_chart->link,
-    itime      => $date,
-    mtime      => $date,
-    source     => '',
-    tax_id     => SL::DB::Manager::Tax->find_by(taxkey => 9)->id,
-    taxkey     => 9,
-    transdate  => $date,
-    trans_id   => $purchase_invoice->id,
-  );
-  $expense_chart_booking->save;
-
-  my $tax_chart  = SL::DB::Manager::Chart->find_by(accno => '1576');
-  my $tax_chart_booking= SL::DB::AccTransaction->new(
-    amount     => '-19',
-    chart_id   => $tax_chart->id,
-    chart_link => $tax_chart->link,
-    itime      => $date,
-    mtime      => $date,
-    source     => '',
-    tax_id     => SL::DB::Manager::Tax->find_by(taxkey => 9)->id,
-    taxkey     => 0,
-    transdate  => $date,
-    trans_id   => $purchase_invoice->id,
-  );
-  $tax_chart_booking->save;
-  $expense_chart  = SL::DB::Manager::Chart->find_by(accno => '3300');
-  $expense_chart_booking= SL::DB::AccTransaction->new(
-    amount     => '-100',
-    chart_id   => $expense_chart->id,
-    chart_link => $expense_chart->link,
-    itime      => $date,
-    mtime      => $date,
-    source     => '',
-    tax_id     => SL::DB::Manager::Tax->find_by(taxkey => 8)->id,
-    taxkey     => 8,
-    transdate  => $date,
-    trans_id   => $purchase_invoice->id,
-  );
-  $expense_chart_booking->save;
-
-  $tax_chart  = SL::DB::Manager::Chart->find_by(accno => '1571');
-  $tax_chart_booking= SL::DB::AccTransaction->new(
-    trans_id   => $purchase_invoice->id,
-    chart_id   => $tax_chart->id,
-    chart_link => $tax_chart->link,
-    amount     => '-7',
-    transdate  => $date,
-    itime      => $date,
-    mtime      => $date,
-    source     => '',
-    taxkey     => 0,
-    tax_id     => SL::DB::Manager::Tax->find_by(taxkey => 8)->id,
-  );
-  $tax_chart_booking->save;
-  my $arap_chart  = SL::DB::Manager::Chart->find_by(accno => '1600');
-  my $arap_booking= SL::DB::AccTransaction->new(
-    trans_id   => $purchase_invoice->id,
-    chart_id   => $arap_chart->id,
-    chart_link => $arap_chart->link,
-    amount     => '226',
-    transdate  => $date,
-    itime      => $date,
-    mtime      => $date,
-    source     => '',
-    taxkey     => 0,
-    tax_id     => SL::DB::Manager::Tax->find_by(taxkey => 0)->id,
-  );
-  $arap_booking->save;
-
-  return $purchase_invoice;
-}
+clear_up();
 
 sub clear_up {
   SL::DB::Manager::AccTransaction->delete_all(all => 1);