Bug 18607: Fix date calculations for monthly frequencies in Serials
Similarly to the solution of bug 18356, this patch fixes the date calculation for monthly frequencies. The calculation in GetFictiveIssueNumber now makes use of the new _delta_units sub introduced on bug 18356. The calculation in _get_next_date_month is also very similar to the one in _get_next_date_year. I do not merge them here, but this could still be considered later on. At least consistency is achieved now between both routines. The connection with firstacquidate has been cut thru just like for year units. Test plan: [1] Without this patch, look at the prediction pattern for a subscription with first issue on Feb 21 and 5 per month. The first issues will be 21, 22, 23, 24, 25. Then jumping to 21, 23, 25, etc. [2] Apply the patch. Look at the same prediction pattern. You will now see 6 day intervals and a new cycle starting on the 21st. So Feb 21, 27, Mar 5, 11, 17 and Mar 21, 27, etc. [3] Edit an subscription. Try a few other monthly frequencies. [4] The next patch adjusts related unit tests. Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl> Signed-off-by: Josef Moravec <josef.moravec@gmail.com> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
This commit is contained in:
parent
d71fb0e17c
commit
adfcd8d79c
1 changed files with 19 additions and 21 deletions
|
@ -2294,12 +2294,8 @@ sub GetFictiveIssueNumber {
|
|||
($wkno, $year) = Week_of_Year($year, $month, $day);
|
||||
my ($fa_wkno, $fa_yr) = Week_of_Year($fa_year, $fa_month, $fa_day);
|
||||
$delta = ($fa_yr == $year) ? ($wkno - $fa_wkno) : ( ($year-$fa_yr-1)*52 + (52-$fa_wkno+$wkno) );
|
||||
} elsif($unit eq 'month') {
|
||||
$delta = ($fa_year == $year)
|
||||
? ($month - $fa_month)
|
||||
: ( ($year-$fa_year-1)*12 + (12-$fa_month+$month) );
|
||||
} elsif( $unit eq 'year' ) {
|
||||
$delta = _delta_units( [ $fa_year, $fa_month, $fa_day ], [ $year, $month, $day ], 'year' );
|
||||
} elsif( $unit eq 'month' || $unit eq 'year' ) {
|
||||
$delta = _delta_units( [$fa_year, $fa_month, $fa_day], [$year, $month, $day], $unit );
|
||||
}
|
||||
if($frequency->{'unitsperissue'} == 1) {
|
||||
$issueno = $delta * $frequency->{'issuesperunit'} + $subscription->{'countissuesperunit'};
|
||||
|
@ -2373,24 +2369,26 @@ sub _get_next_date_week {
|
|||
sub _get_next_date_month {
|
||||
my ($subscription, $freqdata, $year, $month, $day) = @_;
|
||||
|
||||
my $fa_day;
|
||||
(undef, undef, $fa_day) = split /-/, $subscription->{firstacquidate};
|
||||
my @newissue; # ( yy, mm, dd )
|
||||
my $delta_days = int( 30 / $freqdata->{issuesperunit} );
|
||||
|
||||
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 {
|
||||
# Try to guess the next day in month
|
||||
my $days_in_month = Days_in_Month($year, $month);
|
||||
my $delta_days = int(($days_in_month - ($fa_day - 1)) / $freqdata->{issuesperunit});
|
||||
($year,$month,$day) = Add_Delta_Days($year, $month, $day, $delta_days);
|
||||
if( $freqdata->{issuesperunit} == 1 ) {
|
||||
# Add full months
|
||||
@newissue = Add_Delta_YM(
|
||||
$year, $month, $day, 0, $freqdata->{"unitsperissue"} );
|
||||
} elsif ( $subscription->{countissuesperunit} < $freqdata->{issuesperunit} ) {
|
||||
# Add rounded number of days based on frequency.
|
||||
@newissue = Add_Delta_Days( $year, $month, $day, $delta_days );
|
||||
$subscription->{countissuesperunit}++;
|
||||
} else {
|
||||
# We finished a cycle of issues within a unit.
|
||||
# Subtract delta * (issues - 1), add 1 month
|
||||
@newissue = Add_Delta_Days( $year, $month, $day,
|
||||
-$delta_days * ($freqdata->{issuesperunit} - 1) );
|
||||
@newissue = Add_Delta_YM( @newissue, 0, 1 );
|
||||
$subscription->{countissuesperunit} = 1;
|
||||
}
|
||||
|
||||
return ($year, $month, $day);
|
||||
return @newissue;
|
||||
}
|
||||
|
||||
sub _get_next_date_year {
|
||||
|
|
Loading…
Reference in a new issue