4ab1b8dbc026e1a52a46d10c690e0cc82e67cd6b
[kivitendo-erp.git] / t / datev / datev_format_2018.t
1 use strict;
2 use Test::More;
3 use Test::Deep qw(cmp_deeply);
4
5 use lib 't';
6
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;
12 use SL::DB::Chart;
13 use DateTime;
14 use Data::Dumper;
15 use utf8;
16
17 Support::TestSetup::login();
18
19 my $dbh = SL::DB->client->dbh;
20
21 clear_up();
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');
26
27 my $part1 = new_part(partnumber => '19', description => 'Part 19%')->save;
28 my $part2 = new_part(
29   partnumber         => '7',
30   description        => 'Part 7%',
31   buchungsgruppen_id => $buchungsgruppe7->id,
32 )->save;
33
34 my $invoice = create_sales_invoice(
35   invnumber    => "ݗݘݰݶ",
36   itime        => $date,
37   gldate       => $date,
38   taxincluded  => 0,
39   transdate    => $date,
40   invoiceitems => [ create_invoice_item(part => $part1, qty =>  3, sellprice => 550),
41                     create_invoice_item(part => $part2, qty => 10, sellprice => 50),
42                   ],
43   department_id    => $department->id,
44   globalproject_id => $project->id,
45 );
46
47 # lets make a boom
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
51
52 my $datev1 = SL::DATEV->new(
53   dbh        => $dbh,
54   trans_id   => $invoice->id,
55 );
56
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);
60
61
62 $datev1->from($startdate);
63 $datev1->to($enddate);
64
65 $datev1->generate_datev_data;
66 $datev1->generate_datev_lines;
67
68 # check conversion to csv
69 $datev1->from($startdate);
70 $datev1->to($enddate);
71 my ($datev_ref, $warnings_ref, $die_message);
72 eval {
73   ($datev_ref, $warnings_ref) = SL::DATEV::CSV->new(datev_lines  => $datev1->generate_datev_lines,
74                                                      from         => $startdate,
75                                                      to           => $enddate,
76                                                      locked       => $datev1->locked,
77                                                     );
78   1;
79 } or do {
80   $die_message = $@;
81 };
82
83 ok($die_message =~ m/Falscher Feldwert 'ݗݘݰݶ' für Feld 'belegfeld1' bei der Transaktion mit dem Umsatz von/, 'wrong_encoding');
84
85
86 $invoice->invnumber('ݗݘݰݶmuh');
87 $invoice->save();
88
89 my $datev3 = SL::DATEV->new(
90   dbh        => $dbh,
91   trans_id   => $invoice->id,
92 );
93
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);
99 eval {
100   ($datev_ref2, $warnings_ref2) = SL::DATEV::CSV->new(datev_lines  => $datev3->generate_datev_lines,
101                                                        from         => $startdate,
102                                                        to           => $enddate,
103                                                        locked       => $datev3->locked,
104                                                       );
105   1;
106 } or do {
107   $die_message2 = $@;
108 };
109
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');
112
113 # create one haben buchung with GLTransaction today
114
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";
119
120 my @acc_trans;
121 push(@acc_trans, SL::DB::AccTransaction->new(
122                                       chart_id   => $expense_chart->id,
123                                       chart_link => $expense_chart->link,
124                                       amount     => -84.03,
125                                       transdate  => $today,
126                                       source     => '',
127                                       taxkey     => 9,
128                                       tax_id     => $tax_9->id,
129                                       project_id => $project->id,
130 ));
131 push(@acc_trans, SL::DB::AccTransaction->new(
132                                       chart_id   => $tax_chart->id,
133                                       chart_link => $tax_chart->link,
134                                       amount     => -15.97,
135                                       transdate  => $today,
136                                       source     => '',
137                                       taxkey     => 9,
138                                       tax_id     => $tax_9->id,
139                                       project_id => $project->id,
140 ));
141 push(@acc_trans, SL::DB::AccTransaction->new(
142                                       chart_id   => $cash_chart->id,
143                                       chart_link => $cash_chart->link,
144                                       amount     => 100,
145                                       transdate  => $today,
146                                       source     => '',
147                                       taxkey     => 0,
148                                       tax_id     => 0,
149 ));
150
151 my $gl_transaction = SL::DB::GLTransaction->new(
152   reference      => "Reise März 2018",
153   description    => "Reisekonsten März 2018 / Ma Schmidt",
154   transdate      => $today,
155   gldate         => $today,
156   employee_id    => SL::DB::Manager::Employee->current->id,
157   taxincluded    => 1,
158   type           => undef,
159   ob_transaction => 0,
160   cb_transaction => 0,
161   storno         => 0,
162   storno_id      => undef,
163   transactions   => \@acc_trans,
164 )->save;
165 my $datev2 = SL::DATEV->new(
166   dbh        => $dbh,
167   trans_id   => $gl_transaction->id,
168 );
169
170 $datev2->from($startdate);
171 $datev2->to($enddate);
172 $datev2->generate_datev_data;
173 $datev2->generate_datev_lines;
174
175 my ($datev_ref3, $warnings_ref3) = SL::DATEV::CSV->new(datev_lines  => $datev2->generate_datev_lines,
176                                                        from         => $startdate,
177                                                        to           => $enddate,
178                                                        locked       => $datev2->locked,
179                                                       );
180
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                      '', '', '', '', '', '', '', '', '', '', '', '', '',
192                      '', '', '', '', '' ]
193        );
194
195 done_testing();
196 clear_up();
197
198
199 sub clear_up {
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;
209 };
210
211 1;