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 => 80;
24 use Support::TestSetup;
26 use_ok 'SL::BackgroundJob::CreatePeriodicInvoices';
27 use_ok 'SL::DB::Chart';
28 use_ok 'SL::DB::Customer';
29 use_ok 'SL::DB::Default';
30 use_ok 'SL::DB::Invoice';
31 use_ok 'SL::DB::Order';
32 use_ok 'SL::DB::Part';
33 use_ok 'SL::DB::TaxZone';
35 Support::TestSetup::login();
37 our ($ar_chart, $buchungsgruppe, $currency_id, $customer, $employee, $order, $part, $tax_zone, $unit, @invoices);
39 sub init_common_state {
40 $ar_chart = SL::DB::Manager::Chart->find_by(accno => '1400') || croak "No AR chart";
41 $buchungsgruppe = SL::DB::Manager::Buchungsgruppe->find_by(description => 'Standard 19%') || croak "No accounting group";
42 $currency_id = SL::DB::Default->get->currency_id;
43 $employee = SL::DB::Manager::Employee->current || croak "No employee";
44 $tax_zone = SL::DB::Manager::TaxZone->find_by( description => 'Inland') || croak "No taxzone";
45 $unit = SL::DB::Manager::Unit->find_by(name => 'psch') || croak "No unit";
49 "SL::DB::Manager::${_}"->delete_all(all => 1) for qw(InvoiceItem Invoice OrderItem Order Customer Part);
55 $params{$_} ||= {} for qw(customer part tax order orderitem periodic_invoices_config);
57 # Clean up: remove invoices, orders, parts and customers
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',
72 buchungsgruppen_id => $buchungsgruppe->id,
78 $order = SL::DB::Order->new(
79 customer_id => $customer->id,
80 currency_id => $currency_id,
81 taxzone_id => $tax_zone->id,
82 transaction_description => '<%period_start_date%>',
84 { parts_id => $part->id,
85 description => $part->description,
86 lastcost => $part->lastcost,
87 sellprice => $part->sellprice,
90 %{ $params{orderitem} },
93 periodic_invoices_config => {
95 ar_chart_id => $ar_chart->id,
96 %{ $params{periodic_invoices_config} },
101 $order->calculate_prices_and_taxes;
103 ok($order->save(cascade => 1));
105 SL::BackgroundJob::CreatePeriodicInvoices->new->run(SL::DB::BackgroundJob->new);
107 @invoices = @{ SL::DB::Manager::Invoice->get_all(sort_by => [ qw(id) ]) };
111 my ($description, @exp_date_netamount_pairs) = @_;
113 is scalar(@invoices), scalar(@exp_date_netamount_pairs), "${description} number of invoices " . scalar(@exp_date_netamount_pairs);
115 my @actual_date_netamount_pairs = map { [ $_->transaction_description, $_->netamount * 1 ] } @invoices;
116 is_deeply \@actual_date_netamount_pairs, \@exp_date_netamount_pairs, "${description} date/netamount of created invoices";
121 # order_value_periodicity=y
122 create_invoices(periodic_invoices_config => { periodicity => 'm', order_value_periodicity => 'y', start_date => DateTime->from_kivitendo('01.01.2013') });
123 are_invoices 'p=m ovp=y',[ '01.01.2013', 27.78 ], [ '01.02.2013', 27.78 ], [ '01.03.2013', 27.78 ], [ '01.04.2013', 27.78 ],
124 [ '01.05.2013', 27.78 ], [ '01.06.2013', 27.78 ], [ '01.07.2013', 27.78 ], [ '01.08.2013', 27.78 ],
125 [ '01.09.2013', 27.78 ], [ '01.10.2013', 27.78 ], [ '01.11.2013', 27.78 ], [ '01.12.2013', 27.75 ],
126 [ '01.01.2014', 27.78 ], [ '01.02.2014', 27.78 ], [ '01.03.2014', 27.78 ];
128 create_invoices(periodic_invoices_config => { periodicity => 'q', order_value_periodicity => 'y', start_date => DateTime->from_kivitendo('01.01.2013') });
129 are_invoices 'p=q ovp=y',[ '01.01.2013', 83.33 ], [ '01.04.2013', 83.33 ], [ '01.07.2013', 83.33 ], [ '01.10.2013', 83.34 ], [ '01.01.2014', 83.33 ];
131 create_invoices(periodic_invoices_config => { periodicity => 'b', order_value_periodicity => 'y', start_date => DateTime->from_kivitendo('01.01.2013') });
132 are_invoices 'p=b ovp=y',[ '01.01.2013', 166.67 ], [ '01.07.2013', 166.66 ], [ '01.01.2014', 166.67 ];
134 create_invoices(periodic_invoices_config => { periodicity => 'y', order_value_periodicity => 'y', start_date => DateTime->from_kivitendo('01.01.2013') });
135 are_invoices 'p=y ovp=y',[ '01.01.2013', 333.33 ], [ '01.01.2014', 333.33 ];
137 # order_value_periodicity=b
138 create_invoices(periodic_invoices_config => { periodicity => 'm', order_value_periodicity => 'b', start_date => DateTime->from_kivitendo('01.01.2013') });
139 are_invoices 'p=m ovp=b',[ '01.01.2013', 55.56 ], [ '01.02.2013', 55.56 ], [ '01.03.2013', 55.56 ], [ '01.04.2013', 55.56 ],
140 [ '01.05.2013', 55.56 ], [ '01.06.2013', 55.53 ], [ '01.07.2013', 55.56 ], [ '01.08.2013', 55.56 ],
141 [ '01.09.2013', 55.56 ], [ '01.10.2013', 55.56 ], [ '01.11.2013', 55.56 ], [ '01.12.2013', 55.53 ],
142 [ '01.01.2014', 55.56 ], [ '01.02.2014', 55.56 ], [ '01.03.2014', 55.56 ];
144 create_invoices(periodic_invoices_config => { periodicity => 'q', order_value_periodicity => 'b', start_date => DateTime->from_kivitendo('01.01.2013') });
145 are_invoices 'p=q ovp=b',[ '01.01.2013', 166.67 ], [ '01.04.2013', 166.66 ], [ '01.07.2013', 166.67 ], [ '01.10.2013', 166.66 ], [ '01.01.2014', 166.67 ];
147 create_invoices(periodic_invoices_config => { periodicity => 'b', order_value_periodicity => 'b', start_date => DateTime->from_kivitendo('01.01.2013') });
148 are_invoices 'p=b ovp=b',[ '01.01.2013', 333.33 ], [ '01.07.2013', 333.33 ], [ '01.01.2014', 333.33 ];
150 create_invoices(periodic_invoices_config => { periodicity => 'y', order_value_periodicity => 'b', start_date => DateTime->from_kivitendo('01.01.2013') });
151 are_invoices 'p=y ovp=b',[ '01.01.2013', 666.66 ], [ '01.01.2014', 666.66 ];
153 # order_value_periodicity=q
154 create_invoices(periodic_invoices_config => { periodicity => 'm', order_value_periodicity => 'q', start_date => DateTime->from_kivitendo('01.01.2013') });
155 are_invoices 'p=m ovp=q',[ '01.01.2013', 111.11 ], [ '01.02.2013', 111.11 ], [ '01.03.2013', 111.11 ], [ '01.04.2013', 111.11 ],
156 [ '01.05.2013', 111.11 ], [ '01.06.2013', 111.11 ], [ '01.07.2013', 111.11 ], [ '01.08.2013', 111.11 ],
157 [ '01.09.2013', 111.11 ], [ '01.10.2013', 111.11 ], [ '01.11.2013', 111.11 ], [ '01.12.2013', 111.11 ],
158 [ '01.01.2014', 111.11 ], [ '01.02.2014', 111.11 ], [ '01.03.2014', 111.11 ];
160 create_invoices(periodic_invoices_config => { periodicity => 'q', order_value_periodicity => 'q', start_date => DateTime->from_kivitendo('01.01.2013') });
161 are_invoices 'p=q ovp=q',[ '01.01.2013', 333.33 ], [ '01.04.2013', 333.33 ], [ '01.07.2013', 333.33 ], [ '01.10.2013', 333.33 ], [ '01.01.2014', 333.33 ];
163 create_invoices(periodic_invoices_config => { periodicity => 'b', order_value_periodicity => 'q', start_date => DateTime->from_kivitendo('01.01.2013') });
164 are_invoices 'p=b ovp=q',[ '01.01.2013', 666.66 ], [ '01.07.2013', 666.66 ], [ '01.01.2014', 666.66 ];
166 create_invoices(periodic_invoices_config => { periodicity => 'y', order_value_periodicity => 'q', start_date => DateTime->from_kivitendo('01.01.2013') });
167 are_invoices 'p=y ovp=q',[ '01.01.2013', 1333.32 ], [ '01.01.2014', 1333.32 ];
169 # order_value_periodicity=m
170 create_invoices(periodic_invoices_config => { periodicity => 'm', order_value_periodicity => 'm', start_date => DateTime->from_kivitendo('01.01.2013') });
171 are_invoices 'p=m ovp=m',[ '01.01.2013', 333.33 ], [ '01.02.2013', 333.33 ], [ '01.03.2013', 333.33 ], [ '01.04.2013', 333.33 ],
172 [ '01.05.2013', 333.33 ], [ '01.06.2013', 333.33 ], [ '01.07.2013', 333.33 ], [ '01.08.2013', 333.33 ],
173 [ '01.09.2013', 333.33 ], [ '01.10.2013', 333.33 ], [ '01.11.2013', 333.33 ], [ '01.12.2013', 333.33 ],
174 [ '01.01.2014', 333.33 ], [ '01.02.2014', 333.33 ], [ '01.03.2014', 333.33 ];
176 create_invoices(periodic_invoices_config => { periodicity => 'q', order_value_periodicity => 'm', start_date => DateTime->from_kivitendo('01.01.2013') });
177 are_invoices 'p=q ovp=m',[ '01.01.2013', 999.99 ], [ '01.04.2013', 999.99 ], [ '01.07.2013', 999.99 ], [ '01.10.2013', 999.99 ], [ '01.01.2014', 999.99 ];
179 create_invoices(periodic_invoices_config => { periodicity => 'b', order_value_periodicity => 'm', start_date => DateTime->from_kivitendo('01.01.2013') });
180 are_invoices 'p=b ovp=m',[ '01.01.2013', 1999.98 ], [ '01.07.2013', 1999.98 ], [ '01.01.2014', 1999.98 ];
182 create_invoices(periodic_invoices_config => { periodicity => 'y', order_value_periodicity => 'm', start_date => DateTime->from_kivitendo('01.01.2013') });
183 are_invoices 'p=y ovp=m',[ '01.01.2013', 3999.96 ], [ '01.01.2014', 3999.96 ];
185 # order_value_periodicity=2
186 create_invoices(periodic_invoices_config => { periodicity => 'm', order_value_periodicity => '2', start_date => DateTime->from_kivitendo('01.01.2012') });
187 are_invoices 'p=m ovp=2',[ '01.01.2012', 13.89 ], [ '01.02.2012', 13.89 ], [ '01.03.2012', 13.89 ], [ '01.04.2012', 13.89 ],
188 [ '01.05.2012', 13.89 ], [ '01.06.2012', 13.89 ], [ '01.07.2012', 13.89 ], [ '01.08.2012', 13.89 ],
189 [ '01.09.2012', 13.89 ], [ '01.10.2012', 13.89 ], [ '01.11.2012', 13.89 ], [ '01.12.2012', 13.89 ],
190 [ '01.01.2013', 13.89 ], [ '01.02.2013', 13.89 ], [ '01.03.2013', 13.89 ], [ '01.04.2013', 13.89 ],
191 [ '01.05.2013', 13.89 ], [ '01.06.2013', 13.89 ], [ '01.07.2013', 13.89 ], [ '01.08.2013', 13.89 ],
192 [ '01.09.2013', 13.89 ], [ '01.10.2013', 13.89 ], [ '01.11.2013', 13.89 ], [ '01.12.2013', 13.86 ],
193 [ '01.01.2014', 13.89 ], [ '01.02.2014', 13.89 ], [ '01.03.2014', 13.89 ];
195 create_invoices(periodic_invoices_config => { periodicity => 'q', order_value_periodicity => '2', start_date => DateTime->from_kivitendo('01.01.2012') });
196 are_invoices 'p=q ovp=2',[ '01.01.2012', 41.67 ], [ '01.04.2012', 41.67 ], [ '01.07.2012', 41.67 ], [ '01.10.2012', 41.67 ],
197 [ '01.01.2013', 41.67 ], [ '01.04.2013', 41.67 ], [ '01.07.2013', 41.67 ], [ '01.10.2013', 41.64 ],
198 [ '01.01.2014', 41.67 ];
200 create_invoices(periodic_invoices_config => { periodicity => 'b', order_value_periodicity => '2', start_date => DateTime->from_kivitendo('01.01.2012') });
201 are_invoices 'p=b ovp=2',[ '01.01.2012', 83.33 ], [ '01.07.2012', 83.33 ], [ '01.01.2013', 83.33 ], [ '01.07.2013', 83.34 ], [ '01.01.2014', 83.33 ];
203 create_invoices(periodic_invoices_config => { periodicity => 'y', order_value_periodicity => '2', start_date => DateTime->from_kivitendo('01.01.2012') });
204 are_invoices 'p=y ovp=2',[ '01.01.2012', 166.67 ], [ '01.01.2013', 166.66 ], [ '01.01.2014', 166.67 ];
206 # order_value_periodicity=5
207 create_invoices(periodic_invoices_config => { periodicity => 'm', order_value_periodicity => '5', start_date => DateTime->from_kivitendo('01.01.2009') });
208 are_invoices 'p=m ovp=5',[ '01.01.2009', 5.56 ], [ '01.02.2009', 5.56 ], [ '01.03.2009', 5.56 ], [ '01.04.2009', 5.56 ],
209 [ '01.05.2009', 5.56 ], [ '01.06.2009', 5.56 ], [ '01.07.2009', 5.56 ], [ '01.08.2009', 5.56 ],
210 [ '01.09.2009', 5.56 ], [ '01.10.2009', 5.56 ], [ '01.11.2009', 5.56 ], [ '01.12.2009', 5.56 ],
211 [ '01.01.2010', 5.56 ], [ '01.02.2010', 5.56 ], [ '01.03.2010', 5.56 ], [ '01.04.2010', 5.56 ],
212 [ '01.05.2010', 5.56 ], [ '01.06.2010', 5.56 ], [ '01.07.2010', 5.56 ], [ '01.08.2010', 5.56 ],
213 [ '01.09.2010', 5.56 ], [ '01.10.2010', 5.56 ], [ '01.11.2010', 5.56 ], [ '01.12.2010', 5.56 ],
214 [ '01.01.2011', 5.56 ], [ '01.02.2011', 5.56 ], [ '01.03.2011', 5.56 ], [ '01.04.2011', 5.56 ],
215 [ '01.05.2011', 5.56 ], [ '01.06.2011', 5.56 ], [ '01.07.2011', 5.56 ], [ '01.08.2011', 5.56 ],
216 [ '01.09.2011', 5.56 ], [ '01.10.2011', 5.56 ], [ '01.11.2011', 5.56 ], [ '01.12.2011', 5.56 ],
217 [ '01.01.2012', 5.56 ], [ '01.02.2012', 5.56 ], [ '01.03.2012', 5.56 ], [ '01.04.2012', 5.56 ],
218 [ '01.05.2012', 5.56 ], [ '01.06.2012', 5.56 ], [ '01.07.2012', 5.56 ], [ '01.08.2012', 5.56 ],
219 [ '01.09.2012', 5.56 ], [ '01.10.2012', 5.56 ], [ '01.11.2012', 5.56 ], [ '01.12.2012', 5.56 ],
220 [ '01.01.2013', 5.56 ], [ '01.02.2013', 5.56 ], [ '01.03.2013', 5.56 ], [ '01.04.2013', 5.56 ],
221 [ '01.05.2013', 5.56 ], [ '01.06.2013', 5.56 ], [ '01.07.2013', 5.56 ], [ '01.08.2013', 5.56 ],
222 [ '01.09.2013', 5.56 ], [ '01.10.2013', 5.56 ], [ '01.11.2013', 5.56 ], [ '01.12.2013', 5.29 ],
223 [ '01.01.2014', 5.56 ], [ '01.02.2014', 5.56 ], [ '01.03.2014', 5.56 ];
225 create_invoices(periodic_invoices_config => { periodicity => 'q', order_value_periodicity => '5', start_date => DateTime->from_kivitendo('01.01.2009') });
226 are_invoices 'p=q ovp=5',[ '01.01.2009', 16.67 ], [ '01.04.2009', 16.67 ], [ '01.07.2009', 16.67 ], [ '01.10.2009', 16.67 ],
227 [ '01.01.2010', 16.67 ], [ '01.04.2010', 16.67 ], [ '01.07.2010', 16.67 ], [ '01.10.2010', 16.67 ],
228 [ '01.01.2011', 16.67 ], [ '01.04.2011', 16.67 ], [ '01.07.2011', 16.67 ], [ '01.10.2011', 16.67 ],
229 [ '01.01.2012', 16.67 ], [ '01.04.2012', 16.67 ], [ '01.07.2012', 16.67 ], [ '01.10.2012', 16.67 ],
230 [ '01.01.2013', 16.67 ], [ '01.04.2013', 16.67 ], [ '01.07.2013', 16.67 ], [ '01.10.2013', 16.60 ],
231 [ '01.01.2014', 16.67 ];
233 create_invoices(periodic_invoices_config => { periodicity => 'b', order_value_periodicity => '5', start_date => DateTime->from_kivitendo('01.01.2009') });
234 are_invoices 'p=b ovp=5',[ '01.01.2009', 33.33 ], [ '01.07.2009', 33.33 ],
235 [ '01.01.2010', 33.33 ], [ '01.07.2010', 33.33 ],
236 [ '01.01.2011', 33.33 ], [ '01.07.2011', 33.33 ],
237 [ '01.01.2012', 33.33 ], [ '01.07.2012', 33.33 ],
238 [ '01.01.2013', 33.33 ], [ '01.07.2013', 33.36 ],
239 [ '01.01.2014', 33.33 ];
241 create_invoices(periodic_invoices_config => { periodicity => 'y', order_value_periodicity => '5', start_date => DateTime->from_kivitendo('01.01.2009') });
242 are_invoices 'p=y ovp=5',[ '01.01.2009', 66.67 ], [ '01.01.2010', 66.67 ], [ '01.01.2011', 66.67 ], [ '01.01.2012', 66.67 ], [ '01.01.2013', 66.65 ], [ '01.01.2014', 66.67 ];