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