3 use Test::Deep qw(cmp_deeply);
7 use_ok 'Support::TestSetup';
8 use SL::DATEV qw(:CONSTANTS);
9 use SL::Dev::ALL qw(:ALL);
10 use List::Util qw(sum);
11 use SL::DB::Buchungsgruppe;
17 Support::TestSetup::login();
19 my $dbh = SL::DB->client->dbh;
22 my $buchungsgruppe7 = SL::DB::Manager::Buchungsgruppe->find_by(description => 'Standard 7%') || die "No accounting group for 7\%";
23 my $date = DateTime->new(year => 2017, month => 7, day => 19);
24 my $department = create_department(description => 'Kästchenweiße heiße Preise');
25 my $project = create_project(projectnumber => 2017, description => '299');
27 my $part1 = new_part(partnumber => '19', description => 'Part 19%')->save;
30 description => 'Part 7%',
31 buchungsgruppen_id => $buchungsgruppe7->id,
34 my $invoice = create_sales_invoice(
40 invoiceitems => [ create_invoice_item(part => $part1, qty => 3, sellprice => 550),
41 create_invoice_item(part => $part2, qty => 10, sellprice => 50),
43 department_id => $department->id,
44 globalproject_id => $project->id,
48 # generate_datev_* doesnt care about encoding but
49 # csv_buchungsexport does! all arabic will be deleted
50 # and no string will be left as invnumber
52 my $datev1 = SL::DATEV->new(
54 trans_id => $invoice->id,
57 my $startdate = DateTime->new(year => 2017, month => 1, day => 1);
58 my $enddate = DateTime->new(year => 2017, month => 12, day => 31);
59 my $today = DateTime->new(year => 2017, month => 3, day => 17);
62 $datev1->from($startdate);
63 $datev1->to($enddate);
65 $datev1->generate_datev_data;
66 $datev1->generate_datev_lines;
68 # check conversion to csv
69 $datev1->from($startdate);
70 $datev1->to($enddate);
71 my ($datev_csv, $die_message);
73 $datev_csv = SL::DATEV::CSV->new(datev_lines => $datev1->generate_datev_lines,
76 locked => $datev1->locked,
78 my $lines_aref = $datev_csv->lines; # dies only if we assign (do stuff with the data)
83 ok($die_message =~ m/Falscher Feldwert 'ݗݘݰݶ' für Feld 'belegfeld1' bei der Transaktion mit dem Umsatz von/, 'wrong_encoding');
86 $invoice->invnumber('ݗݘݰݶmuh');
89 my $datev3 = SL::DATEV->new(
91 trans_id => $invoice->id,
94 $datev3->from($startdate);
95 $datev3->to($enddate);
96 $datev3->generate_datev_data;
97 $datev3->generate_datev_lines;
98 my ($datev_csv2, $die_message2);
100 $datev_csv2 = SL::DATEV::CSV->new(datev_lines => $datev3->generate_datev_lines,
103 locked => $datev3->locked,
105 my $lines_aref = $datev_csv2->lines; # dies only if we assign (do stuff with the data)
112 # redefine invnumber, we have mixed encodings, should still fail
113 ok($die_message2 =~ m/Falscher Feldwert 'ݗݘݰݶmuh' für Feld 'belegfeld1' bei der Transaktion mit dem Umsatz von/, 'mixed_wrong_encoding');
115 # create one haben buchung with GLTransaction today
117 my $expense_chart = SL::DB::Manager::Chart->find_by(accno => '4660'); # Reisekosten
118 my $cash_chart = SL::DB::Manager::Chart->find_by(accno => '1000'); # Kasse
119 my $tax_chart = SL::DB::Manager::Chart->find_by(accno => '1576'); # Vorsteuer
120 my $tax_9 = SL::DB::Manager::Tax->find_by(taxkey => 9, rate => 0.19) || die "No tax";
123 push(@acc_trans, SL::DB::AccTransaction->new(
124 chart_id => $expense_chart->id,
125 chart_link => $expense_chart->link,
130 tax_id => $tax_9->id,
131 project_id => $project->id,
133 push(@acc_trans, SL::DB::AccTransaction->new(
134 chart_id => $tax_chart->id,
135 chart_link => $tax_chart->link,
140 tax_id => $tax_9->id,
141 project_id => $project->id,
143 push(@acc_trans, SL::DB::AccTransaction->new(
144 chart_id => $cash_chart->id,
145 chart_link => $cash_chart->link,
153 my $gl_transaction = SL::DB::GLTransaction->new(
154 reference => "Reise März 2018",
155 description => "Reisekonsten März 2018 / Ma Schmidt",
158 employee_id => SL::DB::Manager::Employee->current->id,
165 transactions => \@acc_trans,
167 my $datev2 = SL::DATEV->new(
169 trans_id => $gl_transaction->id,
172 $datev2->from($startdate);
173 $datev2->to($enddate);
174 $datev2->generate_datev_data;
175 $datev2->generate_datev_lines;
177 my $datev_csv3 = SL::DATEV::CSV->new(datev_lines => $datev2->generate_datev_lines,
180 locked => $datev2->locked,
183 my @data_csv = $datev_csv3->lines;
184 @data_csv = sort { $a->[0] cmp $b->[0] } @{ $datev_csv3->lines };
185 cmp_deeply($data_csv[0], [ 100, 'H', 'EUR', '', '', '', '4660', '1000', 9, '1703', 'Reise März 2',
186 '', '', '', '', '', '', '', '', '', '', '',
187 '', '', '', '', '', '', '', '', '', '', '', '', '',
188 '', '', '', '', '', '', '', '', '', '', '',
189 '', '', '', '', '', '', '', '', '', '', '', '', '',
190 '', '', '', '', '', '', '', '', '', '', '', '', '',
191 '', '', '', '', '', '', '', '', '', '', '', '', '',
192 '', '', '', '', '', '', '', '', '', '', '', '', '',
193 '', '', '', '', '', '', '', '', '', '', '', '', '',
197 # TODO warnings are not yet tested
198 # currently most of the valid_checks are senseless because of
199 # the strict input_checks before. Maybe something like encoding mismatch of invnumber,
200 # can be altered to just a warning (not a mandantory field!)
207 SL::DB::Manager::AccTransaction->delete_all( all => 1);
208 SL::DB::Manager::GLTransaction->delete_all( all => 1);
209 SL::DB::Manager::InvoiceItem->delete_all( all => 1);
210 SL::DB::Manager::Invoice->delete_all( all => 1);
211 SL::DB::Manager::Customer->delete_all( all => 1);
212 SL::DB::Manager::Part->delete_all( all => 1);
213 SL::DB::Manager::Project->delete_all( all => 1);
214 SL::DB::Manager::Department->delete_all( all => 1);
215 SL::DATEV->clean_temporary_directories;