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

(-)a/C4/HoldsQueue.pm (-1 / +22 lines)
Lines 266-272 sub GetPendingHoldRequestsForBib { Link Here
266
    my $dbh = C4::Context->dbh;
266
    my $dbh = C4::Context->dbh;
267
267
268
    my $request_query = "SELECT biblionumber, borrowernumber, itemnumber, priority, reserves.branchcode,
268
    my $request_query = "SELECT biblionumber, borrowernumber, itemnumber, priority, reserves.branchcode,
269
                                reservedate, reservenotes, borrowers.branchcode AS borrowerbranch
269
                                reservedate, reservenotes, borrowers.branchcode AS borrowerbranch, itemtype
270
                         FROM reserves
270
                         FROM reserves
271
                         JOIN borrowers USING (borrowernumber)
271
                         JOIN borrowers USING (borrowernumber)
272
                         WHERE biblionumber = ?
272
                         WHERE biblionumber = ?
Lines 356-361 sub GetItemsAvailableToFillHoldRequestsForBib { Link Here
356
sub MapItemsToHoldRequests {
356
sub MapItemsToHoldRequests {
357
    my ($hold_requests, $available_items, $branches_to_use, $transport_cost_matrix) = @_;
357
    my ($hold_requests, $available_items, $branches_to_use, $transport_cost_matrix) = @_;
358
358
359
359
    # handle trival cases
360
    # handle trival cases
360
    return unless scalar(@$hold_requests) > 0;
361
    return unless scalar(@$hold_requests) > 0;
361
    return unless scalar(@$available_items) > 0;
362
    return unless scalar(@$available_items) > 0;
Lines 388-393 sub MapItemsToHoldRequests { Link Here
388
                and ( # Don't fill item level holds that contravene the hold pickup policy at this time
389
                and ( # Don't fill item level holds that contravene the hold pickup policy at this time
389
                    ( $items_by_itemnumber{ $request->{itemnumber} }->{hold_fulfillment_policy} eq 'any' )
390
                    ( $items_by_itemnumber{ $request->{itemnumber} }->{hold_fulfillment_policy} eq 'any' )
390
                    || ( $request->{branchcode} eq $items_by_itemnumber{ $request->{itemnumber} }->{ $items_by_itemnumber{ $request->{itemnumber} }->{hold_fulfillment_policy} }  )
391
                    || ( $request->{branchcode} eq $items_by_itemnumber{ $request->{itemnumber} }->{ $items_by_itemnumber{ $request->{itemnumber} }->{hold_fulfillment_policy} }  )
392
                and ( !$request->{itemtype} # If hold itemtype is set, item's itemtype must match
393
                    || $items_by_itemnumber{ $request->{itemnumber} }->{itype} eq $request->{itemtype} )
391
                )
394
                )
392
395
393
              )
396
              )
Lines 439-444 sub MapItemsToHoldRequests { Link Here
439
                    $request->{borrowerbranch} eq $item->{homebranch}
442
                    $request->{borrowerbranch} eq $item->{homebranch}
440
                    && ( ( $item->{hold_fulfillment_policy} eq 'any' ) # Don't fill item level holds that contravene the hold pickup policy at this time
443
                    && ( ( $item->{hold_fulfillment_policy} eq 'any' ) # Don't fill item level holds that contravene the hold pickup policy at this time
441
                        || $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} } )
444
                        || $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} } )
445
                    && ( !$request->{itemtype} # If hold itemtype is set, item's itemtype must match
446
                        || $items_by_itemnumber{ $request->{itemnumber} }->{itype} eq $request->{itemtype} )
442
                  )
447
                  )
443
                {
448
                {
444
                    $itemnumber = $item->{itemnumber};
449
                    $itemnumber = $item->{itemnumber};
Lines 460-465 sub MapItemsToHoldRequests { Link Here
460
                    next unless $item->{hold_fulfillment_policy} eq 'any'
465
                    next unless $item->{hold_fulfillment_policy} eq 'any'
461
                        || $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} };
466
                        || $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} };
462
467
468
                    # If hold itemtype is set, item's itemtype must match
469
                    next unless ( !$request->{itemtype}
470
                        || $item->{itype} eq $request->{itemtype} );
471
463
                    $itemnumber = $item->{itemnumber};
472
                    $itemnumber = $item->{itemnumber};
464
                    last;
473
                    last;
465
                }
474
                }
Lines 492-497 sub MapItemsToHoldRequests { Link Here
492
                    next unless $item->{hold_fulfillment_policy} eq 'any'
501
                    next unless $item->{hold_fulfillment_policy} eq 'any'
493
                        || $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} };
502
                        || $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} };
494
503
504
                    # If hold itemtype is set, item's itemtype must match
505
                    next unless ( !$request->{itemtype}
506
                        || $item->{itype} eq $request->{itemtype} );
507
495
                    $itemnumber = $item->{itemnumber};
508
                    $itemnumber = $item->{itemnumber};
496
                    $holdingbranch = $branch;
509
                    $holdingbranch = $branch;
497
                    last PULL_BRANCHES;
510
                    last PULL_BRANCHES;
Lines 507-512 sub MapItemsToHoldRequests { Link Here
507
                        next unless $current_item->{hold_fulfillment_policy} eq 'any'
520
                        next unless $current_item->{hold_fulfillment_policy} eq 'any'
508
                            || $request->{branchcode} eq $current_item->{ $current_item->{hold_fulfillment_policy} };
521
                            || $request->{branchcode} eq $current_item->{ $current_item->{hold_fulfillment_policy} };
509
522
523
                        # If hold itemtype is set, item's itemtype must match
524
                        next unless ( !$request->{itemtype}
525
                            || $current_item->{itype} eq $request->{itemtype} );
526
510
                        $itemnumber = $current_item->{itemnumber};
527
                        $itemnumber = $current_item->{itemnumber};
511
                        last; # quit this loop as soon as we have a suitable item
528
                        last; # quit this loop as soon as we have a suitable item
512
                    }
529
                    }
Lines 527-532 sub MapItemsToHoldRequests { Link Here
527
                        next unless $item->{hold_fulfillment_policy} eq 'any'
544
                        next unless $item->{hold_fulfillment_policy} eq 'any'
528
                            || $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} };
545
                            || $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} };
529
546
547
                        # If hold itemtype is set, item's itemtype must match
548
                        next unless ( !$request->{itemtype}
549
                            || $item->{itype} eq $request->{itemtype} );
550
530
                        $itemnumber = $item->{itemnumber};
551
                        $itemnumber = $item->{itemnumber};
531
                        $holdingbranch = $branch;
552
                        $holdingbranch = $branch;
532
                        last PULL_BRANCHES2;
553
                        last PULL_BRANCHES2;
(-)a/C4/Reserves.pm (-9 / +18 lines)
Lines 163-171 The following tables are available witin the HOLDPLACED message: Link Here
163
163
164
sub AddReserve {
164
sub AddReserve {
165
    my (
165
    my (
166
        $branch,    $borrowernumber, $biblionumber,
166
        $branch,   $borrowernumber, $biblionumber, $bibitems,
167
        $bibitems,  $priority, $resdate, $expdate, $notes,
167
        $priority, $resdate,        $expdate,      $notes,
168
        $title,      $checkitem, $found
168
        $title,    $checkitem,      $found,        $itemtype
169
    ) = @_;
169
    ) = @_;
170
170
171
    if ( Koha::Holds->search( { borrowernumber => $borrowernumber, biblionumber => $biblionumber } )->count() > 0 ) {
171
    if ( Koha::Holds->search( { borrowernumber => $borrowernumber, biblionumber => $biblionumber } )->count() > 0 ) {
Lines 193-198 sub AddReserve { Link Here
193
        $waitingdate = $resdate;
193
        $waitingdate = $resdate;
194
    }
194
    }
195
195
196
    # Don't add itemtype limit if specific item is selected
197
    $itemtype = undef if $checkitem;
198
196
    # updates take place here
199
    # updates take place here
197
    my $hold = Koha::Hold->new(
200
    my $hold = Koha::Hold->new(
198
        {
201
        {
Lines 205-211 sub AddReserve { Link Here
205
            itemnumber     => $checkitem,
208
            itemnumber     => $checkitem,
206
            found          => $found,
209
            found          => $found,
207
            waitingdate    => $waitingdate,
210
            waitingdate    => $waitingdate,
208
            expirationdate => $expdate
211
            expirationdate => $expdate,
212
            itemtype       => $itemtype,
209
        }
213
        }
210
    )->store();
214
    )->store();
211
    my $reserve_id = $hold->id();
215
    my $reserve_id = $hold->id();
Lines 312-318 sub GetReservesFromBiblionumber { Link Here
312
                expirationdate,
316
                expirationdate,
313
                lowestPriority,
317
                lowestPriority,
314
                suspend,
318
                suspend,
315
                suspend_until
319
                suspend_until,
320
                itemtype
316
        FROM     reserves
321
        FROM     reserves
317
        WHERE biblionumber = ? ";
322
        WHERE biblionumber = ? ";
318
    push( @params, $biblionumber );
323
    push( @params, $biblionumber );
Lines 948-955 sub CheckReserves { Link Here
948
953
949
                # See if this item is more important than what we've got so far
954
                # See if this item is more important than what we've got so far
950
                if ( ( $res->{'priority'} && $res->{'priority'} < $priority ) || $local_hold_match ) {
955
                if ( ( $res->{'priority'} && $res->{'priority'} < $priority ) || $local_hold_match ) {
951
                    $borrowerinfo ||= C4::Members::GetMember( borrowernumber => $res->{'borrowernumber'} );
952
                    $iteminfo ||= C4::Items::GetItem($itemnumber);
956
                    $iteminfo ||= C4::Items::GetItem($itemnumber);
957
                    next if $res->{itemtype} && $res->{itemtype} ne _get_itype( $iteminfo );
958
                    $borrowerinfo ||= C4::Members::GetMember( borrowernumber => $res->{'borrowernumber'} );
953
                    my $branch = GetReservesControlBranch( $iteminfo, $borrowerinfo );
959
                    my $branch = GetReservesControlBranch( $iteminfo, $borrowerinfo );
954
                    my $branchitemrule = C4::Circulation::GetBranchItemRule($branch,$iteminfo->{'itype'});
960
                    my $branchitemrule = C4::Circulation::GetBranchItemRule($branch,$iteminfo->{'itype'});
955
                    next if ($branchitemrule->{'holdallowed'} == 0);
961
                    next if ($branchitemrule->{'holdallowed'} == 0);
Lines 1856-1862 sub _Findgroupreserve { Link Here
1856
               reserves.timestamp           AS timestamp,
1862
               reserves.timestamp           AS timestamp,
1857
               biblioitems.biblioitemnumber AS biblioitemnumber,
1863
               biblioitems.biblioitemnumber AS biblioitemnumber,
1858
               reserves.itemnumber          AS itemnumber,
1864
               reserves.itemnumber          AS itemnumber,
1859
               reserves.reserve_id          AS reserve_id
1865
               reserves.reserve_id          AS reserve_id,
1866
               reserves.itemtype            AS itemtype
1860
        FROM reserves
1867
        FROM reserves
1861
        JOIN biblioitems USING (biblionumber)
1868
        JOIN biblioitems USING (biblionumber)
1862
        JOIN hold_fill_targets USING (biblionumber, borrowernumber, itemnumber)
1869
        JOIN hold_fill_targets USING (biblionumber, borrowernumber, itemnumber)
Lines 1890-1896 sub _Findgroupreserve { Link Here
1890
               reserves.timestamp           AS timestamp,
1897
               reserves.timestamp           AS timestamp,
1891
               biblioitems.biblioitemnumber AS biblioitemnumber,
1898
               biblioitems.biblioitemnumber AS biblioitemnumber,
1892
               reserves.itemnumber          AS itemnumber,
1899
               reserves.itemnumber          AS itemnumber,
1893
               reserves.reserve_id          AS reserve_id
1900
               reserves.reserve_id          AS reserve_id,
1901
               reserves.itemtype            AS itemtype
1894
        FROM reserves
1902
        FROM reserves
1895
        JOIN biblioitems USING (biblionumber)
1903
        JOIN biblioitems USING (biblionumber)
1896
        JOIN hold_fill_targets USING (biblionumber, borrowernumber)
1904
        JOIN hold_fill_targets USING (biblionumber, borrowernumber)
Lines 1923-1929 sub _Findgroupreserve { Link Here
1923
               reserves.priority                   AS priority,
1931
               reserves.priority                   AS priority,
1924
               reserves.timestamp                  AS timestamp,
1932
               reserves.timestamp                  AS timestamp,
1925
               reserves.itemnumber                 AS itemnumber,
1933
               reserves.itemnumber                 AS itemnumber,
1926
               reserves.reserve_id                 AS reserve_id
1934
               reserves.reserve_id                 AS reserve_id,
1935
               reserves.itemtype                   AS itemtype
1927
        FROM reserves
1936
        FROM reserves
1928
        WHERE reserves.biblionumber = ?
1937
        WHERE reserves.biblionumber = ?
1929
          AND (reserves.itemnumber IS NULL OR reserves.itemnumber = ?)
1938
          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 1686-1701 CREATE TABLE `old_reserves` ( -- this table holds all holds/reserves that have b Link Here
1686
  `lowestPriority` tinyint(1) NOT NULL, -- has this hold been pinned to the lowest priority in the holds queue (1 for yes, 0 for no)
1686
  `lowestPriority` tinyint(1) NOT NULL, -- has this hold been pinned to the lowest priority in the holds queue (1 for yes, 0 for no)
1687
  `suspend` BOOLEAN NOT NULL DEFAULT 0, -- in this hold suspended (1 for yes, 0 for no)
1687
  `suspend` BOOLEAN NOT NULL DEFAULT 0, -- in this hold suspended (1 for yes, 0 for no)
1688
  `suspend_until` DATETIME NULL DEFAULT NULL, -- the date this hold is suspended until (NULL for infinitely)
1688
  `suspend_until` DATETIME NULL DEFAULT NULL, -- the date this hold is suspended until (NULL for infinitely)
1689
  `itemtype` VARCHAR(10) NULL DEFAULT NULL, -- If record level hold, the optional itemtype of the item the patron is requesting
1689
  PRIMARY KEY (`reserve_id`),
1690
  PRIMARY KEY (`reserve_id`),
1690
  KEY `old_reserves_borrowernumber` (`borrowernumber`),
1691
  KEY `old_reserves_borrowernumber` (`borrowernumber`),
1691
  KEY `old_reserves_biblionumber` (`biblionumber`),
1692
  KEY `old_reserves_biblionumber` (`biblionumber`),
1692
  KEY `old_reserves_itemnumber` (`itemnumber`),
1693
  KEY `old_reserves_itemnumber` (`itemnumber`),
1693
  KEY `old_reserves_branchcode` (`branchcode`),
1694
  KEY `old_reserves_branchcode` (`branchcode`),
1695
  KEY `old_reserves_itemtype` (`itemtype`),
1694
  CONSTRAINT `old_reserves_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`)
1696
  CONSTRAINT `old_reserves_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`)
1695
    ON DELETE SET NULL ON UPDATE SET NULL,
1697
    ON DELETE SET NULL ON UPDATE SET NULL,
1696
  CONSTRAINT `old_reserves_ibfk_2` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`)
1698
  CONSTRAINT `old_reserves_ibfk_2` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`)
1697
    ON DELETE SET NULL ON UPDATE SET NULL,
1699
    ON DELETE SET NULL ON UPDATE SET NULL,
1698
  CONSTRAINT `old_reserves_ibfk_3` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`)
1700
  CONSTRAINT `old_reserves_ibfk_3` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`)
1701
    ON DELETE SET NULL ON UPDATE SET NULL,
1702
  CONSTRAINT `old_reserves_ibfk_4` FOREIGN KEY (`itemtype`) REFERENCES `itemtypes` (`itemtype`)
1699
    ON DELETE SET NULL ON UPDATE SET NULL
1703
    ON DELETE SET NULL ON UPDATE SET NULL
1700
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
1704
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
1701
1705
Lines 1863-1878 CREATE TABLE `reserves` ( -- information related to holds/reserves in Koha Link Here
1863
  `lowestPriority` tinyint(1) NOT NULL,
1867
  `lowestPriority` tinyint(1) NOT NULL,
1864
  `suspend` BOOLEAN NOT NULL DEFAULT 0,
1868
  `suspend` BOOLEAN NOT NULL DEFAULT 0,
1865
  `suspend_until` DATETIME NULL DEFAULT NULL,
1869
  `suspend_until` DATETIME NULL DEFAULT NULL,
1870
  `itemtype` VARCHAR(10) NULL DEFAULT NULL, -- If record level hold, the optional itemtype of the item the patron is requesting
1866
  PRIMARY KEY (`reserve_id`),
1871
  PRIMARY KEY (`reserve_id`),
1867
  KEY priorityfoundidx (priority,found),
1872
  KEY priorityfoundidx (priority,found),
1868
  KEY `borrowernumber` (`borrowernumber`),
1873
  KEY `borrowernumber` (`borrowernumber`),
1869
  KEY `biblionumber` (`biblionumber`),
1874
  KEY `biblionumber` (`biblionumber`),
1870
  KEY `itemnumber` (`itemnumber`),
1875
  KEY `itemnumber` (`itemnumber`),
1871
  KEY `branchcode` (`branchcode`),
1876
  KEY `branchcode` (`branchcode`),
1877
  KEY `itemtype` (`itemtype`),
1872
  CONSTRAINT `reserves_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1878
  CONSTRAINT `reserves_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1873
  CONSTRAINT `reserves_ibfk_2` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1879
  CONSTRAINT `reserves_ibfk_2` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1874
  CONSTRAINT `reserves_ibfk_3` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1880
  CONSTRAINT `reserves_ibfk_3` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1875
  CONSTRAINT `reserves_ibfk_4` FOREIGN KEY (`branchcode`) REFERENCES `branches` (`branchcode`) ON DELETE CASCADE ON UPDATE CASCADE
1881
  CONSTRAINT `reserves_ibfk_4` FOREIGN KEY (`branchcode`) REFERENCES `branches` (`branchcode`) ON DELETE CASCADE ON UPDATE CASCADE,
1882
  CONSTRAINT `reserves_ibfk_5` FOREIGN KEY (`itemtype`) REFERENCES `itemtype` (`itemtype`) ON DELETE CASCADE ON UPDATE CASCADE
1876
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
1883
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
1877
1884
1878
--
1885
--
(-)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 409-414 function checkMultiHold() { Link Here
409
            </select>
410
            </select>
410
        </li>
411
        </li>
411
412
413
        [% UNLESS ( multi_hold ) %]
414
            <li>
415
                <label for="itemtype">Request specific item type:</label>
416
                <select name="itemtype" size="1" id="itemtype">
417
                    <option value="">Any item type</option>
418
                    [%- FOREACH itemtype IN available_itemtypes %]
419
                        <option value="[% itemtype %]">[% ItemTypes.GetDescription( itemtype ) %]</option>
420
                    [%- END %]
421
                </select>
422
            </li>
423
        [% END %]
424
412
	[% IF ( reserve_in_future ) %]
425
	[% IF ( reserve_in_future ) %]
413
	<li>
426
	<li>
414
        <label for="from">Hold starts on date:</label>
427
        <label for="from">Hold starts on date:</label>
Lines 797-803 function checkMultiHold() { Link Here
797
                </a>
810
                </a>
798
                </i>
811
                </i>
799
            [% ELSE %]
812
            [% ELSE %]
800
                <i>Next available</i>
813
                [% IF reserveloo.itemtype %]
814
                    <i>Next available <b>[% ItemTypes.GetDescription( reserveloo.itemtype ) %]</b> item</i>
815
                [% ELSE %]
816
                    <i>Next available</i>
817
                [% END %]
801
                 <input type="hidden" name="itemnumber" value="" />
818
                 <input type="hidden" name="itemnumber" value="" />
802
            [% END %]
819
            [% END %]
803
    [% END %]
820
    [% END %]
(-)a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-reserve.tt (+13 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
<title>[% IF ( LibraryNameTitle ) %][% LibraryNameTitle %][% ELSE %]Koha online[% END %] catalog &rsaquo; Placing a hold</title>
5
<title>[% IF ( LibraryNameTitle ) %][% LibraryNameTitle %][% ELSE %]Koha online[% END %] catalog &rsaquo; Placing a hold</title>
5
[% INCLUDE 'doc-head-close.inc' %]
6
[% INCLUDE 'doc-head-close.inc' %]
Lines 234-239 Link Here
234
                                                            <span class="date-format to" data-biblionumber="[% bibitemloo.biblionumber %]">[% INCLUDE 'date-format.inc' %]</span>
235
                                                            <span class="date-format to" data-biblionumber="[% bibitemloo.biblionumber %]">[% INCLUDE 'date-format.inc' %]</span>
235
                                                        </li>
236
                                                        </li>
236
237
238
                                                        [% UNLESS ( multi_hold ) %]
239
                                                            <li>
240
                                                                <label for="itemtype">Request specific item type:</label>
241
                                                                <select name="itemtype" size="1" id="itemtype">
242
                                                                    <option value="">Any item type</option>
243
                                                                    [%- FOREACH itemtype IN available_itemtypes %]
244
                                                                        <option value="[% itemtype %]">[% ItemTypes.GetDescription( itemtype ) %]</option>
245
                                                                    [%- END %]
246
                                                                </select>
247
                                                            </li>
248
                                                        [% END %]
249
237
                                                        [% IF ( OpacHoldNotes ) %]
250
                                                        [% IF ( OpacHoldNotes ) %]
238
                                                            <li>
251
                                                            <li>
239
                                                                <div class="notesrow" id="notesrow_[% bibitemloo.biblionumber %]">
252
                                                                <div class="notesrow" id="notesrow_[% bibitemloo.biblionumber %]">
(-)a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-user.tt (-1 / +6 lines)
Lines 1-5 Link Here
1
[% USE Koha %]
1
[% USE Koha %]
2
[% USE KohaDates %]
2
[% USE KohaDates %]
3
[% USE ItemTypes %]
3
4
4
[% INCLUDE 'doc-head-open.inc' %]
5
[% INCLUDE 'doc-head-open.inc' %]
5
<title>[% IF ( LibraryNameTitle ) %][% LibraryNameTitle %][% ELSE %]Koha online[% END %] catalog &rsaquo; Your library home</title>
6
<title>[% IF ( LibraryNameTitle ) %][% LibraryNameTitle %][% ELSE %]Koha online[% END %] catalog &rsaquo; Your library home</title>
Lines 607-613 Link Here
607
                                                    [% ELSIF ( RESERVE.suspend ) %]
608
                                                    [% ELSIF ( RESERVE.suspend ) %]
608
                                                        Suspended [% IF ( RESERVE.suspend_until ) %] until [% RESERVE.suspend_until %] [% END %]
609
                                                        Suspended [% IF ( RESERVE.suspend_until ) %] until [% RESERVE.suspend_until %] [% END %]
609
                                                    [% ELSE %]
610
                                                    [% ELSE %]
610
                                                        Pending
611
                                                        [% IF RESERVE.itemtype %]
612
                                                            Pending for next available <i>[% ItemTypes.GetDescription( RESERVE.itemtype ) %]</i> item
613
                                                        [% ELSE %]
614
                                                            Pending
615
                                                        [% END %]
611
                                                    [% END %]
616
                                                    [% END %]
612
                                                [% END %]
617
                                                [% END %]
613
                                            </td>
618
                                            </td>
(-)a/opac/opac-reserve.pl (-6 / +13 lines)
Lines 36-41 use C4::Debug; Link Here
36
use Koha::DateUtils;
36
use Koha::DateUtils;
37
use Koha::Borrower::Debarments qw(IsDebarred);
37
use Koha::Borrower::Debarments qw(IsDebarred);
38
use Date::Calc qw/Today Date_to_Days/;
38
use Date::Calc qw/Today Date_to_Days/;
39
use List::MoreUtils qw/uniq/;
39
# use Data::Dumper;
40
# use Data::Dumper;
40
41
41
my $maxreserves = C4::Context->preference("maxreserves");
42
my $maxreserves = C4::Context->preference("maxreserves");
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 376-381 unless ($noreserves) { Link Here
376
#
378
#
377
my $notforloan_label_of = get_notforloan_label_of();
379
my $notforloan_label_of = get_notforloan_label_of();
378
380
381
my @available_itemtypes;
379
my $biblioLoop = [];
382
my $biblioLoop = [];
380
my $numBibsAvailable = 0;
383
my $numBibsAvailable = 0;
381
my $itemdata_enumchron = 0;
384
my $itemdata_enumchron = 0;
Lines 529-534 foreach my $biblioNum (@biblionumbers) { Link Here
529
                $itemLoopIter->{available} = 1;
532
                $itemLoopIter->{available} = 1;
530
                $numCopiesOPACAvailable++;
533
                $numCopiesOPACAvailable++;
531
                $biblioLoopIter{force_hold} = 1 if $hold_allowed eq 'F';
534
                $biblioLoopIter{force_hold} = 1 if $hold_allowed eq 'F';
535
                push( @available_itemtypes, $itemInfo->{itype} );
532
            }
536
            }
533
            $numCopiesAvailable++;
537
            $numCopiesAvailable++;
534
        }
538
        }
Lines 566-571 foreach my $biblioNum (@biblionumbers) { Link Here
566
    $anyholdable = 1 if $biblioLoopIter{holdable};
570
    $anyholdable = 1 if $biblioLoopIter{holdable};
567
}
571
}
568
572
573
@available_itemtypes = uniq( @available_itemtypes );
574
$template->param( available_itemtypes => \@available_itemtypes );
575
569
if ( $numBibsAvailable == 0 || $anyholdable == 0) {
576
if ( $numBibsAvailable == 0 || $anyholdable == 0) {
570
    $template->param( none_available => 1 );
577
    $template->param( none_available => 1 );
571
}
578
}
(-)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->param('biblioitem');
40
my @bibitems       = $input->param('biblioitem');
41
my @reqbib=$input->param('reqbib'); 
41
my @reqbib         = $input->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->param('rank-request');
47
my @rank           = $input->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 320-325 foreach my $biblionumber (@biblionumbers) { Link Here
320
320
321
    my @bibitemloop;
321
    my @bibitemloop;
322
322
323
    my @available_itemtypes;
323
    foreach my $biblioitemnumber (@biblioitemnumbers) {
324
    foreach my $biblioitemnumber (@biblioitemnumbers) {
324
        my $biblioitem = $biblioiteminfos_of->{$biblioitemnumber};
325
        my $biblioitem = $biblioiteminfos_of->{$biblioitemnumber};
325
        my $num_available = 0;
326
        my $num_available = 0;
Lines 453-458 foreach my $biblionumber (@biblionumbers) { Link Here
453
            {
454
            {
454
                $item->{available} = 1;
455
                $item->{available} = 1;
455
                $num_available++;
456
                $num_available++;
457
458
                push( @available_itemtypes, $item->{itype} );
456
            }
459
            }
457
            elsif ( C4::Context->preference('AllowHoldPolicyOverride') ) {
460
            elsif ( C4::Context->preference('AllowHoldPolicyOverride') ) {
458
                # If AllowHoldPolicyOverride is set, it should override EVERY restriction, not just branch item rules
461
                # If AllowHoldPolicyOverride is set, it should override EVERY restriction, not just branch item rules
Lines 482-487 foreach my $biblionumber (@biblionumbers) { Link Here
482
        push @bibitemloop, $biblioitem;
485
        push @bibitemloop, $biblioitem;
483
    }
486
    }
484
487
488
    @available_itemtypes = uniq( @available_itemtypes );
489
    $template->param( available_itemtypes => \@available_itemtypes );
490
485
    # existingreserves building
491
    # existingreserves building
486
    my @reserveloop;
492
    my @reserveloop;
487
    my @reserves = Koha::Holds->search( { biblionumber => $biblionumber }, { order_by => 'priority' } );
493
    my @reserves = Koha::Holds->search( { biblionumber => $biblionumber }, { order_by => 'priority' } );
Lines 562-567 foreach my $biblionumber (@biblionumbers) { Link Here
562
        $reserve{'suspend'}        = $res->suspend();
568
        $reserve{'suspend'}        = $res->suspend();
563
        $reserve{'suspend_until'}  = $res->suspend_until();
569
        $reserve{'suspend_until'}  = $res->suspend_until();
564
        $reserve{'reserve_id'}     = $res->reserve_id();
570
        $reserve{'reserve_id'}     = $res->reserve_id();
571
        $reserve{itemtype}         = $res->{itemtype};
565
572
566
        if ( C4::Context->preference('IndependentBranches') && $flags->{'superlibrarian'} != 1 ) {
573
        if ( C4::Context->preference('IndependentBranches') && $flags->{'superlibrarian'} != 1 ) {
567
            $reserve{'branchloop'} = [ GetBranchDetail( $res->branchcode() ) ];
574
            $reserve{'branchloop'} = [ GetBranchDetail( $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 (-2 / +63 lines)
Lines 12-18 use C4::Context; Link Here
12
12
13
use Data::Dumper;
13
use Data::Dumper;
14
14
15
use Test::More tests => 32;
15
use Test::More tests => 35;
16
16
17
use C4::Branch;
17
use C4::Branch;
18
use C4::ItemType;
18
use C4::ItemType;
Lines 525-530 CancelReserve( { reserve_id => $reserve_id } ); Link Here
525
525
526
# End testing hold_fulfillment_policy
526
# End testing hold_fulfillment_policy
527
527
528
# Test hold itemtype limit
529
C4::Context->set_preference( "UseTransportCostMatrix", 0 );
530
my $wrong_itemtype = $item_types[0]->{itemtype};
531
my $right_itemtype = $item_types[1]->{itemtype};
532
$borrowernumber = $borrower3->{borrowernumber};
533
my $branchcode = $library1->{branchcode};
534
$dbh->do("DELETE FROM reserves");
535
$dbh->do("DELETE FROM issues");
536
$dbh->do("DELETE FROM items");
537
$dbh->do("DELETE FROM biblio");
538
$dbh->do("DELETE FROM biblioitems");
539
$dbh->do("DELETE FROM transport_cost");
540
$dbh->do("DELETE FROM tmp_holdsqueue");
541
$dbh->do("DELETE FROM hold_fill_targets");
542
$dbh->do("DELETE FROM default_branch_circ_rules");
543
$dbh->do("DELETE FROM default_branch_item_rules");
544
$dbh->do("DELETE FROM default_circ_rules");
545
$dbh->do("DELETE FROM branch_item_rules");
546
547
$dbh->do("INSERT INTO biblio (frameworkcode, author, title, datecreated) VALUES ('', 'Koha test', '$TITLE', '2011-02-01')");
548
549
$biblionumber = $dbh->selectrow_array("SELECT biblionumber FROM biblio WHERE title = '$TITLE'")
550
  or BAIL_OUT("Cannot find newly created biblio record");
551
552
$dbh->do("INSERT INTO biblioitems (biblionumber, marcxml, itemtype) VALUES ($biblionumber, '', '$itemtype')");
553
554
$biblioitemnumber =
555
  $dbh->selectrow_array("SELECT biblioitemnumber FROM biblioitems WHERE biblionumber = $biblionumber")
556
  or BAIL_OUT("Cannot find newly created biblioitems record");
557
558
$dbh->do("
559
    INSERT INTO items (biblionumber, biblioitemnumber, homebranch, holdingbranch, notforloan, damaged, itemlost, withdrawn, onloan, itype)
560
    VALUES ($biblionumber, $biblioitemnumber, '$library_A', '$library_B', 0, 0, 0, 0, NULL, '$right_itemtype')
561
");
562
563
# With hold_fulfillment_policy = homebranch, hold should only be picked up if pickup branch = homebranch
564
$dbh->do("DELETE FROM default_circ_rules");
565
$dbh->do("INSERT INTO default_circ_rules ( holdallowed, hold_fulfillment_policy ) VALUES ( 2, 'any' )");
566
567
# Home branch matches pickup branch
568
$reserve_id = AddReserve( $library_A, $borrowernumber, $biblionumber, '', 1, undef, undef, undef, undef, undef, undef, $wrong_itemtype );
569
C4::HoldsQueue::CreateQueue();
570
$holds_queue = $dbh->selectall_arrayref( "SELECT * FROM tmp_holdsqueue", { Slice => {} } );
571
is( @$holds_queue, 0, "Item with incorrect itemtype not targeted" );
572
CancelReserve( { reserve_id => $reserve_id } );
573
574
# Holding branch matches pickup branch
575
$reserve_id = AddReserve( $library_A, $borrowernumber, $biblionumber, '', 1, undef, undef, undef, undef, undef, undef, $right_itemtype );
576
C4::HoldsQueue::CreateQueue();
577
$holds_queue = $dbh->selectall_arrayref( "SELECT * FROM tmp_holdsqueue", { Slice => {} } );
578
is( @$holds_queue, 1, "Item with matching itemtype is targeted" );
579
CancelReserve( { reserve_id => $reserve_id } );
580
581
# Neither branch matches pickup branch
582
$reserve_id = AddReserve( $library_A, $borrowernumber, $biblionumber, '', 1, undef, undef, undef, undef, undef, undef, undef );
583
C4::HoldsQueue::CreateQueue();
584
$holds_queue = $dbh->selectall_arrayref( "SELECT * FROM tmp_holdsqueue", { Slice => {} } );
585
is( @$holds_queue, 1, "Item targeted when hold itemtype is not set" );
586
CancelReserve( { reserve_id => $reserve_id } );
587
588
# End testing hold itemtype limit
589
528
# Cleanup
590
# Cleanup
529
$schema->storage->txn_rollback;
591
$schema->storage->txn_rollback;
530
592
531
- 

Return to bug 15533