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