Bug 9088: if there is only one active order, pre-select it when creating new orderings
[koha.git] / t / db_dependent / Serials.t
blobab466e6c391c983bf16ece17894004372ff1ed6a
1 #!/usr/bin/perl
3 # This Koha test module is a stub!
4 # Add more tests here!!!
6 use Modern::Perl;
7 use YAML;
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;
20 BEGIN {
21 use_ok('C4::Serials');
24 my $dbh = C4::Context->dbh;
26 # Start transaction
27 $dbh->{AutoCommit} = 0;
28 $dbh->{RaiseError} = 1;
30 my $booksellerid = C4::Bookseller::AddBookseller(
32 name => "my vendor",
33 address1 => "bookseller's address",
34 phone => "0123456",
35 active => 1
39 my ($biblionumber, $biblioitemnumber) = AddBiblio(MARC::Record->new, '');
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 });
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 });
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 });
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
79 my $subscriptioninformation = GetSubscription( $subscriptionid );
81 my @subscriptions = GetSubscriptions( $$subscriptioninformation{bibliotitle} );
82 isa_ok( \@subscriptions, 'ARRAY' );
84 @subscriptions = GetSubscriptions( undef, $$subscriptioninformation{issn} );
85 isa_ok( \@subscriptions, 'ARRAY' );
87 @subscriptions = GetSubscriptions( undef, undef, $$subscriptioninformation{ean} );
88 isa_ok( \@subscriptions, 'ARRAY' );
90 @subscriptions = GetSubscriptions( undef, undef, undef, $$subscriptioninformation{bibnum} );
91 isa_ok( \@subscriptions, 'ARRAY' );
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);
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 )} );
113 my $expirationdate = GetExpirationDate($subscriptionid) ;
114 ok( $expirationdate, "expiration date is not NULL" );
116 is(C4::Serials::GetLateIssues(), undef, 'test getting late issues');
118 ok(C4::Serials::GetSubscriptionHistoryFromSubscriptionId($subscriptionid), 'test getting history from sub-scription');
120 my ($serials_count, @serials) = GetSerials($subscriptionid);
121 ok($serials_count > 0, 'Subscription has at least one serial');
122 my $serial = $serials[0];
124 ok(C4::Serials::GetSerialStatusFromSerialId($serial->{serialid}), 'test getting Serial Status From Serial Id');
126 isa_ok(C4::Serials::GetSerialInformation($serial->{serialid}), 'HASH', 'test getting Serial Information');
128 # Delete created frequency
129 if ($old_frequency) {
130 my $freq_to_delete = $subscriptioninformation->{periodicity};
131 $subscriptioninformation->{periodicity} = $old_frequency;
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 )} );
143 DelSubscriptionFrequency($freq_to_delete);
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');
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');
157 is(C4::Serials::GetLatestSerials(), undef, 'test getting lastest serials');
159 is(C4::Serials::GetDistributedTo(), undef, 'test getting distributed when nothing is entered');
161 is(C4::Serials::GetNextSeq(), undef, 'test getting next seq when you enter nothing');
163 is(C4::Serials::GetSeq(), undef, 'test getting seq when you enter nothing');
165 is(C4::Serials::CountSubscriptionFromBiblionumber(), undef, 'test counting subscription when nothing is entered');
167 is(C4::Serials::ModSubscriptionHistory(), undef, 'test modding subscription history');
169 is(C4::Serials::ModSerialStatus(),undef, 'test modding serials');
171 is(C4::Serials::NewIssue(), undef, 'test getting 0 when nothing is entered');
173 is(C4::Serials::ItemizeSerials(),undef, 'test getting nothing when nothing is entered');
175 is(C4::Serials::HasSubscriptionStrictlyExpired(), undef, 'test if the subscriptions has expired');
176 is(C4::Serials::HasSubscriptionExpired(), undef, 'test if the subscriptions has expired');
178 is(C4::Serials::GetLateOrMissingIssues(), undef, 'test getting last or missing issues');
180 is(C4::Serials::removeMissingIssue(), undef, 'test removing a missing issue');
182 is(C4::Serials::updateClaim(),undef, 'test updating claim');
184 is(C4::Serials::getsupplierbyserialid(),undef, 'test getting supplier idea');
186 is(C4::Serials::check_routing(), undef, 'test checking route');
188 is(C4::Serials::addroutingmember(),undef, 'test adding route member');
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
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++;
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" );
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" );
234 $subscription = C4::Serials::GetSubscription($subscriptionid); # Retrieve the updated subscription
236 my @serialseqs;
237 for my $am ( @arrived_missing ) {
238 if ( grep {/^$am->{status}$/} qw( 4 41 42 43 44 ) ) {
239 push @serialseqs, $am->{serialseq}
240 } elsif ( grep {/^$am->{status}$/} qw( 5 ) ) {
241 push @serialseqs, 'not issued ' . $am->{serialseq};
244 is( $subscription->{missinglist}, join('; ', @serialseqs), "subscription missinglist is updated after ModSerialStatus" );
246 $dbh->rollback;