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

(-)a/C4/Reserves.pm (-32 / +32 lines)
Lines 141-149 BEGIN { Link Here
141
141
142
        GetMaxPatronHoldsForRecord
142
        GetMaxPatronHoldsForRecord
143
143
144
        &AddReserveGroup
144
        &AddHoldGroup
145
        &DeleteReserveGroup
145
        &DeleteHoldGroup
146
        &GetReserveGroupReserves
146
        &GetHoldGroupHolds
147
    );
147
    );
148
    @EXPORT_OK = qw( MergeHolds );
148
    @EXPORT_OK = qw( MergeHolds );
149
}
149
}
Lines 193-199 sub AddReserve { Link Here
193
    my $found          = $params->{found};
193
    my $found          = $params->{found};
194
    my $itemtype       = $params->{itemtype};
194
    my $itemtype       = $params->{itemtype};
195
    my $non_priority   = $params->{non_priority};
195
    my $non_priority   = $params->{non_priority};
196
    my $reserve_group_id = $params->{reserve_group_id};
196
    my $hold_group_id  = $params->{hold_group_id};
197
197
198
    $resdate = output_pref( { str => dt_from_string( $resdate ), dateonly => 1, dateformat => 'iso' })
198
    $resdate = output_pref( { str => dt_from_string( $resdate ), dateonly => 1, dateformat => 'iso' })
199
        or output_pref({ dt => dt_from_string, dateonly => 1, dateformat => 'iso' });
199
        or output_pref({ dt => dt_from_string, dateonly => 1, dateformat => 'iso' });
Lines 258-264 sub AddReserve { Link Here
258
            itemtype       => $itemtype,
258
            itemtype       => $itemtype,
259
            item_level_hold => $checkitem ? 1 : 0,
259
            item_level_hold => $checkitem ? 1 : 0,
260
            non_priority   => $non_priority ? 1 : 0,
260
            non_priority   => $non_priority ? 1 : 0,
261
            reserve_group_id => $reserve_group_id,
261
            hold_group_id => $hold_group_id,
262
        }
262
        }
263
    )->store();
263
    )->store();
264
    $hold->set_waiting() if $found && $found eq 'W';
264
    $hold->set_waiting() if $found && $found eq 'W';
Lines 623-629 sub GetHoldCount { Link Here
623
        SELECT COUNT(*) AS counter
623
        SELECT COUNT(*) AS counter
624
        FROM reserves
624
        FROM reserves
625
        WHERE borrowernumber = ?
625
        WHERE borrowernumber = ?
626
        AND reserve_group_id is NULL"; #added by 15516
626
        AND hold_group_id is NULL"; #added by 15516
627
    my $sth = $dbh->prepare($query);
627
    my $sth = $dbh->prepare($query);
628
    $sth->execute($borrowernumber);
628
    $sth->execute($borrowernumber);
629
    my $row = $sth->fetchrow_hashref;
629
    my $row = $sth->fetchrow_hashref;
Lines 632-641 sub GetHoldCount { Link Here
632
    $count += $row->{counter};
632
    $count += $row->{counter};
633
633
634
    $query = "
634
    $query = "
635
        SELECT COUNT(DISTINCT reserve_group_id) AS counter
635
        SELECT COUNT(DISTINCT hold_group_id) AS counter
636
        FROM reserves
636
        FROM reserves
637
        WHERE borrowernumber = ?
637
        WHERE borrowernumber = ?
638
        AND reserve_group_id is not NULL
638
        AND hold_group_id is not NULL
639
    ";
639
    ";
640
    $sth = $dbh->prepare($query);
640
    $sth = $dbh->prepare($query);
641
    $sth->execute($borrowernumber);
641
    $sth->execute($borrowernumber);
Lines 1257-1270 sub ModReserveAffect { Link Here
1257
        };
1257
        };
1258
    }
1258
    }
1259
1259
1260
    if ($hold->reserve_group_id) {
1260
    if ($hold->hold_group_id) {
1261
        # Delete other reserves from same group
1261
        # Delete other reserves from same group
1262
        $dbh->do(q{
1262
        $dbh->do(q{
1263
            DELETE FROM reserves
1263
            DELETE FROM reserves
1264
            WHERE reserve_group_id = ?
1264
            WHERE hold_group_id = ?
1265
              AND reserve_id != ?
1265
              AND reserve_id != ?
1266
        }, undef, $hold->reserve_group_id, $hold->reserve_id);
1266
        }, undef, $hold->hold_group_id, $hold->reserve_id);
1267
        DeleteReserveGroup($hold->reserve_group_id);
1267
        DeleteHoldGroup($hold->hold_group_id);
1268
    }
1268
    }
1269
1269
1270
    _FixPriority( { biblionumber => $biblionumber } );
1270
    _FixPriority( { biblionumber => $biblionumber } );
Lines 2325-2378 sub GetMaxPatronHoldsForRecord { Link Here
2325
    return $max;
2325
    return $max;
2326
}
2326
}
2327
2327
2328
=head2 AddReserveGroup
2328
=head2 AddHoldGroup
2329
2329
2330
    my $reserve_group_id = AddReserveGroup();
2330
    my $hold_group_id = AddHoldGroup();
2331
2331
2332
Creates a new reserve group and returns its ID
2332
Creates a new hold group and returns its ID
2333
2333
2334
=cut
2334
=cut
2335
2335
2336
sub AddReserveGroup {
2336
sub AddHoldGroup {
2337
    my $dbh = C4::Context->dbh;
2337
    my $dbh = C4::Context->dbh;
2338
2338
2339
    $dbh->do('INSERT INTO reserve_group VALUES ()');
2339
    $dbh->do('INSERT INTO hold_group VALUES ()');
2340
    return $dbh->last_insert_id(undef, undef, 'reserve_group', undef);
2340
    return $dbh->last_insert_id(undef, undef, 'hold_group', undef);
2341
}
2341
}
2342
2342
2343
=head2 DeleteReserveGroup
2343
=head2 DeleteHoldGroup
2344
2344
2345
    DeleteReserveGroup($reserve_group_id);
2345
    DeleteHoldGroup($hold_group_id);
2346
2346
2347
Delete a reserve group. Reserves that belong to this group are not removed.
2347
Delete a hold group. Reserves that belong to this group are not removed.
2348
2348
2349
=cut
2349
=cut
2350
2350
2351
sub DeleteReserveGroup {
2351
sub DeleteHoldGroup {
2352
    my ($reserve_group_id) = @_;
2352
    my ($hold_group_id) = @_;
2353
2353
2354
    my $dbh = C4::Context->dbh;
2354
    my $dbh = C4::Context->dbh;
2355
    my $query = 'DELETE FROM reserve_group WHERE reserve_group_id = ?';
2355
    my $query = 'DELETE FROM hold_group WHERE hold_group_id = ?';
2356
    $dbh->do($query, undef, $reserve_group_id);
2356
    $dbh->do($query, undef, $hold_group_id);
2357
}
2357
}
2358
2358
2359
=head2 GetReserveGroupReserves
2359
=head2 GetHoldGroupHolds
2360
2360
2361
    my @reserves = GetReserveGroupReserves($reserve_group_id);
2361
    my @reserves = GetHoldGroupHolds($hold_group_id);
2362
2362
2363
Fetch all reserve from a reserve group.
2363
Fetch all reserve from a hold group.
2364
2364
2365
=cut
2365
=cut
2366
2366
2367
sub GetReserveGroupReserves {
2367
sub GetHoldGroupHolds {
2368
    my ($reserve_group_id) = @_;
2368
    my ($hold_group_id) = @_;
2369
2369
2370
    my $dbh = C4::Context->dbh;
2370
    my $dbh = C4::Context->dbh;
2371
2371
2372
    my $reserves = $dbh->selectall_arrayref(q{
2372
    my $reserves = $dbh->selectall_arrayref(q{
2373
        SELECT * FROM reserves
2373
        SELECT * FROM reserves
2374
        WHERE reserve_group_id = ?
2374
        WHERE hold_group_id = ?
2375
    }, { Slice => {} }, $reserve_group_id);
2375
    }, { Slice => {} }, $hold_group_id);
2376
2376
2377
    return () unless defined $reserves;
2377
    return () unless defined $reserves;
2378
2378
(-)a/circ/pendingreserves.pl (-2 / +3 lines)
Lines 202-208 my $strsth = Link Here
202
                    ORDER BY items.itemnumber SEPARATOR '|') l_copynumber,
202
                    ORDER BY items.itemnumber SEPARATOR '|') l_copynumber,
203
            GROUP_CONCAT(DISTINCT items.barcode
203
            GROUP_CONCAT(DISTINCT items.barcode
204
                    ORDER BY items.itemnumber SEPARATOR '|') l_barcode,
204
                    ORDER BY items.itemnumber SEPARATOR '|') l_barcode,
205
            reserves.reserve_group_id,
205
            reserves.hold_group_id,
206
            biblio.title,
206
            biblio.title,
207
            biblio.copyrightdate,
207
            biblio.copyrightdate,
208
            biblioitems.publicationyear,
208
            biblioitems.publicationyear,
Lines 252-257 $sth->execute(@query_params); Link Here
252
while ( my $data = $sth->fetchrow_hashref ) {
252
while ( my $data = $sth->fetchrow_hashref ) {
253
    push(
253
    push(
254
        @reservedata, {
254
        @reservedata, {
255
<<<<<<< HEAD
255
            reservedate      => $data->{l_reservedate},
256
            reservedate      => $data->{l_reservedate},
256
            firstname        => $data->{firstname} || '',
257
            firstname        => $data->{firstname} || '',
257
            surname          => $data->{surname},
258
            surname          => $data->{surname},
Lines 280-286 while ( my $data = $sth->fetchrow_hashref ) { Link Here
280
            homebranch       => $data->{homebranch},
281
            homebranch       => $data->{homebranch},
281
            itemnumber       => $data->{itemnumber},
282
            itemnumber       => $data->{itemnumber},
282
            publicationyear  => C4::Context->preference('marcflavour') eq "MARC21" ? $data->{copyrightdate} : $data->{publicationyear},
283
            publicationyear  => C4::Context->preference('marcflavour') eq "MARC21" ? $data->{copyrightdate} : $data->{publicationyear},
283
            reserve_group_id => $data->{reserve_group_id},
284
            hold_group_id    => $data->{hold_group_id},
284
        }
285
        }
285
    );
286
    );
286
}
287
}
(-)a/installer/data/mysql/atomicupdate/bug_15516.sql (-8 / +8 lines)
Lines 1-11 Link Here
1
DROP TABLE IF EXISTS reserve_group;
1
DROP TABLE IF EXISTS hold_group;
2
CREATE TABLE reserve_group (
2
CREATE TABLE hold_group (
3
  reserve_group_id int unsigned NOT NULL AUTO_INCREMENT,
3
  hold_group_id int unsigned NOT NULL AUTO_INCREMENT,
4
  PRIMARY KEY (reserve_group_id)
4
  PRIMARY KEY (hold_group_id)
5
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
5
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
6
6
7
ALTER TABLE reserves ADD COLUMN reserve_group_id int unsigned NULL DEFAULT NULL;
7
ALTER TABLE reserves ADD COLUMN hold_group_id int unsigned NULL DEFAULT NULL;
8
ALTER TABLE reserves ADD CONSTRAINT reserves_ibfk_6 FOREIGN KEY (reserve_group_id) REFERENCES reserve_group (reserve_group_id) ON DELETE SET NULL ON UPDATE CASCADE;
8
ALTER TABLE reserves ADD CONSTRAINT reserves_ibfk_6 FOREIGN KEY (hold_group_id) REFERENCES hold_group (hold_group_id) ON DELETE SET NULL ON UPDATE CASCADE;
9
9
10
ALTER TABLE old_reserves ADD COLUMN reserve_group_id int unsigned NULL DEFAULT NULL;
10
ALTER TABLE old_reserves ADD COLUMN hold_group_id int unsigned NULL DEFAULT NULL;
11
ALTER TABLE old_reserves ADD CONSTRAINT old_reserves_ibfk_5 FOREIGN KEY (reserve_group_id) REFERENCES reserve_group (reserve_group_id) ON DELETE SET NULL ON UPDATE CASCADE;
11
ALTER TABLE old_reserves ADD CONSTRAINT old_reserves_ibfk_5 FOREIGN KEY (hold_group_id) REFERENCES hold_group (hold_group_id) ON DELETE SET NULL ON UPDATE CASCADE;
(-)a/installer/data/mysql/kohastructure.sql (-15 / +16 lines)
Lines 1705-1711 CREATE TABLE `old_issues` ( -- lists items that were checked out and have been r Link Here
1705
  CONSTRAINT `old_issues_ibfk_2` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`)
1705
  CONSTRAINT `old_issues_ibfk_2` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`)
1706
    ON DELETE SET NULL ON UPDATE SET NULL,
1706
    ON DELETE SET NULL ON UPDATE SET NULL,
1707
  CONSTRAINT `old_issues_ibfk_borrowers_borrowernumber` FOREIGN KEY (`issuer_id`) REFERENCES `borrowers` (`borrowernumber`),
1707
  CONSTRAINT `old_issues_ibfk_borrowers_borrowernumber` FOREIGN KEY (`issuer_id`) REFERENCES `borrowers` (`borrowernumber`),
1708
  CONSTRAINT `old_reserves_ibfk_5` FOREIGN KEY (reserve_group_id) REFERENCES reserve_group (reserve_group_id)
1709
    ON DELETE SET NULL ON UPDATE CASCADE
1708
    ON DELETE SET NULL ON UPDATE CASCADE
1710
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
1709
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
1711
1710
Lines 1786-1791 CREATE TABLE `patronimage` ( -- information related to patron images Link Here
1786
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
1785
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
1787
1786
1788
--
1787
--
1788
-- Table structure for table hold_group
1789
--
1790
1791
DROP TABLE IF EXISTS `hold_group`;
1792
CREATE TABLE `hold_group` (
1793
  `hold_group_id` int unsigned NOT NULL AUTO_INCREMENT,
1794
  PRIMARY KEY(`hold_group_id`)
1795
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
1796
1797
--
1789
-- Table structure for table `reserves`
1798
-- Table structure for table `reserves`
1790
--
1799
--
1791
1800
Lines 1814-1820 CREATE TABLE `reserves` ( -- information related to holds/reserves in Koha Link Here
1814
  `itemtype` VARCHAR(10) NULL DEFAULT NULL, -- If record level hold, the optional itemtype of the item the patron is requesting
1823
  `itemtype` VARCHAR(10) NULL DEFAULT NULL, -- If record level hold, the optional itemtype of the item the patron is requesting
1815
  `item_level_hold` tinyint(1) NOT NULL DEFAULT 0, -- Is the hpld placed at item level
1824
  `item_level_hold` tinyint(1) NOT NULL DEFAULT 0, -- Is the hpld placed at item level
1816
  `non_priority` tinyint(1) NOT NULL DEFAULT 0, -- Is this a non priority hold
1825
  `non_priority` tinyint(1) NOT NULL DEFAULT 0, -- Is this a non priority hold
1817
  `reserve_group_id` int unsigned NULL DEFAULT NULL,  -- Id used on reservations spanning multiple titles
1826
  `hold_group_id` int unsigned NULL DEFAULT NULL,  -- Id used on reservations spanning multiple titles
1818
  PRIMARY KEY (`reserve_id`),
1827
  PRIMARY KEY (`reserve_id`),
1819
  KEY priorityfoundidx (priority,found),
1828
  KEY priorityfoundidx (priority,found),
1820
  KEY `borrowernumber` (`borrowernumber`),
1829
  KEY `borrowernumber` (`borrowernumber`),
Lines 1829-1845 CREATE TABLE `reserves` ( -- information related to holds/reserves in Koha Link Here
1829
  CONSTRAINT `reserves_ibfk_4` FOREIGN KEY (`branchcode`) REFERENCES `branches` (`branchcode`) ON DELETE CASCADE ON UPDATE CASCADE,
1838
  CONSTRAINT `reserves_ibfk_4` FOREIGN KEY (`branchcode`) REFERENCES `branches` (`branchcode`) ON DELETE CASCADE ON UPDATE CASCADE,
1830
  CONSTRAINT `reserves_ibfk_5` FOREIGN KEY (`itemtype`) REFERENCES `itemtypes` (`itemtype`) ON DELETE CASCADE ON UPDATE CASCADE,
1839
  CONSTRAINT `reserves_ibfk_5` FOREIGN KEY (`itemtype`) REFERENCES `itemtypes` (`itemtype`) ON DELETE CASCADE ON UPDATE CASCADE,
1831
  CONSTRAINT `reserves_ibfk_6` FOREIGN KEY (`desk_id`) REFERENCES `desks` (`desk_id`) ON DELETE SET NULL ON UPDATE CASCADE,
1840
  CONSTRAINT `reserves_ibfk_6` FOREIGN KEY (`desk_id`) REFERENCES `desks` (`desk_id`) ON DELETE SET NULL ON UPDATE CASCADE,
1832
  CONSTRAINT `reserves_ibfk_7` FOREIGN KEY (`reserve_group_id`) REFERENCES `reserve_group` (`reserve_group_id`) ON DELETE SET NULL ON UPDATE CASCADE
1841
  CONSTRAINT `reserves_ibfk_7` FOREIGN KEY (`hold_group_id`) REFERENCES `hold_group` (`hold_group_id`) ON DELETE SET NULL ON UPDATE CASCADE
1833
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
1834
1835
--
1836
-- Table structure for table reserve_group
1837
--
1838
1839
DROP TABLE IF EXISTS `reserve_group`;
1840
CREATE TABLE `reserve_group` (
1841
  `reserve_group_id` int unsigned NOT NULL AUTO_INCREMENT,
1842
  PRIMARY KEY(`reserve_group_id`)
1843
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
1842
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
1844
1843
1845
--
1844
--
Lines 1871-1877 CREATE TABLE `old_reserves` ( -- this table holds all holds/reserves that have b Link Here
1871
  `itemtype` VARCHAR(10) NULL DEFAULT NULL, -- If record level hold, the optional itemtype of the item the patron is requesting
1870
  `itemtype` VARCHAR(10) NULL DEFAULT NULL, -- If record level hold, the optional itemtype of the item the patron is requesting
1872
  `item_level_hold` tinyint(1) NOT NULL DEFAULT 0, -- Is the hpld placed at item level
1871
  `item_level_hold` tinyint(1) NOT NULL DEFAULT 0, -- Is the hpld placed at item level
1873
  `non_priority` tinyint(1) NOT NULL DEFAULT 0, -- Is this a non priority hold
1872
  `non_priority` tinyint(1) NOT NULL DEFAULT 0, -- Is this a non priority hold
1874
  `reserve_group_id` int unsigned NULL DEFAULT NULL,  -- The id of a group of titles reservations fulfilled when one title is picked
1873
  `hold_group_id` int unsigned NULL DEFAULT NULL,  -- The id of a group of titles reservations fulfilled when one title is picked
1875
  PRIMARY KEY (`reserve_id`),
1874
  PRIMARY KEY (`reserve_id`),
1876
  KEY `old_reserves_borrowernumber` (`borrowernumber`),
1875
  KEY `old_reserves_borrowernumber` (`borrowernumber`),
1877
  KEY `old_reserves_biblionumber` (`biblionumber`),
1876
  KEY `old_reserves_biblionumber` (`biblionumber`),
Lines 1885-1891 CREATE TABLE `old_reserves` ( -- this table holds all holds/reserves that have b Link Here
1885
  CONSTRAINT `old_reserves_ibfk_3` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`)
1884
  CONSTRAINT `old_reserves_ibfk_3` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`)
1886
    ON DELETE SET NULL ON UPDATE SET NULL,
1885
    ON DELETE SET NULL ON UPDATE SET NULL,
1887
  CONSTRAINT `old_reserves_ibfk_4` FOREIGN KEY (`itemtype`) REFERENCES `itemtypes` (`itemtype`)
1886
  CONSTRAINT `old_reserves_ibfk_4` FOREIGN KEY (`itemtype`) REFERENCES `itemtypes` (`itemtype`)
1888
    ON DELETE SET NULL ON UPDATE SET NULL
1887
    ON DELETE SET NULL ON UPDATE SET NULL,
1888
  CONSTRAINT `old_reserves_ibfk_5` FOREIGN KEY (hold_group_id) REFERENCES hold_group (hold_group_id)
1889
    ON DELETE SET NULL ON UPDATE CASCADE
1889
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
1890
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
1890
1891
1891
--
1892
--
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/hold-group-modal.inc (+16 lines)
Line 0 Link Here
1
<div id="hold-group-modal" class="modal hide" tabindex="-1" role="dialog" aria-labelledby="hold-group-modal-label" aria-hidden="true">
2
    <div class="modal-dialog" role="document">
3
        <div class="modal-content">
4
            <div class="modal-header">
5
                <button type="button" class="closebtn" data-dismiss="modal" aria-hidden="true">×</button>
6
                <h3 id="hold-group-modal-label">Hold group</h3>
7
            </div>
8
            <div class="modal-body">
9
                <div id="loading"> <img src="[% interface | html %]/[% theme | html %]/img/loading-small.gif" alt="" /> Loading </div>
10
            </div>
11
            <div class="modal-footer">
12
                <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
13
            </div>
14
        </div><!-- /.modal-content -->
15
    </div><!-- /.modal-dialog -->
16
</div><!-- /.modal -->
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/holds_table.inc (-2 / +2 lines)
Lines 177-184 Link Here
177
                [% IF hold.non_priority %]
177
                [% IF hold.non_priority %]
178
                    <br><i>Non priority hold</i>
178
                    <br><i>Non priority hold</i>
179
                [% END %]
179
                [% END %]
180
                [% IF hold.reserve_group_id %]
180
                [% IF hold.hold_group_id %]
181
                    <div>(part of a <a href="/cgi-bin/koha/reserve/reserve-group.pl?reserve_group_id=[% hold.reserve_group_id %]" class="reserve-group">reserve group</a>)</div>
181
                    <div>(part of a <a href="/cgi-bin/koha/reserve/hold-group.pl?hold_group_id=[% hold.hold_group_id | uri %]" class="hold-group">hold group</a>)</div>
182
                [% END %]
182
                [% END %]
183
            </td>
183
            </td>
184
184
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/reserve-group-modal.inc (-27 lines)
Lines 1-27 Link Here
1
<div id="reserve-group-modal" class="modal hide" tabindex="-1" role="dialog" aria-labelledby="reserve-group-modal-label" aria-hidden="true">
2
    <div class="modal-header">
3
        <button type="button" class="closebtn" data-dismiss="modal" aria-hidden="true">×</button>
4
        <h3 id="reserve-group-modal-label">Reserve group</h3>
5
    </div>
6
    <div class="modal-body">
7
        <div id="loading"> <img src="[% interface %]/[% theme %]/img/loading-small.gif" alt="" /> Loading </div>
8
    </div>
9
    <div class="modal-footer">
10
        <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
11
    </div>
12
</div>
13
14
<script>
15
  $(document).ready(function() {
16
    $('body').on('click', 'a.reserve-group', function() {
17
      var href = $(this).attr('href');
18
      $('#reserve-group-modal .modal-body').load(href + " #main");
19
      $('#reserve-group-modal').modal('show');
20
      return false;
21
    })
22
23
    $('#reserve-group-modal').on('hidden', function(){
24
        $('#reserve-group-modal .modal-body').html('<div id="loading"><img src="[% interface %]/[% theme %]/img/loading-small.gif" alt="" /> ' + _('Loading') + '</div>');
25
    });
26
  });
27
</script>
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt (-1 / +3 lines)
Lines 1066-1071 Link Here
1066
    </div> <!-- /.modal-dialog -->
1066
    </div> <!-- /.modal-dialog -->
1067
</div> <!-- /#barcodeSubmittedModal -->
1067
</div> <!-- /#barcodeSubmittedModal -->
1068
1068
1069
[% INCLUDE 'hold-group-modal.inc' %]
1070
1069
[% MACRO jsinclude BLOCK %]
1071
[% MACRO jsinclude BLOCK %]
1070
    [% INCLUDE 'calendar.inc' %]
1072
    [% INCLUDE 'calendar.inc' %]
1071
    [% INCLUDE 'datatables.inc' %]
1073
    [% INCLUDE 'datatables.inc' %]
Lines 1099-1104 Link Here
1099
    [% Asset.js("js/checkouts.js") | $raw %]
1101
    [% Asset.js("js/checkouts.js") | $raw %]
1100
    [% Asset.js("js/holds.js") | $raw %]
1102
    [% Asset.js("js/holds.js") | $raw %]
1101
    [% Asset.js("js/circ-patron-search-results.js") | $raw %]
1103
    [% Asset.js("js/circ-patron-search-results.js") | $raw %]
1104
    [% Asset.js("js/hold-group.js" | $raw %]
1102
    <script>
1105
    <script>
1103
        columns_settings_issues_table = [% TablesSettings.GetColumns( 'circ', 'circulation', 'issues-table', 'json' ) | $raw %]
1106
        columns_settings_issues_table = [% TablesSettings.GetColumns( 'circ', 'circulation', 'issues-table', 'json' ) | $raw %]
1104
        columns_settings_borrowers_table = [% TablesSettings.GetColumns( 'circ', 'circulation', 'table_borrowers', 'json' ) | $raw %]
1107
        columns_settings_borrowers_table = [% TablesSettings.GetColumns( 'circ', 'circulation', 'table_borrowers', 'json' ) | $raw %]
Lines 1190-1194 Link Here
1190
    [% Asset.js("js/members-menu.js") | $raw %]
1193
    [% Asset.js("js/members-menu.js") | $raw %]
1191
[% END %]
1194
[% END %]
1192
1195
1193
[% INCLUDE 'reserve-group-modal.inc' %]
1194
[% INCLUDE 'intranet-bottom.inc' %]
1196
[% INCLUDE 'intranet-bottom.inc' %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/pendingreserves.tt (-4 / +5 lines)
Lines 82-89 Link Here
82
                [% IF ( reserveloo.author ) %]<p> by [% reserveloo.author | html %]</p>[% END %]
82
                [% IF ( reserveloo.author ) %]<p> by [% reserveloo.author | html %]</p>[% END %]
83
                [% IF ( reserveloo.editionstatement ) %]<p>[% reserveloo.editionstatement | html %]</p>[% END %]
83
                [% IF ( reserveloo.editionstatement ) %]<p>[% reserveloo.editionstatement | html %]</p>[% END %]
84
                [% IF ( reserveloo.publicationyear ) %]<p>[% reserveloo.publicationyear | html %]</p>[% END %]
84
                [% IF ( reserveloo.publicationyear ) %]<p>[% reserveloo.publicationyear | html %]</p>[% END %]
85
                [% IF reserveloo.reserve_group_id %]
85
                [% IF reserveloo.hold_group_id %]
86
                    <p>(part of a <a class="reserve-group" href="/cgi-bin/koha/reserve/reserve-group.pl?reserve_group_id=[% reserveloo.reserve_group_id | html %]">reserve group</a>)</p>
86
                    <p>(part of a <a class="hold-group" href="/cgi-bin/koha/reserve/hold-group.pl?hold_group_id=[% reserveloo.hold_group_id | html %]">hold group</a>)</p>
87
                [% END %]
87
                [% END %]
88
            </td>
88
            </td>
89
        [% ELSE %]
89
        [% ELSE %]
Lines 265-274 Link Here
265
        </div> <!-- /.col-sm-2.col-sm-pull-10 -->
265
        </div> <!-- /.col-sm-2.col-sm-pull-10 -->
266
     </div> <!-- /.row -->
266
     </div> <!-- /.row -->
267
267
268
[% INCLUDE 'hold-group-modal.inc' %]
269
268
[% MACRO jsinclude BLOCK %]
270
[% MACRO jsinclude BLOCK %]
269
    [% INCLUDE 'calendar.inc' %]
271
    [% INCLUDE 'calendar.inc' %]
270
    [% INCLUDE 'datatables.inc' %]
272
    [% INCLUDE 'datatables.inc' %]
271
    [% INCLUDE 'columns_settings.inc' %]
273
    [% INCLUDE 'columns_settings.inc' %]
274
    [% Asset.js("js/hold-group.js") | $raw %]
272
    <script>
275
    <script>
273
        $(document).ready(function() {
276
        $(document).ready(function() {
274
          var columns_settings = [% TablesSettings.GetColumns('circ', 'holds', 'holds-to-pull', 'json') | $raw %];
277
          var columns_settings = [% TablesSettings.GetColumns('circ', 'holds', 'holds-to-pull', 'json') | $raw %];
Lines 327-332 Link Here
327
    </script>
330
    </script>
328
[% END %]
331
[% END %]
329
332
330
[%# TODO: this module needs to be separated to html and js part to be included correctly %]
331
[% INCLUDE 'reserve-group-modal.inc' %]
332
[% INCLUDE 'intranet-bottom.inc' %]
333
[% INCLUDE 'intranet-bottom.inc' %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt (-1 / +3 lines)
Lines 907-912 Link Here
907
            </div> <!-- /.col-sm-2.col-sm-pull-10 -->
907
            </div> <!-- /.col-sm-2.col-sm-pull-10 -->
908
        </div> <!-- /.row -->
908
        </div> <!-- /.row -->
909
909
910
[% INCLUDE 'hold-group-modal.inc' %]
911
910
[% MACRO jsinclude BLOCK %]
912
[% MACRO jsinclude BLOCK %]
911
    [% INCLUDE 'datatables.inc' %]
913
    [% INCLUDE 'datatables.inc' %]
912
    [% Asset.js("lib/jquery/plugins/rowGroup/dataTables.rowGroup.min.js") | $raw %]
914
    [% Asset.js("lib/jquery/plugins/rowGroup/dataTables.rowGroup.min.js") | $raw %]
Lines 942-947 Link Here
942
    [% INCLUDE 'str/members-menu.inc' %]
944
    [% INCLUDE 'str/members-menu.inc' %]
943
    [% Asset.js("js/members-menu.js") | $raw %]
945
    [% Asset.js("js/members-menu.js") | $raw %]
944
    [% Asset.js("js/messaging-preference-form.js") | $raw %]
946
    [% Asset.js("js/messaging-preference-form.js") | $raw %]
947
    [% Asset.js("js/hold-group.js") %]
945
    <script>
948
    <script>
946
949
947
        columns_settings_issues_table = [% TablesSettings.GetColumns( 'members', 'moremember', 'issues-table', 'json' ) | $raw %]
950
        columns_settings_issues_table = [% TablesSettings.GetColumns( 'members', 'moremember', 'issues-table', 'json' ) | $raw %]
Lines 1030-1034 Link Here
1030
    </script>
1033
    </script>
1031
[% END %]
1034
[% END %]
1032
1035
1033
[% INCLUDE 'reserve-group-modal.inc' %]
1034
[% INCLUDE 'intranet-bottom.inc' %]
1036
[% INCLUDE 'intranet-bottom.inc' %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/reserve-group.tt (-9 / +9 lines)
Lines 1-12 Link Here
1
[% USE Biblio %]
1
[% USE Biblio %]
2
[% INCLUDE 'doc-head-open.inc' %]
2
[% INCLUDE 'doc-head-open.inc' %]
3
  <title>Koha &rsaquo; Circulation &rsaquo; Holds &rsaquo; Holds group ([% reserve_group_id %])</title>
3
  <title>Koha &rsaquo; Circulation &rsaquo; Holds &rsaquo; Holds group ([% hold_group_id | html %])</title>
4
  [% INCLUDE 'doc-head-close.inc' %]
4
  [% INCLUDE 'doc-head-close.inc' %]
5
</head>
5
</head>
6
<body id="reserve-reserve-group">
6
<body id="hold.hold-group">
7
  <h1>Holds group ([% reserve_group_id %])</h1>
7
  <h1>Holds group ([% hold_group_id | html %])</h1>
8
  <div id="main">
8
  <div id="main">
9
    [% IF reserves.size %]
9
    [% IF holds.size %]
10
      <table>
10
      <table>
11
        <thead>
11
        <thead>
12
          <tr>
12
          <tr>
Lines 16-27 Link Here
16
          </tr>
16
          </tr>
17
        </thead>
17
        </thead>
18
        <tbody>
18
        <tbody>
19
          [% FOREACH reserve IN reserves %]
19
          [% FOREACH hold IN holds %]
20
            [% biblio = Biblio.Get(reserve.biblionumber) %]
20
            [% biblio = Biblio.Get(hold.biblionumber) %]
21
            <tr>
21
            <tr>
22
              <td><a href="/cgi-bin/koha/reserve/request.pl?biblionumber=[% biblio.biblionumber %]">[% biblio.title %]</a></td>
22
              <td><a href="/cgi-bin/koha/hold.request.pl?biblionumber=[% biblio.biblionumber | uri %]">[% biblio.title | html %]</a></td>
23
              <td>[% reserve.priority %]</td>
23
              <td>[% hold.priority | html %]</td>
24
              <td>[% reserve.reservenotes %]</td>
24
              <td>[% hold.reservenotes | html %]</td>
25
            </tr>
25
            </tr>
26
          [% END %]
26
          [% END %]
27
        </tbody>
27
        </tbody>
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt (-2 / +3 lines)
Lines 983-988 Link Here
983
        </div>
983
        </div>
984
    </div>
984
    </div>
985
985
986
[% INCLUDE 'hold-group-modal.inc' %]
987
986
[% MACRO jsinclude BLOCK %]
988
[% MACRO jsinclude BLOCK %]
987
    [% INCLUDE 'datatables.inc' %]
989
    [% INCLUDE 'datatables.inc' %]
988
    [% INCLUDE 'calendar.inc' %]
990
    [% INCLUDE 'calendar.inc' %]
Lines 990-995 Link Here
990
    [% Asset.js("lib/hc-sticky.js") | $raw %]
992
    [% Asset.js("lib/hc-sticky.js") | $raw %]
991
    [% Asset.js("js/circ-patron-search-results.js") | $raw %]
993
    [% Asset.js("js/circ-patron-search-results.js") | $raw %]
992
    [% Asset.js("js/holds.js") | $raw %]
994
    [% Asset.js("js/holds.js") | $raw %]
995
    [% Asset.js("js/hold-group.js") | $raw %]
993
    <script>
996
    <script>
994
        var Sticky;
997
        var Sticky;
995
        var biblionumber = "[% biblionumber | $raw %]";
998
        var biblionumber = "[% biblionumber | $raw %]";
Lines 1355-1360 Link Here
1355
    </script>
1358
    </script>
1356
[% END %]
1359
[% END %]
1357
1360
1358
[% INCLUDE 'reserve-group-modal.inc' %]
1359
1360
[% INCLUDE 'intranet-bottom.inc' %]
1361
[% INCLUDE 'intranet-bottom.inc' %]
(-)a/koha-tmpl/intranet-tmpl/prog/js/hold-group.js (+12 lines)
Line 0 Link Here
1
$(document).ready(function() {
2
    $('body').on('click', 'a.hold-group', function() {
3
        var href = $(this).attr('href');
4
        $('#hold-group-modal .modal-body').load(href + " #main");
5
        $('#hold-group-modal').modal('show');
6
        return false;
7
    });
8
9
    $('#hold-group-modal').on('hidden', function(){
10
        $('#hold-group-modal .modal-body').html('<div id="loading"><img src="[% interface %]/[% theme %]/img/loading-small.gif" alt="" /> ' + __("Loading") + '</div>');
11
    });
12
});
(-)a/koha-tmpl/intranet-tmpl/prog/js/holds.js (-3 / +3 lines)
Lines 50-59 $(document).ready(function() { Link Here
50
                                title += " - <span class='" + span_class + "'>" + oObj.itemnotes.escapeHtml() + "</span>"
50
                                title += " - <span class='" + span_class + "'>" + oObj.itemnotes.escapeHtml() + "</span>"
51
                            }
51
                            }
52
52
53
                            if (oObj.reserve_group_id) {
53
                            if (oObj.hold_group_id) {
54
                              title += '<br>';
54
                              title += '<br>';
55
                              var link = '<a class="reserve-group" href="/cgi-bin/koha/reserve/reserve-group.pl?reserve_group_id=' + oObj.reserve_group_id + '">' + RESERVE_GROUP +'</a>'
55
                              var link = '<a class="hold-group" href="/cgi-bin/koha/reserve/hold-group.pl?hold_group_id=' + oObj.hold_group_id + '">' + __("part of a hold group") +'</a>'
56
                              title += '<span>' + PART_OF_A.format(link) + '</span>';
56
                              title += '<span>(' + link + ')</span>';
57
                            }
57
                            }
58
58
59
                            return title;
59
                            return title;
(-)a/reserve/reserve-group.pl (-5 / +5 lines)
Lines 24-42 use C4::Reserves; Link Here
24
24
25
my $cgi = new CGI;
25
my $cgi = new CGI;
26
my ($template, $loggedinuser, $cookie) = get_template_and_user({
26
my ($template, $loggedinuser, $cookie) = get_template_and_user({
27
    template_name   => "reserve/reserve-group.tt",
27
    template_name   => "reserve/hold-group.tt",
28
    query           => $cgi,
28
    query           => $cgi,
29
    type            => "intranet",
29
    type            => "intranet",
30
    authnotrequired => 0,
30
    authnotrequired => 0,
31
    flagsrequired   => { circulate => 'circulate_remaining_permissions' },
31
    flagsrequired   => { circulate => 'circulate_remaining_permissions' },
32
});
32
});
33
33
34
my $reserve_group_id = $cgi->param('reserve_group_id');
34
my $hold_group_id = $cgi->param('hold_group_id');
35
my @reserves = GetReserveGroupReserves($reserve_group_id);
35
my @holds = GetHoldGroupHolds($hold_group_id);
36
36
37
$template->param(
37
$template->param(
38
    reserve_group_id => $reserve_group_id,
38
    hold_group_id => $hold_group_id,
39
    reserves => \@reserves,
39
    holds => \@holds,
40
);
40
);
41
41
42
output_html_with_http_headers $cgi, $cookie, $template->output;
42
output_html_with_http_headers $cgi, $cookie, $template->output;
(-)a/reserve/placerequest.pl (-2 / +2 lines)
Lines 77-85 my $found; Link Here
77
77
78
if ( $type eq 'str8' && $borrower ) {
78
if ( $type eq 'str8' && $borrower ) {
79
79
80
    my $reserve_group_id;
80
    my $hold_group_id;
81
    if ($multi_hold && $requestany) {
81
    if ($multi_hold && $requestany) {
82
        $reserve_group_id = AddReserveGroup();
82
        $hold_group_id = AddHoldGroup();
83
    }
83
    }
84
84
85
    foreach my $biblionumber ( keys %bibinfos ) {
85
    foreach my $biblionumber ( keys %bibinfos ) {
(-)a/reserve/request.pl (-1 / +1 lines)
Lines 690-696 foreach my $biblionumber (@biblionumbers) { Link Here
690
        $reserve{branchcode}       = $res->branchcode();
690
        $reserve{branchcode}       = $res->branchcode();
691
        $reserve{non_priority}     = $res->non_priority();
691
        $reserve{non_priority}     = $res->non_priority();
692
        $reserve{object}           = $res;
692
        $reserve{object}           = $res;
693
        $reserve{'reserve_group_id'} = $res->reserve_group_id;
693
        $reserve{'hold_group_id'}  = $res->hold_group_id;
694
694
695
        push( @reserveloop, \%reserve );
695
        push( @reserveloop, \%reserve );
696
    }
696
    }
(-)a/svc/holds (-1 / +1 lines)
Lines 114-120 while ( my $h = $holds_rs->next() ) { Link Here
114
        waiting_here   => $h->branch()->branchcode() eq $branch,
114
        waiting_here   => $h->branch()->branchcode() eq $branch,
115
        priority       => $h->priority(),
115
        priority       => $h->priority(),
116
        itemtype_limit => $itemtype_limit,
116
        itemtype_limit => $itemtype_limit,
117
        reserve_group_id => $h->reserve_group_id,
117
        hold_group_id => $h->hold_group_id,
118
        reservedate_formatted => $h->reservedate() ? output_pref(
118
        reservedate_formatted => $h->reservedate() ? output_pref(
119
            { dt => dt_from_string( $h->reservedate() ), dateonly => 1 }
119
            { dt => dt_from_string( $h->reservedate() ), dateonly => 1 }
120
          )
120
          )
(-)a/t/db_dependent/Reserves/HoldCount.t (-12 / +11 lines)
Lines 50-56 my $biblio = $builder->build( { source => 'Biblio', } ); Link Here
50
my $biblionumber = $biblio->{biblionumber};
50
my $biblionumber = $biblio->{biblionumber};
51
51
52
# Use AddReserve instead of TestBuilder because i don't manage
52
# Use AddReserve instead of TestBuilder because i don't manage
53
# to make TestBuilder set reserve_group_id to null. Idea ?
53
# to make TestBuilder set hold_group_id to null. Idea ?
54
my $reserve_id = AddReserve($branchcode, $borrowernumber,
54
my $reserve_id = AddReserve($branchcode, $borrowernumber,
55
$biblionumber, $biblionumber, 1, undef, undef, undef
55
$biblionumber, $biblionumber, 1, undef, undef, undef
56
$biblio->{title}, undef, undef, undef);
56
$biblio->{title}, undef, undef, undef);
Lines 58-66 $biblio->{title}, undef, undef, undef); Link Here
58
is(GetHoldCount($borrowernumber), 1, 'Test borrower has 1 reserve.');
58
is(GetHoldCount($borrowernumber), 1, 'Test borrower has 1 reserve.');
59
59
60
my $reserves_group = $builder->build({
60
my $reserves_group = $builder->build({
61
    source => 'ReserveGroup',
61
    source => 'HoldGroup',
62
    value => {
62
    value => {
63
        reserve_group_id => 1
63
        hold_group_id => 1
64
    }
64
    }
65
});
65
});
66
66
Lines 68-113 my $reserve2 = $builder->build({ Link Here
68
    source => 'Reserve',
68
    source => 'Reserve',
69
    value => {
69
    value => {
70
        borrowernumber => $borrowernumber,
70
        borrowernumber => $borrowernumber,
71
        reserve_group_id => 1
71
        hold_group_id => 1
72
    }
72
    }
73
});
73
});
74
my $reserve3 = $builder->build({
74
my $reserve3 = $builder->build({
75
    source => 'Reserve',
75
    source => 'Reserve',
76
    value => {
76
    value => {
77
        borrowernumber => $borrowernumber,
77
        borrowernumber => $borrowernumber,
78
        reserve_group_id => 1
78
        hold_group_id => 1
79
    }
79
    }
80
});
80
});
81
81
82
is(GetHoldCount($borrowernumber), 2, 'Test borrower has 2 reserve.');
82
is(GetHoldCount($borrowernumber), 2, 'Test borrower has 2 reserve.');
83
83
84
my $reserves_group2 = $builder->build({
84
my $reserves_group2 = $builder->build({
85
    source => 'ReserveGroup',
85
    source => 'HoldGroup',
86
    value => {
86
    value => {
87
        reserve_group_id => 2
87
        hold_group_id => 2
88
    }
88
    }
89
});
89
});
90
my $reserve_group_id2 = $reserves_group2->{reserve_group_id};
90
my $hold_group_id2 = $reserves_group2->{hold_group_id};
91
91
92
my $reserve4 = $builder->build({
92
my $reserve4 = $builder->build({
93
    source => 'Reserve',
93
    source => 'Reserve',
94
    value => {
94
    value => {
95
        borrowernumber => $borrowernumber,
95
        borrowernumber => $borrowernumber,
96
        reserve_group_id => 2
96
        hold_group_id => 2
97
    }
97
    }
98
});
98
});
99
my $reserve5 = $builder->build({
99
my $reserve5 = $builder->build({
100
    source => 'Reserve',
100
    source => 'Reserve',
101
    value => {
101
    value => {
102
        borrowernumber => $borrowernumber,
102
        borrowernumber => $borrowernumber,
103
        reserve_group_id => 2
103
        hold_group_id => 2
104
    }
104
    }
105
});
105
});
106
my $reserve6 = $builder->build({
106
my $reserve6 = $builder->build({
107
    source => 'Reserve',
107
    source => 'Reserve',
108
    value => {
108
    value => {
109
        borrowernumber => $borrowernumber,
109
        borrowernumber => $borrowernumber,
110
        reserve_group_id => 2
110
        hold_group_id => 2
111
    }
111
    }
112
});
112
});
113
113
114
- 

Return to bug 15516