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_ref, $warnings_ref, $die_message);
73 ($datev_ref, $warnings_ref) = SL::DATEV::CSV->new(datev_lines => $datev1->generate_datev_lines,
76 locked => $datev1->locked,
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_ref2, $warnings_ref2, $die_message2);
100 ($datev_ref2, $warnings_ref2) = SL::DATEV::CSV->new(datev_lines => $datev3->generate_datev_lines,
103 locked => $datev3->locked,
110 # redefine invnumber, we have mixed encodings, should still fail
111 ok($die_message2 =~ m/Falscher Feldwert 'ݗݘݰݶmuh' für Feld 'belegfeld1' bei der Transaktion mit dem Umsatz von/, 'mixed_wrong_encoding');
113 # create one haben buchung with GLTransaction today
115 my $expense_chart = SL::DB::Manager::Chart->find_by(accno => '4660'); # Reisekosten
116 my $cash_chart = SL::DB::Manager::Chart->find_by(accno => '1000'); # Kasse
117 my $tax_chart = SL::DB::Manager::Chart->find_by(accno => '1576'); # Vorsteuer
118 my $tax_9 = SL::DB::Manager::Tax->find_by(taxkey => 9, rate => 0.19) || die "No tax";
121 push(@acc_trans, SL::DB::AccTransaction->new(
122 chart_id => $expense_chart->id,
123 chart_link => $expense_chart->link,
128 tax_id => $tax_9->id,
129 project_id => $project->id,
131 push(@acc_trans, SL::DB::AccTransaction->new(
132 chart_id => $tax_chart->id,
133 chart_link => $tax_chart->link,
138 tax_id => $tax_9->id,
139 project_id => $project->id,
141 push(@acc_trans, SL::DB::AccTransaction->new(
142 chart_id => $cash_chart->id,
143 chart_link => $cash_chart->link,
151 my $gl_transaction = SL::DB::GLTransaction->new(
152 reference => "Reise März 2018",
153 description => "Reisekonsten März 2018 / Ma Schmidt",
156 employee_id => SL::DB::Manager::Employee->current->id,
163 transactions => \@acc_trans,
165 my $datev2 = SL::DATEV->new(
167 trans_id => $gl_transaction->id,
170 $datev2->from($startdate);
171 $datev2->to($enddate);
172 $datev2->generate_datev_data;
173 $datev2->generate_datev_lines;
175 my ($datev_ref3, $warnings_ref3) = SL::DATEV::CSV->new(datev_lines => $datev2->generate_datev_lines,
178 locked => $datev2->locked,
181 my @data_csv = splice @{ $datev_ref3 }, 2, 5;
182 @data_csv = sort { $a->[0] cmp $b->[0] } @data_csv;
183 cmp_deeply($data_csv[0], [ 100, 'H', 'EUR', '', '', '', '4660', '1000', 9, '1703', 'Reise März 2',
184 '', '', '', '', '', '', '', '', '', '', '',
185 '', '', '', '', '', '', '', '', '', '', '', '', '',
186 '', '', '', '', '', '', '', '', '', '', '',
187 '', '', '', '', '', '', '', '', '', '', '', '', '',
188 '', '', '', '', '', '', '', '', '', '', '', '', '',
189 '', '', '', '', '', '', '', '', '', '', '', '', '',
190 '', '', '', '', '', '', '', '', '', '', '', '', '',
191 '', '', '', '', '', '', '', '', '', '', '', '', '',
200 SL::DB::Manager::AccTransaction->delete_all( all => 1);
201 SL::DB::Manager::GLTransaction->delete_all( all => 1);
202 SL::DB::Manager::InvoiceItem->delete_all( all => 1);
203 SL::DB::Manager::Invoice->delete_all( all => 1);
204 SL::DB::Manager::Customer->delete_all( all => 1);
205 SL::DB::Manager::Part->delete_all( all => 1);
206 SL::DB::Manager::Project->delete_all( all => 1);
207 SL::DB::Manager::Department->delete_all( all => 1);
208 SL::DATEV->clean_temporary_directories;