View | Details | Raw Unified | Return to bug 15533
Collapse All | Expand All

(-)a/C4/HoldsQueue.pm (-1 / +22 lines)
Lines 278-284 sub GetPendingHoldRequestsForBib { Link Here
278
    my $dbh = C4::Context->dbh;
278
    my $dbh = C4::Context->dbh;
279
279
280
    my $request_query = "SELECT biblionumber, borrowernumber, itemnumber, priority, reserves.branchcode,
280
    my $request_query = "SELECT biblionumber, borrowernumber, itemnumber, priority, reserves.branchcode,
281
                                reservedate, reservenotes, borrowers.branchcode AS borrowerbranch
281
                                reservedate, reservenotes, borrowers.branchcode AS borrowerbranch, itemtype
282
                         FROM reserves
282
                         FROM reserves
283
                         JOIN borrowers USING (borrowernumber)
283
                         JOIN borrowers USING (borrowernumber)
284
                         WHERE biblionumber = ?
284
                         WHERE biblionumber = ?
Lines 368-373 sub GetItemsAvailableToFillHoldRequestsForBib { Link Here
368
sub MapItemsToHoldRequests {
368
sub MapItemsToHoldRequests {
369
    my ($hold_requests, $available_items, $branches_to_use, $transport_cost_matrix) = @_;
369
    my ($hold_requests, $available_items, $branches_to_use, $transport_cost_matrix) = @_;
370
370
371
371
    # handle trival cases
372
    # handle trival cases
372
    return unless scalar(@$hold_requests) > 0;
373
    return unless scalar(@$hold_requests) > 0;
373
    return unless scalar(@$available_items) > 0;
374
    return unless scalar(@$available_items) > 0;
Lines 400-405 sub MapItemsToHoldRequests { Link Here
400
                and ( # Don't fill item level holds that contravene the hold pickup policy at this time
401
                and ( # Don't fill item level holds that contravene the hold pickup policy at this time
401
                    ( $items_by_itemnumber{ $request->{itemnumber} }->{hold_fulfillment_policy} eq 'any' )
402
                    ( $items_by_itemnumber{ $request->{itemnumber} }->{hold_fulfillment_policy} eq 'any' )
402
                    || ( $request->{branchcode} eq $items_by_itemnumber{ $request->{itemnumber} }->{ $items_by_itemnumber{ $request->{itemnumber} }->{hold_fulfillment_policy} }  )
403
                    || ( $request->{branchcode} eq $items_by_itemnumber{ $request->{itemnumber} }->{ $items_by_itemnumber{ $request->{itemnumber} }->{hold_fulfillment_policy} }  )
404
                and ( !$request->{itemtype} # If hold itemtype is set, item's itemtype must match
405
                    || $items_by_itemnumber{ $request->{itemnumber} }->{itype} eq $request->{itemtype} )
403
                )
406
                )
404
407
405
              )
408
              )
Lines 451-456 sub MapItemsToHoldRequests { Link Here
451
                    $request->{borrowerbranch} eq $item->{homebranch}
454
                    $request->{borrowerbranch} eq $item->{homebranch}
452
                    && ( ( $item->{hold_fulfillment_policy} eq 'any' ) # Don't fill item level holds that contravene the hold pickup policy at this time
455
                    && ( ( $item->{hold_fulfillment_policy} eq 'any' ) # Don't fill item level holds that contravene the hold pickup policy at this time
453
                        || $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} } )
456
                        || $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} } )
457
                    && ( !$request->{itemtype} # If hold itemtype is set, item's itemtype must match
458
                        || $items_by_itemnumber{ $request->{itemnumber} }->{itype} eq $request->{itemtype} )
454
                  )
459
                  )
455
                {
460
                {
456
                    $itemnumber = $item->{itemnumber};
461
                    $itemnumber = $item->{itemnumber};
Lines 472-477 sub MapItemsToHoldRequests { Link Here
472
                    next unless $item->{hold_fulfillment_policy} eq 'any'
477
                    next unless $item->{hold_fulfillment_policy} eq 'any'
473
                        || $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} };
478
                        || $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} };
474
479
480
                    # If hold itemtype is set, item's itemtype must match
481
                    next unless ( !$request->{itemtype}
482
                        || $item->{itype} eq $request->{itemtype} );
483
475
                    $itemnumber = $item->{itemnumber};
484
                    $itemnumber = $item->{itemnumber};
476
                    last;
485
                    last;
477
                }
486
                }
Lines 504-509 sub MapItemsToHoldRequests { Link Here
504
                    next unless $item->{hold_fulfillment_policy} eq 'any'
513
                    next unless $item->{hold_fulfillment_policy} eq 'any'
505
                        || $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} };
514
                        || $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} };
506
515
516
                    # If hold itemtype is set, item's itemtype must match
517
                    next unless ( !$request->{itemtype}
518
                        || $item->{itype} eq $request->{itemtype} );
519
507
                    $itemnumber = $item->{itemnumber};
520
                    $itemnumber = $item->{itemnumber};
508
                    $holdingbranch = $branch;
521
                    $holdingbranch = $branch;
509
                    last PULL_BRANCHES;
522
                    last PULL_BRANCHES;
Lines 519-524 sub MapItemsToHoldRequests { Link Here
519
                        next unless $current_item->{hold_fulfillment_policy} eq 'any'
532
                        next unless $current_item->{hold_fulfillment_policy} eq 'any'
520
                            || $request->{branchcode} eq $current_item->{ $current_item->{hold_fulfillment_policy} };
533
                            || $request->{branchcode} eq $current_item->{ $current_item->{hold_fulfillment_policy} };
521
534
535
                        # If hold itemtype is set, item's itemtype must match
536
                        next unless ( !$request->{itemtype}
537
                            || $current_item->{itype} eq $request->{itemtype} );
538
522
                        $itemnumber = $current_item->{itemnumber};
539
                        $itemnumber = $current_item->{itemnumber};
523
                        last; # quit this loop as soon as we have a suitable item
540
                        last; # quit this loop as soon as we have a suitable item
524
                    }
541
                    }
Lines 539-544 sub MapItemsToHoldRequests { Link Here
539
                        next unless $item->{hold_fulfillment_policy} eq 'any'
556
                        next unless $item->{hold_fulfillment_policy} eq 'any'
540
                            || $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} };
557
                            || $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} };
541
558
559
                        # If hold itemtype is set, item's itemtype must match
560
                        next unless ( !$request->{itemtype}
561
                            || $item->{itype} eq $request->{itemtype} );
562
542
                        $itemnumber = $item->{itemnumber};
563
                        $itemnumber = $item->{itemnumber};
543
                        $holdingbranch = $branch;
564
                        $holdingbranch = $branch;
544
                        last PULL_BRANCHES2;
565
                        last PULL_BRANCHES2;
(-)a/C4/Reserves.pm (-9 / +18 lines)
Lines 161-169 The following tables are available witin the HOLDPLACED message: Link Here
161
161
162
sub AddReserve {
162
sub AddReserve {
163
    my (
163
    my (
164
        $branch,    $borrowernumber, $biblionumber,
164
        $branch,   $borrowernumber, $biblionumber, $bibitems,
165
        $bibitems,  $priority, $resdate, $expdate, $notes,
165
        $priority, $resdate,        $expdate,      $notes,
166
        $title,      $checkitem, $found
166
        $title,    $checkitem,      $found,        $itemtype
167
    ) = @_;
167
    ) = @_;
168
168
169
    if ( Koha::Holds->search( { borrowernumber => $borrowernumber, biblionumber => $biblionumber } )->count() > 0 ) {
169
    if ( Koha::Holds->search( { borrowernumber => $borrowernumber, biblionumber => $biblionumber } )->count() > 0 ) {
Lines 191-196 sub AddReserve { Link Here
191
        $waitingdate = $resdate;
191
        $waitingdate = $resdate;
192
    }
192
    }
193
193
194
    # Don't add itemtype limit if specific item is selected
195
    $itemtype = undef if $checkitem;
196
194
    # updates take place here
197
    # updates take place here
195
    my $hold = Koha::Hold->new(
198
    my $hold = Koha::Hold->new(
196
        {
199
        {
Lines 203-209 sub AddReserve { Link Here
203
            itemnumber     => $checkitem,
206
            itemnumber     => $checkitem,
204
            found          => $found,
207
            found          => $found,
205
            waitingdate    => $waitingdate,
208
            waitingdate    => $waitingdate,
206
            expirationdate => $expdate
209
            expirationdate => $expdate,
210
            itemtype       => $itemtype,
207
        }
211
        }
208
    )->store();
212
    )->store();
209
    my $reserve_id = $hold->id();
213
    my $reserve_id = $hold->id();
Lines 310-316 sub GetReservesFromBiblionumber { Link Here
310
                expirationdate,
314
                expirationdate,
311
                lowestPriority,
315
                lowestPriority,
312
                suspend,
316
                suspend,
313
                suspend_until
317
                suspend_until,
318
                itemtype
314
        FROM     reserves
319
        FROM     reserves
315
        WHERE biblionumber = ? ";
320
        WHERE biblionumber = ? ";
316
    push( @params, $biblionumber );
321
    push( @params, $biblionumber );
Lines 946-953 sub CheckReserves { Link Here
946
951
947
                # See if this item is more important than what we've got so far
952
                # See if this item is more important than what we've got so far
948
                if ( ( $res->{'priority'} && $res->{'priority'} < $priority ) || $local_hold_match ) {
953
                if ( ( $res->{'priority'} && $res->{'priority'} < $priority ) || $local_hold_match ) {
949
                    $borrowerinfo ||= C4::Members::GetMember( borrowernumber => $res->{'borrowernumber'} );
950
                    $iteminfo ||= C4::Items::GetItem($itemnumber);
954
                    $iteminfo ||= C4::Items::GetItem($itemnumber);
955
                    next if $res->{itemtype} && $res->{itemtype} ne _get_itype( $iteminfo );
956
                    $borrowerinfo ||= C4::Members::GetMember( borrowernumber => $res->{'borrowernumber'} );
951
                    my $branch = GetReservesControlBranch( $iteminfo, $borrowerinfo );
957
                    my $branch = GetReservesControlBranch( $iteminfo, $borrowerinfo );
952
                    my $branchitemrule = C4::Circulation::GetBranchItemRule($branch,$iteminfo->{'itype'});
958
                    my $branchitemrule = C4::Circulation::GetBranchItemRule($branch,$iteminfo->{'itype'});
953
                    next if ($branchitemrule->{'holdallowed'} == 0);
959
                    next if ($branchitemrule->{'holdallowed'} == 0);
Lines 1833-1839 sub _Findgroupreserve { Link Here
1833
               reserves.timestamp           AS timestamp,
1839
               reserves.timestamp           AS timestamp,
1834
               biblioitems.biblioitemnumber AS biblioitemnumber,
1840
               biblioitems.biblioitemnumber AS biblioitemnumber,
1835
               reserves.itemnumber          AS itemnumber,
1841
               reserves.itemnumber          AS itemnumber,
1836
               reserves.reserve_id          AS reserve_id
1842
               reserves.reserve_id          AS reserve_id,
1843
               reserves.itemtype            AS itemtype
1837
        FROM reserves
1844
        FROM reserves
1838
        JOIN biblioitems USING (biblionumber)
1845
        JOIN biblioitems USING (biblionumber)
1839
        JOIN hold_fill_targets USING (biblionumber, borrowernumber, itemnumber)
1846
        JOIN hold_fill_targets USING (biblionumber, borrowernumber, itemnumber)
Lines 1867-1873 sub _Findgroupreserve { Link Here
1867
               reserves.timestamp           AS timestamp,
1874
               reserves.timestamp           AS timestamp,
1868
               biblioitems.biblioitemnumber AS biblioitemnumber,
1875
               biblioitems.biblioitemnumber AS biblioitemnumber,
1869
               reserves.itemnumber          AS itemnumber,
1876
               reserves.itemnumber          AS itemnumber,
1870
               reserves.reserve_id          AS reserve_id
1877
               reserves.reserve_id          AS reserve_id,
1878
               reserves.itemtype            AS itemtype
1871
        FROM reserves
1879
        FROM reserves
1872
        JOIN biblioitems USING (biblionumber)
1880
        JOIN biblioitems USING (biblionumber)
1873
        JOIN hold_fill_targets USING (biblionumber, borrowernumber)
1881
        JOIN hold_fill_targets USING (biblionumber, borrowernumber)
Lines 1900-1906 sub _Findgroupreserve { Link Here
1900
               reserves.priority                   AS priority,
1908
               reserves.priority                   AS priority,
1901
               reserves.timestamp                  AS timestamp,
1909
               reserves.timestamp                  AS timestamp,
1902
               reserves.itemnumber                 AS itemnumber,
1910
               reserves.itemnumber                 AS itemnumber,
1903
               reserves.reserve_id                 AS reserve_id
1911
               reserves.reserve_id                 AS reserve_id,
1912
               reserves.itemtype                   AS itemtype
1904
        FROM reserves
1913
        FROM reserves
1905
        WHERE reserves.biblionumber = ?
1914
        WHERE reserves.biblionumber = ?
1906
          AND (reserves.itemnumber IS NULL OR reserves.itemnumber = ?)
1915
          AND (reserves.itemnumber IS NULL OR reserves.itemnumber = ?)
(-)a/Koha/Schema/Result/OldReserve.pm (-2 / +31 lines)
Lines 129-134 __PACKAGE__->table("old_reserves"); Link Here
129
  datetime_undef_if_invalid: 1
129
  datetime_undef_if_invalid: 1
130
  is_nullable: 1
130
  is_nullable: 1
131
131
132
=head2 itemtype
133
134
  data_type: 'varchar'
135
  is_foreign_key: 1
136
  is_nullable: 1
137
  size: 10
138
132
=cut
139
=cut
133
140
134
__PACKAGE__->add_columns(
141
__PACKAGE__->add_columns(
Lines 177-182 __PACKAGE__->add_columns( Link Here
177
    datetime_undef_if_invalid => 1,
184
    datetime_undef_if_invalid => 1,
178
    is_nullable => 1,
185
    is_nullable => 1,
179
  },
186
  },
187
  "itemtype",
188
  { data_type => "varchar", is_foreign_key => 1, is_nullable => 1, size => 10 },
180
);
189
);
181
190
182
=head1 PRIMARY KEY
191
=head1 PRIMARY KEY
Lines 253-261 __PACKAGE__->belongs_to( Link Here
253
  },
262
  },
254
);
263
);
255
264
265
=head2 itemtype
266
267
Type: belongs_to
268
269
Related object: L<Koha::Schema::Result::Itemtype>
270
271
=cut
272
273
__PACKAGE__->belongs_to(
274
  "itemtype",
275
  "Koha::Schema::Result::Itemtype",
276
  { itemtype => "itemtype" },
277
  {
278
    is_deferrable => 1,
279
    join_type     => "LEFT",
280
    on_delete     => "CASCADE",
281
    on_update     => "CASCADE",
282
  },
283
);
284
256
285
257
# Created by DBIx::Class::Schema::Loader v0.07040 @ 2015-06-30 08:51:40
286
# Created by DBIx::Class::Schema::Loader v0.07042 @ 2015-12-26 12:22:09
258
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:wGi7SO5Sz+IwuvqaAyQDbg
287
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:34jZVAc6xF4/49hChXdSEg
259
288
260
289
261
# You can replace this text with custom content, and it will be preserved on regeneration
290
# You can replace this text with custom content, and it will be preserved on regeneration
(-)a/Koha/Schema/Result/Reserve.pm (-2 / +31 lines)
Lines 133-138 __PACKAGE__->table("reserves"); Link Here
133
  datetime_undef_if_invalid: 1
133
  datetime_undef_if_invalid: 1
134
  is_nullable: 1
134
  is_nullable: 1
135
135
136
=head2 itemtype
137
138
  data_type: 'varchar'
139
  is_foreign_key: 1
140
  is_nullable: 1
141
  size: 10
142
136
=cut
143
=cut
137
144
138
__PACKAGE__->add_columns(
145
__PACKAGE__->add_columns(
Lines 191-196 __PACKAGE__->add_columns( Link Here
191
    datetime_undef_if_invalid => 1,
198
    datetime_undef_if_invalid => 1,
192
    is_nullable => 1,
199
    is_nullable => 1,
193
  },
200
  },
201
  "itemtype",
202
  { data_type => "varchar", is_foreign_key => 1, is_nullable => 1, size => 10 },
194
);
203
);
195
204
196
=head1 PRIMARY KEY
205
=head1 PRIMARY KEY
Lines 277-285 __PACKAGE__->belongs_to( Link Here
277
  },
286
  },
278
);
287
);
279
288
289
=head2 itemtype
290
291
Type: belongs_to
292
293
Related object: L<Koha::Schema::Result::Itemtype>
294
295
=cut
296
297
__PACKAGE__->belongs_to(
298
  "itemtype",
299
  "Koha::Schema::Result::Itemtype",
300
  { itemtype => "itemtype" },
301
  {
302
    is_deferrable => 1,
303
    join_type     => "LEFT",
304
    on_delete     => "CASCADE",
305
    on_update     => "CASCADE",
306
  },
307
);
308
280
309
281
# Created by DBIx::Class::Schema::Loader v0.07040 @ 2015-06-30 08:51:40
310
# Created by DBIx::Class::Schema::Loader v0.07042 @ 2015-12-26 12:22:09
282
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:uHHqseJ56g3nDyKnNncyUA
311
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:v9+wPKUT381CLNlusQ4LMA
283
312
284
__PACKAGE__->belongs_to(
313
__PACKAGE__->belongs_to(
285
  "item",
314
  "item",
(-)a/installer/data/mysql/atomicupdate/hold_itype.sql (+7 lines)
Line 0 Link Here
1
ALTER TABLE reserves ADD COLUMN itemtype VARCHAR(10) NULL DEFAULT NULL AFTER suspend_until;
2
ALTER TABLE reserves ADD KEY `itemtype` (`itemtype`);
3
ALTER TABLE reserves ADD CONSTRAINT `reserves_ibfk_5` FOREIGN KEY (`itemtype`) REFERENCES `itemtypes` (`itemtype`) ON DELETE CASCADE ON UPDATE CASCADE;
4
5
ALTER TABLE old_reserves ADD COLUMN itemtype VARCHAR(10) NULL DEFAULT NULL AFTER suspend_until;
6
ALTER TABLE old_reserves ADD KEY `itemtype` (`itemtype`);
7
ALTER TABLE old_reserves ADD CONSTRAINT `old_reserves_ibfk_4` FOREIGN KEY (`itemtype`) REFERENCES `itemtypes` (`itemtype`) ON DELETE CASCADE ON UPDATE CASCADE;
(-)a/installer/data/mysql/kohastructure.sql (-1 / +8 lines)
Lines 1705-1720 CREATE TABLE `old_reserves` ( -- this table holds all holds/reserves that have b Link Here
1705
  `lowestPriority` tinyint(1) NOT NULL, -- has this hold been pinned to the lowest priority in the holds queue (1 for yes, 0 for no)
1705
  `lowestPriority` tinyint(1) NOT NULL, -- has this hold been pinned to the lowest priority in the holds queue (1 for yes, 0 for no)
1706
  `suspend` BOOLEAN NOT NULL DEFAULT 0, -- in this hold suspended (1 for yes, 0 for no)
1706
  `suspend` BOOLEAN NOT NULL DEFAULT 0, -- in this hold suspended (1 for yes, 0 for no)
1707
  `suspend_until` DATETIME NULL DEFAULT NULL, -- the date this hold is suspended until (NULL for infinitely)
1707
  `suspend_until` DATETIME NULL DEFAULT NULL, -- the date this hold is suspended until (NULL for infinitely)
1708
  `itemtype` VARCHAR(10) NULL DEFAULT NULL, -- If record level hold, the optional itemtype of the item the patron is requesting
1708
  PRIMARY KEY (`reserve_id`),
1709
  PRIMARY KEY (`reserve_id`),
1709
  KEY `old_reserves_borrowernumber` (`borrowernumber`),
1710
  KEY `old_reserves_borrowernumber` (`borrowernumber`),
1710
  KEY `old_reserves_biblionumber` (`biblionumber`),
1711
  KEY `old_reserves_biblionumber` (`biblionumber`),
1711
  KEY `old_reserves_itemnumber` (`itemnumber`),
1712
  KEY `old_reserves_itemnumber` (`itemnumber`),
1712
  KEY `old_reserves_branchcode` (`branchcode`),
1713
  KEY `old_reserves_branchcode` (`branchcode`),
1714
  KEY `old_reserves_itemtype` (`itemtype`),
1713
  CONSTRAINT `old_reserves_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`)
1715
  CONSTRAINT `old_reserves_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`)
1714
    ON DELETE SET NULL ON UPDATE SET NULL,
1716
    ON DELETE SET NULL ON UPDATE SET NULL,
1715
  CONSTRAINT `old_reserves_ibfk_2` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`)
1717
  CONSTRAINT `old_reserves_ibfk_2` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`)
1716
    ON DELETE SET NULL ON UPDATE SET NULL,
1718
    ON DELETE SET NULL ON UPDATE SET NULL,
1717
  CONSTRAINT `old_reserves_ibfk_3` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`)
1719
  CONSTRAINT `old_reserves_ibfk_3` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`)
1720
    ON DELETE SET NULL ON UPDATE SET NULL,
1721
  CONSTRAINT `old_reserves_ibfk_4` FOREIGN KEY (`itemtype`) REFERENCES `itemtypes` (`itemtype`)
1718
    ON DELETE SET NULL ON UPDATE SET NULL
1722
    ON DELETE SET NULL ON UPDATE SET NULL
1719
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
1723
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
1720
1724
Lines 1882-1897 CREATE TABLE `reserves` ( -- information related to holds/reserves in Koha Link Here
1882
  `lowestPriority` tinyint(1) NOT NULL,
1886
  `lowestPriority` tinyint(1) NOT NULL,
1883
  `suspend` BOOLEAN NOT NULL DEFAULT 0,
1887
  `suspend` BOOLEAN NOT NULL DEFAULT 0,
1884
  `suspend_until` DATETIME NULL DEFAULT NULL,
1888
  `suspend_until` DATETIME NULL DEFAULT NULL,
1889
  `itemtype` VARCHAR(10) NULL DEFAULT NULL, -- If record level hold, the optional itemtype of the item the patron is requesting
1885
  PRIMARY KEY (`reserve_id`),
1890
  PRIMARY KEY (`reserve_id`),
1886
  KEY priorityfoundidx (priority,found),
1891
  KEY priorityfoundidx (priority,found),
1887
  KEY `borrowernumber` (`borrowernumber`),
1892
  KEY `borrowernumber` (`borrowernumber`),
1888
  KEY `biblionumber` (`biblionumber`),
1893
  KEY `biblionumber` (`biblionumber`),
1889
  KEY `itemnumber` (`itemnumber`),
1894
  KEY `itemnumber` (`itemnumber`),
1890
  KEY `branchcode` (`branchcode`),
1895
  KEY `branchcode` (`branchcode`),
1896
  KEY `itemtype` (`itemtype`),
1891
  CONSTRAINT `reserves_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1897
  CONSTRAINT `reserves_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1892
  CONSTRAINT `reserves_ibfk_2` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1898
  CONSTRAINT `reserves_ibfk_2` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1893
  CONSTRAINT `reserves_ibfk_3` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1899
  CONSTRAINT `reserves_ibfk_3` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1894
  CONSTRAINT `reserves_ibfk_4` FOREIGN KEY (`branchcode`) REFERENCES `branches` (`branchcode`) ON DELETE CASCADE ON UPDATE CASCADE
1900
  CONSTRAINT `reserves_ibfk_4` FOREIGN KEY (`branchcode`) REFERENCES `branches` (`branchcode`) ON DELETE CASCADE ON UPDATE CASCADE,
1901
  CONSTRAINT `reserves_ibfk_5` FOREIGN KEY (`itemtype`) REFERENCES `itemtypes` (`itemtype`) ON DELETE CASCADE ON UPDATE CASCADE
1895
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
1902
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
1896
1903
1897
--
1904
--
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt (-1 / +18 lines)
Lines 1-5 Link Here
1
[% USE Koha %]
1
[% USE Koha %]
2
[% USE KohaDates %]
2
[% USE KohaDates %]
3
[% USE ItemTypes %]
3
[% INCLUDE 'doc-head-open.inc' %]
4
[% INCLUDE 'doc-head-open.inc' %]
4
[% UNLESS ( multi_hold ) %]
5
[% UNLESS ( multi_hold ) %]
5
    <title>Koha &rsaquo; Circulation &rsaquo; Holds &rsaquo; Place a hold on [% title |html %]</title>
6
    <title>Koha &rsaquo; Circulation &rsaquo; Holds &rsaquo; Place a hold on [% title |html %]</title>
Lines 410-415 function checkMultiHold() { Link Here
410
            </select>
411
            </select>
411
        </li>
412
        </li>
412
413
414
        [% UNLESS ( multi_hold ) %]
415
            <li>
416
                <label for="itemtype">Request specific item type:</label>
417
                <select name="itemtype" size="1" id="itemtype">
418
                    <option value="">Any item type</option>
419
                    [%- FOREACH itemtype IN available_itemtypes %]
420
                        <option value="[% itemtype %]">[% ItemTypes.GetDescription( itemtype ) %]</option>
421
                    [%- END %]
422
                </select>
423
            </li>
424
        [% END %]
425
413
	[% IF ( reserve_in_future ) %]
426
	[% IF ( reserve_in_future ) %]
414
	<li>
427
	<li>
415
        <label for="from">Hold starts on date:</label>
428
        <label for="from">Hold starts on date:</label>
Lines 798-804 function checkMultiHold() { Link Here
798
                </a>
811
                </a>
799
                </i>
812
                </i>
800
            [% ELSE %]
813
            [% ELSE %]
801
                <i>Next available</i>
814
                [% IF reserveloo.itemtype %]
815
                    <i>Next available <b>[% ItemTypes.GetDescription( reserveloo.itemtype ) %]</b> item</i>
816
                [% ELSE %]
817
                    <i>Next available</i>
818
                [% END %]
802
                 <input type="hidden" name="itemnumber" value="" />
819
                 <input type="hidden" name="itemnumber" value="" />
803
            [% END %]
820
            [% END %]
804
    [% END %]
821
    [% END %]
(-)a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-reserve.tt (+13 lines)
Lines 1-6 Link Here
1
[% USE Koha %]
1
[% USE Koha %]
2
[% USE KohaDates %]
2
[% USE KohaDates %]
3
[% USE Price %]
3
[% USE Price %]
4
[% USE ItemTypes %]
4
[% INCLUDE 'doc-head-open.inc' %]
5
[% INCLUDE 'doc-head-open.inc' %]
5
<title>[% IF ( LibraryNameTitle ) %][% LibraryNameTitle %][% ELSE %]Koha online[% END %] catalog &rsaquo; Placing a hold</title>
6
<title>[% IF ( LibraryNameTitle ) %][% LibraryNameTitle %][% ELSE %]Koha online[% END %] catalog &rsaquo; Placing a hold</title>
6
[% INCLUDE 'doc-head-close.inc' %]
7
[% INCLUDE 'doc-head-close.inc' %]
Lines 248-253 Link Here
248
                                                            <span class="date-format to" data-biblionumber="[% bibitemloo.biblionumber %]">[% INCLUDE 'date-format.inc' %]</span>
249
                                                            <span class="date-format to" data-biblionumber="[% bibitemloo.biblionumber %]">[% INCLUDE 'date-format.inc' %]</span>
249
                                                        </li>
250
                                                        </li>
250
251
252
                                                        [% UNLESS ( multi_hold ) %]
253
                                                            <li>
254
                                                                <label for="itemtype">Request specific item type:</label>
255
                                                                <select name="itemtype" size="1" id="itemtype">
256
                                                                    <option value="">Any item type</option>
257
                                                                    [%- FOREACH itemtype IN available_itemtypes %]
258
                                                                        <option value="[% itemtype %]">[% ItemTypes.GetDescription( itemtype ) %]</option>
259
                                                                    [%- END %]
260
                                                                </select>
261
                                                            </li>
262
                                                        [% END %]
263
251
                                                        [% IF ( OpacHoldNotes ) %]
264
                                                        [% IF ( OpacHoldNotes ) %]
252
                                                            <li>
265
                                                            <li>
253
                                                                <div class="notesrow" id="notesrow_[% bibitemloo.biblionumber %]">
266
                                                                <div class="notesrow" id="notesrow_[% bibitemloo.biblionumber %]">
(-)a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-user.tt (-1 / +6 lines)
Lines 1-6 Link Here
1
[% USE Koha %]
1
[% USE Koha %]
2
[% USE KohaDates %]
2
[% USE KohaDates %]
3
[% USE Branches %]
3
[% USE Branches %]
4
[% USE ItemTypes %]
4
5
5
[% INCLUDE 'doc-head-open.inc' %]
6
[% INCLUDE 'doc-head-open.inc' %]
6
<title>[% IF ( LibraryNameTitle ) %][% LibraryNameTitle %][% ELSE %]Koha online[% END %] catalog &rsaquo; Your library home</title>
7
<title>[% IF ( LibraryNameTitle ) %][% LibraryNameTitle %][% ELSE %]Koha online[% END %] catalog &rsaquo; Your library home</title>
Lines 608-614 Link Here
608
                                                    [% ELSIF ( RESERVE.suspend ) %]
609
                                                    [% ELSIF ( RESERVE.suspend ) %]
609
                                                        Suspended [% IF ( RESERVE.suspend_until ) %] until [% RESERVE.suspend_until %] [% END %]
610
                                                        Suspended [% IF ( RESERVE.suspend_until ) %] until [% RESERVE.suspend_until %] [% END %]
610
                                                    [% ELSE %]
611
                                                    [% ELSE %]
611
                                                        Pending
612
                                                        [% IF RESERVE.itemtype %]
613
                                                            Pending for next available <i>[% ItemTypes.GetDescription( RESERVE.itemtype ) %]</i> item
614
                                                        [% ELSE %]
615
                                                            Pending
616
                                                        [% END %]
612
                                                    [% END %]
617
                                                    [% END %]
613
                                                [% END %]
618
                                                [% END %]
614
                                            </td>
619
                                            </td>
(-)a/opac/opac-reserve.pl (-6 / +13 lines)
Lines 37-42 use Koha::DateUtils; Link Here
37
use Koha::Libraries;
37
use Koha::Libraries;
38
use Koha::Patron::Debarments qw(IsDebarred);
38
use Koha::Patron::Debarments qw(IsDebarred);
39
use Date::Calc qw/Today Date_to_Days/;
39
use Date::Calc qw/Today Date_to_Days/;
40
use List::MoreUtils qw/uniq/;
40
41
41
my $maxreserves = C4::Context->preference("maxreserves");
42
my $maxreserves = C4::Context->preference("maxreserves");
42
43
Lines 281-295 if ( $query->param('place_reserve') ) { Link Here
281
            $canreserve = 0;
282
            $canreserve = 0;
282
        }
283
        }
283
284
285
        my $itemtype = $query->param('itemtype') || undef;
286
        $itemtype = undef if $itemNum;
287
284
        # Here we actually do the reserveration. Stage 3.
288
        # Here we actually do the reserveration. Stage 3.
285
        if ($canreserve) {
289
        if ($canreserve) {
286
            my $reserve_id = AddReserve(
290
            my $reserve_id = AddReserve(
287
                $branch,      $borrowernumber,
291
                $branch,          $borrowernumber, $biblioNum,
288
                $biblioNum,
292
                [$biblioNum],     $rank,           $startdate,
289
                [$biblioNum], $rank,
293
                $expiration_date, $notes,          $biblioData->{title},
290
                $startdate,   $expiration_date,
294
                $itemNum,         $found,          $itemtype,
291
                $notes,       $biblioData->{title},
292
                $itemNum,     $found
293
            );
295
            );
294
            $failed_holds++ unless $reserve_id;
296
            $failed_holds++ unless $reserve_id;
295
            ++$reserve_cnt;
297
            ++$reserve_cnt;
Lines 381-386 unless ($noreserves) { Link Here
381
#
383
#
382
my $notforloan_label_of = get_notforloan_label_of();
384
my $notforloan_label_of = get_notforloan_label_of();
383
385
386
my @available_itemtypes;
384
my $biblioLoop = [];
387
my $biblioLoop = [];
385
my $numBibsAvailable = 0;
388
my $numBibsAvailable = 0;
386
my $itemdata_enumchron = 0;
389
my $itemdata_enumchron = 0;
Lines 534-539 foreach my $biblioNum (@biblionumbers) { Link Here
534
                $itemLoopIter->{available} = 1;
537
                $itemLoopIter->{available} = 1;
535
                $numCopiesOPACAvailable++;
538
                $numCopiesOPACAvailable++;
536
                $biblioLoopIter{force_hold} = 1 if $hold_allowed eq 'F';
539
                $biblioLoopIter{force_hold} = 1 if $hold_allowed eq 'F';
540
                push( @available_itemtypes, $itemInfo->{itype} );
537
            }
541
            }
538
            $numCopiesAvailable++;
542
            $numCopiesAvailable++;
539
        }
543
        }
Lines 571-576 foreach my $biblioNum (@biblionumbers) { Link Here
571
    $anyholdable = 1 if $biblioLoopIter{holdable};
575
    $anyholdable = 1 if $biblioLoopIter{holdable};
572
}
576
}
573
577
578
@available_itemtypes = uniq( @available_itemtypes );
579
$template->param( available_itemtypes => \@available_itemtypes );
580
574
if ( $numBibsAvailable == 0 || $anyholdable == 0) {
581
if ( $numBibsAvailable == 0 || $anyholdable == 0) {
575
    $template->param( none_available => 1 );
582
    $template->param( none_available => 1 );
576
}
583
}
(-)a/reserve/placerequest.pl (-13 / +15 lines)
Lines 37-55 my $input = CGI->new(); Link Here
37
37
38
checkauth($input, 0, { reserveforothers => 'place_holds' }, 'intranet');
38
checkauth($input, 0, { reserveforothers => 'place_holds' }, 'intranet');
39
39
40
my @bibitems=$input->multi_param('biblioitem');
40
my @bibitems       = $input->multi_param('biblioitem');
41
my @reqbib=$input->multi_param('reqbib');
41
my @reqbib         = $input->multi_param('reqbib');
42
my $biblionumber=$input->param('biblionumber');
42
my $biblionumber   = $input->param('biblionumber');
43
my $borrowernumber=$input->param('borrowernumber');
43
my $borrowernumber = $input->param('borrowernumber');
44
my $notes=$input->param('notes');
44
my $notes          = $input->param('notes');
45
my $branch=$input->param('pickup');
45
my $branch         = $input->param('pickup');
46
my $startdate=$input->param('reserve_date') || '';
46
my $startdate      = $input->param('reserve_date') || '';
47
my @rank=$input->multi_param('rank-request');
47
my @rank           = $input->multi_param('rank-request');
48
my $type=$input->param('type');
48
my $type           = $input->param('type');
49
my $title=$input->param('title');
49
my $title          = $input->param('title');
50
my $borrower=GetMember('borrowernumber'=>$borrowernumber);
50
my $checkitem      = $input->param('checkitem');
51
my $checkitem=$input->param('checkitem');
52
my $expirationdate = $input->param('expiration_date');
51
my $expirationdate = $input->param('expiration_date');
52
my $itemtype       = $input->param('itemtype') || undef;
53
54
my $borrower = GetMember( 'borrowernumber' => $borrowernumber );
53
55
54
my $multi_hold = $input->param('multi_hold');
56
my $multi_hold = $input->param('multi_hold');
55
my $biblionumbers = $multi_hold ? $input->param('biblionumbers') : ($biblionumber . '/');
57
my $biblionumbers = $multi_hold ? $input->param('biblionumbers') : ($biblionumber . '/');
Lines 108-114 if ($type eq 'str8' && $borrower){ Link Here
108
                       $bibinfo->{rank},$startdate,$expirationdate,$notes,$bibinfo->{title},$checkitem,$found);
110
                       $bibinfo->{rank},$startdate,$expirationdate,$notes,$bibinfo->{title},$checkitem,$found);
109
        } else {
111
        } else {
110
            # place a request on 1st available
112
            # place a request on 1st available
111
            AddReserve($branch,$borrower->{'borrowernumber'},$biblionumber,\@realbi,$rank[0],$startdate,$expirationdate,$notes,$title,$checkitem,$found);
113
            AddReserve($branch,$borrower->{'borrowernumber'},$biblionumber,\@realbi,$rank[0],$startdate,$expirationdate,$notes,$title,$checkitem,$found, $itemtype);
112
        }
114
        }
113
    }
115
    }
114
116
(-)a/reserve/request.pl (+7 lines)
Lines 321-326 foreach my $biblionumber (@biblionumbers) { Link Here
321
321
322
    my @bibitemloop;
322
    my @bibitemloop;
323
323
324
    my @available_itemtypes;
324
    foreach my $biblioitemnumber (@biblioitemnumbers) {
325
    foreach my $biblioitemnumber (@biblioitemnumbers) {
325
        my $biblioitem = $biblioiteminfos_of->{$biblioitemnumber};
326
        my $biblioitem = $biblioiteminfos_of->{$biblioitemnumber};
326
        my $num_available = 0;
327
        my $num_available = 0;
Lines 454-459 foreach my $biblionumber (@biblionumbers) { Link Here
454
            {
455
            {
455
                $item->{available} = 1;
456
                $item->{available} = 1;
456
                $num_available++;
457
                $num_available++;
458
459
                push( @available_itemtypes, $item->{itype} );
457
            }
460
            }
458
            elsif ( C4::Context->preference('AllowHoldPolicyOverride') ) {
461
            elsif ( C4::Context->preference('AllowHoldPolicyOverride') ) {
459
                # If AllowHoldPolicyOverride is set, it should override EVERY restriction, not just branch item rules
462
                # If AllowHoldPolicyOverride is set, it should override EVERY restriction, not just branch item rules
Lines 483-488 foreach my $biblionumber (@biblionumbers) { Link Here
483
        push @bibitemloop, $biblioitem;
486
        push @bibitemloop, $biblioitem;
484
    }
487
    }
485
488
489
    @available_itemtypes = uniq( @available_itemtypes );
490
    $template->param( available_itemtypes => \@available_itemtypes );
491
486
    # existingreserves building
492
    # existingreserves building
487
    my @reserveloop;
493
    my @reserveloop;
488
    my @reserves = Koha::Holds->search( { biblionumber => $biblionumber }, { order_by => 'priority' } );
494
    my @reserves = Koha::Holds->search( { biblionumber => $biblionumber }, { order_by => 'priority' } );
Lines 561-566 foreach my $biblionumber (@biblionumbers) { Link Here
561
        $reserve{'suspend'}        = $res->suspend();
567
        $reserve{'suspend'}        = $res->suspend();
562
        $reserve{'suspend_until'}  = $res->suspend_until();
568
        $reserve{'suspend_until'}  = $res->suspend_until();
563
        $reserve{'reserve_id'}     = $res->reserve_id();
569
        $reserve{'reserve_id'}     = $res->reserve_id();
570
        $reserve{itemtype}         = $res->{itemtype};
564
571
565
        if ( C4::Context->preference('IndependentBranches') && $flags->{'superlibrarian'} != 1 ) {
572
        if ( C4::Context->preference('IndependentBranches') && $flags->{'superlibrarian'} != 1 ) {
566
            $reserve{'branchloop'} = [ Koha::Libraries->find( $res->branchcode() ) ];
573
            $reserve{'branchloop'} = [ Koha::Libraries->find( $res->branchcode() ) ];
(-)a/t/db_dependent/Holds/HoldItemtypeLimit.t (+112 lines)
Line 0 Link Here
1
#!/usr/bin/perl
2
3
use Modern::Perl;
4
5
use C4::Context;
6
7
use Test::More tests => 4;
8
9
use t::lib::TestBuilder;
10
11
BEGIN {
12
    use FindBin;
13
    use lib $FindBin::Bin;
14
    use_ok('C4::Reserves');
15
}
16
17
my $schema = Koha::Database->schema;
18
$schema->storage->txn_begin;
19
my $dbh = C4::Context->dbh;
20
21
my $builder = t::lib::TestBuilder->new;
22
23
my $library = $builder->build({
24
    source => 'Branch',
25
});
26
27
my $bib_title = "Test Title";
28
29
my $borrower = $builder->build({
30
    source => 'Borrower',
31
    value => {
32
        categorycode => 'S',
33
        branchcode => $library->{branchcode},
34
    }
35
});
36
37
my $itemtype1 = $builder->build({
38
    source => 'Itemtype',
39
    value => {
40
        notforloan => 0
41
    }
42
});
43
44
my $itemtype2 = $builder->build({
45
    source => 'Itemtype',
46
    value => {
47
        notforloan => 0
48
    }
49
});
50
51
52
# Test hold_fulfillment_policy
53
my $right_itemtype = $itemtype1->{itemtype};
54
my $wrong_itemtype = $itemtype2->{itemtype};
55
my $borrowernumber = $borrower->{borrowernumber};
56
my $branchcode = $library->{branchcode};
57
$dbh->do("DELETE FROM reserves");
58
$dbh->do("DELETE FROM issues");
59
$dbh->do("DELETE FROM items");
60
$dbh->do("DELETE FROM biblio");
61
$dbh->do("DELETE FROM biblioitems");
62
$dbh->do("DELETE FROM transport_cost");
63
$dbh->do("DELETE FROM tmp_holdsqueue");
64
$dbh->do("DELETE FROM hold_fill_targets");
65
$dbh->do("DELETE FROM default_branch_circ_rules");
66
$dbh->do("DELETE FROM default_branch_item_rules");
67
$dbh->do("DELETE FROM default_circ_rules");
68
$dbh->do("DELETE FROM branch_item_rules");
69
70
$dbh->do("INSERT INTO biblio (frameworkcode, author, title, datecreated) VALUES ('', 'Koha test', '$bib_title', '2011-02-01')");
71
72
my $biblionumber = $dbh->selectrow_array("SELECT biblionumber FROM biblio WHERE title = '$bib_title'")
73
  or BAIL_OUT("Cannot find newly created biblio record");
74
75
$dbh->do("INSERT INTO biblioitems (biblionumber, marcxml, itemtype) VALUES ($biblionumber, '', '$right_itemtype')");
76
77
my $biblioitemnumber =
78
  $dbh->selectrow_array("SELECT biblioitemnumber FROM biblioitems WHERE biblionumber = $biblionumber")
79
  or BAIL_OUT("Cannot find newly created biblioitems record");
80
81
$dbh->do("
82
    INSERT INTO items (biblionumber, biblioitemnumber, homebranch, holdingbranch, notforloan, damaged, itemlost, withdrawn, onloan, itype)
83
    VALUES ($biblionumber, $biblioitemnumber, '$branchcode', '$branchcode', 0, 0, 0, 0, NULL, '$right_itemtype')
84
");
85
86
my $itemnumber =
87
  $dbh->selectrow_array("SELECT itemnumber FROM items WHERE biblionumber = $biblionumber")
88
  or BAIL_OUT("Cannot find newly created item");
89
90
$dbh->do("DELETE FROM default_circ_rules");
91
$dbh->do("INSERT INTO default_circ_rules ( holdallowed, hold_fulfillment_policy ) VALUES ( 2, 'any' )");
92
93
# Itemtypes match
94
my $reserve_id = AddReserve( $branchcode, $borrowernumber, $biblionumber, '', 1, undef, undef, undef, undef, undef, undef, $right_itemtype );
95
my ( $status ) = CheckReserves($itemnumber);
96
is( $status, 'Reserved', "Hold where itemtype matches item's itemtype targed" );
97
CancelReserve( { reserve_id => $reserve_id } );
98
99
# Itemtypes don't match
100
$reserve_id = AddReserve( $branchcode, $borrowernumber, $biblionumber, '', 1, undef, undef, undef, undef, undef, undef, $wrong_itemtype );
101
( $status ) = CheckReserves($itemnumber);
102
is($status, q{}, "Hold where itemtype does not match item's itemtype not targeted" );
103
CancelReserve( { reserve_id => $reserve_id } );
104
105
# No itemtype set
106
$reserve_id = AddReserve( $branchcode, $borrowernumber, $biblionumber, '', 1, undef, undef, undef, undef, undef, undef, undef );
107
( $status ) = CheckReserves($itemnumber);
108
is( $status, 'Reserved', "Item targeted with no hold itemtype set" );
109
CancelReserve( { reserve_id => $reserve_id } );
110
111
# Cleanup
112
$schema->storage->txn_rollback;
(-)a/t/db_dependent/HoldsQueue.t (-3 / +64 lines)
Lines 8-17 Link Here
8
8
9
use Modern::Perl;
9
use Modern::Perl;
10
10
11
use Test::More tests => 35;
11
use Test::More tests => 38;
12
use Data::Dumper;
12
use Data::Dumper;
13
13
14
15
use C4::Branch;
14
use C4::Branch;
16
use C4::Calendar;
15
use C4::Calendar;
17
use C4::Context;
16
use C4::Context;
Lines 555-560 CancelReserve( { reserve_id => $reserve_id } ); Link Here
555
554
556
# End testing hold_fulfillment_policy
555
# End testing hold_fulfillment_policy
557
556
557
# Test hold itemtype limit
558
C4::Context->set_preference( "UseTransportCostMatrix", 0 );
559
my @itemtypes = Koha::ItemTypes->search();
560
my $wrong_itemtype = $itemtypes[0]->itemtype;
561
my $right_itemtype = $itemtypes[1]->itemtype;
562
$borrowernumber = $borrower3->{borrowernumber};
563
my $branchcode = $library1->{branchcode};
564
$dbh->do("DELETE FROM reserves");
565
$dbh->do("DELETE FROM issues");
566
$dbh->do("DELETE FROM items");
567
$dbh->do("DELETE FROM biblio");
568
$dbh->do("DELETE FROM biblioitems");
569
$dbh->do("DELETE FROM transport_cost");
570
$dbh->do("DELETE FROM tmp_holdsqueue");
571
$dbh->do("DELETE FROM hold_fill_targets");
572
$dbh->do("DELETE FROM default_branch_circ_rules");
573
$dbh->do("DELETE FROM default_branch_item_rules");
574
$dbh->do("DELETE FROM default_circ_rules");
575
$dbh->do("DELETE FROM branch_item_rules");
576
577
$dbh->do("INSERT INTO biblio (frameworkcode, author, title, datecreated) VALUES ('', 'Koha test', '$TITLE', '2011-02-01')");
578
579
$biblionumber = $dbh->selectrow_array("SELECT biblionumber FROM biblio WHERE title = '$TITLE'")
580
  or BAIL_OUT("Cannot find newly created biblio record");
581
582
$dbh->do("INSERT INTO biblioitems (biblionumber, marcxml, itemtype) VALUES ($biblionumber, '', '$itemtype')");
583
584
$biblioitemnumber =
585
  $dbh->selectrow_array("SELECT biblioitemnumber FROM biblioitems WHERE biblionumber = $biblionumber")
586
  or BAIL_OUT("Cannot find newly created biblioitems record");
587
588
$dbh->do("
589
    INSERT INTO items (biblionumber, biblioitemnumber, homebranch, holdingbranch, notforloan, damaged, itemlost, withdrawn, onloan, itype)
590
    VALUES ($biblionumber, $biblioitemnumber, '$library_A', '$library_B', 0, 0, 0, 0, NULL, '$right_itemtype')
591
");
592
593
# With hold_fulfillment_policy = homebranch, hold should only be picked up if pickup branch = homebranch
594
$dbh->do("DELETE FROM default_circ_rules");
595
$dbh->do("INSERT INTO default_circ_rules ( holdallowed, hold_fulfillment_policy ) VALUES ( 2, 'any' )");
596
597
# Home branch matches pickup branch
598
$reserve_id = AddReserve( $library_A, $borrowernumber, $biblionumber, '', 1, undef, undef, undef, undef, undef, undef, $wrong_itemtype );
599
C4::HoldsQueue::CreateQueue();
600
$holds_queue = $dbh->selectall_arrayref( "SELECT * FROM tmp_holdsqueue", { Slice => {} } );
601
is( @$holds_queue, 0, "Item with incorrect itemtype not targeted" );
602
CancelReserve( { reserve_id => $reserve_id } );
603
604
# Holding branch matches pickup branch
605
$reserve_id = AddReserve( $library_A, $borrowernumber, $biblionumber, '', 1, undef, undef, undef, undef, undef, undef, $right_itemtype );
606
C4::HoldsQueue::CreateQueue();
607
$holds_queue = $dbh->selectall_arrayref( "SELECT * FROM tmp_holdsqueue", { Slice => {} } );
608
is( @$holds_queue, 1, "Item with matching itemtype is targeted" );
609
CancelReserve( { reserve_id => $reserve_id } );
610
611
# Neither branch matches pickup branch
612
$reserve_id = AddReserve( $library_A, $borrowernumber, $biblionumber, '', 1, undef, undef, undef, undef, undef, undef, undef );
613
C4::HoldsQueue::CreateQueue();
614
$holds_queue = $dbh->selectall_arrayref( "SELECT * FROM tmp_holdsqueue", { Slice => {} } );
615
is( @$holds_queue, 1, "Item targeted when hold itemtype is not set" );
616
CancelReserve( { reserve_id => $reserve_id } );
617
618
# End testing hold itemtype limit
619
558
# Cleanup
620
# Cleanup
559
$schema->storage->txn_rollback;
621
$schema->storage->txn_rollback;
560
622
561
- 

Return to bug 15533