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

(-)a/C4/HoldsQueue.pm (-1 / +22 lines)
Lines 279-285 sub GetPendingHoldRequestsForBib { Link Here
279
    my $dbh = C4::Context->dbh;
279
    my $dbh = C4::Context->dbh;
280
280
281
    my $request_query = "SELECT biblionumber, borrowernumber, itemnumber, priority, reserves.branchcode,
281
    my $request_query = "SELECT biblionumber, borrowernumber, itemnumber, priority, reserves.branchcode,
282
                                reservedate, reservenotes, borrowers.branchcode AS borrowerbranch
282
                                reservedate, reservenotes, borrowers.branchcode AS borrowerbranch, itemtype
283
                         FROM reserves
283
                         FROM reserves
284
                         JOIN borrowers USING (borrowernumber)
284
                         JOIN borrowers USING (borrowernumber)
285
                         WHERE biblionumber = ?
285
                         WHERE biblionumber = ?
Lines 369-374 sub GetItemsAvailableToFillHoldRequestsForBib { Link Here
369
sub MapItemsToHoldRequests {
369
sub MapItemsToHoldRequests {
370
    my ($hold_requests, $available_items, $branches_to_use, $transport_cost_matrix) = @_;
370
    my ($hold_requests, $available_items, $branches_to_use, $transport_cost_matrix) = @_;
371
371
372
372
    # handle trival cases
373
    # handle trival cases
373
    return unless scalar(@$hold_requests) > 0;
374
    return unless scalar(@$hold_requests) > 0;
374
    return unless scalar(@$available_items) > 0;
375
    return unless scalar(@$available_items) > 0;
Lines 401-406 sub MapItemsToHoldRequests { Link Here
401
                and ( # Don't fill item level holds that contravene the hold pickup policy at this time
402
                and ( # Don't fill item level holds that contravene the hold pickup policy at this time
402
                    ( $items_by_itemnumber{ $request->{itemnumber} }->{hold_fulfillment_policy} eq 'any' )
403
                    ( $items_by_itemnumber{ $request->{itemnumber} }->{hold_fulfillment_policy} eq 'any' )
403
                    || ( $request->{branchcode} eq $items_by_itemnumber{ $request->{itemnumber} }->{ $items_by_itemnumber{ $request->{itemnumber} }->{hold_fulfillment_policy} }  )
404
                    || ( $request->{branchcode} eq $items_by_itemnumber{ $request->{itemnumber} }->{ $items_by_itemnumber{ $request->{itemnumber} }->{hold_fulfillment_policy} }  )
405
                and ( !$request->{itemtype} # If hold itemtype is set, item's itemtype must match
406
                    || $items_by_itemnumber{ $request->{itemnumber} }->{itype} eq $request->{itemtype} )
404
                )
407
                )
405
408
406
              )
409
              )
Lines 452-457 sub MapItemsToHoldRequests { Link Here
452
                    $request->{borrowerbranch} eq $item->{homebranch}
455
                    $request->{borrowerbranch} eq $item->{homebranch}
453
                    && ( ( $item->{hold_fulfillment_policy} eq 'any' ) # Don't fill item level holds that contravene the hold pickup policy at this time
456
                    && ( ( $item->{hold_fulfillment_policy} eq 'any' ) # Don't fill item level holds that contravene the hold pickup policy at this time
454
                        || $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} } )
457
                        || $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} } )
458
                    && ( !$request->{itemtype} # If hold itemtype is set, item's itemtype must match
459
                        || $items_by_itemnumber{ $request->{itemnumber} }->{itype} eq $request->{itemtype} )
455
                  )
460
                  )
456
                {
461
                {
457
                    $itemnumber = $item->{itemnumber};
462
                    $itemnumber = $item->{itemnumber};
Lines 473-478 sub MapItemsToHoldRequests { Link Here
473
                    next unless $item->{hold_fulfillment_policy} eq 'any'
478
                    next unless $item->{hold_fulfillment_policy} eq 'any'
474
                        || $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} };
479
                        || $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} };
475
480
481
                    # If hold itemtype is set, item's itemtype must match
482
                    next unless ( !$request->{itemtype}
483
                        || $item->{itype} eq $request->{itemtype} );
484
476
                    $itemnumber = $item->{itemnumber};
485
                    $itemnumber = $item->{itemnumber};
477
                    last;
486
                    last;
478
                }
487
                }
Lines 505-510 sub MapItemsToHoldRequests { Link Here
505
                    next unless $item->{hold_fulfillment_policy} eq 'any'
514
                    next unless $item->{hold_fulfillment_policy} eq 'any'
506
                        || $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} };
515
                        || $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} };
507
516
517
                    # If hold itemtype is set, item's itemtype must match
518
                    next unless ( !$request->{itemtype}
519
                        || $item->{itype} eq $request->{itemtype} );
520
508
                    $itemnumber = $item->{itemnumber};
521
                    $itemnumber = $item->{itemnumber};
509
                    $holdingbranch = $branch;
522
                    $holdingbranch = $branch;
510
                    last PULL_BRANCHES;
523
                    last PULL_BRANCHES;
Lines 520-525 sub MapItemsToHoldRequests { Link Here
520
                        next unless $current_item->{hold_fulfillment_policy} eq 'any'
533
                        next unless $current_item->{hold_fulfillment_policy} eq 'any'
521
                            || $request->{branchcode} eq $current_item->{ $current_item->{hold_fulfillment_policy} };
534
                            || $request->{branchcode} eq $current_item->{ $current_item->{hold_fulfillment_policy} };
522
535
536
                        # If hold itemtype is set, item's itemtype must match
537
                        next unless ( !$request->{itemtype}
538
                            || $current_item->{itype} eq $request->{itemtype} );
539
523
                        $itemnumber = $current_item->{itemnumber};
540
                        $itemnumber = $current_item->{itemnumber};
524
                        last; # quit this loop as soon as we have a suitable item
541
                        last; # quit this loop as soon as we have a suitable item
525
                    }
542
                    }
Lines 540-545 sub MapItemsToHoldRequests { Link Here
540
                        next unless $item->{hold_fulfillment_policy} eq 'any'
557
                        next unless $item->{hold_fulfillment_policy} eq 'any'
541
                            || $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} };
558
                            || $request->{branchcode} eq $item->{ $item->{hold_fulfillment_policy} };
542
559
560
                        # If hold itemtype is set, item's itemtype must match
561
                        next unless ( !$request->{itemtype}
562
                            || $item->{itype} eq $request->{itemtype} );
563
543
                        $itemnumber = $item->{itemnumber};
564
                        $itemnumber = $item->{itemnumber};
544
                        $holdingbranch = $branch;
565
                        $holdingbranch = $branch;
545
                        last PULL_BRANCHES2;
566
                        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 1707-1722 CREATE TABLE `old_reserves` ( -- this table holds all holds/reserves that have b Link Here
1707
  `lowestPriority` tinyint(1) NOT NULL, -- has this hold been pinned to the lowest priority in the holds queue (1 for yes, 0 for no)
1707
  `lowestPriority` tinyint(1) NOT NULL, -- has this hold been pinned to the lowest priority in the holds queue (1 for yes, 0 for no)
1708
  `suspend` BOOLEAN NOT NULL DEFAULT 0, -- in this hold suspended (1 for yes, 0 for no)
1708
  `suspend` BOOLEAN NOT NULL DEFAULT 0, -- in this hold suspended (1 for yes, 0 for no)
1709
  `suspend_until` DATETIME NULL DEFAULT NULL, -- the date this hold is suspended until (NULL for infinitely)
1709
  `suspend_until` DATETIME NULL DEFAULT NULL, -- the date this hold is suspended until (NULL for infinitely)
1710
  `itemtype` VARCHAR(10) NULL DEFAULT NULL, -- If record level hold, the optional itemtype of the item the patron is requesting
1710
  PRIMARY KEY (`reserve_id`),
1711
  PRIMARY KEY (`reserve_id`),
1711
  KEY `old_reserves_borrowernumber` (`borrowernumber`),
1712
  KEY `old_reserves_borrowernumber` (`borrowernumber`),
1712
  KEY `old_reserves_biblionumber` (`biblionumber`),
1713
  KEY `old_reserves_biblionumber` (`biblionumber`),
1713
  KEY `old_reserves_itemnumber` (`itemnumber`),
1714
  KEY `old_reserves_itemnumber` (`itemnumber`),
1714
  KEY `old_reserves_branchcode` (`branchcode`),
1715
  KEY `old_reserves_branchcode` (`branchcode`),
1716
  KEY `old_reserves_itemtype` (`itemtype`),
1715
  CONSTRAINT `old_reserves_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`)
1717
  CONSTRAINT `old_reserves_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`)
1716
    ON DELETE SET NULL ON UPDATE SET NULL,
1718
    ON DELETE SET NULL ON UPDATE SET NULL,
1717
  CONSTRAINT `old_reserves_ibfk_2` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`)
1719
  CONSTRAINT `old_reserves_ibfk_2` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`)
1718
    ON DELETE SET NULL ON UPDATE SET NULL,
1720
    ON DELETE SET NULL ON UPDATE SET NULL,
1719
  CONSTRAINT `old_reserves_ibfk_3` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`)
1721
  CONSTRAINT `old_reserves_ibfk_3` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`)
1722
    ON DELETE SET NULL ON UPDATE SET NULL,
1723
  CONSTRAINT `old_reserves_ibfk_4` FOREIGN KEY (`itemtype`) REFERENCES `itemtypes` (`itemtype`)
1720
    ON DELETE SET NULL ON UPDATE SET NULL
1724
    ON DELETE SET NULL ON UPDATE SET NULL
1721
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
1725
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
1722
1726
Lines 1884-1899 CREATE TABLE `reserves` ( -- information related to holds/reserves in Koha Link Here
1884
  `lowestPriority` tinyint(1) NOT NULL,
1888
  `lowestPriority` tinyint(1) NOT NULL,
1885
  `suspend` BOOLEAN NOT NULL DEFAULT 0,
1889
  `suspend` BOOLEAN NOT NULL DEFAULT 0,
1886
  `suspend_until` DATETIME NULL DEFAULT NULL,
1890
  `suspend_until` DATETIME NULL DEFAULT NULL,
1891
  `itemtype` VARCHAR(10) NULL DEFAULT NULL, -- If record level hold, the optional itemtype of the item the patron is requesting
1887
  PRIMARY KEY (`reserve_id`),
1892
  PRIMARY KEY (`reserve_id`),
1888
  KEY priorityfoundidx (priority,found),
1893
  KEY priorityfoundidx (priority,found),
1889
  KEY `borrowernumber` (`borrowernumber`),
1894
  KEY `borrowernumber` (`borrowernumber`),
1890
  KEY `biblionumber` (`biblionumber`),
1895
  KEY `biblionumber` (`biblionumber`),
1891
  KEY `itemnumber` (`itemnumber`),
1896
  KEY `itemnumber` (`itemnumber`),
1892
  KEY `branchcode` (`branchcode`),
1897
  KEY `branchcode` (`branchcode`),
1898
  KEY `itemtype` (`itemtype`),
1893
  CONSTRAINT `reserves_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1899
  CONSTRAINT `reserves_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1894
  CONSTRAINT `reserves_ibfk_2` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1900
  CONSTRAINT `reserves_ibfk_2` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1895
  CONSTRAINT `reserves_ibfk_3` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1901
  CONSTRAINT `reserves_ibfk_3` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1896
  CONSTRAINT `reserves_ibfk_4` FOREIGN KEY (`branchcode`) REFERENCES `branches` (`branchcode`) ON DELETE CASCADE ON UPDATE CASCADE
1902
  CONSTRAINT `reserves_ibfk_4` FOREIGN KEY (`branchcode`) REFERENCES `branches` (`branchcode`) ON DELETE CASCADE ON UPDATE CASCADE,
1903
  CONSTRAINT `reserves_ibfk_5` FOREIGN KEY (`itemtype`) REFERENCES `itemtypes` (`itemtype`) ON DELETE CASCADE ON UPDATE CASCADE
1897
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
1904
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
1898
1905
1899
--
1906
--
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt (-1 / +18 lines)
Lines 1-5 Link Here
1
[% USE Koha %]
1
[% USE Koha %]
2
[% USE KohaDates %]
2
[% USE KohaDates %]
3
[% USE ItemTypes %]
3
[% INCLUDE 'doc-head-open.inc' %]
4
[% INCLUDE 'doc-head-open.inc' %]
4
[% UNLESS ( multi_hold ) %]
5
[% UNLESS ( multi_hold ) %]
5
    <title>Koha &rsaquo; Circulation &rsaquo; Holds &rsaquo; Place a hold on [% title |html %]</title>
6
    <title>Koha &rsaquo; Circulation &rsaquo; Holds &rsaquo; Place a hold on [% title |html %]</title>
Lines 410-415 function checkMultiHold() { Link Here
410
            </select>
411
            </select>
411
        </li>
412
        </li>
412
413
414
        [% UNLESS ( multi_hold ) %]
415
            <li>
416
                <label for="itemtype">Request specific item type:</label>
417
                <select name="itemtype" size="1" id="itemtype">
418
                    <option value="">Any item type</option>
419
                    [%- FOREACH itemtype IN available_itemtypes %]
420
                        <option value="[% itemtype %]">[% ItemTypes.GetDescription( itemtype ) %]</option>
421
                    [%- END %]
422
                </select>
423
            </li>
424
        [% END %]
425
413
	[% IF ( reserve_in_future ) %]
426
	[% IF ( reserve_in_future ) %]
414
	<li>
427
	<li>
415
        <label for="from">Hold starts on date:</label>
428
        <label for="from">Hold starts on date:</label>
Lines 798-804 function checkMultiHold() { Link Here
798
                </a>
811
                </a>
799
                </i>
812
                </i>
800
            [% ELSE %]
813
            [% ELSE %]
801
                <i>Next available</i>
814
                [% IF reserveloo.itemtype %]
815
                    <i>Next available <b>[% ItemTypes.GetDescription( reserveloo.itemtype ) %]</b> item</i>
816
                [% ELSE %]
817
                    <i>Next available</i>
818
                [% END %]
802
                 <input type="hidden" name="itemnumber" value="" />
819
                 <input type="hidden" name="itemnumber" value="" />
803
            [% END %]
820
            [% END %]
804
    [% END %]
821
    [% END %]
(-)a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-reserve.tt (+13 lines)
Lines 1-6 Link Here
1
[% USE Koha %]
1
[% USE Koha %]
2
[% USE KohaDates %]
2
[% USE KohaDates %]
3
[% USE Price %]
3
[% USE Price %]
4
[% USE ItemTypes %]
4
[% INCLUDE 'doc-head-open.inc' %]
5
[% INCLUDE 'doc-head-open.inc' %]
5
<title>[% IF ( LibraryNameTitle ) %][% LibraryNameTitle %][% ELSE %]Koha online[% END %] catalog &rsaquo; Placing a hold</title>
6
<title>[% IF ( LibraryNameTitle ) %][% LibraryNameTitle %][% ELSE %]Koha online[% END %] catalog &rsaquo; Placing a hold</title>
6
[% INCLUDE 'doc-head-close.inc' %]
7
[% INCLUDE 'doc-head-close.inc' %]
Lines 248-253 Link Here
248
                                                            <span class="date-format to" data-biblionumber="[% bibitemloo.biblionumber %]">[% INCLUDE 'date-format.inc' %]</span>
249
                                                            <span class="date-format to" data-biblionumber="[% bibitemloo.biblionumber %]">[% INCLUDE 'date-format.inc' %]</span>
249
                                                        </li>
250
                                                        </li>
250
251
252
                                                        [% UNLESS ( multi_hold ) %]
253
                                                            <li>
254
                                                                <label for="itemtype">Request specific item type:</label>
255
                                                                <select name="itemtype" size="1" id="itemtype">
256
                                                                    <option value="">Any item type</option>
257
                                                                    [%- FOREACH itemtype IN available_itemtypes %]
258
                                                                        <option value="[% itemtype %]">[% ItemTypes.GetDescription( itemtype ) %]</option>
259
                                                                    [%- END %]
260
                                                                </select>
261
                                                            </li>
262
                                                        [% END %]
263
251
                                                        [% IF ( OpacHoldNotes ) %]
264
                                                        [% IF ( OpacHoldNotes ) %]
252
                                                            <li>
265
                                                            <li>
253
                                                                <div class="notesrow" id="notesrow_[% bibitemloo.biblionumber %]">
266
                                                                <div class="notesrow" id="notesrow_[% bibitemloo.biblionumber %]">
(-)a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-user.tt (-1 / +6 lines)
Lines 1-6 Link Here
1
[% USE Koha %]
1
[% USE Koha %]
2
[% USE KohaDates %]
2
[% USE KohaDates %]
3
[% USE Branches %]
3
[% USE Branches %]
4
[% USE ItemTypes %]
4
5
5
[% INCLUDE 'doc-head-open.inc' %]
6
[% INCLUDE 'doc-head-open.inc' %]
6
<title>[% IF ( LibraryNameTitle ) %][% LibraryNameTitle %][% ELSE %]Koha online[% END %] catalog &rsaquo; Your library home</title>
7
<title>[% IF ( LibraryNameTitle ) %][% LibraryNameTitle %][% ELSE %]Koha online[% END %] catalog &rsaquo; Your library home</title>
Lines 608-614 Link Here
608
                                                    [% ELSIF ( RESERVE.suspend ) %]
609
                                                    [% ELSIF ( RESERVE.suspend ) %]
609
                                                        Suspended [% IF ( RESERVE.suspend_until ) %] until [% RESERVE.suspend_until %] [% END %]
610
                                                        Suspended [% IF ( RESERVE.suspend_until ) %] until [% RESERVE.suspend_until %] [% END %]
610
                                                    [% ELSE %]
611
                                                    [% ELSE %]
611
                                                        Pending
612
                                                        [% IF RESERVE.itemtype %]
613
                                                            Pending for next available <i>[% ItemTypes.GetDescription( RESERVE.itemtype ) %]</i> item
614
                                                        [% ELSE %]
615
                                                            Pending
616
                                                        [% END %]
612
                                                    [% END %]
617
                                                    [% END %]
613
                                                [% END %]
618
                                                [% END %]
614
                                            </td>
619
                                            </td>
(-)a/opac/opac-reserve.pl (-6 / +13 lines)
Lines 37-42 use Koha::DateUtils; Link Here
37
use Koha::Libraries;
37
use Koha::Libraries;
38
use Koha::Patron::Debarments qw(IsDebarred);
38
use Koha::Patron::Debarments qw(IsDebarred);
39
use Date::Calc qw/Today Date_to_Days/;
39
use Date::Calc qw/Today Date_to_Days/;
40
use List::MoreUtils qw/uniq/;
40
41
41
my $maxreserves = C4::Context->preference("maxreserves");
42
my $maxreserves = C4::Context->preference("maxreserves");
42
43
Lines 281-295 if ( $query->param('place_reserve') ) { Link Here
281
            $canreserve = 0;
282
            $canreserve = 0;
282
        }
283
        }
283
284
285
        my $itemtype = $query->param('itemtype') || undef;
286
        $itemtype = undef if $itemNum;
287
284
        # Here we actually do the reserveration. Stage 3.
288
        # Here we actually do the reserveration. Stage 3.
285
        if ($canreserve) {
289
        if ($canreserve) {
286
            my $reserve_id = AddReserve(
290
            my $reserve_id = AddReserve(
287
                $branch,      $borrowernumber,
291
                $branch,          $borrowernumber, $biblioNum,
288
                $biblioNum,
292
                [$biblioNum],     $rank,           $startdate,
289
                [$biblioNum], $rank,
293
                $expiration_date, $notes,          $biblioData->{title},
290
                $startdate,   $expiration_date,
294
                $itemNum,         $found,          $itemtype,
291
                $notes,       $biblioData->{title},
292
                $itemNum,     $found
293
            );
295
            );
294
            $failed_holds++ unless $reserve_id;
296
            $failed_holds++ unless $reserve_id;
295
            ++$reserve_cnt;
297
            ++$reserve_cnt;
Lines 381-386 unless ($noreserves) { Link Here
381
#
383
#
382
my $notforloan_label_of = get_notforloan_label_of();
384
my $notforloan_label_of = get_notforloan_label_of();
383
385
386
my @available_itemtypes;
384
my $biblioLoop = [];
387
my $biblioLoop = [];
385
my $numBibsAvailable = 0;
388
my $numBibsAvailable = 0;
386
my $itemdata_enumchron = 0;
389
my $itemdata_enumchron = 0;
Lines 534-539 foreach my $biblioNum (@biblionumbers) { Link Here
534
                $itemLoopIter->{available} = 1;
537
                $itemLoopIter->{available} = 1;
535
                $numCopiesOPACAvailable++;
538
                $numCopiesOPACAvailable++;
536
                $biblioLoopIter{force_hold} = 1 if $hold_allowed eq 'F';
539
                $biblioLoopIter{force_hold} = 1 if $hold_allowed eq 'F';
540
                push( @available_itemtypes, $itemInfo->{itype} );
537
            }
541
            }
538
            $numCopiesAvailable++;
542
            $numCopiesAvailable++;
539
        }
543
        }
Lines 571-576 foreach my $biblioNum (@biblionumbers) { Link Here
571
    $anyholdable = 1 if $biblioLoopIter{holdable};
575
    $anyholdable = 1 if $biblioLoopIter{holdable};
572
}
576
}
573
577
578
@available_itemtypes = uniq( @available_itemtypes );
579
$template->param( available_itemtypes => \@available_itemtypes );
580
574
if ( $numBibsAvailable == 0 || $anyholdable == 0) {
581
if ( $numBibsAvailable == 0 || $anyholdable == 0) {
575
    $template->param( none_available => 1 );
582
    $template->param( none_available => 1 );
576
}
583
}
(-)a/reserve/placerequest.pl (-13 / +15 lines)
Lines 37-55 my $input = CGI->new(); Link Here
37
37
38
checkauth($input, 0, { reserveforothers => 'place_holds' }, 'intranet');
38
checkauth($input, 0, { reserveforothers => 'place_holds' }, 'intranet');
39
39
40
my @bibitems=$input->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 321-326 foreach my $biblionumber (@biblionumbers) { Link Here
321
321
322
    my @bibitemloop;
322
    my @bibitemloop;
323
323
324
    my @available_itemtypes;
324
    foreach my $biblioitemnumber (@biblioitemnumbers) {
325
    foreach my $biblioitemnumber (@biblioitemnumbers) {
325
        my $biblioitem = $biblioiteminfos_of->{$biblioitemnumber};
326
        my $biblioitem = $biblioiteminfos_of->{$biblioitemnumber};
326
        my $num_available = 0;
327
        my $num_available = 0;
Lines 454-459 foreach my $biblionumber (@biblionumbers) { Link Here
454
            {
455
            {
455
                $item->{available} = 1;
456
                $item->{available} = 1;
456
                $num_available++;
457
                $num_available++;
458
459
                push( @available_itemtypes, $item->{itype} );
457
            }
460
            }
458
            elsif ( C4::Context->preference('AllowHoldPolicyOverride') ) {
461
            elsif ( C4::Context->preference('AllowHoldPolicyOverride') ) {
459
                # If AllowHoldPolicyOverride is set, it should override EVERY restriction, not just branch item rules
462
                # If AllowHoldPolicyOverride is set, it should override EVERY restriction, not just branch item rules
Lines 483-488 foreach my $biblionumber (@biblionumbers) { Link Here
483
        push @bibitemloop, $biblioitem;
486
        push @bibitemloop, $biblioitem;
484
    }
487
    }
485
488
489
    @available_itemtypes = uniq( @available_itemtypes );
490
    $template->param( available_itemtypes => \@available_itemtypes );
491
486
    # existingreserves building
492
    # existingreserves building
487
    my @reserveloop;
493
    my @reserveloop;
488
    my @reserves = Koha::Holds->search( { biblionumber => $biblionumber }, { order_by => 'priority' } );
494
    my @reserves = Koha::Holds->search( { biblionumber => $biblionumber }, { order_by => 'priority' } );
Lines 561-566 foreach my $biblionumber (@biblionumbers) { Link Here
561
        $reserve{'suspend'}        = $res->suspend();
567
        $reserve{'suspend'}        = $res->suspend();
562
        $reserve{'suspend_until'}  = $res->suspend_until();
568
        $reserve{'suspend_until'}  = $res->suspend_until();
563
        $reserve{'reserve_id'}     = $res->reserve_id();
569
        $reserve{'reserve_id'}     = $res->reserve_id();
570
        $reserve{itemtype}         = $res->{itemtype};
564
571
565
        if ( C4::Context->preference('IndependentBranches') && $flags->{'superlibrarian'} != 1 ) {
572
        if ( C4::Context->preference('IndependentBranches') && $flags->{'superlibrarian'} != 1 ) {
566
            $reserve{'branchloop'} = [ Koha::Libraries->find( $res->branchcode() ) ];
573
            $reserve{'branchloop'} = [ Koha::Libraries->find( $res->branchcode() ) ];
(-)a/t/db_dependent/Holds/HoldItemtypeLimit.t (+112 lines)
Line 0 Link Here
1
#!/usr/bin/perl
2
3
use Modern::Perl;
4
5
use C4::Context;
6
7
use Test::More tests => 4;
8
9
use t::lib::TestBuilder;
10
11
BEGIN {
12
    use FindBin;
13
    use lib $FindBin::Bin;
14
    use_ok('C4::Reserves');
15
}
16
17
my $schema = Koha::Database->schema;
18
$schema->storage->txn_begin;
19
my $dbh = C4::Context->dbh;
20
21
my $builder = t::lib::TestBuilder->new;
22
23
my $library = $builder->build({
24
    source => 'Branch',
25
});
26
27
my $bib_title = "Test Title";
28
29
my $borrower = $builder->build({
30
    source => 'Borrower',
31
    value => {
32
        categorycode => 'S',
33
        branchcode => $library->{branchcode},
34
    }
35
});
36
37
my $itemtype1 = $builder->build({
38
    source => 'Itemtype',
39
    value => {
40
        notforloan => 0
41
    }
42
});
43
44
my $itemtype2 = $builder->build({
45
    source => 'Itemtype',
46
    value => {
47
        notforloan => 0
48
    }
49
});
50
51
52
# Test hold_fulfillment_policy
53
my $right_itemtype = $itemtype1->{itemtype};
54
my $wrong_itemtype = $itemtype2->{itemtype};
55
my $borrowernumber = $borrower->{borrowernumber};
56
my $branchcode = $library->{branchcode};
57
$dbh->do("DELETE FROM reserves");
58
$dbh->do("DELETE FROM issues");
59
$dbh->do("DELETE FROM items");
60
$dbh->do("DELETE FROM biblio");
61
$dbh->do("DELETE FROM biblioitems");
62
$dbh->do("DELETE FROM transport_cost");
63
$dbh->do("DELETE FROM tmp_holdsqueue");
64
$dbh->do("DELETE FROM hold_fill_targets");
65
$dbh->do("DELETE FROM default_branch_circ_rules");
66
$dbh->do("DELETE FROM default_branch_item_rules");
67
$dbh->do("DELETE FROM default_circ_rules");
68
$dbh->do("DELETE FROM branch_item_rules");
69
70
$dbh->do("INSERT INTO biblio (frameworkcode, author, title, datecreated) VALUES ('', 'Koha test', '$bib_title', '2011-02-01')");
71
72
my $biblionumber = $dbh->selectrow_array("SELECT biblionumber FROM biblio WHERE title = '$bib_title'")
73
  or BAIL_OUT("Cannot find newly created biblio record");
74
75
$dbh->do("INSERT INTO biblioitems (biblionumber, marcxml, itemtype) VALUES ($biblionumber, '', '$right_itemtype')");
76
77
my $biblioitemnumber =
78
  $dbh->selectrow_array("SELECT biblioitemnumber FROM biblioitems WHERE biblionumber = $biblionumber")
79
  or BAIL_OUT("Cannot find newly created biblioitems record");
80
81
$dbh->do("
82
    INSERT INTO items (biblionumber, biblioitemnumber, homebranch, holdingbranch, notforloan, damaged, itemlost, withdrawn, onloan, itype)
83
    VALUES ($biblionumber, $biblioitemnumber, '$branchcode', '$branchcode', 0, 0, 0, 0, NULL, '$right_itemtype')
84
");
85
86
my $itemnumber =
87
  $dbh->selectrow_array("SELECT itemnumber FROM items WHERE biblionumber = $biblionumber")
88
  or BAIL_OUT("Cannot find newly created item");
89
90
$dbh->do("DELETE FROM default_circ_rules");
91
$dbh->do("INSERT INTO default_circ_rules ( holdallowed, hold_fulfillment_policy ) VALUES ( 2, 'any' )");
92
93
# Itemtypes match
94
my $reserve_id = AddReserve( $branchcode, $borrowernumber, $biblionumber, '', 1, undef, undef, undef, undef, undef, undef, $right_itemtype );
95
my ( $status ) = CheckReserves($itemnumber);
96
is( $status, 'Reserved', "Hold where itemtype matches item's itemtype targed" );
97
CancelReserve( { reserve_id => $reserve_id } );
98
99
# Itemtypes don't match
100
$reserve_id = AddReserve( $branchcode, $borrowernumber, $biblionumber, '', 1, undef, undef, undef, undef, undef, undef, $wrong_itemtype );
101
( $status ) = CheckReserves($itemnumber);
102
is($status, q{}, "Hold where itemtype does not match item's itemtype not targeted" );
103
CancelReserve( { reserve_id => $reserve_id } );
104
105
# No itemtype set
106
$reserve_id = AddReserve( $branchcode, $borrowernumber, $biblionumber, '', 1, undef, undef, undef, undef, undef, undef, undef );
107
( $status ) = CheckReserves($itemnumber);
108
is( $status, 'Reserved', "Item targeted with no hold itemtype set" );
109
CancelReserve( { reserve_id => $reserve_id } );
110
111
# Cleanup
112
$schema->storage->txn_rollback;
(-)a/t/db_dependent/HoldsQueue.t (-3 / +64 lines)
Lines 8-17 Link Here
8
8
9
use Modern::Perl;
9
use Modern::Perl;
10
10
11
use Test::More tests => 35;
11
use Test::More tests => 38;
12
use Data::Dumper;
12
use Data::Dumper;
13
13
14
15
use C4::Branch;
14
use C4::Branch;
16
use C4::Calendar;
15
use C4::Calendar;
17
use C4::Context;
16
use C4::Context;
Lines 555-560 CancelReserve( { reserve_id => $reserve_id } ); Link Here
555
554
556
# End testing hold_fulfillment_policy
555
# End testing hold_fulfillment_policy
557
556
557
# Test hold itemtype limit
558
C4::Context->set_preference( "UseTransportCostMatrix", 0 );
559
my @itemtypes = Koha::ItemTypes->search();
560
my $wrong_itemtype = $itemtypes[0]->itemtype;
561
my $right_itemtype = $itemtypes[1]->itemtype;
562
$borrowernumber = $borrower3->{borrowernumber};
563
my $branchcode = $library1->{branchcode};
564
$dbh->do("DELETE FROM reserves");
565
$dbh->do("DELETE FROM issues");
566
$dbh->do("DELETE FROM items");
567
$dbh->do("DELETE FROM biblio");
568
$dbh->do("DELETE FROM biblioitems");
569
$dbh->do("DELETE FROM transport_cost");
570
$dbh->do("DELETE FROM tmp_holdsqueue");
571
$dbh->do("DELETE FROM hold_fill_targets");
572
$dbh->do("DELETE FROM default_branch_circ_rules");
573
$dbh->do("DELETE FROM default_branch_item_rules");
574
$dbh->do("DELETE FROM default_circ_rules");
575
$dbh->do("DELETE FROM branch_item_rules");
576
577
$dbh->do("INSERT INTO biblio (frameworkcode, author, title, datecreated) VALUES ('', 'Koha test', '$TITLE', '2011-02-01')");
578
579
$biblionumber = $dbh->selectrow_array("SELECT biblionumber FROM biblio WHERE title = '$TITLE'")
580
  or BAIL_OUT("Cannot find newly created biblio record");
581
582
$dbh->do("INSERT INTO biblioitems (biblionumber, marcxml, itemtype) VALUES ($biblionumber, '', '$itemtype')");
583
584
$biblioitemnumber =
585
  $dbh->selectrow_array("SELECT biblioitemnumber FROM biblioitems WHERE biblionumber = $biblionumber")
586
  or BAIL_OUT("Cannot find newly created biblioitems record");
587
588
$dbh->do("
589
    INSERT INTO items (biblionumber, biblioitemnumber, homebranch, holdingbranch, notforloan, damaged, itemlost, withdrawn, onloan, itype)
590
    VALUES ($biblionumber, $biblioitemnumber, '$library_A', '$library_B', 0, 0, 0, 0, NULL, '$right_itemtype')
591
");
592
593
# With hold_fulfillment_policy = homebranch, hold should only be picked up if pickup branch = homebranch
594
$dbh->do("DELETE FROM default_circ_rules");
595
$dbh->do("INSERT INTO default_circ_rules ( holdallowed, hold_fulfillment_policy ) VALUES ( 2, 'any' )");
596
597
# Home branch matches pickup branch
598
$reserve_id = AddReserve( $library_A, $borrowernumber, $biblionumber, '', 1, undef, undef, undef, undef, undef, undef, $wrong_itemtype );
599
C4::HoldsQueue::CreateQueue();
600
$holds_queue = $dbh->selectall_arrayref( "SELECT * FROM tmp_holdsqueue", { Slice => {} } );
601
is( @$holds_queue, 0, "Item with incorrect itemtype not targeted" );
602
CancelReserve( { reserve_id => $reserve_id } );
603
604
# Holding branch matches pickup branch
605
$reserve_id = AddReserve( $library_A, $borrowernumber, $biblionumber, '', 1, undef, undef, undef, undef, undef, undef, $right_itemtype );
606
C4::HoldsQueue::CreateQueue();
607
$holds_queue = $dbh->selectall_arrayref( "SELECT * FROM tmp_holdsqueue", { Slice => {} } );
608
is( @$holds_queue, 1, "Item with matching itemtype is targeted" );
609
CancelReserve( { reserve_id => $reserve_id } );
610
611
# Neither branch matches pickup branch
612
$reserve_id = AddReserve( $library_A, $borrowernumber, $biblionumber, '', 1, undef, undef, undef, undef, undef, undef, undef );
613
C4::HoldsQueue::CreateQueue();
614
$holds_queue = $dbh->selectall_arrayref( "SELECT * FROM tmp_holdsqueue", { Slice => {} } );
615
is( @$holds_queue, 1, "Item targeted when hold itemtype is not set" );
616
CancelReserve( { reserve_id => $reserve_id } );
617
618
# End testing hold itemtype limit
619
558
# Cleanup
620
# Cleanup
559
$schema->storage->txn_rollback;
621
$schema->storage->txn_rollback;
560
622
561
- 

Return to bug 15533