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 1835-1841 sub _Findgroupreserve { Link Here
1835
               reserves.timestamp           AS timestamp,
1841
               reserves.timestamp           AS timestamp,
1836
               biblioitems.biblioitemnumber AS biblioitemnumber,
1842
               biblioitems.biblioitemnumber AS biblioitemnumber,
1837
               reserves.itemnumber          AS itemnumber,
1843
               reserves.itemnumber          AS itemnumber,
1838
               reserves.reserve_id          AS reserve_id
1844
               reserves.reserve_id          AS reserve_id,
1845
               reserves.itemtype            AS itemtype
1839
        FROM reserves
1846
        FROM reserves
1840
        JOIN biblioitems USING (biblionumber)
1847
        JOIN biblioitems USING (biblionumber)
1841
        JOIN hold_fill_targets USING (biblionumber, borrowernumber, itemnumber)
1848
        JOIN hold_fill_targets USING (biblionumber, borrowernumber, itemnumber)
Lines 1869-1875 sub _Findgroupreserve { Link Here
1869
               reserves.timestamp           AS timestamp,
1876
               reserves.timestamp           AS timestamp,
1870
               biblioitems.biblioitemnumber AS biblioitemnumber,
1877
               biblioitems.biblioitemnumber AS biblioitemnumber,
1871
               reserves.itemnumber          AS itemnumber,
1878
               reserves.itemnumber          AS itemnumber,
1872
               reserves.reserve_id          AS reserve_id
1879
               reserves.reserve_id          AS reserve_id,
1880
               reserves.itemtype            AS itemtype
1873
        FROM reserves
1881
        FROM reserves
1874
        JOIN biblioitems USING (biblionumber)
1882
        JOIN biblioitems USING (biblionumber)
1875
        JOIN hold_fill_targets USING (biblionumber, borrowernumber)
1883
        JOIN hold_fill_targets USING (biblionumber, borrowernumber)
Lines 1902-1908 sub _Findgroupreserve { Link Here
1902
               reserves.priority                   AS priority,
1910
               reserves.priority                   AS priority,
1903
               reserves.timestamp                  AS timestamp,
1911
               reserves.timestamp                  AS timestamp,
1904
               reserves.itemnumber                 AS itemnumber,
1912
               reserves.itemnumber                 AS itemnumber,
1905
               reserves.reserve_id                 AS reserve_id
1913
               reserves.reserve_id                 AS reserve_id,
1914
               reserves.itemtype                   AS itemtype
1906
        FROM reserves
1915
        FROM reserves
1907
        WHERE reserves.biblionumber = ?
1916
        WHERE reserves.biblionumber = ?
1908
          AND (reserves.itemnumber IS NULL OR reserves.itemnumber = ?)
1917
          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 1704-1719 CREATE TABLE `old_reserves` ( -- this table holds all holds/reserves that have b Link Here
1704
  `lowestPriority` tinyint(1) NOT NULL, -- has this hold been pinned to the lowest priority in the holds queue (1 for yes, 0 for no)
1704
  `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
  `suspend` BOOLEAN NOT NULL DEFAULT 0, -- in this hold suspended (1 for yes, 0 for no)
1705
  `suspend` BOOLEAN NOT NULL DEFAULT 0, -- in this hold suspended (1 for yes, 0 for no)
1706
  `suspend_until` DATETIME NULL DEFAULT NULL, -- the date this hold is suspended until (NULL for infinitely)
1706
  `suspend_until` DATETIME NULL DEFAULT NULL, -- the date this hold is suspended until (NULL for infinitely)
1707
  `itemtype` VARCHAR(10) NULL DEFAULT NULL, -- If record level hold, the optional itemtype of the item the patron is requesting
1707
  PRIMARY KEY (`reserve_id`),
1708
  PRIMARY KEY (`reserve_id`),
1708
  KEY `old_reserves_borrowernumber` (`borrowernumber`),
1709
  KEY `old_reserves_borrowernumber` (`borrowernumber`),
1709
  KEY `old_reserves_biblionumber` (`biblionumber`),
1710
  KEY `old_reserves_biblionumber` (`biblionumber`),
1710
  KEY `old_reserves_itemnumber` (`itemnumber`),
1711
  KEY `old_reserves_itemnumber` (`itemnumber`),
1711
  KEY `old_reserves_branchcode` (`branchcode`),
1712
  KEY `old_reserves_branchcode` (`branchcode`),
1713
  KEY `old_reserves_itemtype` (`itemtype`),
1712
  CONSTRAINT `old_reserves_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`)
1714
  CONSTRAINT `old_reserves_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`)
1713
    ON DELETE SET NULL ON UPDATE SET NULL,
1715
    ON DELETE SET NULL ON UPDATE SET NULL,
1714
  CONSTRAINT `old_reserves_ibfk_2` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`)
1716
  CONSTRAINT `old_reserves_ibfk_2` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`)
1715
    ON DELETE SET NULL ON UPDATE SET NULL,
1717
    ON DELETE SET NULL ON UPDATE SET NULL,
1716
  CONSTRAINT `old_reserves_ibfk_3` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`)
1718
  CONSTRAINT `old_reserves_ibfk_3` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`)
1719
    ON DELETE SET NULL ON UPDATE SET NULL,
1720
  CONSTRAINT `old_reserves_ibfk_4` FOREIGN KEY (`itemtype`) REFERENCES `itemtypes` (`itemtype`)
1717
    ON DELETE SET NULL ON UPDATE SET NULL
1721
    ON DELETE SET NULL ON UPDATE SET NULL
1718
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
1722
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
1719
1723
Lines 1881-1896 CREATE TABLE `reserves` ( -- information related to holds/reserves in Koha Link Here
1881
  `lowestPriority` tinyint(1) NOT NULL,
1885
  `lowestPriority` tinyint(1) NOT NULL,
1882
  `suspend` BOOLEAN NOT NULL DEFAULT 0,
1886
  `suspend` BOOLEAN NOT NULL DEFAULT 0,
1883
  `suspend_until` DATETIME NULL DEFAULT NULL,
1887
  `suspend_until` DATETIME NULL DEFAULT NULL,
1888
  `itemtype` VARCHAR(10) NULL DEFAULT NULL, -- If record level hold, the optional itemtype of the item the patron is requesting
1884
  PRIMARY KEY (`reserve_id`),
1889
  PRIMARY KEY (`reserve_id`),
1885
  KEY priorityfoundidx (priority,found),
1890
  KEY priorityfoundidx (priority,found),
1886
  KEY `borrowernumber` (`borrowernumber`),
1891
  KEY `borrowernumber` (`borrowernumber`),
1887
  KEY `biblionumber` (`biblionumber`),
1892
  KEY `biblionumber` (`biblionumber`),
1888
  KEY `itemnumber` (`itemnumber`),
1893
  KEY `itemnumber` (`itemnumber`),
1889
  KEY `branchcode` (`branchcode`),
1894
  KEY `branchcode` (`branchcode`),
1895
  KEY `itemtype` (`itemtype`),
1890
  CONSTRAINT `reserves_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1896
  CONSTRAINT `reserves_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1891
  CONSTRAINT `reserves_ibfk_2` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1897
  CONSTRAINT `reserves_ibfk_2` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1892
  CONSTRAINT `reserves_ibfk_3` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1898
  CONSTRAINT `reserves_ibfk_3` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1893
  CONSTRAINT `reserves_ibfk_4` FOREIGN KEY (`branchcode`) REFERENCES `branches` (`branchcode`) ON DELETE CASCADE ON UPDATE CASCADE
1899
  CONSTRAINT `reserves_ibfk_4` FOREIGN KEY (`branchcode`) REFERENCES `branches` (`branchcode`) ON DELETE CASCADE ON UPDATE CASCADE,
1900
  CONSTRAINT `reserves_ibfk_5` FOREIGN KEY (`itemtype`) REFERENCES `itemtype` (`itemtype`) ON DELETE CASCADE ON UPDATE CASCADE
1894
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
1901
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
1895
1902
1896
--
1903
--
(-)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-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 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->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::Members;
18
use C4::Members;
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