Koha/serials/showpredictionpattern.pl
Julian Maurice 47a9afcb7e Bug 12003: Do not calculate next pubdate for irregular subscriptions
Show 'Unknown' when planneddate and publisheddate cannot be calculated

Also fixes SQL query in misc/cronjobs/serialsUpdate.pl that was still
using "periodicity != 32" to exclude irregular subscriptions from
results

Test plan:

1) Create a subscription in the serials module. Make sure to choose:
   Frequency = Irregular
2) Test the prediction pattern, first publication date is set to
   "First issue publication date" field, others will show as
   'unknown'
3) Save the subscription
4) Check the created issue - it will show a published date and a
   planned date (same as "First issue publication date" field)
5) Receive the issue and check the next generated issue, planned
   date and published date should show as 'Unknown'
6) Generate a next issue, planned date and published date should
   also show as 'Unknown'

Signed-off-by: Bernardo Gonzalez Kriegel <bgkriegel@gmail.com>
Work as described following test plan.
No koha-qa errors

Signed-off-by: Katrin Fischer <Katrin.Fischer.83@web.de>
Passes all tests and QA script.
Also tested:
- multi receiving generates mulitple issues without dates - 'unknown'
- staff detail page shows the dates empty, which is fine
- OPAC detail page shows the dates empty, which is fine
- serial collection page shows 'unknown' and those issues appear
  on the 'manage' tab, as they did in the past
- Editing the issue from the serial collection page leaves the
  date fields empty.
- Receving the issue, setting the status to 'Arrived' the Expected on
  date is set to 'today' automatically. Date published has to be
  entered manually (maybe something we could improve later
- subscription detail > issues tab shows Uknown.
- t/db_dependent/Serials/GetNextDate.t pass.

Signed-off-by: Galen Charlton <gmc@esilibrary.com>
2014-04-18 20:57:51 +00:00

194 lines
6.3 KiB
Perl
Executable file

#!/usr/bin/perl
# Copyright 2011-2013 Biblibre SARL
#
# This file is part of Koha.
#
# Koha is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# Koha is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Koha; if not, see <http://www.gnu.org/licenses>.
=head1 NAME
showpredictionpattern.pl
=head1 DESCRIPTION
This script calculate numbering of serials based on numbering pattern, and
publication date, based on frequency and first publication date.
=cut
use Modern::Perl;
use CGI;
use Date::Calc qw(Today Day_of_Year Week_of_Year Day_of_Week Days_in_Year Delta_Days Add_Delta_Days Add_Delta_YM);
use C4::Auth;
use C4::Output;
use C4::Serials;
use C4::Serials::Frequency;
my $input = new CGI;
my ($template, $loggedinuser, $cookie, $flags) = get_template_and_user( {
template_name => 'serials/showpredictionpattern.tt',
query => $input,
type => 'intranet',
authnotrequired => 0,
flagsrequired => { 'serials' => '*' },
} );
my $subscriptionid = $input->param('subscriptionid');
my $frequencyid = $input->param('frequency');
my $firstacquidate = $input->param('firstacquidate');
my $nextacquidate = $input->param('nextacquidate');
my $enddate = $input->param('enddate');
my $subtype = $input->param('subtype');
my $sublength = $input->param('sublength');
my $custompattern = $input->param('custompattern');
my $frequency = GetSubscriptionFrequency($frequencyid);
my %pattern = (
numberingmethod => $input->param('numberingmethod') // '',
numbering1 => $input->param('numbering1') // '',
numbering2 => $input->param('numbering2') // '',
numbering3 => $input->param('numbering3') // '',
add1 => $input->param('add1') // '',
add2 => $input->param('add2') // '',
add3 => $input->param('add3') // '',
whenmorethan1 => $input->param('whenmorethan1') // '',
whenmorethan2 => $input->param('whenmorethan2') // '',
whenmorethan3 => $input->param('whenmorethan3') // '',
setto1 => $input->param('setto1') // '',
setto2 => $input->param('setto2') // '',
setto3 => $input->param('setto3') // '',
every1 => $input->param('every1') // '',
every2 => $input->param('every2') // '',
every3 => $input->param('every3') // '',
);
if(!defined $firstacquidate || $firstacquidate eq ''){
my ($year, $month, $day) = Today();
$firstacquidate = sprintf "%04d-%02d-%02d", $year, $month, $day;
} else {
$firstacquidate = C4::Dates->new($firstacquidate)->output('iso');
}
if($enddate){
$enddate = C4::Dates->new($enddate)->output('iso');
}
if($nextacquidate) {
$nextacquidate = C4::Dates->new($nextacquidate)->output('iso');
} else {
$nextacquidate = $firstacquidate;
}
my $date = $nextacquidate;
my %subscription = (
locale => $input->param('locale') // '',
lastvalue1 => $input->param('lastvalue1') // '',
lastvalue2 => $input->param('lastvalue2') // '',
lastvalue3 => $input->param('lastvalue3') // '',
innerloop1 => $input->param('innerloop1') // '',
innerloop2 => $input->param('innerloop2') // '',
innerloop3 => $input->param('innerloop3') // '',
irregularity => '',
periodicity => $frequencyid,
countissuesperunit => 1,
firstacquidate => $firstacquidate,
);
my $issuenumber;
if(defined $subscriptionid) {
($issuenumber) = C4::Serials::GetFictiveIssueNumber(\%subscription, $date);
} else {
$issuenumber = 1;
}
my @predictions_loop;
my ($calculated) = GetSeq(\%subscription, \%pattern);
push @predictions_loop, {
number => $calculated,
publicationdate => $date,
issuenumber => $issuenumber,
dow => Day_of_Week(split /-/, $date),
};
my @irreg = ();
if(defined $subscriptionid) {
@irreg = C4::Serials::GetSubscriptionIrregularities($subscriptionid);
while(@irreg && $issuenumber > $irreg[0]) {
shift @irreg;
}
if(@irreg && $issuenumber == $irreg[0]){
$predictions_loop[0]->{'not_published'} = 1;
shift @irreg;
}
}
my $i = 1;
while( $i < 1000 ) {
my %line;
if(defined $date){
$date = GetNextDate(\%subscription, $date);
}
if(defined $date){
$line{'publicationdate'} = $date;
$line{'dow'} = Day_of_Week(split /-/, $date);
}
# Check if we don't have exceed end date
if($sublength){
if($subtype eq "issues" && $i >= $sublength){
last;
} elsif($subtype eq "weeks" && $date && Delta_Days( split(/-/, $date), Add_Delta_Days( split(/-/, $firstacquidate), 7*$sublength - 1 ) ) < 0) {
last;
} elsif($subtype eq "months" && $date && (Delta_Days( split(/-/, $date), Add_Delta_YM( split(/-/, $firstacquidate), 0, $sublength) ) - 1) < 0 ) {
last;
}
}
if($enddate && $date && Delta_Days( split(/-/, $date), split(/-/, $enddate) ) <= 0 ) {
last;
}
($calculated, $subscription{'lastvalue1'}, $subscription{'lastvalue2'}, $subscription{'lastvalue3'}, $subscription{'innerloop1'}, $subscription{'innerloop2'}, $subscription{'innerloop3'}) = GetNextSeq(\%subscription, \%pattern);
$issuenumber++;
$line{'number'} = $calculated;
$line{'issuenumber'} = $issuenumber;
if(@irreg && $issuenumber == $irreg[0]){
$line{'not_published'} = 1;
shift @irreg;
}
push @predictions_loop, \%line;
$i++;
}
$template->param(
predictions_loop => \@predictions_loop,
);
if ( $frequency->{unit} and not $custompattern ) {
$template->param( ask_for_irregularities => 1 );
if ( $frequency->{unit} eq 'day' and $frequency->{unitsperissue} == 1 ) {
$template->param( daily_options => 1 );
}
}
if ( ( $date && $enddate && $date ne $enddate )
or ( $subtype eq 'issues' && $i < $sublength ) )
{
$template->param( not_consistent_end_date => 1 );
}
output_html_with_http_headers $input, $cookie, $template->output;