3 use SL::Helper::DateTime;
5 no warnings 'redefine';
8 return shift->new(time_zone => $::locale->get_local_time_zone, year => 2014, month => 3, day => 15, hour => 12, minute => 23, second => 34);
12 return shift->now_local->truncate(to => 'day');
17 use Test::More; # tests => 49;
24 use Support::TestSetup;
25 use SL::Dev::ALL qw(:ALL);
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';
37 Support::TestSetup::login();
39 our ($ar_chart, $ctrl, $customer, $order, $part, $unit, @invoices);
42 "SL::DB::Manager::${_}"->delete_all(all => 1) for qw(InvoiceItem Invoice OrderItem Order Customer Part);
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";
50 sub make_sales_order {
55 $params{$_} ||= {} for qw(customer part order orderitem);
57 $customer = new_customer(
58 name => 'Test Customer',
59 %{ $params{customer} }
63 partnumber => 'T4254',
64 description => 'Fourty-two fifty-four',
72 $order = create_sales_order(
74 customer => $customer,
75 transaction_description => '<%period_start_date%>',
76 transdate => DateTime->from_kivitendo('01.03.2014'),
81 %{ $params{orderitem} },
84 periodic_invoices_config => $params{periodic_invoices_config} ? {
86 ar_chart_id => $ar_chart->id,
87 %{ $params{periodic_invoices_config} },
92 $::form = Support::TestSetup->create_new_form;
93 $ctrl = SL::Controller::FinancialControllingReport->new;
95 $ctrl->orders($ctrl->models->get);
96 $ctrl->calculate_data;
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);
104 my ($msg, $num_orders, $values, %order_params) = @_;
106 make_sales_order(%order_params);
108 is($num_orders, scalar @{ $ctrl->orders }, "${msg}, #orders");
109 is_deeply([ map { ($ctrl->orders->[0]->{$_} // 0) * 1 } @columns ],
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 ]);
120 # ----------------------------------------------------------------------
121 # order_value_periodicity=y, periodicity=q
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 => {
128 order_value_periodicity => 'y',
129 start_date => DateTime->from_kivitendo('01.05.2013'),
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 => {
137 order_value_periodicity => 'y',
139 start_date => DateTime->from_kivitendo('01.05.2013'),
140 end_date => DateTime->from_kivitendo('01.12.2013'),
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 => {
148 order_value_periodicity => 'y',
149 start_date => DateTime->from_kivitendo('01.01.2015'),
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 => {
157 order_value_periodicity => 'y',
158 start_date => DateTime->from_kivitendo('01.01.2014'),
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 => {
166 order_value_periodicity => 'y',
167 start_date => DateTime->from_kivitendo('01.07.2014'),
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 => {
175 order_value_periodicity => 'y',
176 start_date => DateTime->from_kivitendo('01.05.2014'),
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 => {
184 order_value_periodicity => 'y',
185 start_date => DateTime->from_kivitendo('01.01.2014'),
186 end_date => DateTime->from_kivitendo('30.06.2014'),
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 => {
195 order_value_periodicity => 'y',
196 start_date => DateTime->from_kivitendo('01.07.2014'),
197 end_date => DateTime->from_kivitendo('30.11.2014'),
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 => {
206 order_value_periodicity => 'y',
207 start_date => DateTime->from_kivitendo('01.05.2014'),
208 end_date => DateTime->from_kivitendo('30.06.2015'),
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 => {
217 order_value_periodicity => 'y',
219 start_date => DateTime->from_kivitendo('01.11.2013'),
220 end_date => DateTime->from_kivitendo('30.04.2014'),
224 # ----------------------------------------------------------------------
225 # order_value_periodicity=y, periodicity=m
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 => {
232 order_value_periodicity => 'y',
233 start_date => DateTime->from_kivitendo('01.05.2013'),
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 => {
241 order_value_periodicity => 'y',
243 start_date => DateTime->from_kivitendo('01.05.2013'),
244 end_date => DateTime->from_kivitendo('01.12.2013'),
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 => {
252 order_value_periodicity => 'y',
253 start_date => DateTime->from_kivitendo('01.01.2015'),
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 => {
261 order_value_periodicity => 'y',
262 start_date => DateTime->from_kivitendo('01.01.2014'),
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 => {
270 order_value_periodicity => 'y',
271 start_date => DateTime->from_kivitendo('01.07.2014'),
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 => {
279 order_value_periodicity => 'y',
280 start_date => DateTime->from_kivitendo('01.05.2014'),
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 => {
288 order_value_periodicity => 'y',
289 start_date => DateTime->from_kivitendo('01.01.2014'),
290 end_date => DateTime->from_kivitendo('30.06.2014'),
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 => {
299 order_value_periodicity => 'y',
300 start_date => DateTime->from_kivitendo('01.07.2014'),
301 end_date => DateTime->from_kivitendo('30.11.2014'),
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 => {
310 order_value_periodicity => 'y',
311 start_date => DateTime->from_kivitendo('01.05.2014'),
312 end_date => DateTime->from_kivitendo('30.06.2015'),
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 => {
321 order_value_periodicity => 'y',
323 start_date => DateTime->from_kivitendo('01.11.2013'),
324 end_date => DateTime->from_kivitendo('30.04.2014'),
328 # ----------------------------------------------------------------------
329 # order_value_periodicity=y, periodicity=q
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 => {
336 order_value_periodicity => '2',
337 start_date => DateTime->from_kivitendo('01.05.2013'),
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 => {
345 order_value_periodicity => '2',
347 start_date => DateTime->from_kivitendo('01.05.2013'),
348 end_date => DateTime->from_kivitendo('01.12.2013'),
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 => {
356 order_value_periodicity => '2',
357 start_date => DateTime->from_kivitendo('01.01.2015'),
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 => {
365 order_value_periodicity => '2',
366 start_date => DateTime->from_kivitendo('01.01.2014'),
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 => {
374 order_value_periodicity => '2',
375 start_date => DateTime->from_kivitendo('01.07.2014'),
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 => {
383 order_value_periodicity => '2',
384 start_date => DateTime->from_kivitendo('01.05.2014'),
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 => {
392 order_value_periodicity => '2',
393 start_date => DateTime->from_kivitendo('01.01.2014'),
394 end_date => DateTime->from_kivitendo('30.06.2014'),
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 => {
403 order_value_periodicity => '2',
404 start_date => DateTime->from_kivitendo('01.07.2014'),
405 end_date => DateTime->from_kivitendo('30.11.2014'),
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 => {
414 order_value_periodicity => '2',
415 start_date => DateTime->from_kivitendo('01.05.2014'),
416 end_date => DateTime->from_kivitendo('30.06.2015'),
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 => {
425 order_value_periodicity => '2',
427 start_date => DateTime->from_kivitendo('01.11.2013'),
428 end_date => DateTime->from_kivitendo('30.04.2014'),
433 # ----------------------------------------------------------------------
434 # order_value_periodicity=m, periodicity=b
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 => {
441 order_value_periodicity => 'm',
442 start_date => DateTime->from_kivitendo('01.05.2013'),
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 => {
450 order_value_periodicity => 'm',
452 start_date => DateTime->from_kivitendo('01.05.2013'),
453 end_date => DateTime->from_kivitendo('01.12.2013'),
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 => {
461 order_value_periodicity => 'm',
462 start_date => DateTime->from_kivitendo('01.01.2015'),
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 => {
470 order_value_periodicity => 'm',
471 start_date => DateTime->from_kivitendo('01.01.2014'),
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 => {
479 order_value_periodicity => 'm',
480 start_date => DateTime->from_kivitendo('01.07.2014'),
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 => {
488 order_value_periodicity => 'm',
489 start_date => DateTime->from_kivitendo('01.05.2014'),
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 => {
497 order_value_periodicity => 'm',
498 start_date => DateTime->from_kivitendo('01.01.2014'),
499 end_date => DateTime->from_kivitendo('30.06.2014'),
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 => {
508 order_value_periodicity => 'm',
509 start_date => DateTime->from_kivitendo('01.07.2014'),
510 end_date => DateTime->from_kivitendo('30.11.2014'),
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 => {
519 order_value_periodicity => 'm',
520 start_date => DateTime->from_kivitendo('01.05.2014'),
521 end_date => DateTime->from_kivitendo('30.06.2015'),
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 => {
530 order_value_periodicity => 'm',
532 start_date => DateTime->from_kivitendo('01.11.2013'),
533 end_date => DateTime->from_kivitendo('30.04.2014'),