Title | +Priority | +Notes | +
---|---|---|
[% biblio.title %] | +[% reserve.priority %] | +[% reserve.reservenotes %] | +
@@ -, +, @@
of titles
--- a/C4/Reserves.pm
+++ a/C4/Reserves.pm
@@ -139,6 +139,10 @@ BEGIN {
IsItemOnHoldAndFound
GetMaxPatronHoldsForRecord
+
+ &AddReserveGroup
+ &DeleteReserveGroup
+ &GetReserveGroupReserves
);
@EXPORT_OK = qw( MergeHolds );
}
@@ -164,7 +168,8 @@ sub AddReserve {
my (
$branch, $borrowernumber, $biblionumber, $bibitems,
$priority, $resdate, $expdate, $notes,
- $title, $checkitem, $found, $itemtype
+ $title, $checkitem, $found, $itemtype,
+ $reserve_group_id
) = @_;
$resdate = output_pref( { str => dt_from_string( $resdate ), dateonly => 1, dateformat => 'iso' })
@@ -212,6 +217,7 @@ sub AddReserve {
waitingdate => $waitingdate,
expirationdate => $expdate,
itemtype => $itemtype,
+ reserve_group_id => $reserve_group_id,
}
)->store();
$hold->set_waiting() if $found eq 'W';
@@ -1066,6 +1072,16 @@ sub ModReserveAffect {
$hold->itemnumber($itemnumber);
$hold->set_waiting($transferToDo);
+ if ($hold->reserve_group_id) {
+ # Delete other reserves from same group
+ $dbh->do(q{
+ DELETE FROM reserves
+ WHERE reserve_group_id = ?
+ AND reserve_id != ?
+ }, undef, $hold->reserve_group_id, $hold->reserve_id);
+ DeleteReserveGroup($hold->reserve_group_id);
+ }
+
_koha_notify_reserve( $hold->reserve_id )
if ( !$transferToDo && !$already_on_shelf );
@@ -2152,6 +2168,60 @@ sub GetHoldRule {
return $sth->fetchrow_hashref();
}
+=head2 AddReserveGroup
+
+ my $reserve_group_id = AddReserveGroup();
+
+Creates a new reserve group and returns its ID
+
+=cut
+
+sub AddReserveGroup {
+ my $dbh = C4::Context->dbh;
+
+ $dbh->do('INSERT INTO reserve_group VALUES ()');
+ return $dbh->last_insert_id(undef, undef, 'reserve_group', undef);
+}
+
+=head2 DeleteReserveGroup
+
+ DeleteReserveGroup($reserve_group_id);
+
+Delete a reserve group. Reserves that belong to this group are not removed.
+
+=cut
+
+sub DeleteReserveGroup {
+ my ($reserve_group_id) = @_;
+
+ my $dbh = C4::Context->dbh;
+ my $query = 'DELETE FROM reserve_group WHERE reserve_group_id = ?';
+ $dbh->do($query, undef, $reserve_group_id);
+}
+
+=head2 GetReserveGroupReserves
+
+ my @reserves = GetReserveGroupReserves($reserve_group_id);
+
+Fetch all reserve from a reserve group.
+
+=cut
+
+sub GetReserveGroupReserves {
+ my ($reserve_group_id) = @_;
+
+ my $dbh = C4::Context->dbh;
+
+ my $reserves = $dbh->selectall_arrayref(q{
+ SELECT * FROM reserves
+ WHERE reserve_group_id = ?
+ }, { Slice => {} }, $reserve_group_id);
+
+ return () unless defined $reserves;
+
+ return @$reserves;
+}
+
=head1 AUTHOR
Koha Development Team
') l_enumchron,
GROUP_CONCAT(DISTINCT items.copynumber
ORDER BY items.itemnumber SEPARATOR '
') l_copynumber,
+ reserves.reserve_group_id,
biblio.title,
biblio.author,
count(DISTINCT items.itemnumber) as icount,
@@ -263,6 +264,7 @@ while ( my $data = $sth->fetchrow_hashref ) {
holdingbranch => $data->{holdingbranch},
homebranch => $data->{homebranch},
itemnumber => $data->{itemnumber},
+ reserve_group_id => $data->{reserve_group_id},
}
);
}
--- a/installer/data/mysql/atomicupdate/bug_15516.sql
+++ a/installer/data/mysql/atomicupdate/bug_15516.sql
@@ -0,0 +1,8 @@
+DROP TABLE IF EXISTS reserve_group;
+CREATE TABLE reserve_group (
+ reserve_group_id int unsigned NOT NULL AUTO_INCREMENT,
+ PRIMARY KEY (reserve_group_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
+
+ALTER TABLE reserves ADD COLUMN reserve_group_id int unsigned NULL DEFAULT NULL;
+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;
--- a/installer/data/mysql/kohastructure.sql
+++ a/installer/data/mysql/kohastructure.sql
@@ -1894,6 +1894,7 @@ CREATE TABLE `reserves` ( -- information related to holds/reserves in Koha
`suspend` BOOLEAN NOT NULL DEFAULT 0,
`suspend_until` DATETIME NULL DEFAULT NULL,
`itemtype` VARCHAR(10) NULL DEFAULT NULL, -- If record level hold, the optional itemtype of the item the patron is requesting
+ `reserve_group_id` int unsigned NULL DEFAULT NULL, -- Id used on reservations spanning multiple titles
PRIMARY KEY (`reserve_id`),
KEY priorityfoundidx (priority,found),
KEY `borrowernumber` (`borrowernumber`),
@@ -1905,7 +1906,18 @@ CREATE TABLE `reserves` ( -- information related to holds/reserves in Koha
CONSTRAINT `reserves_ibfk_2` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `reserves_ibfk_3` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `reserves_ibfk_4` FOREIGN KEY (`branchcode`) REFERENCES `branches` (`branchcode`) ON DELETE CASCADE ON UPDATE CASCADE,
- CONSTRAINT `reserves_ibfk_5` FOREIGN KEY (`itemtype`) REFERENCES `itemtypes` (`itemtype`) ON DELETE CASCADE ON UPDATE CASCADE
+ CONSTRAINT `reserves_ibfk_5` FOREIGN KEY (`itemtype`) REFERENCES `itemtypes` (`itemtype`) ON DELETE CASCADE ON UPDATE CASCADE,
+ CONSTRAINT `reserves_ibfk_6` FOREIGN KEY (`reserve_group_id`) REFERENCES `reserve_group` (`reserve_group_id`) ON DELETE SET NULL ON UPDATE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+--
+-- Table structure for table reserve_group
+--
+
+DROP TABLE IF EXISTS `reserve_group`;
+CREATE TABLE `reserve_group` (
+ `reserve_group_id` int unsigned NOT NULL AUTO_INCREMENT,
+ PRIMARY KEY(`reserve_group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
--- a/koha-tmpl/intranet-tmpl/prog/en/includes/holds_table.inc
+++ a/koha-tmpl/intranet-tmpl/prog/en/includes/holds_table.inc
@@ -157,6 +157,9 @@
[% END %]
[% END %]
+ [% IF hold.reserve_group_id %]
+
by [% reserveloo.author | html %]
[% END %] + [% IF reserveloo.reserve_group_id %] +(part of a reserve group)
+ [% END %] [% ELSE %]Title | +Priority | +Notes | +
---|---|---|
[% biblio.title %] | +[% reserve.priority %] | +[% reserve.reservenotes %] | +