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;
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';
36 Support::TestSetup::login();
38 our ($ar_chart, $buchungsgruppe, $ctrl, $currency_id, $customer, $employee, $order, $part, $tax_zone, $unit, @invoices);
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";
49 sub create_sales_order {
52 $params{$_} ||= {} for qw(customer part tax order orderitem);
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);
57 $customer = SL::DB::Customer->new(
58 name => 'Test Customer',
59 currency_id => $currency_id,
60 taxzone_id => $tax_zone->id,
61 %{ $params{customer} }
64 $part = SL::DB::Part->new(
65 partnumber => 'T4254',
66 description => 'Fourty-two fifty-four',
69 buchungsgruppen_id => $buchungsgruppe->id,
75 $order = SL::DB::Order->new(
76 customer_id => $customer->id,
77 currency_id => $currency_id,
78 taxzone_id => $tax_zone->id,
79 transaction_description => '<%period_start_date%>',
80 transdate => DateTime->from_kivitendo('01.03.2014'),
82 { parts_id => $part->id,
83 description => $part->description,
84 lastcost => $part->lastcost,
85 sellprice => $part->sellprice,
88 %{ $params{orderitem} },
91 periodic_invoices_config => $params{periodic_invoices_config} ? {
93 ar_chart_id => $ar_chart->id,
94 %{ $params{periodic_invoices_config} },
99 $order->calculate_prices_and_taxes;
101 ok($order->save(cascade => 1));
103 $::form = Form->new('');
104 $ctrl = SL::Controller::FinancialControllingReport->new;
106 $ctrl->orders($ctrl->models->get);
107 $ctrl->calculate_data;
110 my @columns = qw(net_amount other_amount
111 delivered_amount billed_amount paid_amount billable_amount
112 delivered_amount_p billed_amount_p paid_amount_p billable_amount_p);
115 my ($msg, $num_orders, $values, %order_params) = @_;
117 create_sales_order(%order_params);
119 is($num_orders, scalar @{ $ctrl->orders }, "${msg}, #orders");
120 is_deeply([ map { ($ctrl->orders->[0]->{$_} // 0) * 1 } @columns ],
127 # ----------------------------------------------------------------------
128 # An order without periodic invoices:
129 run_tests("no periodic conf", 1, [ 333.33, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]);
131 # ----------------------------------------------------------------------
132 # order_value_periodicity=y, periodicity=q
135 "periodic conf p=q ovp=y, starting in previous year", 1,
136 [ 333.33, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
137 periodic_invoices_config => {
139 order_value_periodicity => 'y',
140 start_date => DateTime->from_kivitendo('01.05.2013'),
144 "periodic conf p=q ovp=y, starting and ending in previous year", 1,
145 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
146 periodic_invoices_config => {
148 order_value_periodicity => 'y',
150 start_date => DateTime->from_kivitendo('01.05.2013'),
151 end_date => DateTime->from_kivitendo('01.12.2013'),
155 "periodic conf p=q ovp=y, starting in next year", 1,
156 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
157 periodic_invoices_config => {
159 order_value_periodicity => 'y',
160 start_date => DateTime->from_kivitendo('01.01.2015'),
164 "periodic conf p=q ovp=y, starting January 1st of current year", 1,
165 [ 333.33, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
166 periodic_invoices_config => {
168 order_value_periodicity => 'y',
169 start_date => DateTime->from_kivitendo('01.01.2014'),
173 "periodic conf p=q ovp=y, starting July 1st of current year", 1,
174 [ 166.665, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
175 periodic_invoices_config => {
177 order_value_periodicity => 'y',
178 start_date => DateTime->from_kivitendo('01.07.2014'),
182 "periodic conf p=q ovp=y, starting May 1st of current year", 1,
183 [ 249.9975, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
184 periodic_invoices_config => {
186 order_value_periodicity => 'y',
187 start_date => DateTime->from_kivitendo('01.05.2014'),
191 "periodic conf p=q ovp=y, starting January 1st of current year, ending June 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.01.2014'),
197 end_date => DateTime->from_kivitendo('30.06.2014'),
202 "periodic conf p=q ovp=y, starting July 1st of current year, ending November 30", 1,
203 [ 166.665, 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.07.2014'),
208 end_date => DateTime->from_kivitendo('30.11.2014'),
213 "periodic conf p=q ovp=y, starting May 1st of current year, ending next year", 1,
214 [ 249.9975, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
215 periodic_invoices_config => {
217 order_value_periodicity => 'y',
218 start_date => DateTime->from_kivitendo('01.05.2014'),
219 end_date => DateTime->from_kivitendo('30.06.2015'),
224 "periodic conf p=q ovp=y, starting November 1 in previous year, ending April 30", 1,
225 [ 83.3325, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
226 periodic_invoices_config => {
228 order_value_periodicity => 'y',
230 start_date => DateTime->from_kivitendo('01.11.2013'),
231 end_date => DateTime->from_kivitendo('30.04.2014'),
235 # ----------------------------------------------------------------------
236 # order_value_periodicity=y, periodicity=m
239 "periodic conf p=m ovp=y, starting in previous year", 1,
240 [ 333.33, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
241 periodic_invoices_config => {
243 order_value_periodicity => 'y',
244 start_date => DateTime->from_kivitendo('01.05.2013'),
248 "periodic conf p=m ovp=y, starting and ending in previous year", 1,
249 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
250 periodic_invoices_config => {
252 order_value_periodicity => 'y',
254 start_date => DateTime->from_kivitendo('01.05.2013'),
255 end_date => DateTime->from_kivitendo('01.12.2013'),
259 "periodic conf p=m ovp=y, starting in next year", 1,
260 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
261 periodic_invoices_config => {
263 order_value_periodicity => 'y',
264 start_date => DateTime->from_kivitendo('01.01.2015'),
268 "periodic conf p=m ovp=y, starting January 1st of current year", 1,
269 [ 333.33, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
270 periodic_invoices_config => {
272 order_value_periodicity => 'y',
273 start_date => DateTime->from_kivitendo('01.01.2014'),
277 "periodic conf p=m ovp=y, starting July 1st of current year", 1,
278 [ 166.665, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
279 periodic_invoices_config => {
281 order_value_periodicity => 'y',
282 start_date => DateTime->from_kivitendo('01.07.2014'),
286 "periodic conf p=m ovp=y, starting May 1st of current year", 1,
287 [ 222.22, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
288 periodic_invoices_config => {
290 order_value_periodicity => 'y',
291 start_date => DateTime->from_kivitendo('01.05.2014'),
295 "periodic conf p=m ovp=y, starting January 1st of current year, ending June 30", 1,
296 [ 166.665, 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.01.2014'),
301 end_date => DateTime->from_kivitendo('30.06.2014'),
306 "periodic conf p=m ovp=y, starting July 1st of current year, ending November 30", 1,
307 [ 138.8875, 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.07.2014'),
312 end_date => DateTime->from_kivitendo('30.11.2014'),
317 "periodic conf p=m ovp=y, starting May 1st of current year, ending next year", 1,
318 [ 222.22, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
319 periodic_invoices_config => {
321 order_value_periodicity => 'y',
322 start_date => DateTime->from_kivitendo('01.05.2014'),
323 end_date => DateTime->from_kivitendo('30.06.2015'),
328 "periodic conf p=m ovp=y, starting November 1 in previous year, ending April 30", 1,
329 [ 111.11, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
330 periodic_invoices_config => {
332 order_value_periodicity => 'y',
334 start_date => DateTime->from_kivitendo('01.11.2013'),
335 end_date => DateTime->from_kivitendo('30.04.2014'),
339 # ----------------------------------------------------------------------
340 # order_value_periodicity=y, periodicity=q
343 "periodic conf p=q ovp=2, starting in previous year", 1,
344 [ 166.665, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
345 periodic_invoices_config => {
347 order_value_periodicity => '2',
348 start_date => DateTime->from_kivitendo('01.05.2013'),
352 "periodic conf p=q ovp=2, starting and ending in previous year", 1,
353 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
354 periodic_invoices_config => {
356 order_value_periodicity => '2',
358 start_date => DateTime->from_kivitendo('01.05.2013'),
359 end_date => DateTime->from_kivitendo('01.12.2013'),
363 "periodic conf p=q ovp=2, starting in next year", 1,
364 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
365 periodic_invoices_config => {
367 order_value_periodicity => '2',
368 start_date => DateTime->from_kivitendo('01.01.2015'),
372 "periodic conf p=q ovp=2, starting January 1st of current year", 1,
373 [ 166.665, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
374 periodic_invoices_config => {
376 order_value_periodicity => '2',
377 start_date => DateTime->from_kivitendo('01.01.2014'),
381 "periodic conf p=q ovp=2, starting July 1st of current year", 1,
382 [ 83.3325, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
383 periodic_invoices_config => {
385 order_value_periodicity => '2',
386 start_date => DateTime->from_kivitendo('01.07.2014'),
390 "periodic conf p=q ovp=2, starting May 1st of current year", 1,
391 [ 124.99875, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
392 periodic_invoices_config => {
394 order_value_periodicity => '2',
395 start_date => DateTime->from_kivitendo('01.05.2014'),
399 "periodic conf p=q ovp=2, starting January 1st of current year, ending June 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.01.2014'),
405 end_date => DateTime->from_kivitendo('30.06.2014'),
410 "periodic conf p=q ovp=2, starting July 1st of current year, ending November 30", 1,
411 [ 83.3325, 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.07.2014'),
416 end_date => DateTime->from_kivitendo('30.11.2014'),
421 "periodic conf p=q ovp=2, starting May 1st of current year, ending next year", 1,
422 [ 124.99875, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
423 periodic_invoices_config => {
425 order_value_periodicity => '2',
426 start_date => DateTime->from_kivitendo('01.05.2014'),
427 end_date => DateTime->from_kivitendo('30.06.2015'),
432 "periodic conf p=q ovp=2, starting November 1 in previous year, ending April 30", 1,
433 [ 41.66625, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
434 periodic_invoices_config => {
436 order_value_periodicity => '2',
438 start_date => DateTime->from_kivitendo('01.11.2013'),
439 end_date => DateTime->from_kivitendo('30.04.2014'),
444 # ----------------------------------------------------------------------
445 # order_value_periodicity=m, periodicity=b
448 "periodic conf p=b ovp=m, starting in previous year", 1,
449 [ 3999.96, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
450 periodic_invoices_config => {
452 order_value_periodicity => 'm',
453 start_date => DateTime->from_kivitendo('01.05.2013'),
457 "periodic conf p=b ovp=m, starting and ending in previous year", 1,
458 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
459 periodic_invoices_config => {
461 order_value_periodicity => 'm',
463 start_date => DateTime->from_kivitendo('01.05.2013'),
464 end_date => DateTime->from_kivitendo('01.12.2013'),
468 "periodic conf p=b ovp=m, starting in next year", 1,
469 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
470 periodic_invoices_config => {
472 order_value_periodicity => 'm',
473 start_date => DateTime->from_kivitendo('01.01.2015'),
477 "periodic conf p=b ovp=m, starting January 1st of current year", 1,
478 [ 3999.96, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
479 periodic_invoices_config => {
481 order_value_periodicity => 'm',
482 start_date => DateTime->from_kivitendo('01.01.2014'),
486 "periodic conf p=b ovp=m, starting July 1st of current year", 1,
487 [ 1999.98, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
488 periodic_invoices_config => {
490 order_value_periodicity => 'm',
491 start_date => DateTime->from_kivitendo('01.07.2014'),
495 "periodic conf p=b ovp=m, starting May 1st of current year", 1,
496 [ 3999.96, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
497 periodic_invoices_config => {
499 order_value_periodicity => 'm',
500 start_date => DateTime->from_kivitendo('01.05.2014'),
504 "periodic conf p=b ovp=m, starting January 1st of current year, ending June 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.01.2014'),
510 end_date => DateTime->from_kivitendo('30.06.2014'),
515 "periodic conf p=b ovp=m, starting July 1st of current year, ending November 30", 1,
516 [ 1999.98, 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.07.2014'),
521 end_date => DateTime->from_kivitendo('30.11.2014'),
526 "periodic conf p=b ovp=m, starting May 1st of current year, ending next year", 1,
527 [ 3999.96, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
528 periodic_invoices_config => {
530 order_value_periodicity => 'm',
531 start_date => DateTime->from_kivitendo('01.05.2014'),
532 end_date => DateTime->from_kivitendo('30.06.2015'),
537 "periodic conf p=b ovp=m, starting November 1 in previous year, ending April 30", 1,
538 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
539 periodic_invoices_config => {
541 order_value_periodicity => 'm',
543 start_date => DateTime->from_kivitendo('01.11.2013'),
544 end_date => DateTime->from_kivitendo('30.04.2014'),