sub _get_next_date_day {
my ($subscription, $freqdata, $year, $month, $day) = @_;
- if ($subscription->{'countissuesperunit'} + 1 > $freqdata->{'issuesperunit'}){
- ($year,$month,$day) = Add_Delta_Days($year,$month, $day , $freqdata->{'unitsperissue'} );
- $subscription->{'countissuesperunit'} = 1;
+ if ($subscription->{countissuesperunit} + 1 > $freqdata->{issuesperunit}){
+ ($year,$month,$day) = Add_Delta_Days($year,$month, $day , $freqdata->{unitsperissue} );
+ $subscription->{countissuesperunit} = 1;
} else {
- $subscription->{'countissuesperunit'}++;
+ $subscription->{countissuesperunit}++;
}
return ($year, $month, $day);
my ($subscription, $freqdata, $year, $month, $day) = @_;
my ($wkno, $yr) = Week_of_Year($year, $month, $day);
+ my $fa_dow = Day_of_Week(split /-/, $subscription->{firstacquidate});
- if ($subscription->{'countissuesperunit'} + 1 > $freqdata->{'issuesperunit'}){
- $subscription->{'countissuesperunit'} = 1;
- $wkno += $freqdata->{"unitsperissue"};
+ if ($subscription->{countissuesperunit} + 1 > $freqdata->{issuesperunit}){
+ $subscription->{countissuesperunit} = 1;
+ $wkno += $freqdata->{unitsperissue};
if($wkno > 52){
$wkno = $wkno % 52;
$yr++;
}
- my $dow = Day_of_Week($year, $month, $day);
($year,$month,$day) = Monday_of_Week($wkno, $yr);
- if($freqdata->{'issuesperunit'} == 1) {
- ($year, $month, $day) = Add_Delta_Days($year, $month, $day, $dow - 1);
- }
+ ($year,$month,$day) = Add_Delta_Days($year, $month, $day, $fa_dow - 1);
} else {
- $subscription->{'countissuesperunit'}++;
+ # Try to guess the next day of week
+ my $delta_days = int((7 - ($fa_dow - 1)) / $freqdata->{issuesperunit});
+ ($year,$month,$day) = Add_Delta_Days($year, $month, $day, $delta_days);
+ $subscription->{countissuesperunit}++;
}
return ($year, $month, $day);
sub _get_next_date_month {
my ($subscription, $freqdata, $year, $month, $day) = @_;
- if ($subscription->{'countissuesperunit'} + 1 > $freqdata->{'issuesperunit'}){
- $subscription->{'countissuesperunit'} = 1;
- ($year,$month,$day) = Add_Delta_YM($year,$month,$day, 0,$freqdata->{"unitsperissue"});
- unless($freqdata->{'issuesperunit'} == 1) {
- $day = 1; # Jumping to the first day of month, because we don't know what day is expected
- }
+ my $fa_day;
+ (undef, undef, $fa_day) = split /-/, $subscription->{firstacquidate};
+
+ if ($subscription->{countissuesperunit} + 1 > $freqdata->{issuesperunit}){
+ $subscription->{countissuesperunit} = 1;
+ ($year,$month,$day) = Add_Delta_YM($year,$month,$day, 0,
+ $freqdata->{unitsperissue});
+ my $days_in_month = Days_in_Month($year, $month);
+ $day = $fa_day <= $days_in_month ? $fa_day : $days_in_month;
} else {
- $subscription->{'countissuesperunit'}++;
+ # Try to guess the next day in month
+ my $delta_days = int((28 - ($fa_day - 1)) / $freqdata->{issuesperunit});
+ ($year,$month,$day) = Add_Delta_Days($year, $month, $day, $delta_days);
+ $subscription->{countissuesperunit}++;
}
return ($year, $month, $day);
sub _get_next_date_year {
my ($subscription, $freqdata, $year, $month, $day) = @_;
- if ($subscription->{'countissuesperunit'} + 1 > $freqdata->{'issuesperunit'}){
- $subscription->{'countissuesperunit'} = 1;
- ($year,$month,$day) = Add_Delta_YM($year,$month,$day, $freqdata->{"unitsperissue"},0);
- unless($freqdata->{'issuesperunit'} == 1) {
- # Jumping to the first day of year, because we don't know what day is expected
- $month = 1;
- $day = 1;
- }
+ my ($fa_year, $fa_month, $fa_day) = split /-/, $subscription->{firstacquidate};
+
+ if ($subscription->{countissuesperunit} + 1 > $freqdata->{issuesperunit}){
+ $subscription->{countissuesperunit} = 1;
+ ($year) = Add_Delta_YM($year,$month,$day, $freqdata->{"unitsperissue"},0);
+ $month = $fa_month;
+ my $days_in_month = Days_in_Month($year, $month);
+ $day = $fa_day <= $days_in_month ? $fa_day : $days_in_month;
} else {
- $subscription->{'countissuesperunit'}++;
+ # Try to guess the next day in year
+ my $delta_days = int((365 - ($fa_day - 1)) / $freqdata->{issuesperunit});
+ ($year,$month,$day) = Add_Delta_Days($year, $month, $day, $delta_days);
+ $subscription->{countissuesperunit}++;
}
return ($year, $month, $day);
#!/usr/bin/perl
use C4::Context;
-use Test::More tests => 86;
+use Test::More tests => 96;
use Modern::Perl;
my $dbh = C4::Context->dbh;
use C4::Serials::Frequency;
use C4::Serials;
-# TEST CASE 1 - 1 issue per day, no irregularities
+# TEST CASE - 1 issue per day, no irregularities
my $frequency = {
description => "One issue per day",
unit => 'day',
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-04');
-# TEST CASE 2 - 1 issue per day, irregularities
+# TEST CASE - 1 issue per day, irregularities
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-06');
-# TEST CASE 3 - 2 issues per day, no irregularity
+# TEST CASE - 2 issues per day, no irregularity
$id = AddSubscriptionFrequency({
description => "Two issues per day",
unit => 'day',
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-03');
-# TEST CASE 4 - 2 issues per day, irregularities
+# TEST CASE - 2 issues per day, irregularities
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-05');
-# TEST CASE 5 - 1 issue every 2 days, no irregularity
+# TEST CASE - 1 issue every 2 days, no irregularity
$id = AddSubscriptionFrequency({
description => "one issue every two days",
unit => 'day',
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-05');
-# TEST CASE 6 - 1 issue every 2 days, irregularities
+# TEST CASE - 1 issue every 2 days, irregularities
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-09');
-# TEST CASE 7 - 1 issue per week, no irregularity
+# TEST CASE - 1 issue per week, no irregularity
$id = AddSubscriptionFrequency({
description => "one issue per week",
unit => 'week',
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-15');
-# TEST CASE 8 - 1 issue per week, irregularities
+# TEST CASE - 1 issue per week, irregularities
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-01-29');
-# TEST CASE 9 - 1 issue every 2 weeks, no irregularity
+# TEST CASE - 1 issue every 2 weeks, no irregularity
$id = AddSubscriptionFrequency({
description => "one issue every 2 weeks",
unit => 'week',
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-02-12');
-# TEST CASE 10 - 1 issue every 2 weeks, irregularities
+# TEST CASE - 1 issue every 2 weeks, irregularities
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-02-26');
-# TEST CASE 11 - 2 issues per week, no irregularity
+# TEST CASE - 2 issues per week, no irregularity
$id = AddSubscriptionFrequency({
description => "two issues per week",
unit => 'week',
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
-is($publisheddate, '1970-01-01');
-# when more than 1 issue per week, date is automatically set to monday
-# because we can't guess the right day
+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-05');
+is($publisheddate, '1970-01-08');
$publisheddate = GetNextDate($subscription, $publisheddate);
-is($publisheddate, '1970-01-05');
+is($publisheddate, '1970-01-10');
$publisheddate = GetNextDate($subscription, $publisheddate);
-is($publisheddate, '1970-01-12');
+is($publisheddate, '1970-01-15');
-# TEST CASE 12 - 2 issues per week, irregularities
+# TEST CASE - 2 issues per week, irregularities
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
-is($publisheddate, '1970-01-01');
+is($publisheddate, '1970-01-03');
$publisheddate = GetNextDate($subscription, $publisheddate);
-is($publisheddate, '1970-01-05');
+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-19');
+is($publisheddate, '1970-01-09');
$publisheddate = GetNextDate($subscription, $publisheddate);
-is($publisheddate, '1970-01-19');
+is($publisheddate, '1970-01-13');
$publisheddate = GetNextDate($subscription, $publisheddate);
-is($publisheddate, '1970-01-26');
+is($publisheddate, '1970-01-14');
-# TEST CASE 13 - 1 issue per month, no irregularity
+# TEST CASE - 1 issue per month, no irregularity
$id = AddSubscriptionFrequency({
description => "1 issue per month",
unit => 'month',
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-04-01');
-# TEST CASE 14 - 1 issue per month, irregularities
+# TEST CASE - 1 issue per month, irregularities
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-06-01');
-# TEST CASE 15 - 1 issue every 2 months, no irregularity
+# TEST CASE - 1 issue every 2 months, no irregularity
$id = AddSubscriptionFrequency({
description => "1 issue every 2 months",
unit => 'month',
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-07-01');
-# TEST CASE 16 - 1 issue every 2 months, irregularities
+# TEST CASE - 1 issue every 2 months, irregularities
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-11-01');
-# TEST CASE 17 - 2 issues per month, no irregularity
+# TEST CASE - 2 issues per month, no irregularity
$id = AddSubscriptionFrequency({
description => "2 issues per month",
unit => 'month',
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
-is($publisheddate, '1970-01-01');
+is($publisheddate, '1970-01-15');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-02-01');
$publisheddate = GetNextDate($subscription, $publisheddate);
-is($publisheddate, '1970-02-01');
+is($publisheddate, '1970-02-15');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-03-01');
-# TEST CASE 18 - 2 issues per month, irregularities
+# TEST CASE - 2 issues per month, irregularities
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
-is($publisheddate, '1970-01-01');
+is($publisheddate, '1970-01-15');
$publisheddate = GetNextDate($subscription, $publisheddate);
-is($publisheddate, '1970-02-01');
+is($publisheddate, '1970-02-15');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-04-01');
$publisheddate = GetNextDate($subscription, $publisheddate);
-is($publisheddate, '1970-04-01');
+is($publisheddate, '1970-04-15');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1970-05-01');
-# TEST CASE 19 - 1 issue per year, no irregularity
+# TEST CASE - 1 issue per year, no irregularity
$id = AddSubscriptionFrequency({
description => "1 issue per year",
unit => 'year',
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1973-01-01');
-# TEST CASE 20 - 1 issue per year, irregularities
+# TEST CASE - 1 issue per year, irregularities
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1975-01-01');
-# TEST CASE 21 - 1 issue every 2 years, no irregularity
+# TEST CASE - 1 issue every 2 years, no irregularity
$id = AddSubscriptionFrequency({
description => "1 issue every 2 years",
unit => 'year',
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1976-01-01');
-# TEST CASE 22 - 1 issue every 2 years, irregularities
+# TEST CASE - 1 issue every 2 years, irregularities
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1980-01-01');
-# TEST CASE 23 - 2 issues per year, no irregularity
+# TEST CASE - 2 issues per year, no irregularity
$id = AddSubscriptionFrequency({
description => "1 issue every 2 years",
unit => 'year',
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
-is($publisheddate, '1970-01-01');
+is($publisheddate, '1970-07-02');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1971-01-01');
$publisheddate = GetNextDate($subscription, $publisheddate);
-is($publisheddate, '1971-01-01');
+is($publisheddate, '1971-07-02');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1972-01-01');
-# TEST CASE 24 - 2 issues per year, irregularities
+# TEST CASE - 2 issues per year, irregularities
$subscription = {
periodicity => $id,
firstacquidate => '1970-01-01',
};
$publisheddate = $subscription->{firstacquidate};
$publisheddate = GetNextDate($subscription, $publisheddate);
-is($publisheddate, '1970-01-01');
+is($publisheddate, '1970-07-02');
$publisheddate = GetNextDate($subscription, $publisheddate);
-is($publisheddate, '1971-01-01');
+is($publisheddate, '1971-07-02');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1973-01-01');
$publisheddate = GetNextDate($subscription, $publisheddate);
-is($publisheddate, '1973-01-01');
+is($publisheddate, '1973-07-02');
$publisheddate = GetNextDate($subscription, $publisheddate);
is($publisheddate, '1974-01-01');
-# TEST CASE 25 - Irregular
+# TEST CASE - Irregular
$id = AddSubscriptionFrequency({
description => "Irregular",
unit => undef,