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);
41 "SL::DB::Manager::${_}"->delete_all(all => 1) for qw(InvoiceItem Invoice OrderItem Order Customer Part);
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";
53 sub create_sales_order {
58 $params{$_} ||= {} for qw(customer part tax order orderitem);
60 $customer = SL::DB::Customer->new(
61 name => 'Test Customer',
62 currency_id => $currency_id,
63 taxzone_id => $tax_zone->id,
64 %{ $params{customer} }
67 $part = SL::DB::Part->new(
68 partnumber => 'T4254',
69 description => 'Fourty-two fifty-four',
73 buchungsgruppen_id => $buchungsgruppe->id,
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'),
86 { parts_id => $part->id,
87 description => $part->description,
88 lastcost => $part->lastcost,
89 sellprice => $part->sellprice,
92 %{ $params{orderitem} },
95 periodic_invoices_config => $params{periodic_invoices_config} ? {
97 ar_chart_id => $ar_chart->id,
98 %{ $params{periodic_invoices_config} },
103 $order->calculate_prices_and_taxes;
105 ok($order->save(cascade => 1));
107 $::form = Support::TestSetup->create_new_form;
108 $ctrl = SL::Controller::FinancialControllingReport->new;
110 $ctrl->orders($ctrl->models->get);
111 $ctrl->calculate_data;
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);
119 my ($msg, $num_orders, $values, %order_params) = @_;
121 create_sales_order(%order_params);
123 is($num_orders, scalar @{ $ctrl->orders }, "${msg}, #orders");
124 is_deeply([ map { ($ctrl->orders->[0]->{$_} // 0) * 1 } @columns ],
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 ]);
135 # ----------------------------------------------------------------------
136 # order_value_periodicity=y, periodicity=q
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 => {
143 order_value_periodicity => 'y',
144 start_date => DateTime->from_kivitendo('01.05.2013'),
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 => {
152 order_value_periodicity => 'y',
154 start_date => DateTime->from_kivitendo('01.05.2013'),
155 end_date => DateTime->from_kivitendo('01.12.2013'),
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 => {
163 order_value_periodicity => 'y',
164 start_date => DateTime->from_kivitendo('01.01.2015'),
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 => {
172 order_value_periodicity => 'y',
173 start_date => DateTime->from_kivitendo('01.01.2014'),
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 => {
181 order_value_periodicity => 'y',
182 start_date => DateTime->from_kivitendo('01.07.2014'),
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 => {
190 order_value_periodicity => 'y',
191 start_date => DateTime->from_kivitendo('01.05.2014'),
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 => {
199 order_value_periodicity => 'y',
200 start_date => DateTime->from_kivitendo('01.01.2014'),
201 end_date => DateTime->from_kivitendo('30.06.2014'),
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 => {
210 order_value_periodicity => 'y',
211 start_date => DateTime->from_kivitendo('01.07.2014'),
212 end_date => DateTime->from_kivitendo('30.11.2014'),
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 => {
221 order_value_periodicity => 'y',
222 start_date => DateTime->from_kivitendo('01.05.2014'),
223 end_date => DateTime->from_kivitendo('30.06.2015'),
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 => {
232 order_value_periodicity => 'y',
234 start_date => DateTime->from_kivitendo('01.11.2013'),
235 end_date => DateTime->from_kivitendo('30.04.2014'),
239 # ----------------------------------------------------------------------
240 # order_value_periodicity=y, periodicity=m
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 => {
247 order_value_periodicity => 'y',
248 start_date => DateTime->from_kivitendo('01.05.2013'),
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 => {
256 order_value_periodicity => 'y',
258 start_date => DateTime->from_kivitendo('01.05.2013'),
259 end_date => DateTime->from_kivitendo('01.12.2013'),
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 => {
267 order_value_periodicity => 'y',
268 start_date => DateTime->from_kivitendo('01.01.2015'),
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 => {
276 order_value_periodicity => 'y',
277 start_date => DateTime->from_kivitendo('01.01.2014'),
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 => {
285 order_value_periodicity => 'y',
286 start_date => DateTime->from_kivitendo('01.07.2014'),
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 => {
294 order_value_periodicity => 'y',
295 start_date => DateTime->from_kivitendo('01.05.2014'),
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 => {
303 order_value_periodicity => 'y',
304 start_date => DateTime->from_kivitendo('01.01.2014'),
305 end_date => DateTime->from_kivitendo('30.06.2014'),
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 => {
314 order_value_periodicity => 'y',
315 start_date => DateTime->from_kivitendo('01.07.2014'),
316 end_date => DateTime->from_kivitendo('30.11.2014'),
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 => {
325 order_value_periodicity => 'y',
326 start_date => DateTime->from_kivitendo('01.05.2014'),
327 end_date => DateTime->from_kivitendo('30.06.2015'),
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 => {
336 order_value_periodicity => 'y',
338 start_date => DateTime->from_kivitendo('01.11.2013'),
339 end_date => DateTime->from_kivitendo('30.04.2014'),
343 # ----------------------------------------------------------------------
344 # order_value_periodicity=y, periodicity=q
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 => {
351 order_value_periodicity => '2',
352 start_date => DateTime->from_kivitendo('01.05.2013'),
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 => {
360 order_value_periodicity => '2',
362 start_date => DateTime->from_kivitendo('01.05.2013'),
363 end_date => DateTime->from_kivitendo('01.12.2013'),
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 => {
371 order_value_periodicity => '2',
372 start_date => DateTime->from_kivitendo('01.01.2015'),
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 => {
380 order_value_periodicity => '2',
381 start_date => DateTime->from_kivitendo('01.01.2014'),
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 => {
389 order_value_periodicity => '2',
390 start_date => DateTime->from_kivitendo('01.07.2014'),
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 => {
398 order_value_periodicity => '2',
399 start_date => DateTime->from_kivitendo('01.05.2014'),
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 => {
407 order_value_periodicity => '2',
408 start_date => DateTime->from_kivitendo('01.01.2014'),
409 end_date => DateTime->from_kivitendo('30.06.2014'),
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 => {
418 order_value_periodicity => '2',
419 start_date => DateTime->from_kivitendo('01.07.2014'),
420 end_date => DateTime->from_kivitendo('30.11.2014'),
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 => {
429 order_value_periodicity => '2',
430 start_date => DateTime->from_kivitendo('01.05.2014'),
431 end_date => DateTime->from_kivitendo('30.06.2015'),
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 => {
440 order_value_periodicity => '2',
442 start_date => DateTime->from_kivitendo('01.11.2013'),
443 end_date => DateTime->from_kivitendo('30.04.2014'),
448 # ----------------------------------------------------------------------
449 # order_value_periodicity=m, periodicity=b
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 => {
456 order_value_periodicity => 'm',
457 start_date => DateTime->from_kivitendo('01.05.2013'),
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 => {
465 order_value_periodicity => 'm',
467 start_date => DateTime->from_kivitendo('01.05.2013'),
468 end_date => DateTime->from_kivitendo('01.12.2013'),
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 => {
476 order_value_periodicity => 'm',
477 start_date => DateTime->from_kivitendo('01.01.2015'),
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 => {
485 order_value_periodicity => 'm',
486 start_date => DateTime->from_kivitendo('01.01.2014'),
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 => {
494 order_value_periodicity => 'm',
495 start_date => DateTime->from_kivitendo('01.07.2014'),
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 => {
503 order_value_periodicity => 'm',
504 start_date => DateTime->from_kivitendo('01.05.2014'),
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 => {
512 order_value_periodicity => 'm',
513 start_date => DateTime->from_kivitendo('01.01.2014'),
514 end_date => DateTime->from_kivitendo('30.06.2014'),
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 => {
523 order_value_periodicity => 'm',
524 start_date => DateTime->from_kivitendo('01.07.2014'),
525 end_date => DateTime->from_kivitendo('30.11.2014'),
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 => {
534 order_value_periodicity => 'm',
535 start_date => DateTime->from_kivitendo('01.05.2014'),
536 end_date => DateTime->from_kivitendo('30.06.2015'),
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 => {
545 order_value_periodicity => 'm',
547 start_date => DateTime->from_kivitendo('01.11.2013'),
548 end_date => DateTime->from_kivitendo('30.04.2014'),