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