# This Koha test module is a stub!
# Add more tests here!!!
-use strict;
-use warnings;
+use Modern::Perl;
use YAML;
+use CGI;
use C4::Serials;
+use C4::Serials::Frequency;
+use C4::Serials::Numberpattern;
use C4::Debug;
-use Test::More tests => 34;
+use C4::Bookseller;
+use C4::Biblio;
+use C4::Budgets;
+use Koha::DateUtils;
+use Test::More tests => 44;
BEGIN {
use_ok('C4::Serials');
}
-my $subscriptionid = 1;
+my $dbh = C4::Context->dbh;
+
+# Start transaction
+$dbh->{AutoCommit} = 0;
+$dbh->{RaiseError} = 1;
+
+my $booksellerid = C4::Bookseller::AddBookseller(
+ {
+ name => "my vendor",
+ address1 => "bookseller's address",
+ phone => "0123456",
+ active => 1
+ }
+);
+
+my ($biblionumber, $biblioitemnumber) = AddBiblio(MARC::Record->new, '');
+
+my $budgetid;
+my $bpid = AddBudgetPeriod({
+ budget_period_startdate => '01-01-2015',
+ budget_period_enddate => '31-12-2015',
+ budget_description => "budget desc"
+});
+
+my $budget_id = AddBudget({
+ budget_code => "ABCD",
+ budget_amount => "123.132",
+ budget_name => "Périodiques",
+ budget_notes => "This is a note",
+ budget_description => "Serials",
+ budget_active => 1,
+ budget_period_id => $bpid
+});
+
+my $frequency_id = AddSubscriptionFrequency({ description => "Test frequency 1" });
+my $pattern_id = AddSubscriptionNumberpattern({
+ label => 'Test numberpattern 1',
+ numberingmethod => '{X}',
+ label1 => q{},
+ add1 => 1,
+ every1 => 1,
+ every1 => 1,
+ numbering1 => 1,
+ whenmorethan1 => 1,
+});
+
+my $subscriptionid = NewSubscription(
+ undef, "", undef, undef, $budget_id, $biblionumber,
+ '2013-01-01', $frequency_id, undef, undef, undef,
+ undef, undef, undef, undef, undef, undef,
+ 1, "notes",undef, '2013-01-01', undef, $pattern_id,
+ undef, undef, 0, "intnotes", 0,
+ undef, undef, 0, undef, '2013-12-31', 0
+);
+
my $subscriptioninformation = GetSubscription( $subscriptionid );
-$debug && warn Dump($subscriptioninformation);
+
my @subscriptions = GetSubscriptions( $$subscriptioninformation{bibliotitle} );
isa_ok( \@subscriptions, 'ARRAY' );
-$debug && warn scalar(@subscriptions);
+
@subscriptions = GetSubscriptions( undef, $$subscriptioninformation{issn} );
isa_ok( \@subscriptions, 'ARRAY' );
-$debug && warn scalar(@subscriptions);
+
@subscriptions = GetSubscriptions( undef, undef, $$subscriptioninformation{ean} );
isa_ok( \@subscriptions, 'ARRAY' );
-$debug && warn scalar(@subscriptions);
+
@subscriptions = GetSubscriptions( undef, undef, undef, $$subscriptioninformation{bibnum} );
isa_ok( \@subscriptions, 'ARRAY' );
-$debug && warn scalar(@subscriptions);
-if ($subscriptioninformation->{periodicity} % 16==0){
- $subscriptioninformation->{periodicity}=7;
- ModSubscription(@$subscriptioninformation{qw(librarian, branchcode, aqbooksellerid, cost, aqbudgetid, startdate, periodicity, firstacquidate,
- dow, irregularity, numberpattern, numberlength, weeklength, monthlength, add1, every1,
- whenmorethan1, setto1, lastvalue1, innerloop1, add2, every2, whenmorethan2, setto2,
- lastvalue2, innerloop2, add3, every3, whenmorethan3, setto3, lastvalue3, innerloop3,
- numberingmethod, status, biblionumber, callnumber, notes, letter, hemisphere, manualhistory,
- internalnotes, serialsadditems, staffdisplaycount, opacdisplaycount, graceperiod, location, enddate, subscriptionid
-)});
+
+my $frequency = GetSubscriptionFrequency($subscriptioninformation->{periodicity});
+my $old_frequency;
+if (not $frequency->{unit}) {
+ $old_frequency = $frequency->{id};
+ $frequency->{unit} = "month";
+ $frequency->{unitsperissue} = 1;
+ $frequency->{issuesperunit} = 1;
+ $frequency->{description} = "Frequency created by t/db_dependant/Serials.t";
+ $subscriptioninformation->{periodicity} = AddSubscriptionFrequency($frequency);
+
+ ModSubscription( @$subscriptioninformation{qw(
+ librarian branchcode aqbooksellerid cost aqbudgetid startdate
+ periodicity firstacquidate irregularity numberpattern locale
+ numberlength weeklength monthlength lastvalue1 innerloop1 lastvalue2
+ innerloop2 lastvalue3 innerloop3 status biblionumber callnumber notes
+ letter manualhistory internalnotes serialsadditems staffdisplaycount
+ opacdisplaycount graceperiod location enddate subscriptionid
+ skip_serialseq
+ )} );
}
-my $expirationdate = GetExpirationDate(1) ;
-ok( $expirationdate, "not NULL" );
-$debug && warn "$expirationdate";
+my $expirationdate = GetExpirationDate($subscriptionid) ;
+ok( $expirationdate, "expiration date is not NULL" );
-is(C4::Serials::GetLateIssues(),"0", 'test getting late issues');
+is(C4::Serials::GetLateIssues(), undef, 'test getting late issues');
-ok(C4::Serials::GetSubscriptionHistoryFromSubscriptionId(), 'test getting history from sub-scription');
+ok(C4::Serials::GetSubscriptionHistoryFromSubscriptionId($subscriptionid), 'test getting history from sub-scription');
-ok(C4::Serials::GetSerialStatusFromSerialId(), 'test getting Serial Status From Serial Id');
+my ($serials_count, @serials) = GetSerials($subscriptionid);
+ok($serials_count > 0, 'Subscription has at least one serial');
+my $serial = $serials[0];
-ok(C4::Serials::GetSerialInformation(), 'test getting Serial Information');
+ok(C4::Serials::GetSerialStatusFromSerialId($serial->{serialid}), 'test getting Serial Status From Serial Id');
-ok(C4::Serials::AddItem2Serial(), 'test adding item to serial');
+isa_ok(C4::Serials::GetSerialInformation($serial->{serialid}), 'HASH', 'test getting Serial Information');
-ok(C4::Serials::UpdateClaimdateIssues(), 'test updating claim date');
+# Delete created frequency
+if ($old_frequency) {
+ my $freq_to_delete = $subscriptioninformation->{periodicity};
+ $subscriptioninformation->{periodicity} = $old_frequency;
-ok(C4::Serials::GetFullSubscription(), 'test getting full subscription');
+ ModSubscription( @$subscriptioninformation{qw(
+ librarian branchcode aqbooksellerid cost aqbudgetid startdate
+ periodicity firstacquidate irregularity numberpattern locale
+ numberlength weeklength monthlength lastvalue1 innerloop1 lastvalue2
+ innerloop2 lastvalue3 innerloop3 status biblionumber callnumber notes
+ letter manualhistory internalnotes serialsadditems staffdisplaycount
+ opacdisplaycount graceperiod location enddate subscriptionid
+ skip_serialseq
+ )} );
-ok(C4::Serials::PrepareSerialsData(), 'test preparing serial data');
+ DelSubscriptionFrequency($freq_to_delete);
+}
-ok(C4::Serials::GetSubscriptionsFromBiblionumber(), 'test getting subscriptions form biblio number');
-is(C4::Serials::GetSerials(),"0", 'test getting serials when you enter nothing');
-is(C4::Serials::GetSerials2(),"0", 'test getting serials when you enter nothing');
+# Test calling subs without parameters
+is(C4::Serials::AddItem2Serial(), undef, 'test adding item to serial');
+is(C4::Serials::UpdateClaimdateIssues(), undef, 'test updating claim date');
+is(C4::Serials::GetFullSubscription(), undef, 'test getting full subscription');
+is(C4::Serials::PrepareSerialsData(), undef, 'test preparing serial data');
+is(C4::Serials::GetSubscriptionsFromBiblionumber(), undef, 'test getting subscriptions form biblio number');
-ok(C4::Serials::GetLatestSerials(), 'test getting lastest serials');
+is(C4::Serials::GetSerials(), undef, 'test getting serials when you enter nothing');
+is(C4::Serials::GetSerials2(), undef, 'test getting serials when you enter nothing');
-is(C4::Serials::GetDistributedTo(),"0", 'test getting distributed when nothing is entered');
+is(C4::Serials::GetLatestSerials(), undef, 'test getting lastest serials');
-is(C4::Serials::GetNextSeq(),"0", 'test getting next seq when you enter nothing');
+is(C4::Serials::GetDistributedTo(), undef, 'test getting distributed when nothing is entered');
-is(C4::Serials::GetSeq(),undef, 'test getting seq when you enter nothing');
+is(C4::Serials::GetNextSeq(), undef, 'test getting next seq when you enter nothing');
-is(C4::Serials::CountSubscriptionFromBiblionumber(),"0", 'test counting subscription when nothing is entered');
+is(C4::Serials::GetSeq(), undef, 'test getting seq when you enter nothing');
-is(C4::Serials::ModSubscriptionHistory(),"0", 'test modding subscription history');
+is(C4::Serials::CountSubscriptionFromBiblionumber(), undef, 'test counting subscription when nothing is entered');
+
+is(C4::Serials::ModSubscriptionHistory(), undef, 'test modding subscription history');
is(C4::Serials::ModSerialStatus(),undef, 'test modding serials');
-is(C4::Serials::NewIssue(),"0", 'test getting 0 when nothing is entered');
+is(C4::Serials::NewIssue(), undef, 'test getting 0 when nothing is entered');
is(C4::Serials::ItemizeSerials(),undef, 'test getting nothing when nothing is entered');
-ok(C4::Serials::HasSubscriptionStrictlyExpired(), 'test if the subscriptions has expired');
-is(C4::Serials::HasSubscriptionExpired(),"0", 'test if the subscriptions has expired');
+is(C4::Serials::HasSubscriptionStrictlyExpired(), undef, 'test if the subscriptions has expired');
+is(C4::Serials::HasSubscriptionExpired(), undef, 'test if the subscriptions has expired');
-is(C4::Serials::GetLateOrMissingIssues(),"0", 'test getting last or missing issues');
+is(C4::Serials::GetLateOrMissingIssues(), undef, 'test getting last or missing issues');
-is(C4::Serials::removeMissingIssue(),undef, 'test removing a missing issue');
+is(C4::Serials::removeMissingIssue(), undef, 'test removing a missing issue');
is(C4::Serials::updateClaim(),undef, 'test updating claim');
is(C4::Serials::getsupplierbyserialid(),undef, 'test getting supplier idea');
-is(C4::Serials::check_routing(),"0", 'test checking route');
+is(C4::Serials::check_routing(), undef, 'test checking route');
is(C4::Serials::addroutingmember(),undef, 'test adding route member');
+
+
+# Unit tests for statuses management (Bug 11689)
+$subscriptionid = NewSubscription(
+ undef, "", undef, undef, $budget_id, $biblionumber,
+ '2013-01-01', $frequency_id, undef, undef, undef,
+ undef, undef, undef, undef, undef, undef,
+ 1, "notes",undef, '2013-01-01', undef, $pattern_id,
+ undef, undef, 0, "intnotes", 0,
+ undef, undef, 0, undef, '2013-12-31', 0
+);
+my $total_issues;
+( $total_issues, @serials ) = C4::Serials::GetSerials( $subscriptionid );
+is( $total_issues, 1, "NewSubscription created a first serial" );
+is( @serials, 1, "GetSerials returns the serial" );
+my $subscription = C4::Serials::GetSubscription($subscriptionid);
+my $pattern = C4::Serials::Numberpattern::GetSubscriptionNumberpattern($subscription->{numberpattern});
+( $total_issues, @serials ) = C4::Serials::GetSerials( $subscriptionid );
+my $publisheddate = output_pref({ dt => dt_from_string, dateformat => 'iso', dateonly => 1 });
+( $total_issues, @serials ) = C4::Serials::GetSerials( $subscriptionid );
+my $nextpublisheddate = C4::Serials::GetNextDate($subscription, $publisheddate, 1);
+my @statuses = qw( 2 2 3 3 3 3 3 4 4 41 42 43 44 5 );
+# Add 14 serials
+my $counter = 0;
+for my $status ( @statuses ) {
+ my $serialseq = "No.".$counter;
+ my ( $expected_serial ) = GetSerials2( $subscriptionid, 1 );
+ C4::Serials::ModSerialStatus( $expected_serial->{serialid}, $serialseq, $publisheddate, $publisheddate, $statuses[$counter], 'an useless note' );
+ $counter++;
+}
+# Here we have 15 serials with statuses : 2*2 + 5*3 + 2*4 + 1*41 + 1*42 + 1*43 + 1*44 + 1*5 + 1*1
+( $total_issues, @serials ) = C4::Serials::GetSerials( $subscriptionid );
+is( $total_issues, @statuses + 1, "GetSerials returns total_issues" );
+my @arrived_missing = map { my $status = $_->{status}; ( grep { /^$status$/ } qw( 2 4 41 42 43 44 5 ) ) ? $_ : () } @serials;
+my @others = map { my $status = $_->{status}; ( grep { /^$status$/ } qw( 2 4 41 42 43 44 5 ) ) ? () : $_ } @serials;
+is( @arrived_missing, 5, "GetSerials returns 5 arrived/missing by default" );
+is( @others, 6, "GetSerials returns all serials not arrived and not missing" );
+
+( $total_issues, @serials ) = C4::Serials::GetSerials( $subscriptionid, 10 );
+is( $total_issues, @statuses + 1, "GetSerials returns total_issues" );
+@arrived_missing = map { my $status = $_->{status}; ( grep { /^$status$/ } qw( 2 4 41 42 43 44 5 ) ) ? $_ : () } @serials;
+@others = map { my $status = $_->{status}; ( grep { /^$status$/ } qw( 2 4 41 42 43 44 5 ) ) ? () : $_ } @serials;
+is( @arrived_missing, 9, "GetSerials returns all arrived/missing if count given" );
+is( @others, 6, "GetSerials returns all serials not arrived and not missing if count given" );
+
+$subscription = C4::Serials::GetSubscription($subscriptionid); # Retrieve the updated subscription
+
+my @serialseqs;
+for my $am ( @arrived_missing ) {
+ if ( grep {/^$am->{status}$/} qw( 4 41 42 43 44 ) ) {
+ push @serialseqs, $am->{serialseq}
+ } elsif ( grep {/^$am->{status}$/} qw( 5 ) ) {
+ push @serialseqs, 'not issued ' . $am->{serialseq};
+ }
+}
+is( $subscription->{missinglist}, join('; ', @serialseqs), "subscription missinglist is updated after ModSerialStatus" );
+
+$dbh->rollback;