Consolidation and extended test runs
[kivitendo-erp.git] / t / controllers / financial_controlling / sales_order_with_periodic_invoices_config.t
1 package DateTime;
2
3 use SL::Helper::DateTime;
4
5 no warnings 'redefine';
6
7 sub now_local {
8   return shift->new(time_zone => $::locale->get_local_time_zone, year => 2014, month => 3, day => 15, hour => 12, minute => 23, second => 34);
9 }
10
11 sub today_local {
12   return shift->now_local->truncate(to => 'day');
13 }
14
15 package main;
16
17 use Test::More; # tests => 49;
18
19 use lib 't';
20 use strict;
21 use utf8;
22
23 use Carp;
24 use Support::TestSetup;
25
26 use_ok 'SL::BackgroundJob::CreatePeriodicInvoices';
27 use_ok 'SL::Controller::FinancialControllingReport';
28 use_ok 'SL::DB::Chart';
29 use_ok 'SL::DB::Customer';
30 use_ok 'SL::DB::Default';
31 use_ok 'SL::DB::Invoice';
32 use_ok 'SL::DB::Order';
33 use_ok 'SL::DB::Part';
34 use_ok 'SL::DB::TaxZone';
35
36 Support::TestSetup::login();
37
38 our ($ar_chart, $buchungsgruppe, $ctrl, $currency_id, $customer, $employee, $order, $part, $tax_zone, $unit, @invoices);
39
40 sub init_common_state {
41   if ($::lx_office_conf{system}->{default_manager} eq "swiss") {
42     $ar_chart       = SL::DB::Manager::Chart->find_by(accno => '3200')                        || croak "No AR chart";
43     $buchungsgruppe = SL::DB::Manager::Buchungsgruppe->find_by(description => 'Standard 8%')  || croak "No accounting group";
44     $currency_id    = SL::DB::Default->get->currency_id;
45     $employee       = SL::DB::Manager::Employee->current                                      || croak "No employee";
46     $tax_zone       = SL::DB::Manager::TaxZone->find_by( description => 'Schweiz')            || croak "No taxzone";
47     $unit           = SL::DB::Manager::Unit->find_by(name => 'pauschal')                      || croak "No unit";
48   } else {
49     $ar_chart       = SL::DB::Manager::Chart->find_by(accno => '1400')                        || croak "No AR chart";
50     $buchungsgruppe = SL::DB::Manager::Buchungsgruppe->find_by(description => 'Standard 19%') || croak "No accounting group";
51     $currency_id    = SL::DB::Default->get->currency_id;
52     $employee       = SL::DB::Manager::Employee->current                                      || croak "No employee";
53     $tax_zone       = SL::DB::Manager::TaxZone->find_by( description => 'Inland')             || croak "No taxzone";
54     $unit           = SL::DB::Manager::Unit->find_by(name => 'psch')                          || croak "No unit";
55   }
56 }
57
58 sub create_sales_order {
59   my %params = @_;
60
61   $params{$_} ||= {} for qw(customer part tax order orderitem);
62
63   # Clean up: remove invoices, orders, parts and customers
64   "SL::DB::Manager::${_}"->delete_all(all => 1) for qw(InvoiceItem Invoice OrderItem Order Customer Part);
65
66   $customer     = SL::DB::Customer->new(
67     name        => 'Test Customer',
68     currency_id => $currency_id,
69     taxzone_id  => $tax_zone->id,
70     %{ $params{customer} }
71   )->save;
72
73   $part = SL::DB::Part->new(
74     partnumber         => 'T4254',
75     description        => 'Fourty-two fifty-four',
76     lastcost           => 222.22,
77     sellprice          => 333.33,
78     buchungsgruppen_id => $buchungsgruppe->id,
79     unit               => $unit->name,
80     %{ $params{part} }
81   )->save;
82   $part->load;
83
84   $order                     = SL::DB::Order->new(
85     customer_id              => $customer->id,
86     currency_id              => $currency_id,
87     taxzone_id               => $tax_zone->id,
88     transaction_description  => '<%period_start_date%>',
89     transdate                => DateTime->from_kivitendo('01.03.2014'),
90     orderitems               => [
91       { parts_id             => $part->id,
92         description          => $part->description,
93         lastcost             => $part->lastcost,
94         sellprice            => $part->sellprice,
95         qty                  => 1,
96         unit                 => $unit->name,
97         %{ $params{orderitem} },
98       },
99     ],
100     periodic_invoices_config => $params{periodic_invoices_config} ? {
101       active                 => 1,
102       ar_chart_id            => $ar_chart->id,
103       %{ $params{periodic_invoices_config} },
104     } : undef,
105     %{ $params{order} },
106   );
107
108   $order->calculate_prices_and_taxes;
109
110   ok($order->save(cascade => 1));
111
112   $::form = Form->new('');
113   $ctrl   = SL::Controller::FinancialControllingReport->new;
114
115   $ctrl->orders($ctrl->models->get);
116   $ctrl->calculate_data;
117 }
118
119 my @columns = qw(net_amount         other_amount
120                  delivered_amount   billed_amount   paid_amount   billable_amount
121                  delivered_amount_p billed_amount_p paid_amount_p billable_amount_p);
122
123 sub run_tests {
124   my ($msg, $num_orders, $values, %order_params) = @_;
125
126   create_sales_order(%order_params);
127
128   is($num_orders, scalar @{ $ctrl->orders }, "${msg}, #orders");
129   is_deeply([ map { ($ctrl->orders->[0]->{$_} // 0) * 1 } @columns ],
130             $values,
131             "${msg}, values");
132 }
133
134 init_common_state();
135
136 # ----------------------------------------------------------------------
137 # An order without periodic invoices:
138 run_tests("no periodic conf", 1, [ 333.33, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]);
139
140 # ----------------------------------------------------------------------
141 # order_value_periodicity=y, periodicity=q
142
143 run_tests(
144   "periodic conf p=q ovp=y, starting in previous year", 1,
145   [ 333.33, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
146   periodic_invoices_config  => {
147     periodicity             => 'q',
148     order_value_periodicity => 'y',
149     start_date              => DateTime->from_kivitendo('01.05.2013'),
150   });
151
152 run_tests(
153   "periodic conf p=q ovp=y, starting and ending in previous year", 1,
154   [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
155   periodic_invoices_config  => {
156     periodicity             => 'q',
157     order_value_periodicity => 'y',
158     terminated              => 1,
159     start_date              => DateTime->from_kivitendo('01.05.2013'),
160     end_date                => DateTime->from_kivitendo('01.12.2013'),
161   });
162
163 run_tests(
164   "periodic conf p=q ovp=y, starting in next year", 1,
165   [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
166   periodic_invoices_config  => {
167     periodicity             => 'q',
168     order_value_periodicity => 'y',
169     start_date              => DateTime->from_kivitendo('01.01.2015'),
170   });
171
172 run_tests(
173   "periodic conf p=q ovp=y, starting January 1st of current year", 1,
174   [ 333.33, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
175   periodic_invoices_config  => {
176     periodicity             => 'q',
177     order_value_periodicity => 'y',
178     start_date              => DateTime->from_kivitendo('01.01.2014'),
179   });
180
181 run_tests(
182   "periodic conf p=q ovp=y, starting July 1st of current year", 1,
183   [ 166.665, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
184   periodic_invoices_config  => {
185     periodicity             => 'q',
186     order_value_periodicity => 'y',
187     start_date              => DateTime->from_kivitendo('01.07.2014'),
188   });
189
190 run_tests(
191   "periodic conf p=q ovp=y, starting May 1st of current year", 1,
192   [ 249.9975, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
193   periodic_invoices_config  => {
194     periodicity             => 'q',
195     order_value_periodicity => 'y',
196     start_date              => DateTime->from_kivitendo('01.05.2014'),
197   });
198
199 run_tests(
200   "periodic conf p=q ovp=y, starting January 1st of current year, ending June 30", 1,
201   [ 166.665, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
202   periodic_invoices_config  => {
203     periodicity             => 'q',
204     order_value_periodicity => 'y',
205     start_date              => DateTime->from_kivitendo('01.01.2014'),
206     end_date                => DateTime->from_kivitendo('30.06.2014'),
207     terminated              => 1,
208   });
209
210 run_tests(
211   "periodic conf p=q ovp=y, starting July 1st of current year, ending November 30", 1,
212   [ 166.665, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
213   periodic_invoices_config  => {
214     periodicity             => 'q',
215     order_value_periodicity => 'y',
216     start_date              => DateTime->from_kivitendo('01.07.2014'),
217     end_date                => DateTime->from_kivitendo('30.11.2014'),
218     terminated              => 1,
219   });
220
221 run_tests(
222   "periodic conf p=q ovp=y, starting May 1st of current year, ending next year", 1,
223   [ 249.9975, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
224   periodic_invoices_config  => {
225     periodicity             => 'q',
226     order_value_periodicity => 'y',
227     start_date              => DateTime->from_kivitendo('01.05.2014'),
228     end_date                => DateTime->from_kivitendo('30.06.2015'),
229     terminated              => 1,
230   });
231
232 run_tests(
233   "periodic conf p=q ovp=y, starting November 1 in previous year, ending April 30", 1,
234   [ 83.3325, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
235   periodic_invoices_config  => {
236     periodicity             => 'q',
237     order_value_periodicity => 'y',
238     terminated              => 1,
239     start_date              => DateTime->from_kivitendo('01.11.2013'),
240     end_date                => DateTime->from_kivitendo('30.04.2014'),
241   });
242
243
244 # ----------------------------------------------------------------------
245 # order_value_periodicity=y, periodicity=m
246
247 run_tests(
248   "periodic conf p=m ovp=y, starting in previous year", 1,
249   [ 333.33, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
250   periodic_invoices_config  => {
251     periodicity             => 'm',
252     order_value_periodicity => 'y',
253     start_date              => DateTime->from_kivitendo('01.05.2013'),
254   });
255
256 run_tests(
257   "periodic conf p=m ovp=y, starting and ending in previous year", 1,
258   [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
259   periodic_invoices_config  => {
260     periodicity             => 'm',
261     order_value_periodicity => 'y',
262     terminated              => 1,
263     start_date              => DateTime->from_kivitendo('01.05.2013'),
264     end_date                => DateTime->from_kivitendo('01.12.2013'),
265   });
266
267 run_tests(
268   "periodic conf p=m ovp=y, starting in next year", 1,
269   [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
270   periodic_invoices_config  => {
271     periodicity             => 'm',
272     order_value_periodicity => 'y',
273     start_date              => DateTime->from_kivitendo('01.01.2015'),
274   });
275
276 run_tests(
277   "periodic conf p=m ovp=y, starting January 1st of current year", 1,
278   [ 333.33, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
279   periodic_invoices_config  => {
280     periodicity             => 'm',
281     order_value_periodicity => 'y',
282     start_date              => DateTime->from_kivitendo('01.01.2014'),
283   });
284
285 run_tests(
286   "periodic conf p=m ovp=y, starting July 1st of current year", 1,
287   [ 166.665, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
288   periodic_invoices_config  => {
289     periodicity             => 'm',
290     order_value_periodicity => 'y',
291     start_date              => DateTime->from_kivitendo('01.07.2014'),
292   });
293
294 run_tests(
295   "periodic conf p=m ovp=y, starting May 1st of current year", 1,
296   [ 222.22, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
297   periodic_invoices_config  => {
298     periodicity             => 'm',
299     order_value_periodicity => 'y',
300     start_date              => DateTime->from_kivitendo('01.05.2014'),
301   });
302
303 run_tests(
304   "periodic conf p=m ovp=y, starting January 1st of current year, ending June 30", 1,
305   [ 166.665, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
306   periodic_invoices_config  => {
307     periodicity             => 'm',
308     order_value_periodicity => 'y',
309     start_date              => DateTime->from_kivitendo('01.01.2014'),
310     end_date                => DateTime->from_kivitendo('30.06.2014'),
311     terminated              => 1,
312   });
313
314 run_tests(
315   "periodic conf p=m ovp=y, starting July 1st of current year, ending November 30", 1,
316   [ 138.8875, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
317   periodic_invoices_config  => {
318     periodicity             => 'm',
319     order_value_periodicity => 'y',
320     start_date              => DateTime->from_kivitendo('01.07.2014'),
321     end_date                => DateTime->from_kivitendo('30.11.2014'),
322     terminated              => 1,
323   });
324
325 run_tests(
326   "periodic conf p=m ovp=y, starting May 1st of current year, ending next year", 1,
327   [ 222.22, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
328   periodic_invoices_config  => {
329     periodicity             => 'm',
330     order_value_periodicity => 'y',
331     start_date              => DateTime->from_kivitendo('01.05.2014'),
332     end_date                => DateTime->from_kivitendo('30.06.2015'),
333     terminated              => 1,
334   });
335
336 run_tests(
337   "periodic conf p=m ovp=y, starting November 1 in previous year, ending April 30", 1,
338   [ 111.11, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
339   periodic_invoices_config  => {
340     periodicity             => 'm',
341     order_value_periodicity => 'y',
342     terminated              => 1,
343     start_date              => DateTime->from_kivitendo('01.11.2013'),
344     end_date                => DateTime->from_kivitendo('30.04.2014'),
345   });
346
347
348 # ----------------------------------------------------------------------
349 # order_value_periodicity=y, periodicity=q
350
351 run_tests(
352   "periodic conf p=q ovp=2, starting in previous year", 1,
353   [ 166.665, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
354   periodic_invoices_config  => {
355     periodicity             => 'q',
356     order_value_periodicity => '2',
357     start_date              => DateTime->from_kivitendo('01.05.2013'),
358   });
359
360 run_tests(
361   "periodic conf p=q ovp=2, starting and ending in previous year", 1,
362   [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
363   periodic_invoices_config  => {
364     periodicity             => 'q',
365     order_value_periodicity => '2',
366     terminated              => 1,
367     start_date              => DateTime->from_kivitendo('01.05.2013'),
368     end_date                => DateTime->from_kivitendo('01.12.2013'),
369   });
370
371 run_tests(
372   "periodic conf p=q ovp=2, starting in next year", 1,
373   [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
374   periodic_invoices_config  => {
375     periodicity             => 'q',
376     order_value_periodicity => '2',
377     start_date              => DateTime->from_kivitendo('01.01.2015'),
378   });
379
380 run_tests(
381   "periodic conf p=q ovp=2, starting January 1st of current year", 1,
382   [ 166.665, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
383   periodic_invoices_config  => {
384     periodicity             => 'q',
385     order_value_periodicity => '2',
386     start_date              => DateTime->from_kivitendo('01.01.2014'),
387   });
388
389 run_tests(
390   "periodic conf p=q ovp=2, starting July 1st of current year", 1,
391   [ 83.3325, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
392   periodic_invoices_config  => {
393     periodicity             => 'q',
394     order_value_periodicity => '2',
395     start_date              => DateTime->from_kivitendo('01.07.2014'),
396   });
397
398 run_tests(
399   "periodic conf p=q ovp=2, starting May 1st of current year", 1,
400   [ 124.99875, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
401   periodic_invoices_config  => {
402     periodicity             => 'q',
403     order_value_periodicity => '2',
404     start_date              => DateTime->from_kivitendo('01.05.2014'),
405   });
406
407 run_tests(
408   "periodic conf p=q ovp=2, starting January 1st of current year, ending June 30", 1,
409   [ 83.3325, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
410   periodic_invoices_config  => {
411     periodicity             => 'q',
412     order_value_periodicity => '2',
413     start_date              => DateTime->from_kivitendo('01.01.2014'),
414     end_date                => DateTime->from_kivitendo('30.06.2014'),
415     terminated              => 1,
416   });
417
418 run_tests(
419   "periodic conf p=q ovp=2, starting July 1st of current year, ending November 30", 1,
420   [ 83.3325, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
421   periodic_invoices_config  => {
422     periodicity             => 'q',
423     order_value_periodicity => '2',
424     start_date              => DateTime->from_kivitendo('01.07.2014'),
425     end_date                => DateTime->from_kivitendo('30.11.2014'),
426     terminated              => 1,
427   });
428
429 run_tests(
430   "periodic conf p=q ovp=2, starting May 1st of current year, ending next year", 1,
431   [ 124.99875, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
432   periodic_invoices_config  => {
433     periodicity             => 'q',
434     order_value_periodicity => '2',
435     start_date              => DateTime->from_kivitendo('01.05.2014'),
436     end_date                => DateTime->from_kivitendo('30.06.2015'),
437     terminated              => 1,
438   });
439
440 run_tests(
441   "periodic conf p=q ovp=2, starting November 1 in previous year, ending April 30", 1,
442   [ 41.66625, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
443   periodic_invoices_config  => {
444     periodicity             => 'q',
445     order_value_periodicity => '2',
446     terminated              => 1,
447     start_date              => DateTime->from_kivitendo('01.11.2013'),
448     end_date                => DateTime->from_kivitendo('30.04.2014'),
449   });
450
451
452
453 # ----------------------------------------------------------------------
454 # order_value_periodicity=m, periodicity=b
455
456 run_tests(
457   "periodic conf p=b ovp=m, starting in previous year", 1,
458   [ 3999.96, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
459   periodic_invoices_config  => {
460     periodicity             => 'b',
461     order_value_periodicity => 'm',
462     start_date              => DateTime->from_kivitendo('01.05.2013'),
463   });
464
465 run_tests(
466   "periodic conf p=b ovp=m, starting and ending in previous year", 1,
467   [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
468   periodic_invoices_config  => {
469     periodicity             => 'b',
470     order_value_periodicity => 'm',
471     terminated              => 1,
472     start_date              => DateTime->from_kivitendo('01.05.2013'),
473     end_date                => DateTime->from_kivitendo('01.12.2013'),
474   });
475
476 run_tests(
477   "periodic conf p=b ovp=m, starting in next year", 1,
478   [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
479   periodic_invoices_config  => {
480     periodicity             => 'b',
481     order_value_periodicity => 'm',
482     start_date              => DateTime->from_kivitendo('01.01.2015'),
483   });
484
485 run_tests(
486   "periodic conf p=b ovp=m, starting January 1st of current year", 1,
487   [ 3999.96, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
488   periodic_invoices_config  => {
489     periodicity             => 'b',
490     order_value_periodicity => 'm',
491     start_date              => DateTime->from_kivitendo('01.01.2014'),
492   });
493
494 run_tests(
495   "periodic conf p=b ovp=m, starting July 1st of current year", 1,
496   [ 1999.98, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
497   periodic_invoices_config  => {
498     periodicity             => 'b',
499     order_value_periodicity => 'm',
500     start_date              => DateTime->from_kivitendo('01.07.2014'),
501   });
502
503 run_tests(
504   "periodic conf p=b ovp=m, starting May 1st of current year", 1,
505   [ 3999.96, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
506   periodic_invoices_config  => {
507     periodicity             => 'b',
508     order_value_periodicity => 'm',
509     start_date              => DateTime->from_kivitendo('01.05.2014'),
510   });
511
512 run_tests(
513   "periodic conf p=b ovp=m, starting January 1st of current year, ending June 30", 1,
514   [ 1999.98, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
515   periodic_invoices_config  => {
516     periodicity             => 'b',
517     order_value_periodicity => 'm',
518     start_date              => DateTime->from_kivitendo('01.01.2014'),
519     end_date                => DateTime->from_kivitendo('30.06.2014'),
520     terminated              => 1,
521   });
522
523 run_tests(
524   "periodic conf p=b ovp=m, starting July 1st of current year, ending November 30", 1,
525   [ 1999.98, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
526   periodic_invoices_config  => {
527     periodicity             => 'b',
528     order_value_periodicity => 'm',
529     start_date              => DateTime->from_kivitendo('01.07.2014'),
530     end_date                => DateTime->from_kivitendo('30.11.2014'),
531     terminated              => 1,
532   });
533
534 run_tests(
535   "periodic conf p=b ovp=m, starting May 1st of current year, ending next year", 1,
536   [ 3999.96, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
537   periodic_invoices_config  => {
538     periodicity             => 'b',
539     order_value_periodicity => 'm',
540     start_date              => DateTime->from_kivitendo('01.05.2014'),
541     end_date                => DateTime->from_kivitendo('30.06.2015'),
542     terminated              => 1,
543   });
544
545 run_tests(
546   "periodic conf p=b ovp=m, starting November 1 in previous year, ending April 30", 1,
547   [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
548   periodic_invoices_config  => {
549     periodicity             => 'b',
550     order_value_periodicity => 'm',
551     terminated              => 1,
552     start_date              => DateTime->from_kivitendo('01.11.2013'),
553     end_date                => DateTime->from_kivitendo('30.04.2014'),
554   });
555
556
557 done_testing();