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;
23 my $d = SL::DB::Default->get;
24 $d->update_attributes(datev_export_format => 'cp1252');
26 my $buchungsgruppe7 = SL::DB::Manager::Buchungsgruppe->find_by(description => 'Standard 7%') || die "No accounting group for 7\%";
27 my $date = DateTime->new(year => 2017, month => 7, day => 19);
28 my $department = create_department(description => 'Kästchenweiße heiße Preise');
29 my $project = create_project(projectnumber => 2017, description => '299');
30 my $customer = new_customer(name => 'Test customer', ustid => 'DE12345678')->save();
31 my $part1 = new_part(partnumber => '19', description => 'Part 19%')->save;
34 description => 'Part 7%',
35 buchungsgruppen_id => $buchungsgruppe7->id,
38 my $invoice = create_sales_invoice(
44 invoiceitems => [ create_invoice_item(part => $part1, qty => 3, sellprice => 550),
45 create_invoice_item(part => $part2, qty => 10, sellprice => 50),
47 department_id => $department->id,
48 globalproject_id => $project->id,
49 customer_id => $customer->id,
53 # generate_datev_* doesnt care about encoding but
54 # csv_buchungsexport does! all arabic will be deleted
55 # and no string will be left as invnumber
57 my $datev1 = SL::DATEV->new(
59 trans_id => $invoice->id,
62 my $startdate = DateTime->new(year => 2017, month => 1, day => 1);
63 my $enddate = DateTime->new(year => 2017, month => 12, day => 31);
64 my $today = DateTime->new(year => 2017, month => 3, day => 17);
67 $datev1->from($startdate);
68 $datev1->to($enddate);
70 $datev1->generate_datev_data;
71 $datev1->generate_datev_lines;
73 # check conversion to csv
74 $datev1->from($startdate);
75 $datev1->to($enddate);
76 my ($datev_csv, $die_message);
78 $datev_csv = SL::DATEV::CSV->new(datev_lines => $datev1->generate_datev_lines,
81 locked => $datev1->locked,
83 my $lines_aref = $datev_csv->lines; # dies only if we assign (do stuff with the data)
88 ok($die_message =~ m/Falscher Feldwert 'ݗݘݰݶ' für Feld 'belegfeld1' bei der Transaktion mit dem Umsatz von/, 'wrong_encoding');
91 $invoice->invnumber('ݗݘݰݶmuh');
94 my $datev3 = SL::DATEV->new(
96 trans_id => $invoice->id,
99 $datev3->from($startdate);
100 $datev3->to($enddate);
101 $datev3->generate_datev_data;
102 $datev3->generate_datev_lines;
103 my ($datev_csv2, $die_message2);
105 $datev_csv2 = SL::DATEV::CSV->new(datev_lines => $datev3->generate_datev_lines,
108 locked => $datev3->locked,
110 my $lines_aref = $datev_csv2->lines; # dies only if we assign (do stuff with the data)
117 # redefine invnumber, we have mixed encodings, should still fail
118 ok($die_message2 =~ m/Falscher Feldwert 'ݗݘݰݶmuh' für Feld 'belegfeld1' bei der Transaktion mit dem Umsatz von/, 'mixed_wrong_encoding');
120 # check with good number
121 $invoice->invnumber('meine muh');
124 my $datev4 = SL::DATEV->new(
126 trans_id => $invoice->id,
129 $datev4->from($startdate);
130 $datev4->to($enddate);
131 $datev4->generate_datev_data;
132 $datev4->generate_datev_lines;
133 my ($datev_csv4, $die_message3, $lines_aref);
135 $datev_csv4 = SL::DATEV::CSV->new(datev_lines => $datev4->generate_datev_lines,
138 locked => $datev4->locked,
140 $lines_aref = $datev_csv4->lines; # dies only if we assign (do stuff with the data)
146 ok(!($die_message3), 'no die message');
147 ok(scalar @{ $datev_csv4->warnings } == 0, 'no warnings');
149 my @sorted = sort { $a->[0] cmp $b->[0] } @{ $lines_aref };
150 cmp_deeply $sorted[0], [ '1963,5', 'S', 'EUR', '', '', '',
151 '1400', '8400', '', '1907', 'meine muh',
152 '', '', 'Test customer', '', '', '', '', '', '',
153 '', '', '', '', '', '', '', '', '',
154 '', '', '', '', '', '', '', "K\x{e4}stchen",
155 '299', '','DE12345678', '', '', '',
156 '', '', '', '', '', '', '', '', '',
157 '', '', '', '', '', '', '', '', '',
158 '', '', '', '', '', '', '', '', '',
159 '', '', '', '', '', '', '', '', '',
160 '', '', '', '', '', '', '', '', '',
161 '', '', '', '', '', '', '', '', '',
162 '', '', '', '', '', '', '', '', '',
163 '', '', '', '', '', '', '', '', '',
166 cmp_deeply $sorted[1], [ '535', 'S', 'EUR', '', '', '',
167 '1400', '8300', '', '1907','meine muh',
168 '', '', 'Test customer', '', '', '', '', '', '',
169 '', '', '', '', '', '', '', '', '',
170 '', '', '', '', '', '', '', "K\x{e4}stchen",
171 '299', '','DE12345678', '', '', '',
172 '', '', '', '', '', '', '', '', '',
173 '', '', '', '', '', '', '', '', '',
174 '', '', '', '', '', '', '', '', '',
175 '', '', '', '', '', '', '', '', '',
176 '', '', '', '', '', '', '', '', '',
177 '', '', '', '', '', '', '', '', '',
178 '', '', '', '', '', '', '', '', '',
179 '', '', '', '', '', '', '', '', '',
182 # create one haben buchung with GLTransaction today
184 my $expense_chart = SL::DB::Manager::Chart->find_by(accno => '4660'); # Reisekosten
185 my $cash_chart = SL::DB::Manager::Chart->find_by(accno => '1000'); # Kasse
187 my $gl_transaction = create_gl_transaction(
188 reference => "Reise März 2018",
189 description => "Reisekonsten März 2018 / Ma Schmidt",
195 chart => $expense_chart,
197 debit => 100, # net 84.03
200 chart => $cash_chart,
207 my $datev2 = SL::DATEV->new(
209 trans_id => $gl_transaction->id,
212 $datev2->from($startdate);
213 $datev2->to($enddate);
214 $datev2->generate_datev_data;
216 my $datev_csv3 = SL::DATEV::CSV->new(datev_lines => $datev2->generate_datev_lines,
219 locked => $datev2->locked,
222 my @data_csv = sort { $a->[0] cmp $b->[0] } @{ $datev_csv3->lines };
223 cmp_deeply($data_csv[0], [ '100', 'S', 'EUR', '', '', '', '4660', '1000', 9, '1703', 'Reise März 2',
224 '', '', 'Reisekonsten März 2018 / Ma Schmidt', '', '', '', '', '', '', '', '',
225 '', '', '', '', '', '', '', '', '', '', '', '', '',
226 '', '', '', '', '', '', '', '', '', '', '',
227 '', '', '', '', '', '', '', '', '', '', '', '', '',
228 '', '', '', '', '', '', '', '', '', '', '', '', '',
229 '', '', '', '', '', '', '', '', '', '', '', '', '',
230 '', '', '', '', '', '', '', '', '', '', '', '', '',
231 '', '', '', '', '', '', '', '', '', '', '', '', '',
235 # TODO warnings are not yet tested
236 # currently most of the valid_checks are senseless because of
237 # the strict input_checks before. Maybe something like encoding mismatch of invnumber,
238 # can be altered to just a warning (not a mandantory field!)
245 SL::DB::Manager::AccTransaction->delete_all( all => 1);
246 SL::DB::Manager::GLTransaction->delete_all( all => 1);
247 SL::DB::Manager::InvoiceItem->delete_all( all => 1);
248 SL::DB::Manager::Invoice->delete_all( all => 1);
249 SL::DB::Manager::Customer->delete_all( all => 1);
250 SL::DB::Manager::Part->delete_all( all => 1);
251 SL::DB::Manager::Project->delete_all( all => 1);
252 SL::DB::Manager::Department->delete_all( all => 1);
253 SL::DATEV->clean_temporary_directories;