Bug 11689: (follow-up) fix warnings generated when running Serials.t
[koha.git] / t / db_dependent / Serials.t
1 #!/usr/bin/perl
2 #
3 # This Koha test module is a stub!
4 # Add more tests here!!!
5
6 use Modern::Perl;
7 use YAML;
8
9 use CGI;
10 use C4::Serials;
11 use C4::Serials::Frequency;
12 use C4::Serials::Numberpattern;
13 use C4::Debug;
14 use C4::Bookseller;
15 use C4::Biblio;
16 use C4::Budgets;
17 use Koha::DateUtils;
18 use Test::More tests => 44;
19
20 BEGIN {
21     use_ok('C4::Serials');
22 }
23
24 my $dbh = C4::Context->dbh;
25
26 # Start transaction
27 $dbh->{AutoCommit} = 0;
28 $dbh->{RaiseError} = 1;
29
30 my $booksellerid = C4::Bookseller::AddBookseller(
31     {
32         name => "my vendor",
33         address1 => "bookseller's address",
34         phone => "0123456",
35         active => 1
36     }
37 );
38
39 my ($biblionumber, $biblioitemnumber) = AddBiblio(MARC::Record->new, '');
40
41 my $budgetid;
42 my $bpid = AddBudgetPeriod({
43     budget_period_startdate => '01-01-2015',
44     budget_period_enddate   => '31-12-2015',
45     budget_description      => "budget desc"
46 });
47
48 my $budget_id = AddBudget({
49     budget_code        => "ABCD",
50     budget_amount      => "123.132",
51     budget_name        => "Périodiques",
52     budget_notes       => "This is a note",
53     budget_description => "Serials",
54     budget_active      => 1,
55     budget_period_id   => $bpid
56 });
57
58 my $frequency_id = AddSubscriptionFrequency({ description => "Test frequency 1" });
59 my $pattern_id = AddSubscriptionNumberpattern({
60     label => 'Test numberpattern 1',
61     numberingmethod => '{X}',
62     label1 => q{},
63     add1 => 1,
64     every1 => 1,
65     every1 => 1,
66     numbering1 => 1,
67     whenmorethan1 => 1,
68 });
69
70 my $subscriptionid = NewSubscription(
71     undef,      "",     undef, undef, $budget_id, $biblionumber,
72     '2013-01-01', $frequency_id, undef, undef,  undef,
73     undef,      undef,  undef, undef, undef, undef,
74     1,          "notes",undef, '2013-01-01', undef, $pattern_id,
75     undef,       undef,  0,    "intnotes",  0,
76     undef, undef, 0,          undef,         '2013-12-31', 0
77 );
78
79 my $subscriptioninformation = GetSubscription( $subscriptionid );
80
81 my @subscriptions = GetSubscriptions( $$subscriptioninformation{bibliotitle} );
82 isa_ok( \@subscriptions, 'ARRAY' );
83
84 @subscriptions = GetSubscriptions( undef, $$subscriptioninformation{issn} );
85 isa_ok( \@subscriptions, 'ARRAY' );
86
87 @subscriptions = GetSubscriptions( undef, undef, $$subscriptioninformation{ean} );
88 isa_ok( \@subscriptions, 'ARRAY' );
89
90 @subscriptions = GetSubscriptions( undef, undef, undef, $$subscriptioninformation{bibnum} );
91 isa_ok( \@subscriptions, 'ARRAY' );
92
93 my $frequency = GetSubscriptionFrequency($subscriptioninformation->{periodicity});
94 my $old_frequency;
95 if (not $frequency->{unit}) {
96     $old_frequency = $frequency->{id};
97     $frequency->{unit} = "month";
98     $frequency->{unitsperissue} = 1;
99     $frequency->{issuesperunit} = 1;
100     $frequency->{description} = "Frequency created by t/db_dependant/Serials.t";
101     $subscriptioninformation->{periodicity} = AddSubscriptionFrequency($frequency);
102
103     ModSubscription( @$subscriptioninformation{qw(
104         librarian branchcode aqbooksellerid cost aqbudgetid startdate
105         periodicity firstacquidate irregularity numberpattern locale
106         numberlength weeklength monthlength lastvalue1 innerloop1 lastvalue2
107         innerloop2 lastvalue3 innerloop3 status biblionumber callnumber notes
108         letter manualhistory internalnotes serialsadditems staffdisplaycount
109         opacdisplaycount graceperiod location enddate subscriptionid
110         skip_serialseq
111     )} );
112 }
113 my $expirationdate = GetExpirationDate($subscriptionid) ;
114 ok( $expirationdate, "expiration date is not NULL" );
115
116 is(C4::Serials::GetLateIssues(), undef, 'test getting late issues');
117
118 ok(C4::Serials::GetSubscriptionHistoryFromSubscriptionId($subscriptionid), 'test getting history from sub-scription');
119
120 my ($serials_count, @serials) = GetSerials($subscriptionid);
121 ok($serials_count > 0, 'Subscription has at least one serial');
122 my $serial = $serials[0];
123
124 ok(C4::Serials::GetSerialStatusFromSerialId($serial->{serialid}), 'test getting Serial Status From Serial Id');
125
126 isa_ok(C4::Serials::GetSerialInformation($serial->{serialid}), 'HASH', 'test getting Serial Information');
127
128 # Delete created frequency
129 if ($old_frequency) {
130     my $freq_to_delete = $subscriptioninformation->{periodicity};
131     $subscriptioninformation->{periodicity} = $old_frequency;
132
133     ModSubscription( @$subscriptioninformation{qw(
134         librarian branchcode aqbooksellerid cost aqbudgetid startdate
135         periodicity firstacquidate irregularity numberpattern locale
136         numberlength weeklength monthlength lastvalue1 innerloop1 lastvalue2
137         innerloop2 lastvalue3 innerloop3 status biblionumber callnumber notes
138         letter manualhistory internalnotes serialsadditems staffdisplaycount
139         opacdisplaycount graceperiod location enddate subscriptionid
140         skip_serialseq
141     )} );
142
143     DelSubscriptionFrequency($freq_to_delete);
144 }
145
146
147 # Test calling subs without parameters
148 is(C4::Serials::AddItem2Serial(), undef, 'test adding item to serial');
149 is(C4::Serials::UpdateClaimdateIssues(), undef, 'test updating claim date');
150 is(C4::Serials::GetFullSubscription(), undef, 'test getting full subscription');
151 is(C4::Serials::PrepareSerialsData(), undef, 'test preparing serial data');
152 is(C4::Serials::GetSubscriptionsFromBiblionumber(), undef, 'test getting subscriptions form biblio number');
153
154 is(C4::Serials::GetSerials(), undef, 'test getting serials when you enter nothing');
155 is(C4::Serials::GetSerials2(), undef, 'test getting serials when you enter nothing');
156
157 is(C4::Serials::GetLatestSerials(), undef, 'test getting lastest serials');
158
159 is(C4::Serials::GetDistributedTo(), undef, 'test getting distributed when nothing is entered');
160
161 is(C4::Serials::GetNextSeq(), undef, 'test getting next seq when you enter nothing');
162
163 is(C4::Serials::GetSeq(), undef, 'test getting seq when you enter nothing');
164
165 is(C4::Serials::CountSubscriptionFromBiblionumber(), undef, 'test counting subscription when nothing is entered');
166
167 is(C4::Serials::ModSubscriptionHistory(), undef, 'test modding subscription history');
168
169 is(C4::Serials::ModSerialStatus(),undef, 'test modding serials');
170
171 is(C4::Serials::NewIssue(), undef, 'test getting 0 when nothing is entered');
172
173 is(C4::Serials::ItemizeSerials(),undef, 'test getting nothing when nothing is entered');
174
175 is(C4::Serials::HasSubscriptionStrictlyExpired(), undef, 'test if the subscriptions has expired');
176 is(C4::Serials::HasSubscriptionExpired(), undef, 'test if the subscriptions has expired');
177
178 is(C4::Serials::GetLateOrMissingIssues(), undef, 'test getting last or missing issues');
179
180 is(C4::Serials::removeMissingIssue(), undef, 'test removing a missing issue');
181
182 is(C4::Serials::updateClaim(),undef, 'test updating claim');
183
184 is(C4::Serials::getsupplierbyserialid(),undef, 'test getting supplier idea');
185
186 is(C4::Serials::check_routing(), undef, 'test checking route');
187
188 is(C4::Serials::addroutingmember(),undef, 'test adding route member');
189
190
191 # Unit tests for statuses management (Bug 11689)
192 $subscriptionid = NewSubscription(
193     undef,      "",     undef, undef, $budget_id, $biblionumber,
194     '2013-01-01', $frequency_id, undef, undef,  undef,
195     undef,      undef,  undef, undef, undef, undef,
196     1,          "notes",undef, '2013-01-01', undef, $pattern_id,
197     undef,       undef,  0,    "intnotes",  0,
198     undef, undef, 0,          undef,         '2013-12-31', 0
199 );
200 my $total_issues;
201 ( $total_issues, @serials ) = C4::Serials::GetSerials( $subscriptionid );
202 is( $total_issues, 1, "NewSubscription created a first serial" );
203 is( @serials, 1, "GetSerials returns the serial" );
204 my $subscription = C4::Serials::GetSubscription($subscriptionid);
205 my $pattern = C4::Serials::Numberpattern::GetSubscriptionNumberpattern($subscription->{numberpattern});
206 ( $total_issues, @serials ) = C4::Serials::GetSerials( $subscriptionid );
207 my $publisheddate = output_pref({ dt => dt_from_string, dateformat => 'iso', dateonly => 1 });
208 ( $total_issues, @serials ) = C4::Serials::GetSerials( $subscriptionid );
209 my $nextpublisheddate = C4::Serials::GetNextDate($subscription, $publisheddate, 1);
210 my @statuses = qw( 2 2 3 3 3 3 3 4 4 41 42 43 44 5 );
211 # Add 14 serials
212 my $counter = 0;
213 for my $status ( @statuses ) {
214     my $serialseq = "No.".$counter;
215     my ( $expected_serial ) = GetSerials2( $subscriptionid, 1 );
216     C4::Serials::ModSerialStatus( $expected_serial->{serialid}, $serialseq, $publisheddate, $publisheddate, $statuses[$counter], 'an useless note' );
217     $counter++;
218 }
219 # 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
220 ( $total_issues, @serials ) = C4::Serials::GetSerials( $subscriptionid );
221 is( $total_issues, @statuses + 1, "GetSerials returns total_issues" );
222 my @arrived_missing = map { my $status = $_->{status}; ( grep { /^$status$/ } qw( 2 4 41 42 43 44 5 ) ) ? $_ : () } @serials;
223 my @others = map { my $status = $_->{status}; ( grep { /^$status$/ } qw( 2 4 41 42 43 44 5 ) ) ? () : $_ } @serials;
224 is( @arrived_missing, 5, "GetSerials returns 5 arrived/missing by default" );
225 is( @others, 6, "GetSerials returns all serials not arrived and not missing" );
226
227 ( $total_issues, @serials ) = C4::Serials::GetSerials( $subscriptionid, 10 );
228 is( $total_issues, @statuses + 1, "GetSerials returns total_issues" );
229 @arrived_missing = map { my $status = $_->{status}; ( grep { /^$status$/ } qw( 2 4 41 42 43 44 5 ) ) ? $_ : () } @serials;
230 @others = map { my $status = $_->{status}; ( grep { /^$status$/ } qw( 2 4 41 42 43 44 5 ) ) ? () : $_ } @serials;
231 is( @arrived_missing, 9, "GetSerials returns all arrived/missing if count given" );
232 is( @others, 6, "GetSerials returns all serials not arrived and not missing if count given" );
233
234 $subscription = C4::Serials::GetSubscription($subscriptionid); # Retrieve the updated subscription
235
236 my @serialseqs;
237 for my $am ( reverse @arrived_missing ) {
238     if ( grep {/^$am->{status}$/} qw( 4 41 42 43 44 5 ) ) {
239         push @serialseqs, $am->{serialseq}
240     }
241 }
242 is( $subscription->{missinglist}, 'not issued ' . join('; ', @serialseqs), "subscription missinglist is updated after ModSerialStatus" );
243
244 $dbh->rollback;