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 $ustid = 'DE123456788';
27 my $buchungsgruppe7 = SL::DB::Manager::Buchungsgruppe->find_by(description => 'Standard 7%') || die "No accounting group for 7\%";
28 my $date = DateTime->new(year => 2017, month => 7, day => 19);
29 my $department = create_department(description => 'Kästchenweiße heiße Preise');
30 my $project = create_project(projectnumber => 2017, description => '299');
31 my $customer = new_customer(name => 'Test customer', ustid => $ustid)->save();
32 my $part1 = new_part(partnumber => '19', description => 'Part 19%')->save;
35 description => 'Part 7%',
36 buchungsgruppen_id => $buchungsgruppe7->id,
39 my $invoice = create_sales_invoice(
45 invoiceitems => [ create_invoice_item(part => $part1, qty => 3, sellprice => 550),
46 create_invoice_item(part => $part2, qty => 10, sellprice => 50),
48 department_id => $department->id,
49 globalproject_id => $project->id,
50 customer_id => $customer->id,
54 # generate_datev_* doesnt care about encoding but
55 # csv_buchungsexport does! all arabic will be deleted
56 # and no string will be left as invnumber
58 my $datev1 = SL::DATEV->new(
60 trans_id => $invoice->id,
63 my $startdate = DateTime->new(year => 2017, month => 1, day => 1);
64 my $enddate = DateTime->new(year => 2017, month => 12, day => 31);
65 my $today = DateTime->new(year => 2017, month => 3, day => 17);
68 $datev1->from($startdate);
69 $datev1->to($enddate);
71 $datev1->generate_datev_data;
72 $datev1->generate_datev_lines;
74 # check conversion to csv
75 $datev1->from($startdate);
76 $datev1->to($enddate);
77 my ($datev_csv, $die_message);
79 $datev_csv = SL::DATEV::CSV->new(datev_lines => $datev1->generate_datev_lines,
82 locked => $datev1->locked,
84 my $lines_aref = $datev_csv->lines; # dies only if we assign (do stuff with the data)
89 ok($die_message =~ m/Falscher Feldwert 'ݗݘݰݶ' für Feld 'belegfeld1' bei der Transaktion mit dem Umsatz von/, 'wrong_encoding');
92 $invoice->invnumber('ݗݘݰݶmuh');
95 my $datev3 = SL::DATEV->new(
97 trans_id => $invoice->id,
100 $datev3->from($startdate);
101 $datev3->to($enddate);
102 $datev3->generate_datev_data;
103 $datev3->generate_datev_lines;
104 my ($datev_csv2, $die_message2);
106 $datev_csv2 = SL::DATEV::CSV->new(datev_lines => $datev3->generate_datev_lines,
109 locked => $datev3->locked,
111 my $lines_aref = $datev_csv2->lines; # dies only if we assign (do stuff with the data)
118 # redefine invnumber, we have mixed encodings, should still fail
119 ok($die_message2 =~ m/Falscher Feldwert 'ݗݘݰݶmuh' für Feld 'belegfeld1' bei der Transaktion mit dem Umsatz von/, 'mixed_wrong_encoding');
121 # check with good number
122 $invoice->invnumber('meine muh');
125 my $datev4 = SL::DATEV->new(
127 trans_id => $invoice->id,
130 $datev4->from($startdate);
131 $datev4->to($enddate);
132 $datev4->generate_datev_data;
133 $datev4->generate_datev_lines;
135 my ($datev_csv4, $die_message3, $lines_aref);
137 $datev_csv4 = SL::DATEV::CSV->new(datev_lines => $datev4->generate_datev_lines,
140 locked => $datev4->locked,
142 $lines_aref = $datev_csv4->lines; # dies only if we assign (do stuff with the data)
148 ok(!($die_message3), 'no die message');
149 ok(scalar @{ $datev_csv4->warnings } == 0, 'no warnings');
151 my @sorted = sort { $a->[0] cmp $b->[0] } @{ $lines_aref };
152 cmp_deeply $sorted[0], [ '1963,5', 'S', 'EUR', '', '', '',
153 '1400', '8400', '', '1907', 'meine muh',
154 '', '', 'Test customer', '', '', '', '', '', '',
155 '', '', '', '', '', '', '', '', '',
156 '', '', '', '', '', '', '', "K\x{e4}stchen",
157 '299', '', $ustid, '', '', '',
158 '', '', '', '', '', '', '', '', '',
159 '', '', '', '', '', '', '', '', '',
160 '', '', '', '', '', '', '', '', '',
161 '', '', '', '', '', '', '', '', '',
162 '', '', '', '', '', '', '', '', '',
163 '', '', '', '', '', '', '', '', '',
164 '', '', '', '', '', '', '', '', '',
165 '', '', '', '', '', '', '', '1', '',
168 cmp_deeply $sorted[1], [ '535', 'S', 'EUR', '', '', '',
169 '1400', '8300', '', '1907','meine muh',
170 '', '', 'Test customer', '', '', '', '', '', '',
171 '', '', '', '', '', '', '', '', '',
172 '', '', '', '', '', '', '', "K\x{e4}stchen",
173 '299', '', $ustid, '', '', '',
174 '', '', '', '', '', '', '', '', '',
175 '', '', '', '', '', '', '', '', '',
176 '', '', '', '', '', '', '', '', '',
177 '', '', '', '', '', '', '', '', '',
178 '', '', '', '', '', '', '', '', '',
179 '', '', '', '', '', '', '', '', '',
180 '', '', '', '', '', '', '', '', '',
181 '', '', '', '', '', '', '', '1', '',
184 # create one haben buchung with GLTransaction today
186 my $expense_chart = SL::DB::Manager::Chart->find_by(accno => '4660'); # Reisekosten
187 my $cash_chart = SL::DB::Manager::Chart->find_by(accno => '1000'); # Kasse
189 my $gl_transaction = create_gl_transaction(
190 reference => "Reise März 2018",
191 description => "Reisekonsten März 2018 / Ma Schmidt",
197 chart => $expense_chart,
199 debit => 100, # net 84.03
202 chart => $cash_chart,
209 my $datev2 = SL::DATEV->new(
211 trans_id => $gl_transaction->id,
214 $datev2->from($startdate);
215 $datev2->to($enddate);
216 $datev2->generate_datev_data;
218 my $datev_csv3 = SL::DATEV::CSV->new(datev_lines => $datev2->generate_datev_lines,
221 locked => $datev2->locked,
224 my @data_csv = sort { $a->[0] cmp $b->[0] } @{ $datev_csv3->lines };
225 cmp_deeply($data_csv[0], [ '100', 'S', 'EUR', '', '', '', '4660', '1000', 9, '1703', 'Reise März 2',
226 '', '', 'Reisekonsten März 2018 / Ma Schmidt', '', '', '', '', '', '', '', '',
227 '', '', '', '', '', '', '', '', '', '', '', '', '',
228 '', '', '', '', '', '', '', '', '', '', '',
229 '', '', '', '', '', '', '', '', '', '', '', '', '',
230 '', '', '', '', '', '', '', '', '', '', '', '', '',
231 '', '', '', '', '', '', '', '', '', '', '', '', '',
232 '', '', '', '', '', '', '', '', '', '', '', '', '',
233 '', '', '', '', '', '', '', '', '', '', '', '', '',
234 '', '', '1', '', '', '', '', '', '', ]
237 # TODO warnings are not yet tested
238 # currently most of the valid_checks are senseless because of
239 # the strict input_checks before. Maybe something like encoding mismatch of invnumber,
240 # can be altered to just a warning (not a mandantory field!)
247 SL::DB::Manager::AccTransaction->delete_all( all => 1);
248 SL::DB::Manager::GLTransaction->delete_all( all => 1);
249 SL::DB::Manager::InvoiceItem->delete_all( all => 1);
250 SL::DB::Manager::Invoice->delete_all( all => 1);
251 SL::DB::Manager::Customer->delete_all( all => 1);
252 SL::DB::Manager::Part->delete_all( all => 1);
253 SL::DB::Manager::Project->delete_all( all => 1);
254 SL::DB::Manager::Department->delete_all( all => 1);
255 SL::DATEV->clean_temporary_directories;