Koha/t/db_dependent/Serials/GetNextDate.t
Julian Maurice 8b94c89f0b Bug 12671: Guess next serial date when there are several issues per unit
This guess uses the following algorithm
1/ Get the number of days remaining from first issue of this unit of
time until the end of the unit of time (using 7 days for week, 28 for
month and 365 for year)
2/ Divide it by the number of issues per unit
3/ Take the integer part of the result, this is the number of days to
add to previous serial published date

This patch also try to guess the date of the first issue of a unit of
time. Before that, it was:
- for week: monday of week
- for month: 1st day of month
- for year: 1st day of year
Now it uses firstacquidate.

Example:
  firstacquidate = 1970-01-07 (wednesday)
  unit = week
  issuesperunit = 2 (2 issues per week)

  From wednesday to sunday, there are 4 days so we add 2 days to get the
  next date.
  The next dates should be:
  - 1970-01-09 (+ 2 days)
  - 1970-01-14 (wednesday of next week)
  - 1970-01-16 (+ 2 days)
  - ... and so on

Test plan:
1/ Go to numbering pattern creation page (Serials -> Manager numbering
patterns -> New numbering pattern)
2/ In "Test prediction pattern" fieldset, set subscription length to 50
issues (this avoid to compute the next 1000 dates, which can take time)
3/ Fill first issue publication date
4/ Choose the frequency you want to test
5/ click on "Test pattern" button
6/ Check that the dates are correct
7/ Repeat steps 3-7 until you think you have tested enough cases

Interesting frequencies to test:
- 1/day
- 1/week
- 2/week
- 6/week (firstacquidate should be monday or tuesday, or the generated
  dates will be the same for all the week)
- 1/month
- 2/month
- 3/month
- 1/year
- 2/year
- 3/year

----------------
Sign off report:
----------------
-Followed the test plan. Unit tests work. Also trying some more strange
 frequencies with our librarians:
 5/year, 43/year, 10/year.
-Received all serials for a subscription and found no errors.
-Received some serials with frequency 2/month pre-patch, getting publication
 date as 1st of every month for each magazine. Having applied the patch,
 publication dates started working mid-subscription for new magazines.
-Works well and fine!
Signed-off-by: Olli-Antti Kivilahti <olli-antti.kivilahti@jns.fi>

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@gmail.com>
2015-05-05 15:22:10 -03:00

541 lines
18 KiB
Perl

#!/usr/bin/perl
use C4::Context;
use Test::More tests => 96;
use Modern::Perl;
my $dbh = C4::Context->dbh;
$dbh->{RaiseError} = 1;
$dbh->{AutoCommit} = 0;
use C4::Serials::Frequency;
use C4::Serials;
# TEST CASE - 1 issue per day, no irregularities
my $frequency = {
description => "One issue per day",
unit => 'day',
issuesperunit => 1,
unitsperissue => 1,
};
my $id = AddSubscriptionFrequency($frequency);
my $subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
irregularity => '',
countissuesperunit => 1,
};
my $publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-02');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-03');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-04');
# TEST CASE - 1 issue per day, irregularities
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
irregularity => '2;4', # Skip the second and fourth issues
countissuesperunit => 1,
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-03');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-05');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-06');
# TEST CASE - 2 issues per day, no irregularity
$id = AddSubscriptionFrequency({
description => "Two issues per day",
unit => 'day',
issuesperunit => 2,
unitsperissue => 1,
});
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
irregularity => '',
countissuesperunit => 1,
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-01');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-02');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-02');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-03');
# TEST CASE - 2 issues per day, irregularities
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
irregularity => '3;5;6',
countissuesperunit => 1,
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-01');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-02');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-04');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-04');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-05');
# TEST CASE - 1 issue every 2 days, no irregularity
$id = AddSubscriptionFrequency({
description => "one issue every two days",
unit => 'day',
issuesperunit => 1,
unitsperissue => 2,
});
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
irregularity => '',
countissuesperunit => 1,
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-03');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-05');
# TEST CASE - 1 issue every 2 days, irregularities
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
irregularity => '3',
countissuesperunit => 1,
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-03');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-07');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-09');
# TEST CASE - 1 issue per week, no irregularity
$id = AddSubscriptionFrequency({
description => "one issue per week",
unit => 'week',
issuesperunit => 1,
unitsperissue => 1,
});
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
irregularity => '',
countissuesperunit => 1,
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-08');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-15');
# TEST CASE - 1 issue per week, irregularities
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
irregularity => '3',
countissuesperunit => 1,
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-08');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-22');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-29');
# TEST CASE - 1 issue every 2 weeks, no irregularity
$id = AddSubscriptionFrequency({
description => "one issue every 2 weeks",
unit => 'week',
issuesperunit => 1,
unitsperissue => 2,
});
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
irregularity => '',
countissuesperunit => 1,
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-15');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-29');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-02-12');
# TEST CASE - 1 issue every 2 weeks, irregularities
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
irregularity => '3',
countissuesperunit => 1,
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-15');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-02-12');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-02-26');
# TEST CASE - 2 issues per week, no irregularity
$id = AddSubscriptionFrequency({
description => "two issues per week",
unit => 'week',
issuesperunit => 2,
unitsperissue => 1,
});
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
irregularity => '',
countissuesperunit => 1,
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-03');
# when more than 1 issue per week, date is automatically set to the same day of
# week as firstacquidate
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-08');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-10');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-15');
# TEST CASE - 2 issues per week, irregularities
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
irregularity => '3;5;6',
countissuesperunit => 1,
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-03');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-10');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-22');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-24');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-29');
# TEST CASE - 6 issues per week, no irregularity
$id = AddSubscriptionFrequency({
description => "six issues per week",
unit => 'week',
issuesperunit => 6,
unitsperissue => 1,
});
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-06',
irregularity => '',
countissuesperunit => 1,
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-07');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-08');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-09');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-10');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-11');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-13');
# TEST CASE - 6 issues per week, irregularities
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-06',
irregularity => '3;5;6',
countissuesperunit => 1,
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-07');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-09');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-13');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-14');
# TEST CASE - 1 issue per month, no irregularity
$id = AddSubscriptionFrequency({
description => "1 issue per month",
unit => 'month',
issuesperunit => 1,
unitsperissue => 1,
});
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
irregularity => '',
countissuesperunit => 1,
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-02-01');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-03-01');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-04-01');
# TEST CASE - 1 issue per month, irregularities
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
irregularity => '2;4',
countissuesperunit => 1,
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-03-01');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-05-01');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-06-01');
# TEST CASE - 1 issue every 2 months, no irregularity
$id = AddSubscriptionFrequency({
description => "1 issue every 2 months",
unit => 'month',
issuesperunit => 1,
unitsperissue => 2,
});
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
irregularity => '',
countissuesperunit => 1,
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-03-01');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-05-01');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-07-01');
# TEST CASE - 1 issue every 2 months, irregularities
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
irregularity => '2;3',
countissuesperunit => 1,
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-07-01');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-09-01');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-11-01');
# TEST CASE - 2 issues per month, no irregularity
$id = AddSubscriptionFrequency({
description => "2 issues per month",
unit => 'month',
issuesperunit => 2,
unitsperissue => 1,
});
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
irregularity => '',
countissuesperunit => 1,
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-15');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-02-01');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-02-15');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-03-01');
# TEST CASE - 2 issues per month, irregularities
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
irregularity => '3;5;6',
countissuesperunit => 1,
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-15');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-02-15');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-04-01');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-04-15');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-05-01');
# TEST CASE - 1 issue per year, no irregularity
$id = AddSubscriptionFrequency({
description => "1 issue per year",
unit => 'year',
issuesperunit => 1,
unitsperissue => 1,
});
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
irregularity => '',
countissuesperunit => 1,
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1971-01-01');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1972-01-01');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1973-01-01');
# TEST CASE - 1 issue per year, irregularities
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
irregularity => '2;4',
countissuesperunit => 1,
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1972-01-01');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1974-01-01');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1975-01-01');
# TEST CASE - 1 issue every 2 years, no irregularity
$id = AddSubscriptionFrequency({
description => "1 issue every 2 years",
unit => 'year',
issuesperunit => 1,
unitsperissue => 2,
});
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
irregularity => '',
countissuesperunit => 1,
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1972-01-01');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1974-01-01');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1976-01-01');
# TEST CASE - 1 issue every 2 years, irregularities
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
irregularity => '2;4',
countissuesperunit => 1,
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1974-01-01');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1978-01-01');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1980-01-01');
# TEST CASE - 2 issues per year, no irregularity
$id = AddSubscriptionFrequency({
description => "1 issue every 2 years",
unit => 'year',
issuesperunit => 2,
unitsperissue => 1,
});
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
irregularity => '',
countissuesperunit => 1,
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-07-02');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1971-01-01');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1971-07-02');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1972-01-01');
# TEST CASE - 2 issues per year, irregularities
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
irregularity => '3;5;6',
countissuesperunit => 1,
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-07-02');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1971-07-02');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1973-01-01');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1973-07-02');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1974-01-01');
# TEST CASE - Irregular
$id = AddSubscriptionFrequency({
description => "Irregular",
unit => undef,
issuesperunit => 1,
unitsperissue => 1,
});
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
irregularity => '',
countissuesperunit => 1,
};
$publisheddate = $subscription->{firstacquidate};
# GetNextDate always return undef if subscription is irregular
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, undef);
# GetNextDate returns undef if one of two first parameters is undef
$publisheddate = GetNextDate($subscription, undef);
is($publisheddate, undef);
$publisheddate = GetNextDate(undef, $subscription->{firstacquidate});
is($publisheddate, undef);
$publisheddate = GetNextDate(undef, undef);
is($publisheddate, undef);
$dbh->rollback;