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',
70 buchungsgruppen_id => $buchungsgruppe->id,
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'),
83 { parts_id => $part->id,
84 description => $part->description,
85 lastcost => $part->lastcost,
86 sellprice => $part->sellprice,
89 %{ $params{orderitem} },
92 periodic_invoices_config => $params{periodic_invoices_config} ? {
94 ar_chart_id => $ar_chart->id,
95 %{ $params{periodic_invoices_config} },
100 $order->calculate_prices_and_taxes;
102 ok($order->save(cascade => 1));
104 $::form = Form->new('');
105 $ctrl = SL::Controller::FinancialControllingReport->new;
107 $ctrl->orders($ctrl->models->get);
108 $ctrl->calculate_data;
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);
116 my ($msg, $num_orders, $values, %order_params) = @_;
118 create_sales_order(%order_params);
120 is($num_orders, scalar @{ $ctrl->orders }, "${msg}, #orders");
121 is_deeply([ map { ($ctrl->orders->[0]->{$_} // 0) * 1 } @columns ],
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 ]);
132 # ----------------------------------------------------------------------
133 # order_value_periodicity=y, periodicity=q
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 => {
140 order_value_periodicity => 'y',
141 start_date => DateTime->from_kivitendo('01.05.2013'),
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 => {
149 order_value_periodicity => 'y',
151 start_date => DateTime->from_kivitendo('01.05.2013'),
152 end_date => DateTime->from_kivitendo('01.12.2013'),
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 => {
160 order_value_periodicity => 'y',
161 start_date => DateTime->from_kivitendo('01.01.2015'),
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 => {
169 order_value_periodicity => 'y',
170 start_date => DateTime->from_kivitendo('01.01.2014'),
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 => {
178 order_value_periodicity => 'y',
179 start_date => DateTime->from_kivitendo('01.07.2014'),
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 => {
187 order_value_periodicity => 'y',
188 start_date => DateTime->from_kivitendo('01.05.2014'),
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 => {
196 order_value_periodicity => 'y',
197 start_date => DateTime->from_kivitendo('01.01.2014'),
198 end_date => DateTime->from_kivitendo('30.06.2014'),
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 => {
207 order_value_periodicity => 'y',
208 start_date => DateTime->from_kivitendo('01.07.2014'),
209 end_date => DateTime->from_kivitendo('30.11.2014'),
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 => {
218 order_value_periodicity => 'y',
219 start_date => DateTime->from_kivitendo('01.05.2014'),
220 end_date => DateTime->from_kivitendo('30.06.2015'),
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 => {
229 order_value_periodicity => 'y',
231 start_date => DateTime->from_kivitendo('01.11.2013'),
232 end_date => DateTime->from_kivitendo('30.04.2014'),
236 # ----------------------------------------------------------------------
237 # order_value_periodicity=y, periodicity=m
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 => {
244 order_value_periodicity => 'y',
245 start_date => DateTime->from_kivitendo('01.05.2013'),
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 => {
253 order_value_periodicity => 'y',
255 start_date => DateTime->from_kivitendo('01.05.2013'),
256 end_date => DateTime->from_kivitendo('01.12.2013'),
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 => {
264 order_value_periodicity => 'y',
265 start_date => DateTime->from_kivitendo('01.01.2015'),
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 => {
273 order_value_periodicity => 'y',
274 start_date => DateTime->from_kivitendo('01.01.2014'),
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 => {
282 order_value_periodicity => 'y',
283 start_date => DateTime->from_kivitendo('01.07.2014'),
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 => {
291 order_value_periodicity => 'y',
292 start_date => DateTime->from_kivitendo('01.05.2014'),
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 => {
300 order_value_periodicity => 'y',
301 start_date => DateTime->from_kivitendo('01.01.2014'),
302 end_date => DateTime->from_kivitendo('30.06.2014'),
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 => {
311 order_value_periodicity => 'y',
312 start_date => DateTime->from_kivitendo('01.07.2014'),
313 end_date => DateTime->from_kivitendo('30.11.2014'),
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 => {
322 order_value_periodicity => 'y',
323 start_date => DateTime->from_kivitendo('01.05.2014'),
324 end_date => DateTime->from_kivitendo('30.06.2015'),
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 => {
333 order_value_periodicity => 'y',
335 start_date => DateTime->from_kivitendo('01.11.2013'),
336 end_date => DateTime->from_kivitendo('30.04.2014'),
340 # ----------------------------------------------------------------------
341 # order_value_periodicity=y, periodicity=q
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 => {
348 order_value_periodicity => '2',
349 start_date => DateTime->from_kivitendo('01.05.2013'),
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 => {
357 order_value_periodicity => '2',
359 start_date => DateTime->from_kivitendo('01.05.2013'),
360 end_date => DateTime->from_kivitendo('01.12.2013'),
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 => {
368 order_value_periodicity => '2',
369 start_date => DateTime->from_kivitendo('01.01.2015'),
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 => {
377 order_value_periodicity => '2',
378 start_date => DateTime->from_kivitendo('01.01.2014'),
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 => {
386 order_value_periodicity => '2',
387 start_date => DateTime->from_kivitendo('01.07.2014'),
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 => {
395 order_value_periodicity => '2',
396 start_date => DateTime->from_kivitendo('01.05.2014'),
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 => {
404 order_value_periodicity => '2',
405 start_date => DateTime->from_kivitendo('01.01.2014'),
406 end_date => DateTime->from_kivitendo('30.06.2014'),
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 => {
415 order_value_periodicity => '2',
416 start_date => DateTime->from_kivitendo('01.07.2014'),
417 end_date => DateTime->from_kivitendo('30.11.2014'),
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 => {
426 order_value_periodicity => '2',
427 start_date => DateTime->from_kivitendo('01.05.2014'),
428 end_date => DateTime->from_kivitendo('30.06.2015'),
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 => {
437 order_value_periodicity => '2',
439 start_date => DateTime->from_kivitendo('01.11.2013'),
440 end_date => DateTime->from_kivitendo('30.04.2014'),
445 # ----------------------------------------------------------------------
446 # order_value_periodicity=m, periodicity=b
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 => {
453 order_value_periodicity => 'm',
454 start_date => DateTime->from_kivitendo('01.05.2013'),
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 => {
462 order_value_periodicity => 'm',
464 start_date => DateTime->from_kivitendo('01.05.2013'),
465 end_date => DateTime->from_kivitendo('01.12.2013'),
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 => {
473 order_value_periodicity => 'm',
474 start_date => DateTime->from_kivitendo('01.01.2015'),
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 => {
482 order_value_periodicity => 'm',
483 start_date => DateTime->from_kivitendo('01.01.2014'),
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 => {
491 order_value_periodicity => 'm',
492 start_date => DateTime->from_kivitendo('01.07.2014'),
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 => {
500 order_value_periodicity => 'm',
501 start_date => DateTime->from_kivitendo('01.05.2014'),
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 => {
509 order_value_periodicity => 'm',
510 start_date => DateTime->from_kivitendo('01.01.2014'),
511 end_date => DateTime->from_kivitendo('30.06.2014'),
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 => {
520 order_value_periodicity => 'm',
521 start_date => DateTime->from_kivitendo('01.07.2014'),
522 end_date => DateTime->from_kivitendo('30.11.2014'),
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 => {
531 order_value_periodicity => 'm',
532 start_date => DateTime->from_kivitendo('01.05.2014'),
533 end_date => DateTime->from_kivitendo('30.06.2015'),
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 => {
542 order_value_periodicity => 'm',
544 start_date => DateTime->from_kivitendo('01.11.2013'),
545 end_date => DateTime->from_kivitendo('30.04.2014'),