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 if ($::lx_office_conf{system}->{default_manager} eq "swiss") {
42 $ar_chart = SL::DB::Manager::Chart->find_by(accno => '3200') || croak "No AR chart";
43 $buchungsgruppe = SL::DB::Manager::Buchungsgruppe->find_by(description => 'Standard 8%') || croak "No accounting group";
44 $currency_id = SL::DB::Default->get->currency_id;
45 $employee = SL::DB::Manager::Employee->current || croak "No employee";
46 $tax_zone = SL::DB::Manager::TaxZone->find_by( description => 'Schweiz') || croak "No taxzone";
47 $unit = SL::DB::Manager::Unit->find_by(name => 'pauschal') || croak "No unit";
49 $ar_chart = SL::DB::Manager::Chart->find_by(accno => '1400') || croak "No AR chart";
50 $buchungsgruppe = SL::DB::Manager::Buchungsgruppe->find_by(description => 'Standard 19%') || croak "No accounting group";
51 $currency_id = SL::DB::Default->get->currency_id;
52 $employee = SL::DB::Manager::Employee->current || croak "No employee";
53 $tax_zone = SL::DB::Manager::TaxZone->find_by( description => 'Inland') || croak "No taxzone";
54 $unit = SL::DB::Manager::Unit->find_by(name => 'psch') || croak "No unit";
58 sub create_sales_order {
61 $params{$_} ||= {} for qw(customer part tax order orderitem);
63 # Clean up: remove invoices, orders, parts and customers
64 "SL::DB::Manager::${_}"->delete_all(all => 1) for qw(InvoiceItem Invoice OrderItem Order Customer Part);
66 $customer = SL::DB::Customer->new(
67 name => 'Test Customer',
68 currency_id => $currency_id,
69 taxzone_id => $tax_zone->id,
70 %{ $params{customer} }
73 $part = SL::DB::Part->new(
74 partnumber => 'T4254',
75 description => 'Fourty-two fifty-four',
78 buchungsgruppen_id => $buchungsgruppe->id,
84 $order = SL::DB::Order->new(
85 customer_id => $customer->id,
86 currency_id => $currency_id,
87 taxzone_id => $tax_zone->id,
88 transaction_description => '<%period_start_date%>',
89 transdate => DateTime->from_kivitendo('01.03.2014'),
91 { parts_id => $part->id,
92 description => $part->description,
93 lastcost => $part->lastcost,
94 sellprice => $part->sellprice,
97 %{ $params{orderitem} },
100 periodic_invoices_config => $params{periodic_invoices_config} ? {
102 ar_chart_id => $ar_chart->id,
103 %{ $params{periodic_invoices_config} },
108 $order->calculate_prices_and_taxes;
110 ok($order->save(cascade => 1));
112 $::form = Form->new('');
113 $ctrl = SL::Controller::FinancialControllingReport->new;
115 $ctrl->orders($ctrl->models->get);
116 $ctrl->calculate_data;
119 my @columns = qw(net_amount other_amount
120 delivered_amount billed_amount paid_amount billable_amount
121 delivered_amount_p billed_amount_p paid_amount_p billable_amount_p);
124 my ($msg, $num_orders, $values, %order_params) = @_;
126 create_sales_order(%order_params);
128 is($num_orders, scalar @{ $ctrl->orders }, "${msg}, #orders");
129 is_deeply([ map { ($ctrl->orders->[0]->{$_} // 0) * 1 } @columns ],
136 # ----------------------------------------------------------------------
137 # An order without periodic invoices:
138 run_tests("no periodic conf", 1, [ 333.33, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]);
140 # ----------------------------------------------------------------------
141 # order_value_periodicity=y, periodicity=q
144 "periodic conf p=q ovp=y, starting in previous year", 1,
145 [ 333.33, 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.05.2013'),
153 "periodic conf p=q ovp=y, starting and ending in previous year", 1,
154 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
155 periodic_invoices_config => {
157 order_value_periodicity => 'y',
159 start_date => DateTime->from_kivitendo('01.05.2013'),
160 end_date => DateTime->from_kivitendo('01.12.2013'),
164 "periodic conf p=q ovp=y, starting in next year", 1,
165 [ 0, 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.2015'),
173 "periodic conf p=q ovp=y, starting January 1st of current year", 1,
174 [ 333.33, 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.01.2014'),
182 "periodic conf p=q ovp=y, starting July 1st of current year", 1,
183 [ 166.665, 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.07.2014'),
191 "periodic conf p=q ovp=y, starting May 1st of current year", 1,
192 [ 249.9975, 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.05.2014'),
200 "periodic conf p=q ovp=y, starting January 1st of current year, ending June 30", 1,
201 [ 166.665, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
202 periodic_invoices_config => {
204 order_value_periodicity => 'y',
205 start_date => DateTime->from_kivitendo('01.01.2014'),
206 end_date => DateTime->from_kivitendo('30.06.2014'),
211 "periodic conf p=q ovp=y, starting July 1st of current year, ending November 30", 1,
212 [ 166.665, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
213 periodic_invoices_config => {
215 order_value_periodicity => 'y',
216 start_date => DateTime->from_kivitendo('01.07.2014'),
217 end_date => DateTime->from_kivitendo('30.11.2014'),
222 "periodic conf p=q ovp=y, starting May 1st of current year, ending next year", 1,
223 [ 249.9975, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
224 periodic_invoices_config => {
226 order_value_periodicity => 'y',
227 start_date => DateTime->from_kivitendo('01.05.2014'),
228 end_date => DateTime->from_kivitendo('30.06.2015'),
233 "periodic conf p=q ovp=y, starting November 1 in previous year, ending April 30", 1,
234 [ 83.3325, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
235 periodic_invoices_config => {
237 order_value_periodicity => 'y',
239 start_date => DateTime->from_kivitendo('01.11.2013'),
240 end_date => DateTime->from_kivitendo('30.04.2014'),
244 # ----------------------------------------------------------------------
245 # order_value_periodicity=y, periodicity=m
248 "periodic conf p=m ovp=y, starting in previous year", 1,
249 [ 333.33, 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.05.2013'),
257 "periodic conf p=m ovp=y, starting and ending in previous year", 1,
258 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
259 periodic_invoices_config => {
261 order_value_periodicity => 'y',
263 start_date => DateTime->from_kivitendo('01.05.2013'),
264 end_date => DateTime->from_kivitendo('01.12.2013'),
268 "periodic conf p=m ovp=y, starting in next year", 1,
269 [ 0, 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.2015'),
277 "periodic conf p=m ovp=y, starting January 1st of current year", 1,
278 [ 333.33, 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.01.2014'),
286 "periodic conf p=m ovp=y, starting July 1st of current year", 1,
287 [ 166.665, 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.07.2014'),
295 "periodic conf p=m ovp=y, starting May 1st of current year", 1,
296 [ 222.22, 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.05.2014'),
304 "periodic conf p=m ovp=y, starting January 1st of current year, ending June 30", 1,
305 [ 166.665, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
306 periodic_invoices_config => {
308 order_value_periodicity => 'y',
309 start_date => DateTime->from_kivitendo('01.01.2014'),
310 end_date => DateTime->from_kivitendo('30.06.2014'),
315 "periodic conf p=m ovp=y, starting July 1st of current year, ending November 30", 1,
316 [ 138.8875, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
317 periodic_invoices_config => {
319 order_value_periodicity => 'y',
320 start_date => DateTime->from_kivitendo('01.07.2014'),
321 end_date => DateTime->from_kivitendo('30.11.2014'),
326 "periodic conf p=m ovp=y, starting May 1st of current year, ending next year", 1,
327 [ 222.22, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
328 periodic_invoices_config => {
330 order_value_periodicity => 'y',
331 start_date => DateTime->from_kivitendo('01.05.2014'),
332 end_date => DateTime->from_kivitendo('30.06.2015'),
337 "periodic conf p=m ovp=y, starting November 1 in previous year, ending April 30", 1,
338 [ 111.11, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
339 periodic_invoices_config => {
341 order_value_periodicity => 'y',
343 start_date => DateTime->from_kivitendo('01.11.2013'),
344 end_date => DateTime->from_kivitendo('30.04.2014'),
348 # ----------------------------------------------------------------------
349 # order_value_periodicity=y, periodicity=q
352 "periodic conf p=q ovp=2, starting in previous year", 1,
353 [ 166.665, 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.05.2013'),
361 "periodic conf p=q ovp=2, starting and ending in previous year", 1,
362 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
363 periodic_invoices_config => {
365 order_value_periodicity => '2',
367 start_date => DateTime->from_kivitendo('01.05.2013'),
368 end_date => DateTime->from_kivitendo('01.12.2013'),
372 "periodic conf p=q ovp=2, starting in next year", 1,
373 [ 0, 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.2015'),
381 "periodic conf p=q ovp=2, starting January 1st of current year", 1,
382 [ 166.665, 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.01.2014'),
390 "periodic conf p=q ovp=2, starting July 1st of current year", 1,
391 [ 83.3325, 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.07.2014'),
399 "periodic conf p=q ovp=2, starting May 1st of current year", 1,
400 [ 124.99875, 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.05.2014'),
408 "periodic conf p=q ovp=2, starting January 1st of current year, ending June 30", 1,
409 [ 83.3325, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
410 periodic_invoices_config => {
412 order_value_periodicity => '2',
413 start_date => DateTime->from_kivitendo('01.01.2014'),
414 end_date => DateTime->from_kivitendo('30.06.2014'),
419 "periodic conf p=q ovp=2, starting July 1st of current year, ending November 30", 1,
420 [ 83.3325, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
421 periodic_invoices_config => {
423 order_value_periodicity => '2',
424 start_date => DateTime->from_kivitendo('01.07.2014'),
425 end_date => DateTime->from_kivitendo('30.11.2014'),
430 "periodic conf p=q ovp=2, starting May 1st of current year, ending next year", 1,
431 [ 124.99875, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
432 periodic_invoices_config => {
434 order_value_periodicity => '2',
435 start_date => DateTime->from_kivitendo('01.05.2014'),
436 end_date => DateTime->from_kivitendo('30.06.2015'),
441 "periodic conf p=q ovp=2, starting November 1 in previous year, ending April 30", 1,
442 [ 41.66625, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
443 periodic_invoices_config => {
445 order_value_periodicity => '2',
447 start_date => DateTime->from_kivitendo('01.11.2013'),
448 end_date => DateTime->from_kivitendo('30.04.2014'),
453 # ----------------------------------------------------------------------
454 # order_value_periodicity=m, periodicity=b
457 "periodic conf p=b ovp=m, starting in previous year", 1,
458 [ 3999.96, 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.05.2013'),
466 "periodic conf p=b ovp=m, starting and ending in previous year", 1,
467 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
468 periodic_invoices_config => {
470 order_value_periodicity => 'm',
472 start_date => DateTime->from_kivitendo('01.05.2013'),
473 end_date => DateTime->from_kivitendo('01.12.2013'),
477 "periodic conf p=b ovp=m, starting in next year", 1,
478 [ 0, 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.2015'),
486 "periodic conf p=b ovp=m, starting January 1st of current year", 1,
487 [ 3999.96, 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.01.2014'),
495 "periodic conf p=b ovp=m, starting July 1st of current year", 1,
496 [ 1999.98, 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.07.2014'),
504 "periodic conf p=b ovp=m, starting May 1st of current year", 1,
505 [ 3999.96, 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.05.2014'),
513 "periodic conf p=b ovp=m, starting January 1st of current year, ending June 30", 1,
514 [ 1999.98, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
515 periodic_invoices_config => {
517 order_value_periodicity => 'm',
518 start_date => DateTime->from_kivitendo('01.01.2014'),
519 end_date => DateTime->from_kivitendo('30.06.2014'),
524 "periodic conf p=b ovp=m, starting July 1st of current year, ending November 30", 1,
525 [ 1999.98, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
526 periodic_invoices_config => {
528 order_value_periodicity => 'm',
529 start_date => DateTime->from_kivitendo('01.07.2014'),
530 end_date => DateTime->from_kivitendo('30.11.2014'),
535 "periodic conf p=b ovp=m, starting May 1st of current year, ending next year", 1,
536 [ 3999.96, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
537 periodic_invoices_config => {
539 order_value_periodicity => 'm',
540 start_date => DateTime->from_kivitendo('01.05.2014'),
541 end_date => DateTime->from_kivitendo('30.06.2015'),
546 "periodic conf p=b ovp=m, starting November 1 in previous year, ending April 30", 1,
547 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
548 periodic_invoices_config => {
550 order_value_periodicity => 'm',
552 start_date => DateTime->from_kivitendo('01.11.2013'),
553 end_date => DateTime->from_kivitendo('30.04.2014'),