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

(-)a/C4/Reserves.pm (-2 / +49 lines)
Lines 141-146 BEGIN { Link Here
141
        &GetReservesControlBranch
141
        &GetReservesControlBranch
142
142
143
        IsItemOnHoldAndFound
143
        IsItemOnHoldAndFound
144
145
        AddReserveGroup
146
        DeleteReserveGroup
144
    );
147
    );
145
    @EXPORT_OK = qw( MergeHolds );
148
    @EXPORT_OK = qw( MergeHolds );
146
}
149
}
Lines 165-171 sub AddReserve { Link Here
165
    my (
168
    my (
166
        $branch,    $borrowernumber, $biblionumber,
169
        $branch,    $borrowernumber, $biblionumber,
167
        $bibitems,  $priority, $resdate, $expdate, $notes,
170
        $bibitems,  $priority, $resdate, $expdate, $notes,
168
        $title,      $checkitem, $found
171
        $title,      $checkitem, $found, $reserve_group_id
169
    ) = @_;
172
    ) = @_;
170
173
171
    if ( Koha::Holds->search( { borrowernumber => $borrowernumber, biblionumber => $biblionumber } )->count() > 0 ) {
174
    if ( Koha::Holds->search( { borrowernumber => $borrowernumber, biblionumber => $biblionumber } )->count() > 0 ) {
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
            reserve_group_id => $reserve_group_id,
209
        }
213
        }
210
    )->store();
214
    )->store();
211
    my $reserve_id = $hold->id();
215
    my $reserve_id = $hold->id();
Lines 1336-1341 sub ModReserveAffect { Link Here
1336
    }
1340
    }
1337
    $sth = $dbh->prepare($query);
1341
    $sth = $dbh->prepare($query);
1338
    $sth->execute( $itemnumber, $borrowernumber,$biblionumber);
1342
    $sth->execute( $itemnumber, $borrowernumber,$biblionumber);
1343
1344
    if ($request->{reserve_group_id}) {
1345
        # Delete other reserves from same group
1346
        $dbh->do(q{
1347
            DELETE FROM reserves
1348
            WHERE reserve_group_id = ?
1349
              AND reserve_id != ?
1350
        }, undef, $request->{reserve_group_id}, $request->{reserve_id});
1351
        DeleteReserveGroup($request->{reserve_group_id});
1352
    }
1353
1339
    _koha_notify_reserve( $itemnumber, $borrowernumber, $biblionumber ) if ( !$transferToDo && !$already_on_shelf );
1354
    _koha_notify_reserve( $itemnumber, $borrowernumber, $biblionumber ) if ( !$transferToDo && !$already_on_shelf );
1340
    _FixPriority( { biblionumber => $biblionumber } );
1355
    _FixPriority( { biblionumber => $biblionumber } );
1341
    if ( C4::Context->preference("ReturnToShelvingCart") ) {
1356
    if ( C4::Context->preference("ReturnToShelvingCart") ) {
Lines 1415-1420 sub GetReserveInfo { Link Here
1415
                   reminderdate,
1430
                   reminderdate,
1416
                   priority,
1431
                   priority,
1417
                   found,
1432
                   found,
1433
                   reserve_group_id,
1418
                   firstname,
1434
                   firstname,
1419
                   surname,
1435
                   surname,
1420
                   phone,
1436
                   phone,
Lines 2471-2476 sub IsItemOnHoldAndFound { Link Here
2471
    return $found;
2487
    return $found;
2472
}
2488
}
2473
2489
2490
=head2 AddReserveGroup
2491
2492
    my $reserve_group_id = AddReserveGroup();
2493
2494
Creates a new reserve group and returns its ID
2495
2496
=cut
2497
2498
sub AddReserveGroup {
2499
    my $dbh = C4::Context->dbh;
2500
2501
    $dbh->do('INSERT INTO reserve_group VALUES ()');
2502
    return $dbh->last_insert_id(undef, undef, 'reserve_group', undef);
2503
}
2504
2505
=head2 DeleteReserveGroup
2506
2507
    DeleteReserveGroup($reserve_group_id);
2508
2509
Delete a reserve group. Reserves that belong to this group are not removed.
2510
2511
=cut
2512
2513
sub DeleteReserveGroup {
2514
    my ($reserve_group_id) = @_;
2515
2516
    my $dbh = C4::Context->dbh;
2517
    my $query = 'DELETE FROM reserve_group WHERE reserve_group_id = ?';
2518
    $dbh->do($query, undef, $reserve_group_id);
2519
}
2520
2474
=head1 AUTHOR
2521
=head1 AUTHOR
2475
2522
2476
Koha Development Team <http://koha-community.org/>
2523
Koha Development Team <http://koha-community.org/>
(-)a/installer/data/mysql/atomicupdate/bug_15516.sql (+8 lines)
Line 0 Link Here
1
DROP TABLE IF EXISTS reserve_group;
2
CREATE TABLE reserve_group (
3
  reserve_group_id int unsigned NOT NULL AUTO_INCREMENT,
4
  PRIMARY KEY (reserve_group_id)
5
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
6
7
ALTER TABLE reserves ADD COLUMN reserve_group_id int unsigned NULL DEFAULT NULL;
8
ALTER TABLE reserves ADD CONSTRAINT reserves_ibfk_5 FOREIGN KEY (reserve_group_id) REFERENCES reserve_group (reserve_group_id) ON DELETE SET NULL ON UPDATE CASCADE;
(-)a/installer/data/mysql/kohastructure.sql (+12 lines)
Lines 1859-1864 CREATE TABLE `reserves` ( -- information related to holds/reserves in Koha Link Here
1859
  `lowestPriority` tinyint(1) NOT NULL,
1859
  `lowestPriority` tinyint(1) NOT NULL,
1860
  `suspend` BOOLEAN NOT NULL DEFAULT 0,
1860
  `suspend` BOOLEAN NOT NULL DEFAULT 0,
1861
  `suspend_until` DATETIME NULL DEFAULT NULL,
1861
  `suspend_until` DATETIME NULL DEFAULT NULL,
1862
  reserve_group_id int unsigned NULL DEFAULT NULL,
1862
  PRIMARY KEY (`reserve_id`),
1863
  PRIMARY KEY (`reserve_id`),
1863
  KEY priorityfoundidx (priority,found),
1864
  KEY priorityfoundidx (priority,found),
1864
  KEY `borrowernumber` (`borrowernumber`),
1865
  KEY `borrowernumber` (`borrowernumber`),
Lines 1869-1874 CREATE TABLE `reserves` ( -- information related to holds/reserves in Koha Link Here
1869
  CONSTRAINT `reserves_ibfk_2` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1870
  CONSTRAINT `reserves_ibfk_2` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1870
  CONSTRAINT `reserves_ibfk_3` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1871
  CONSTRAINT `reserves_ibfk_3` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1871
  CONSTRAINT `reserves_ibfk_4` FOREIGN KEY (`branchcode`) REFERENCES `branches` (`branchcode`) ON DELETE CASCADE ON UPDATE CASCADE
1872
  CONSTRAINT `reserves_ibfk_4` FOREIGN KEY (`branchcode`) REFERENCES `branches` (`branchcode`) ON DELETE CASCADE ON UPDATE CASCADE
1873
  CONSTRAINT `reserves_ibfk_5` FOREIGN KEY (reserve_group_id) REFERENCES reserve_group (reserve_group_id) ON DELETE SET NULL ON UPDATE CASCADE
1874
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
1875
1876
--
1877
-- Table structure for table reserve_group
1878
--
1879
1880
DROP TABLE IF EXISTS reserve_group;
1881
CREATE TABLE reserve_group (
1882
  reserve_group_id int unsigned NOT NULL AUTO_INCREMENT,
1883
  PRIMARY KEY(reserve_group_id)
1872
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
1884
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
1873
1885
1874
--
1886
--
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt (-3 / +8 lines)
Lines 423-435 function checkMultiHold() { Link Here
423
        <a href="#" id="clear-date-to" class="clear-date">Clear date</a>
423
        <a href="#" id="clear-date-to" class="clear-date">Clear date</a>
424
	</li>
424
	</li>
425
425
426
        [% UNLESS ( multi_hold ) %]
427
          <li> <label for="requestany">Place a hold on the next available item </label>
426
          <li> <label for="requestany">Place a hold on the next available item </label>
428
               <input type="checkbox" id="requestany" name="request" checked="checked" value="Any" />
427
              [% IF multi_hold %]
428
                  <input type="checkbox" id="requestany" name="requestany" value="1" />
429
              [% ELSE %]
430
                  <input type="checkbox" id="requestany" name="requestany" checked="checked" value="1" />
431
              [% END %]
429
               <input type="hidden" name="biblioitem" value="[% biblioitemnumber %]" />
432
               <input type="hidden" name="biblioitem" value="[% biblioitemnumber %]" />
430
               <input type="hidden" name="alreadyreserved" value="[% alreadyreserved %]" />
433
               <input type="hidden" name="alreadyreserved" value="[% alreadyreserved %]" />
431
          </li>
434
          </li>
432
        [% END %]
433
435
434
</ol>
436
</ol>
435
   [% UNLESS ( multi_hold ) %]
437
   [% UNLESS ( multi_hold ) %]
Lines 801-806 function checkMultiHold() { Link Here
801
                 <input type="hidden" name="itemnumber" value="" />
803
                 <input type="hidden" name="itemnumber" value="" />
802
            [% END %]
804
            [% END %]
803
    [% END %]
805
    [% END %]
806
            [% IF reserveloo.reserve_group_id %]
807
                <div>(part of a reserve group)</div>
808
            [% END %]
804
        </td>
809
        </td>
805
810
806
    [% IF ( CAN_user_reserveforothers_modify_holds_priority ) %]
811
    [% IF ( CAN_user_reserveforothers_modify_holds_priority ) %]
(-)a/reserve/placerequest.pl (-2 / +10 lines)
Lines 50-55 my $title=$input->param('title'); Link Here
50
my $borrower=GetMember('borrowernumber'=>$borrowernumber);
50
my $borrower=GetMember('borrowernumber'=>$borrowernumber);
51
my $checkitem=$input->param('checkitem');
51
my $checkitem=$input->param('checkitem');
52
my $expirationdate = $input->param('expiration_date');
52
my $expirationdate = $input->param('expiration_date');
53
my $requestany = $input->param('requestany');
53
54
54
my $multi_hold = $input->param('multi_hold');
55
my $multi_hold = $input->param('multi_hold');
55
my $biblionumbers = $multi_hold ? $input->param('biblionumbers') : ($biblionumber . '/');
56
my $biblionumbers = $multi_hold ? $input->param('biblionumbers') : ($biblionumber . '/');
Lines 79-84 if (defined $checkitem && $checkitem ne ''){ Link Here
79
80
80
if ($type eq 'str8' && $borrower){
81
if ($type eq 'str8' && $borrower){
81
82
83
    my $reserve_group_id;
84
    if ($multi_hold && $requestany) {
85
        $reserve_group_id = AddReserveGroup();
86
    }
87
82
    foreach my $biblionumber (keys %bibinfos) {
88
    foreach my $biblionumber (keys %bibinfos) {
83
        my $count=@bibitems;
89
        my $count=@bibitems;
84
        @bibitems=sort @bibitems;
90
        @bibitems=sort @bibitems;
Lines 104-111 if ($type eq 'str8' && $borrower){ Link Here
104
110
105
        if ($multi_hold) {
111
        if ($multi_hold) {
106
            my $bibinfo = $bibinfos{$biblionumber};
112
            my $bibinfo = $bibinfos{$biblionumber};
107
            AddReserve($branch,$borrower->{'borrowernumber'},$biblionumber,[$biblionumber],
113
            AddReserve($branch, $borrower->{'borrowernumber'}, $biblionumber,
108
                       $bibinfo->{rank},$startdate,$expirationdate,$notes,$bibinfo->{title},$checkitem,$found);
114
                [$biblionumber], $bibinfo->{rank}, $startdate, $expirationdate,
115
                $notes, $bibinfo->{title}, $checkitem, $found,
116
                $reserve_group_id);
109
        } else {
117
        } else {
110
            # place a request on 1st available
118
            # place a request on 1st available
111
            AddReserve($branch,$borrower->{'borrowernumber'},$biblionumber,\@realbi,$rank[0],$startdate,$expirationdate,$notes,$title,$checkitem,$found);
119
            AddReserve($branch,$borrower->{'borrowernumber'},$biblionumber,\@realbi,$rank[0],$startdate,$expirationdate,$notes,$title,$checkitem,$found);
(-)a/reserve/request.pl (-1 / +1 lines)
Lines 562-567 foreach my $biblionumber (@biblionumbers) { Link Here
562
        $reserve{'suspend'}        = $res->suspend();
562
        $reserve{'suspend'}        = $res->suspend();
563
        $reserve{'suspend_until'}  = $res->suspend_until();
563
        $reserve{'suspend_until'}  = $res->suspend_until();
564
        $reserve{'reserve_id'}     = $res->reserve_id();
564
        $reserve{'reserve_id'}     = $res->reserve_id();
565
        $reserve{'reserve_group_id'} = $res->reserve_group_id;
565
566
566
        if ( C4::Context->preference('IndependentBranches') && $flags->{'superlibrarian'} != 1 ) {
567
        if ( C4::Context->preference('IndependentBranches') && $flags->{'superlibrarian'} != 1 ) {
567
            $reserve{'branchloop'} = [ GetBranchDetail( $res->branchcode() ) ];
568
            $reserve{'branchloop'} = [ GetBranchDetail( $res->branchcode() ) ];
568
- 

Return to bug 15516