Bug 12803 - Add ability to skip closed libraries when generating the holds queue
[koha.git] / t / db_dependent / Serials / GetNextDate.t
1 #!/usr/bin/perl
2
3 use C4::Context;
4 use Test::More tests => 96;
5 use Modern::Perl;
6
7 my $dbh = C4::Context->dbh;
8 $dbh->{RaiseError} = 1;
9 $dbh->{AutoCommit} = 0;
10
11 use C4::Serials::Frequency;
12 use C4::Serials;
13
14 # TEST CASE - 1 issue per day, no irregularities
15 my $frequency = {
16     description => "One issue per day",
17     unit => 'day',
18     issuesperunit => 1,
19     unitsperissue => 1,
20 };
21 my $id = AddSubscriptionFrequency($frequency);
22
23 my $subscription = {
24     periodicity => $id,
25     firstacquidate => '1970-01-01',
26     irregularity => '',
27     countissuesperunit => 1,
28 };
29 my $publisheddate = $subscription->{firstacquidate};
30
31 $publisheddate = GetNextDate($subscription, $publisheddate);
32 is($publisheddate, '1970-01-02');
33 $publisheddate = GetNextDate($subscription, $publisheddate);
34 is($publisheddate, '1970-01-03');
35 $publisheddate = GetNextDate($subscription, $publisheddate);
36 is($publisheddate, '1970-01-04');
37
38 # TEST CASE - 1 issue per day, irregularities
39 $subscription = {
40     periodicity => $id,
41     firstacquidate => '1970-01-01',
42     irregularity => '2;4',  # Skip the second and fourth issues
43     countissuesperunit => 1,
44 };
45 $publisheddate = $subscription->{firstacquidate};
46 $publisheddate = GetNextDate($subscription, $publisheddate);
47 is($publisheddate, '1970-01-03');
48 $publisheddate = GetNextDate($subscription, $publisheddate);
49 is($publisheddate, '1970-01-05');
50 $publisheddate = GetNextDate($subscription, $publisheddate);
51 is($publisheddate, '1970-01-06');
52
53 # TEST CASE - 2 issues per day, no irregularity
54 $id = AddSubscriptionFrequency({
55     description => "Two issues per day",
56     unit => 'day',
57     issuesperunit => 2,
58     unitsperissue => 1,
59 });
60 $subscription = {
61     periodicity => $id,
62     firstacquidate => '1970-01-01',
63     irregularity => '',
64     countissuesperunit => 1,
65 };
66 $publisheddate = $subscription->{firstacquidate};
67 $publisheddate = GetNextDate($subscription, $publisheddate);
68 is($publisheddate, '1970-01-01');
69 $publisheddate = GetNextDate($subscription, $publisheddate);
70 is($publisheddate, '1970-01-02');
71 $publisheddate = GetNextDate($subscription, $publisheddate);
72 is($publisheddate, '1970-01-02');
73 $publisheddate = GetNextDate($subscription, $publisheddate);
74 is($publisheddate, '1970-01-03');
75
76 # TEST CASE - 2 issues per day, irregularities
77 $subscription = {
78     periodicity => $id,
79     firstacquidate => '1970-01-01',
80     irregularity => '3;5;6',
81     countissuesperunit => 1,
82 };
83 $publisheddate = $subscription->{firstacquidate};
84 $publisheddate = GetNextDate($subscription, $publisheddate);
85 is($publisheddate, '1970-01-01');
86 $publisheddate = GetNextDate($subscription, $publisheddate);
87 is($publisheddate, '1970-01-02');
88 $publisheddate = GetNextDate($subscription, $publisheddate);
89 is($publisheddate, '1970-01-04');
90 $publisheddate = GetNextDate($subscription, $publisheddate);
91 is($publisheddate, '1970-01-04');
92 $publisheddate = GetNextDate($subscription, $publisheddate);
93 is($publisheddate, '1970-01-05');
94
95 # TEST CASE - 1 issue every 2 days, no irregularity
96 $id = AddSubscriptionFrequency({
97     description => "one issue every two days",
98     unit => 'day',
99     issuesperunit => 1,
100     unitsperissue => 2,
101 });
102 $subscription = {
103     periodicity => $id,
104     firstacquidate => '1970-01-01',
105     irregularity => '',
106     countissuesperunit => 1,
107 };
108 $publisheddate = $subscription->{firstacquidate};
109 $publisheddate = GetNextDate($subscription, $publisheddate);
110 is($publisheddate, '1970-01-03');
111 $publisheddate = GetNextDate($subscription, $publisheddate);
112 is($publisheddate, '1970-01-05');
113
114 # TEST CASE - 1 issue every 2 days, irregularities
115 $subscription = {
116     periodicity => $id,
117     firstacquidate => '1970-01-01',
118     irregularity => '3',
119     countissuesperunit => 1,
120 };
121 $publisheddate = $subscription->{firstacquidate};
122 $publisheddate = GetNextDate($subscription, $publisheddate);
123 is($publisheddate, '1970-01-03');
124 $publisheddate = GetNextDate($subscription, $publisheddate);
125 is($publisheddate, '1970-01-07');
126 $publisheddate = GetNextDate($subscription, $publisheddate);
127 is($publisheddate, '1970-01-09');
128
129 # TEST CASE - 1 issue per week, no irregularity
130 $id = AddSubscriptionFrequency({
131     description => "one issue per week",
132     unit => 'week',
133     issuesperunit => 1,
134     unitsperissue => 1,
135 });
136 $subscription = {
137     periodicity => $id,
138     firstacquidate => '1970-01-01',
139     irregularity => '',
140     countissuesperunit => 1,
141 };
142 $publisheddate = $subscription->{firstacquidate};
143 $publisheddate = GetNextDate($subscription, $publisheddate);
144 is($publisheddate, '1970-01-08');
145 $publisheddate = GetNextDate($subscription, $publisheddate);
146 is($publisheddate, '1970-01-15');
147
148 # TEST CASE - 1 issue per week, irregularities
149 $subscription = {
150     periodicity => $id,
151     firstacquidate => '1970-01-01',
152     irregularity => '3',
153     countissuesperunit => 1,
154 };
155 $publisheddate = $subscription->{firstacquidate};
156 $publisheddate = GetNextDate($subscription, $publisheddate);
157 is($publisheddate, '1970-01-08');
158 $publisheddate = GetNextDate($subscription, $publisheddate);
159 is($publisheddate, '1970-01-22');
160 $publisheddate = GetNextDate($subscription, $publisheddate);
161 is($publisheddate, '1970-01-29');
162
163 # TEST CASE - 1 issue every 2 weeks, no irregularity
164 $id = AddSubscriptionFrequency({
165     description => "one issue every 2 weeks",
166     unit => 'week',
167     issuesperunit => 1,
168     unitsperissue => 2,
169 });
170 $subscription = {
171     periodicity => $id,
172     firstacquidate => '1970-01-01',
173     irregularity => '',
174     countissuesperunit => 1,
175 };
176 $publisheddate = $subscription->{firstacquidate};
177 $publisheddate = GetNextDate($subscription, $publisheddate);
178 is($publisheddate, '1970-01-15');
179 $publisheddate = GetNextDate($subscription, $publisheddate);
180 is($publisheddate, '1970-01-29');
181 $publisheddate = GetNextDate($subscription, $publisheddate);
182 is($publisheddate, '1970-02-12');
183
184 # TEST CASE - 1 issue every 2 weeks, irregularities
185 $subscription = {
186     periodicity => $id,
187     firstacquidate => '1970-01-01',
188     irregularity => '3',
189     countissuesperunit => 1,
190 };
191 $publisheddate = $subscription->{firstacquidate};
192 $publisheddate = GetNextDate($subscription, $publisheddate);
193 is($publisheddate, '1970-01-15');
194 $publisheddate = GetNextDate($subscription, $publisheddate);
195 is($publisheddate, '1970-02-12');
196 $publisheddate = GetNextDate($subscription, $publisheddate);
197 is($publisheddate, '1970-02-26');
198
199 # TEST CASE - 2 issues per week, no irregularity
200 $id = AddSubscriptionFrequency({
201     description => "two issues per week",
202     unit => 'week',
203     issuesperunit => 2,
204     unitsperissue => 1,
205 });
206 $subscription = {
207     periodicity => $id,
208     firstacquidate => '1970-01-01',
209     irregularity => '',
210     countissuesperunit => 1,
211 };
212 $publisheddate = $subscription->{firstacquidate};
213 $publisheddate = GetNextDate($subscription, $publisheddate);
214 is($publisheddate, '1970-01-03');
215 # when more than 1 issue per week, date is automatically set to the same day of
216 # week as firstacquidate
217 $publisheddate = GetNextDate($subscription, $publisheddate);
218 is($publisheddate, '1970-01-08');
219 $publisheddate = GetNextDate($subscription, $publisheddate);
220 is($publisheddate, '1970-01-10');
221 $publisheddate = GetNextDate($subscription, $publisheddate);
222 is($publisheddate, '1970-01-15');
223
224 # TEST CASE - 2 issues per week, irregularities
225 $subscription = {
226     periodicity => $id,
227     firstacquidate => '1970-01-01',
228     irregularity => '3;5;6',
229     countissuesperunit => 1,
230 };
231 $publisheddate = $subscription->{firstacquidate};
232 $publisheddate = GetNextDate($subscription, $publisheddate);
233 is($publisheddate, '1970-01-03');
234 $publisheddate = GetNextDate($subscription, $publisheddate);
235 is($publisheddate, '1970-01-10');
236 $publisheddate = GetNextDate($subscription, $publisheddate);
237 is($publisheddate, '1970-01-22');
238 $publisheddate = GetNextDate($subscription, $publisheddate);
239 is($publisheddate, '1970-01-24');
240 $publisheddate = GetNextDate($subscription, $publisheddate);
241 is($publisheddate, '1970-01-29');
242
243 # TEST CASE - 6 issues per week, no irregularity
244 $id = AddSubscriptionFrequency({
245     description => "six issues per week",
246     unit => 'week',
247     issuesperunit => 6,
248     unitsperissue => 1,
249 });
250 $subscription = {
251     periodicity => $id,
252     firstacquidate => '1970-01-06',
253     irregularity => '',
254     countissuesperunit => 1,
255 };
256 $publisheddate = $subscription->{firstacquidate};
257 $publisheddate = GetNextDate($subscription, $publisheddate);
258 is($publisheddate, '1970-01-07');
259 $publisheddate = GetNextDate($subscription, $publisheddate);
260 is($publisheddate, '1970-01-08');
261 $publisheddate = GetNextDate($subscription, $publisheddate);
262 is($publisheddate, '1970-01-09');
263 $publisheddate = GetNextDate($subscription, $publisheddate);
264 is($publisheddate, '1970-01-10');
265 $publisheddate = GetNextDate($subscription, $publisheddate);
266 is($publisheddate, '1970-01-11');
267 $publisheddate = GetNextDate($subscription, $publisheddate);
268 is($publisheddate, '1970-01-13');
269
270 # TEST CASE - 6 issues per week, irregularities
271 $subscription = {
272     periodicity => $id,
273     firstacquidate => '1970-01-06',
274     irregularity => '3;5;6',
275     countissuesperunit => 1,
276 };
277 $publisheddate = $subscription->{firstacquidate};
278 $publisheddate = GetNextDate($subscription, $publisheddate);
279 is($publisheddate, '1970-01-07');
280 $publisheddate = GetNextDate($subscription, $publisheddate);
281 is($publisheddate, '1970-01-09');
282 $publisheddate = GetNextDate($subscription, $publisheddate);
283 is($publisheddate, '1970-01-13');
284 $publisheddate = GetNextDate($subscription, $publisheddate);
285 is($publisheddate, '1970-01-14');
286
287 # TEST CASE - 1 issue per month, no irregularity
288 $id = AddSubscriptionFrequency({
289     description => "1 issue per month",
290     unit => 'month',
291     issuesperunit => 1,
292     unitsperissue => 1,
293 });
294 $subscription = {
295     periodicity => $id,
296     firstacquidate => '1970-01-01',
297     irregularity => '',
298     countissuesperunit => 1,
299 };
300 $publisheddate = $subscription->{firstacquidate};
301 $publisheddate = GetNextDate($subscription, $publisheddate);
302 is($publisheddate, '1970-02-01');
303 $publisheddate = GetNextDate($subscription, $publisheddate);
304 is($publisheddate, '1970-03-01');
305 $publisheddate = GetNextDate($subscription, $publisheddate);
306 is($publisheddate, '1970-04-01');
307
308 # TEST CASE - 1 issue per month, irregularities
309 $subscription = {
310     periodicity => $id,
311     firstacquidate => '1970-01-01',
312     irregularity => '2;4',
313     countissuesperunit => 1,
314 };
315 $publisheddate = $subscription->{firstacquidate};
316 $publisheddate = GetNextDate($subscription, $publisheddate);
317 is($publisheddate, '1970-03-01');
318 $publisheddate = GetNextDate($subscription, $publisheddate);
319 is($publisheddate, '1970-05-01');
320 $publisheddate = GetNextDate($subscription, $publisheddate);
321 is($publisheddate, '1970-06-01');
322
323 # TEST CASE - 1 issue every 2 months, no irregularity
324 $id = AddSubscriptionFrequency({
325     description => "1 issue every 2 months",
326     unit => 'month',
327     issuesperunit => 1,
328     unitsperissue => 2,
329 });
330 $subscription = {
331     periodicity => $id,
332     firstacquidate => '1970-01-01',
333     irregularity => '',
334     countissuesperunit => 1,
335 };
336 $publisheddate = $subscription->{firstacquidate};
337 $publisheddate = GetNextDate($subscription, $publisheddate);
338 is($publisheddate, '1970-03-01');
339 $publisheddate = GetNextDate($subscription, $publisheddate);
340 is($publisheddate, '1970-05-01');
341 $publisheddate = GetNextDate($subscription, $publisheddate);
342 is($publisheddate, '1970-07-01');
343
344 # TEST CASE - 1 issue every 2 months, irregularities
345 $subscription = {
346     periodicity => $id,
347     firstacquidate => '1970-01-01',
348     irregularity => '2;3',
349     countissuesperunit => 1,
350 };
351 $publisheddate = $subscription->{firstacquidate};
352 $publisheddate = GetNextDate($subscription, $publisheddate);
353 is($publisheddate, '1970-07-01');
354 $publisheddate = GetNextDate($subscription, $publisheddate);
355 is($publisheddate, '1970-09-01');
356 $publisheddate = GetNextDate($subscription, $publisheddate);
357 is($publisheddate, '1970-11-01');
358
359 # TEST CASE - 2 issues per month, no irregularity
360 $id = AddSubscriptionFrequency({
361     description => "2 issues per month",
362     unit => 'month',
363     issuesperunit => 2,
364     unitsperissue => 1,
365 });
366 $subscription = {
367     periodicity => $id,
368     firstacquidate => '1970-01-01',
369     irregularity => '',
370     countissuesperunit => 1,
371 };
372 $publisheddate = $subscription->{firstacquidate};
373 $publisheddate = GetNextDate($subscription, $publisheddate);
374 is($publisheddate, '1970-01-16', 'January has 31 days');
375 $publisheddate = GetNextDate($subscription, $publisheddate);
376 is($publisheddate, '1970-02-01');
377 $publisheddate = GetNextDate($subscription, $publisheddate);
378 is($publisheddate, '1970-02-15', 'February has only 28 days');
379 $publisheddate = GetNextDate($subscription, $publisheddate);
380 is($publisheddate, '1970-03-01');
381
382 # TEST CASE - 2 issues per month, irregularities
383 $subscription = {
384     periodicity => $id,
385     firstacquidate => '1970-01-01',
386     irregularity => '3;5;6',
387     countissuesperunit => 1,
388 };
389 $publisheddate = $subscription->{firstacquidate};
390 $publisheddate = GetNextDate($subscription, $publisheddate);
391 is($publisheddate, '1970-01-16', 'January has 31 days');
392 $publisheddate = GetNextDate($subscription, $publisheddate);
393 is($publisheddate, '1970-02-15', 'February has only 28 days');
394 $publisheddate = GetNextDate($subscription, $publisheddate);
395 is($publisheddate, '1970-04-01');
396 $publisheddate = GetNextDate($subscription, $publisheddate);
397 is($publisheddate, '1970-04-16', 'April has 30 days');
398 $publisheddate = GetNextDate($subscription, $publisheddate);
399 is($publisheddate, '1970-05-01');
400
401 # TEST CASE - 1 issue per year, no irregularity
402 $id = AddSubscriptionFrequency({
403     description => "1 issue per year",
404     unit => 'year',
405     issuesperunit => 1,
406     unitsperissue => 1,
407 });
408 $subscription = {
409     periodicity => $id,
410     firstacquidate => '1970-01-01',
411     irregularity => '',
412     countissuesperunit => 1,
413 };
414 $publisheddate = $subscription->{firstacquidate};
415 $publisheddate = GetNextDate($subscription, $publisheddate);
416 is($publisheddate, '1971-01-01');
417 $publisheddate = GetNextDate($subscription, $publisheddate);
418 is($publisheddate, '1972-01-01');
419 $publisheddate = GetNextDate($subscription, $publisheddate);
420 is($publisheddate, '1973-01-01');
421
422 # TEST CASE - 1 issue per year, irregularities
423 $subscription = {
424     periodicity => $id,
425     firstacquidate => '1970-01-01',
426     irregularity => '2;4',
427     countissuesperunit => 1,
428 };
429 $publisheddate = $subscription->{firstacquidate};
430 $publisheddate = GetNextDate($subscription, $publisheddate);
431 is($publisheddate, '1972-01-01');
432 $publisheddate = GetNextDate($subscription, $publisheddate);
433 is($publisheddate, '1974-01-01');
434 $publisheddate = GetNextDate($subscription, $publisheddate);
435 is($publisheddate, '1975-01-01');
436
437 # TEST CASE - 1 issue every 2 years, no irregularity
438 $id = AddSubscriptionFrequency({
439     description => "1 issue every 2 years",
440     unit => 'year',
441     issuesperunit => 1,
442     unitsperissue => 2,
443 });
444 $subscription = {
445     periodicity => $id,
446     firstacquidate => '1970-01-01',
447     irregularity => '',
448     countissuesperunit => 1,
449 };
450 $publisheddate = $subscription->{firstacquidate};
451 $publisheddate = GetNextDate($subscription, $publisheddate);
452 is($publisheddate, '1972-01-01');
453 $publisheddate = GetNextDate($subscription, $publisheddate);
454 is($publisheddate, '1974-01-01');
455 $publisheddate = GetNextDate($subscription, $publisheddate);
456 is($publisheddate, '1976-01-01');
457
458 # TEST CASE - 1 issue every 2 years, irregularities
459 $subscription = {
460     periodicity => $id,
461     firstacquidate => '1970-01-01',
462     irregularity => '2;4',
463     countissuesperunit => 1,
464 };
465 $publisheddate = $subscription->{firstacquidate};
466 $publisheddate = GetNextDate($subscription, $publisheddate);
467 is($publisheddate, '1974-01-01');
468 $publisheddate = GetNextDate($subscription, $publisheddate);
469 is($publisheddate, '1978-01-01');
470 $publisheddate = GetNextDate($subscription, $publisheddate);
471 is($publisheddate, '1980-01-01');
472
473 # TEST CASE - 2 issues per year, no irregularity
474 $id = AddSubscriptionFrequency({
475     description => "1 issue every 2 years",
476     unit => 'year',
477     issuesperunit => 2,
478     unitsperissue => 1,
479 });
480 $subscription = {
481     periodicity => $id,
482     firstacquidate => '1970-01-01',
483     irregularity => '',
484     countissuesperunit => 1,
485 };
486 $publisheddate = $subscription->{firstacquidate};
487 $publisheddate = GetNextDate($subscription, $publisheddate);
488 is($publisheddate, '1970-07-02');
489 $publisheddate = GetNextDate($subscription, $publisheddate);
490 is($publisheddate, '1971-01-01');
491 $publisheddate = GetNextDate($subscription, $publisheddate);
492 is($publisheddate, '1971-07-02');
493 $publisheddate = GetNextDate($subscription, $publisheddate);
494 is($publisheddate, '1972-01-01');
495
496 # TEST CASE - 2 issues per year, irregularities
497 $subscription = {
498     periodicity => $id,
499     firstacquidate => '1970-01-01',
500     irregularity => '3;5;6',
501     countissuesperunit => 1,
502 };
503 $publisheddate = $subscription->{firstacquidate};
504 $publisheddate = GetNextDate($subscription, $publisheddate);
505 is($publisheddate, '1970-07-02');
506 $publisheddate = GetNextDate($subscription, $publisheddate);
507 is($publisheddate, '1971-07-02');
508 $publisheddate = GetNextDate($subscription, $publisheddate);
509 is($publisheddate, '1973-01-01');
510 $publisheddate = GetNextDate($subscription, $publisheddate);
511 is($publisheddate, '1973-07-02');
512 $publisheddate = GetNextDate($subscription, $publisheddate);
513 is($publisheddate, '1974-01-01');
514
515 # TEST CASE - Irregular
516 $id = AddSubscriptionFrequency({
517     description => "Irregular",
518     unit => undef,
519     issuesperunit => 1,
520     unitsperissue => 1,
521 });
522 $subscription = {
523     periodicity => $id,
524     firstacquidate => '1970-01-01',
525     irregularity => '',
526     countissuesperunit => 1,
527 };
528 $publisheddate = $subscription->{firstacquidate};
529 # GetNextDate always return undef if subscription is irregular
530 $publisheddate = GetNextDate($subscription, $publisheddate);
531 is($publisheddate, undef);
532
533 # GetNextDate returns undef if one of two first parameters is undef
534 $publisheddate = GetNextDate($subscription, undef);
535 is($publisheddate, undef);
536 $publisheddate = GetNextDate(undef, $subscription->{firstacquidate});
537 is($publisheddate, undef);
538 $publisheddate = GetNextDate(undef, undef);
539 is($publisheddate, undef);
540
541 $dbh->rollback;