X-Git-Url: http://wagnertech.de/git?p=kivitendo-erp.git;a=blobdiff_plain;f=t%2Ftax%2Ftax.t;fp=t%2Ftax%2Ftax.t;h=88638bb0c8f852de0761c252cd79db08cf60f7ba;hp=0000000000000000000000000000000000000000;hb=53593baa211863fbf66540cf1bcc36c8fb37257f;hpb=deb4d2dbb676d7d6f69dfe7815d6e0cb09bd4a44 diff --git a/t/tax/tax.t b/t/tax/tax.t new file mode 100644 index 000000000..88638bb0c --- /dev/null +++ b/t/tax/tax.t @@ -0,0 +1,633 @@ +use Test::More tests => 48; +use Test::Deep qw(cmp_deeply); + +use strict; + +use lib 't'; +use utf8; + +use Support::TestSetup; +use Test::Exception; + +use SL::DB::BankTransaction; +use SL::DB::BankTransactionAccTrans; +use SL::DB::Customer; +use SL::DB::Vendor; +use SL::DB::Invoice; +use SL::DB::GLTransaction; +use SL::DB::AccTransaction; +use SL::DB::Part; +use SL::DB::PaymentTerm; +use SL::DBUtils qw(selectall_hashref_query); +use SL::Dev::Record qw(:ALL); +use SL::Dev::CustomerVendor qw(new_customer new_vendor); +use SL::Dev::Part qw(new_part); +use SL::Dev::Payment qw(create_payment_terms); +use Data::Dumper; + +Support::TestSetup::login(); +my $dbh = SL::DB->client->dbh; + +clear_up(); + +# TODOs: Storno muß noch korrekt funktionieren +# neue Konten für 5% anlegen +# Leistungszeitraum vs. Datum Zuord. Steuerperiodest + + + + +note('checking if all tax entries exist for Konjunkturprogramm'); + +# create dates to test on +my $date_2006 = DateTime->new(year => 2006, month => 6, day => 15); +my $date_2020_1 = DateTime->new(year => 2020, month => 6, day => 15); +my $date_2020_2 = DateTime->new(year => 2020, month => 7, day => 15); +my $date_2021 = DateTime->new(year => 2021, month => 1, day => 15); + +# dummy bt_id +my $bank_account = SL::DB::BankAccount->new( + account_number => '123', + bank_code => '123', + iban => '123', + bic => '123', + bank => '123', + chart_id => SL::DB::Manager::Chart->find_by( description => 'Bank' )->id, + name => SL::DB::Manager::Chart->find_by( description => 'Bank' )->description, + )->save; + + +my $currency_id = $::instance_conf->get_currency_id; +my $bt = SL::DB::BankTransaction->new( + local_bank_account_id => $bank_account->id, + transdate => $date_2021, + valutadate => $date_2021, + amount => 27332.32, + purpose => 'dummy', + currency => $currency_id, + ); + $bt->save || die $@; + + +# The only way to discern the pre-2007 16% tax from the 2020 16% tax is by +# their configured automatic tax charts, so look them up here: + +my ($chart_vst_19, $chart_vst_16, $chart_vst_5, $chart_vst_7); +my ($chart_ust_19, $chart_ust_16, $chart_ust_5, $chart_ust_7); +my ($income_19_accno, $income_7_accno); +my ($ar_accno, $ap_accno); +my ($chart_reisekosten_accno, $chart_cash_accno, $chart_bank_accno); + +my ($skonto_5, $skonto_16, $skonto_7, $skonto_19); # store acc_trans entries during tests + +my $test_kontenrahmen = $::instance_conf->get_coa eq 'Germany-DATEV-SKR04EU' ? 'skr04' : 'skr03'; + +if ( $test_kontenrahmen eq 'skr03' ) { + + is(SL::DB::Default->get->coa, 'Germany-DATEV-SKR03EU', "coa SKR03 ok"); + + $chart_ust_19 = '1776'; + $chart_ust_16 = '1775'; + $chart_ust_5 = '1773'; + $chart_ust_7 = '1771'; + + $chart_vst_19 = '1576'; + $chart_vst_16 = '1575'; + $chart_vst_5 = '1568'; + $chart_vst_7 = '1571'; + + $income_19_accno = '8400'; + $income_7_accno = '8300'; + + $chart_reisekosten_accno = 4660; + $chart_cash_accno = 1000; + $chart_bank_accno = 1200; + + $ar_accno = 1400; + $ap_accno = 1600; + +} elsif ( $test_kontenrahmen eq 'skr04') { # skr04 - test can be ran manually by running t/000setup_database.t with coa for SKR04 + is(SL::DB::Default->get->coa, 'Germany-DATEV-SKR04EU', "coa SKR04 ok"); + $chart_vst_19 = '1406'; + $chart_vst_16 = '1405'; + $chart_vst_5 = '1403'; + $chart_vst_7 = '1401'; + + $chart_ust_19 = '3806'; + $chart_ust_16 = '3805'; + $chart_ust_5 = '3803'; + $chart_ust_7 = '3801'; + + $income_19_accno = '4400'; + $income_7_accno = '4300'; + + $chart_reisekosten_accno = 6650; + $chart_cash_accno = 1600; + $chart_bank_accno = 1800; + + $ar_accno = 1200; + $ap_accno = 3300; +} + +my $tax_vst_19 = SL::DB::Manager::Chart->find_by(accno => $chart_vst_19) or die; # 19% +my $tax_vst_16 = SL::DB::Manager::Chart->find_by(accno => $chart_vst_16) or die; # 16% +my $tax_vst_5 = SL::DB::Manager::Chart->find_by(accno => $chart_vst_5 ) or die; # 5% +my $tax_vst_7 = SL::DB::Manager::Chart->find_by(accno => $chart_vst_7 ) or die; # 7% + +my $tax_ust_19 = SL::DB::Manager::Chart->find_by(accno => $chart_ust_19) or die; # 19% +my $tax_ust_16 = SL::DB::Manager::Chart->find_by(accno => $chart_ust_16) or die; # 16% +my $tax_ust_5 = SL::DB::Manager::Chart->find_by(accno => $chart_ust_5) or die; # 5% +my $tax_ust_7 = SL::DB::Manager::Chart->find_by(accno => $chart_ust_7) or die; # 7% + +my $chart_income_19 = SL::DB::Manager::Chart->find_by(accno => $income_19_accno) or die; +my $chart_income_7 = SL::DB::Manager::Chart->find_by(accno => $income_7_accno) or die; + +my $chart_reisekosten = SL::DB::Manager::Chart->find_by(accno => $chart_reisekosten_accno) or die; +my $chart_cash = SL::DB::Manager::Chart->find_by(accno => $chart_cash_accno) or die; +my $chart_bank = SL::DB::Manager::Chart->find_by(accno => $chart_bank_accno) or die; + +my $payment_terms = create_payment_terms(); + +is(defined SL::DB::Manager::Tax->find_by(taxkey => 2, rate => 0.05), 1, "tax for taxkey 2 with 5% was created ok"); +is(defined SL::DB::Manager::Tax->find_by(taxkey => 3, rate => 0.16, chart_id => $tax_ust_16->id), 1, "new sales tax for taxkey 3 with 16% exists ok"); +is(defined SL::DB::Manager::Tax->find_by(taxkey => 3, rate => 0.19, chart_id => $tax_ust_19->id), 1, "old sales tax for taxkey 3 with 19% exists ok"); +# is(defined SL::DB::Manager::Tax->find_by(taxkey => 5, rate => 0.16, chart_id => $tax_ust_16->id), 1, "new sales tax for taxkey 5 with 16% exists ok"); + +# is(defined SL::DB::Manager::Tax->find_by(taxkey => 7, rate => 0.16, chart_id => $tax_ust_16->id), 1, "old purchase tax for taxkey 7 with 16% exists ok"); +is(defined SL::DB::Manager::Tax->find_by(taxkey => 8, rate => 0.07, chart_id => $tax_vst_7->id ), 1, "purchase tax for taxkey 8 with 7% exists ok"); +is(defined SL::DB::Manager::Tax->find_by(taxkey => 9, rate => 0.19, chart_id => $tax_vst_19->id), 1, "old purchase tax for taxkey 9 with 19% exists ok"); +is(defined SL::DB::Manager::Tax->find_by(taxkey => 9, rate => 0.16, chart_id => $tax_vst_16->id), 1, "new purchase tax for taxkey 9 with 16% exists ok"); + +my $vendor = new_vendor( name => 'Testvendor', payment_id => $payment_terms->id)->save; +my $customer = new_customer(name => 'Testcustomer', payment_id => $payment_terms->id)->save; + +cmp_ok($chart_income_7->get_active_taxkey($date_2020_1)->tax->rate, '==', 0.07, "get_active_taxkey rate for 8300 in 2020_1 ok"); +cmp_ok($chart_income_7->get_active_taxkey($date_2020_2)->tax->rate, '==', 0.05, "get_active_taxkey rate for 8300 in 2020_2 ok"); +cmp_ok($chart_income_7->get_active_taxkey($date_2021 )->tax->rate, '==', 0.07, "get_active_taxkey rate for 8300 in 2021 ok"); +cmp_ok($chart_income_7->get_active_taxkey($date_2020_1)->tax->rate, '==', 0.07, "get_active_taxkey rate for $income_7_accno in 2020_1 ok"); +cmp_ok($chart_income_7->get_active_taxkey($date_2020_2)->tax->rate, '==', 0.05, "get_active_taxkey rate for $income_7_accno in 2020_2 ok"); +cmp_ok($chart_income_7->get_active_taxkey($date_2021 )->tax->rate, '==', 0.07, "get_active_taxkey rate for $income_7_accno in 2021 ok"); +cmp_ok($chart_income_7->get_active_taxkey($date_2006 )->tax->rate, '==', 0.07, "get_active_taxkey rate for $income_7_accno in 2016 ok"); + +cmp_ok($chart_income_19->get_active_taxkey($date_2020_1)->tax->rate, '==', 0.19, "get_active_taxkey rate for $income_19_accno in 2020_1 ok"); +cmp_ok($chart_income_19->get_active_taxkey($date_2020_2)->tax->rate, '==', 0.16, "get_active_taxkey rate for $income_19_accno in 2020_2 ok"); +cmp_ok($chart_income_19->get_active_taxkey($date_2021 )->tax->rate, '==', 0.19, "get_active_taxkey rate for $income_19_accno in 2021 ok"); +cmp_ok($chart_income_19->get_active_taxkey($date_2006 )->tax->rate, '==', 0.16, "get_active_taxkey rate for $income_19_accno in 2016 ok"); + +my $bugru19 = SL::DB::Manager::Buchungsgruppe->find_by(description => 'Standard 19%') or die "Can't find bugru19"; +my $bugru7 = SL::DB::Manager::Buchungsgruppe->find_by(description => 'Standard 7%' ) or die "Can't find bugru7"; + +my $part1 = new_part(partnumber => '1', description => 'part19', buchungsgruppen_id => $bugru19->id)->save; +my $part2 = new_part(partnumber => '2', description => 'part7', buchungsgruppen_id => $bugru7->id )->save; + +note('sales invoices'); +my $sales_invoice_2006 = create_invoice_for_date('2006', $date_2006); +my $sales_invoice_2020_1 = create_invoice_for_date('2020_1', $date_2020_1); +my $sales_invoice_2020_2 = create_invoice_for_date('2020_2', $date_2020_2); +my $sales_invoice_2021 = create_invoice_for_date('2021', $date_2021); + +is($sales_invoice_2006->amount, 223, '2006 sales invoice has 16% and 7% tax ok' ); # 116 + 7 +is($sales_invoice_2020_1->amount, 226, '2020_01 sales invoice has 19% and 7% tax ok'); # 119 + 7 +is($sales_invoice_2020_2->amount, 221, '2020_02 sales invoice has 16% and 5% tax ok'); # 116 + 5 +is($sales_invoice_2021->amount, 226, '2021 sales invoice has 19% and 7% tax ok' ); # 119 + 7 + +&datev_test($sales_invoice_2020_2, + [ + { + 'belegfeld1' => 'test is 2020_2', + 'buchungstext' => 'Testcustomer', + 'datum' => '15.07.2020', + 'leistungsdatum' => '15.07.2020', # should leistungsdatum be empty if it doesn't exist? + 'gegenkonto' => $income_7_accno, + 'konto' => $ar_accno, + 'kost1' => undef, + 'kost2' => undef, + 'locked' => undef, + 'umsatz' => 105, + 'waehrung' => 'EUR' + }, + { + 'belegfeld1' => 'test is 2020_2', + 'buchungstext' => 'Testcustomer', + 'datum' => '15.07.2020', + 'leistungsdatum' => '15.07.2020', + 'gegenkonto' => $income_19_accno, + 'konto' => $ar_accno, + 'kost1' => undef, + 'kost2' => undef, + 'locked' => undef, + 'umsatz' => 116, + 'waehrung' => 'EUR' + } + ], + "datev check for 16/5 ok, no taxkey" +); + +note('sales invoice with differing delivery dates'); +my $sales_invoice_2020_1_with_delivery_date_2020_2 = create_invoice_for_date('deliverydate 2020_1', $date_2020_1, $date_2020_2); +is($sales_invoice_2020_1_with_delivery_date_2020_2->amount, 221, "sales_invoice from 2020_1 with future delivery_date 2020_2 tax ok"); + +my $sales_invoice_2020_2_with_delivery_date_2020_1 = create_invoice_for_date('deliverydate 2020_2', $date_2020_2, $date_2020_1); +is($sales_invoice_2020_2_with_delivery_date_2020_1->amount, 226, "sales_invoice from 2020_2 with past delivery_date 2020_1 tax ok"); + +&datev_test($sales_invoice_2020_2_with_delivery_date_2020_1, + [ + { + 'belegfeld1' => 'test is deliverydate 2020_2', + 'buchungstext' => 'Testcustomer', + 'datum' => '15.07.2020', + 'gegenkonto' => $income_7_accno, + 'konto' => $ar_accno, + 'kost1' => undef, + 'kost2' => undef, + 'leistungsdatum' => '15.06.2020', + 'locked' => undef, + 'umsatz' => 107, + 'waehrung' => 'EUR' + }, + { + 'belegfeld1' => 'test is deliverydate 2020_2', + 'buchungstext' => 'Testcustomer', + 'datum' => '15.07.2020', + 'gegenkonto' => $income_19_accno, + 'konto' => $ar_accno, + 'kost1' => undef, + 'kost2' => undef, + 'leistungsdatum' => '15.06.2020', + 'locked' => undef, + 'umsatz' => 119, + 'waehrung' => 'EUR' + } + ], + "datev check for datev export with delivery_date 19/7 ok, no taxkey" +); + +my $sales_invoice_2021_with_delivery_date_2020_2 = create_invoice_for_date('deliverydate 2020_2', $date_2021, $date_2020_2); +is($sales_invoice_2021_with_delivery_date_2020_2->amount, 221, "sales_invoice from 2021 with past delivery_date 2020_2 tax ok"); + +my $sales_invoice_2020_2_with_delivery_date_2021 = create_invoice_for_date('deliverydate 2021', $date_2020_2, $date_2021); +is($sales_invoice_2020_2_with_delivery_date_2021->amount, 226, "sales_invoice from 2020_2 with future delivery_date 2021 tax ok"); + + +note('ap transactions'); +# in the test we want to test for Reisekosten with 19% and 7%. Normally the user +# would select the entries from the dropdown, as they may differ from the +# default, so we have to pass the tax we want to create_ap_transaction + +# my $tax_9_16_old = SL::DB::Manager::Tax->find_by(taxkey => 7, rate => 0.16, chart_id => $tax_vst_16->id); +my $tax_9_19 = SL::DB::Manager::Tax->find_by(taxkey => 9, rate => 0.19, chart_id => $tax_vst_19->id) or die "missing 9_19"; +my $tax_9_16 = SL::DB::Manager::Tax->find_by(taxkey => 9, rate => 0.16, chart_id => $tax_vst_16->id) or die "missing 9_16"; +my $tax_8_7 = SL::DB::Manager::Tax->find_by(taxkey => 8, rate => 0.07, chart_id => $tax_vst_7->id) or die "missing 8_7"; +my $tax_8_5 = SL::DB::Manager::Tax->find_by(taxkey => 8, rate => 0.05, chart_id => $tax_vst_5->id) or die "missing 8_5"; + +# simulate user selecting the "correct" taxes in dropdown: +my $ap_transaction_2006 = create_ap_transaction_for_date('2006', $date_2006, undef, $tax_9_16, $tax_8_7); +my $ap_transaction_2020_1 = create_ap_transaction_for_date('2020_1', $date_2020_1, undef, $tax_9_19, $tax_8_7); +my $ap_transaction_2020_2 = create_ap_transaction_for_date('2020_2', $date_2020_2, undef, $tax_9_16, $tax_8_5); +my $ap_transaction_2021 = create_ap_transaction_for_date('2021', $date_2021, undef, $tax_9_19, $tax_8_7); + + +is($ap_transaction_2006->amount, 223, '2006 ap transaction has 16% and 7% tax ok'); # 116 + 7 +is($ap_transaction_2020_1->amount, 226, '2020_01 ap transaction has 19% and 7% tax ok'); # 119 + 7 +is($ap_transaction_2020_2->amount, 221, '2020_02 ap transaction has 16% and 5% tax ok'); # 116 + 5 +is($ap_transaction_2021->amount, 226, '2021 ap transaction has 19% and 7% tax ok'); # 119 + 7 + +# ap transaction in july, but use old tax +my $ap_transaction_2020_2_with_delivery_date_2020_1 = create_ap_transaction_for_date('2020_2 with delivery date 2020_1', $date_2020_2, $date_2020_1, $tax_9_19, $tax_8_7); +is($ap_transaction_2020_2_with_delivery_date_2020_1->amount, 226, 'ap transaction 2020_2 with delivery date 2020_1, 19% and 7% tax ok'); # 119 + 7 +&datev_test($ap_transaction_2020_2_with_delivery_date_2020_1, + [ + { + 'belegfeld1' => 'test ap_transaction 2020_2 with delivery date 2020_1', + 'buchungsschluessel' => 8, + 'buchungstext' => 'Testvendor', + 'datum' => '15.07.2020', + 'gegenkonto' => $ap_accno, + 'konto' => $chart_reisekosten_accno, + 'kost1' => undef, + 'kost2' => undef, + 'leistungsdatum' => '15.06.2020', + 'locked' => undef, + 'umsatz' => 107, + 'waehrung' => 'EUR' + }, + { + 'belegfeld1' => 'test ap_transaction 2020_2 with delivery date 2020_1', + 'buchungsschluessel' => 9, + 'buchungstext' => 'Testvendor', + 'datum' => '15.07.2020', + 'gegenkonto' => $ap_accno, + 'konto' => $chart_reisekosten_accno, + 'kost1' => undef, + 'kost2' => undef, + 'leistungsdatum' => '15.06.2020', + 'locked' => undef, + 'umsatz' => 119, + 'waehrung' => 'EUR' + } + ], + "datev check for ap transaction 2020_2 with delivery date 2020_1, 19% and 7% tax ok" +); + +note('ar transactions'); + +my $ar_transaction_2006 = create_ar_transaction_for_date('2006', $date_2006); +my $ar_transaction_2020_1 = create_ar_transaction_for_date('2020_1', $date_2020_1); +my $ar_transaction_2020_2 = create_ar_transaction_for_date('2020_2', $date_2020_2); +my $ar_transaction_2021 = create_ar_transaction_for_date('2021', $date_2021); + +is($ar_transaction_2006->amount, 223, '2006 ar transaction has 16% and 7% tax ok'); # 116 + 7 +is($ar_transaction_2020_1->amount, 226, '2020_01 ar transaction has 19% and 7% tax ok'); # 119 + 7 +is($ar_transaction_2020_2->amount, 221, '2020_02 ar transaction has 16% and 5% tax ok'); # 116 + 5 +is($ar_transaction_2021->amount, 226, '2021 ar transaction has 19% and 7% tax ok'); # 119 + 7 + +note('gl transactions'); + +my $gl_2006 = create_gl_transaction_for_date('glincome 2006', $date_2006, 223); +my $gl_2020_1 = create_gl_transaction_for_date('glincome 2020_1', $date_2020_1, 226); +my $gl_2020_2 = create_gl_transaction_for_date('glincome 2020_2', $date_2020_2, 221); +my $gl_2021 = create_gl_transaction_for_date('glincome 2021', $date_2021, 226); + +is(SL::DB::Manager::GLTransaction->get_all_count(), 4, "4 gltransactions created correctly"); + +my $result = &get_account_balances; +# print Dumper($result); +is_deeply( &get_account_balances, + [ + # { + # 'accno' => '1000', + # # 'description' => 'Kasse', + # 'sum' => '-896.00000' + # }, + # { + # 'accno' => '1400', + # # 'description' => 'Ford. a.Lieferungen und Leistungen', + # 'sum' => '-2686.00000' + # }, + { + 'accno' => '1568', + # 'description' => 'Abziehbare Vorsteuer 7%', + 'sum' => '-5.00000' + }, + { + 'accno' => '1571', + # 'description' => 'Abziehbare Vorsteuer 7%', + 'sum' => '-28.00000' + }, + { + 'accno' => '1575', + # 'description' => 'Abziehbare Vorsteuer 16%', + 'sum' => '-32.00000' + }, + { + 'accno' => '1576', + # 'description' => 'Abziehbare Vorsteuer 19 %', + 'sum' => '-57.00000' + }, + # { + # 'accno' => '1600', + # # 'description' => 'Verbindlichkeiten aus Lief.u.Leist.', + # 'sum' => '896.00000' + # }, + { + 'accno' => '1771', + # 'description' => 'Umsatzsteuer 7%', + 'sum' => '77.00000' + }, + { + 'accno' => '1773', + # 'description' => 'Umsatzsteuer 5 %', + 'sum' => '25.00000' + }, + { + 'accno' => '1775', + # 'description' => 'Umsatzsteuer 16%', + 'sum' => '128.00000' + }, + { + 'accno' => '1776', + # 'description' => 'Umsatzsteuer 19 %', + 'sum' => '152.00000' + }, + # { + # 'accno' => '4660', + # # 'description' => 'Reisekosten Arbeitnehmer', + # 'sum' => '-800.00000' + # }, + # { + # 'accno' => $income_7_accno, + # # 'description' => "Erl\x{f6}se 7%USt", + # 'sum' => '1600.00000' + # }, + # { + # 'accno' => $income_19_accno, + # # 'description' => "Erl\x{f6}se 16%/19% USt.", + # 'sum' => '1600.00000' + # } + ], + 'account balances after invoices' +); + +note('testing payments with skonto'); + +my %params = ( chart_id => $chart_bank->id, + payment_type => 'with_skonto_pt', + bt_id => $bt->id, + ); + +$sales_invoice_2020_2->pay_invoice( %params, + amount => $sales_invoice_2020_2->amount_less_skonto, + transdate => $date_2020_2->to_kivitendo, + ); + + +$skonto_5 = SL::DB::Manager::AccTransaction->find_by(trans_id => $sales_invoice_2020_2->id, amount => -5.25); +like($skonto_5->chart->description, qr/Skonti.*5/, "sales_invoice 2020_2 paid in 2020_2 - skonto 5% ok"); +$skonto_16 = SL::DB::Manager::AccTransaction->find_by(trans_id => $sales_invoice_2020_2->id, amount => -5.80); +like($skonto_16->chart->description, qr/Skonti.*16/, "sales_invoice 2020_2 paid in 2020_2 - skonto 16% ok"); + +$sales_invoice_2020_1->pay_invoice( %params, + amount => $sales_invoice_2020_1->amount_less_skonto, + transdate => $date_2020_2->to_kivitendo, + ); +$skonto_7 = SL::DB::Manager::AccTransaction->find_by(trans_id => $sales_invoice_2020_1->id, amount => -5.35); +like($skonto_7->chart->description, qr/Skonti.*7/, "sales_invoice 2020_1 paid with skonto in 2020_2 - skonto 7% ok"); +$skonto_19 = SL::DB::Manager::AccTransaction->find_by(trans_id => $sales_invoice_2020_1->id, amount => -5.95); +like($skonto_19->chart->description, qr/Skonti.*19/, "sales_invoice 2020_1 paid with skonto in 2020_2 - skonto 19% ok"); + +$ap_transaction_2020_1->pay_invoice( %params, + amount => $ap_transaction_2020_1->amount_less_skonto, + transdate => $date_2020_2->to_kivitendo, + ); +$skonto_7 = SL::DB::Manager::AccTransaction->find_by(trans_id => $ap_transaction_2020_1->id, amount => 5.35); +like($skonto_7->chart->description, qr/Skonti.*7/, "ap transaction 2020_1 paid with skonto in 2020_2 - skonto 7% ok"); +$skonto_19 = SL::DB::Manager::AccTransaction->find_by(trans_id => $ap_transaction_2020_1->id, amount => 5.95); +like($skonto_19->chart->description, qr/Skonti.*19/, "ap transaction 2020_1 paid with skonto in 2020_2 - skonto 19% ok"); + + +$ap_transaction_2020_2->pay_invoice( %params, + amount => $ap_transaction_2020_2->amount_less_skonto, + transdate => $date_2021->to_kivitendo, + ); +$skonto_5 = SL::DB::Manager::AccTransaction->find_by(trans_id => $ap_transaction_2020_2->id, amount => 5.25); +like($skonto_5->chart->description, qr/Skonti.*5/, "ap transaction 2020_2 paid in 2021 - skonto 5% ok"); + +$skonto_16 = SL::DB::Manager::AccTransaction->find_by(trans_id => $ap_transaction_2020_2->id, amount => 5.80); +like($skonto_16->chart->description, qr/Skonti.*16/, "sales_invoice 2020_2 paid in 2021 - skonto 16% ok"); + +clear_up(); + +done_testing(); + +###### functions for setting up data + +sub create_invoice_for_date { + my ($invnumber, $transdate, $deliverydate) = @_; + + $deliverydate = $transdate unless defined $deliverydate; + + my $sales_invoice = create_sales_invoice( + invnumber => 'test is ' . $invnumber, + transdate => $transdate, + customer => $customer, + deliverydate => $deliverydate, + payment_terms => $payment_terms, + taxincluded => 0, + invoiceitems => [ create_invoice_item(part => $part1, qty => 10, sellprice => 10), + create_invoice_item(part => $part2, qty => 10, sellprice => 10), + ] + ); + return $sales_invoice; +} + +sub create_ar_transaction_for_date { + my ($invnumber, $transdate) = @_; + + my $ar_transaction = create_ar_transaction( + customer => $customer, + invnumber => 'test ar' . $invnumber, + taxincluded => 0, + transdate => $transdate, + ar_chart => SL::DB::Manager::Chart->find_by(accno => $ar_accno), # pass ar_chart, as it is hardcoded for SKR03 in SL::Dev::Record + bookings => [ + { + chart => $chart_income_19, + amount => 100, + }, + { + chart => $chart_income_7, + amount => 100, + }, + ] + ); + return $ar_transaction; +} + +sub create_ap_transaction_for_date { + my ($invnumber, $transdate, $deliverydate, $tax_high, $tax_low) = @_; + + # printf("invnumber = %s tax_high = %s tax_low = %s\n", $invnumber, $tax_high->accno , $tax_low->accno); + my $taxkey_ = $chart_reisekosten->get_active_taxkey($transdate); + + my $ap_transaction = create_ap_transaction( + vendor => $vendor, + invnumber => 'test ap_transaction ' . $invnumber, + taxincluded => 0, + transdate => $transdate, + deliverydate => $deliverydate, + payment_id => $payment_terms->id, + ap_chart => SL::DB::Manager::Chart->find_by(accno => $ap_accno), # pass ap_chart, as it is hardcoded for SKR03 in SL::Dev::Record + bookings => [ + { + chart => $chart_reisekosten, + amount => 100, + tax_id => $tax_high->id, + }, + { + chart => $chart_reisekosten, + amount => 100, + tax_id => $tax_low->id, + }, + ] + ); + return $ap_transaction; +} + +sub create_gl_transaction_for_date { + my ($reference, $transdate, $debitamount) = @_; + + my $gl_transaction = create_gl_transaction( + reference => $reference, + taxincluded => 0, + transdate => $transdate, + bookings => [ + { + chart => $chart_income_19, + memo => 'gl 19', + source => 'gl 19', + credit => 100, + }, + { + chart => $chart_income_7, + memo => 'gl 7', + source => 'gl 7', + credit => 100, + }, + { + chart => $chart_cash, + debit => $debitamount, + memo => 'gl 19+7', + source => 'gl 19+7', + }, + ], + ); + return $gl_transaction; +} + +sub get_account_balances { + my $query = <new( + dbh => $invoice->db->dbh, + trans_id => $invoice->id, + ); + + $datev->generate_datev_data; + my @data_datev = sort { $a->{umsatz} <=> $b->{umsatz} } @{ $datev->generate_datev_lines() }; + + # print Dumper(\@data_datev); + + cmp_deeply(\@data_datev, $expected_data, $msg); +} + +sub clear_up { + SL::DB::Manager::BankTransactionAccTrans->delete_all(all => 1); + SL::DB::Manager::BankTransaction->delete_all(all => 1); + SL::DB::Manager::BankAccount->delete_all(all => 1); + SL::DB::Manager::OrderItem->delete_all(all => 1); + SL::DB::Manager::Order->delete_all(all => 1); + SL::DB::Manager::InvoiceItem->delete_all(all => 1); + SL::DB::Manager::Invoice->delete_all(all => 1); + SL::DB::Manager::PurchaseInvoice->delete_all(all => 1); + SL::DB::Manager::GLTransaction->delete_all(all => 1); + SL::DB::Manager::Part->delete_all(all => 1); + SL::DB::Manager::Customer->delete_all(all => 1); + SL::DB::Manager::Vendor->delete_all(all => 1); + SL::DB::Manager::PaymentTerm->delete_all(all => 1); +}; + +1;