diff --git a/Koha/ItemType.pm b/Koha/ItemType.pm
index fb88518c25..f4c0c4aee9 100644
--- a/Koha/ItemType.pm
+++ b/Koha/ItemType.pm
@@ -234,6 +234,7 @@ sub to_api_mapping {
rentalcharge_daily_calendar => 'daily_rental_charge_calendar',
rentalcharge_hourly => 'hourly_rental_charge',
rentalcharge_hourly_calendar => 'hourly_rental_charge_calendar',
+ bookable_itemtype => 'bookable_itemtype',
};
}
diff --git a/Koha/Items.pm b/Koha/Items.pm
index f9467117cd..f026836417 100644
--- a/Koha/Items.pm
+++ b/Koha/Items.pm
@@ -197,7 +197,10 @@ Returns a new resultset, containing only those items that are allowed to be book
sub filter_by_bookable {
my ($self) = @_;
- my $params = { bookable => 1 };
+ my $params =
+ C4::Context->preference('item-level_booking') == 1
+ ? { bookable => 1 }
+ : { itype => { -in => \'SELECT itemtype FROM itemtypes WHERE bookable = 1' } };
return $self->search($params);
}
diff --git a/Koha/REST/V1/Biblios.pm b/Koha/REST/V1/Biblios.pm
index 1c15e8ec25..ae4d5d1c26 100644
--- a/Koha/REST/V1/Biblios.pm
+++ b/Koha/REST/V1/Biblios.pm
@@ -266,6 +266,9 @@ sub get_items {
my $biblio = Koha::Biblios->find( { biblionumber => $c->param('biblio_id') }, { prefetch => ['items'] } );
my $bookable_only = $c->param('bookable');
+ # Deletion of parameter to avoid filtering on the items table in the case of bookings on 'itemtype'
+ $c->req->params->remove('bookable');
+
return $c->render_resource_not_found("Bibliographic record")
unless $biblio;
diff --git a/admin/itemtypes.pl b/admin/itemtypes.pl
index 684f9377db..b5dbc7c98c 100755
--- a/admin/itemtypes.pl
+++ b/admin/itemtypes.pl
@@ -98,6 +98,7 @@ if ( $op eq 'add_form' ) {
my $rentalcharge_daily_calendar = $input->param('rentalcharge_daily_calendar') // 0;
my $rentalcharge_hourly_calendar = $input->param('rentalcharge_hourly_calendar') // 0;
my $automatic_checkin = $input->param('automatic_checkin') // 0;
+ my $bookable = $input->param('bookable')// 0;
if ( $itemtype and $is_a_modif ) { # it's a modification
$itemtype->description($description);
@@ -118,6 +119,7 @@ if ( $op eq 'add_form' ) {
$itemtype->rentalcharge_daily_calendar($rentalcharge_daily_calendar);
$itemtype->rentalcharge_hourly_calendar($rentalcharge_hourly_calendar);
$itemtype->automatic_checkin($automatic_checkin);
+ $itemtype->bookable($bookable);
eval {
$itemtype->store;
@@ -151,6 +153,7 @@ if ( $op eq 'add_form' ) {
rentalcharge_daily_calendar => $rentalcharge_daily_calendar,
rentalcharge_hourly_calendar => $rentalcharge_hourly_calendar,
automatic_checkin => $automatic_checkin,
+ bookable => $bookable,
}
);
eval {
diff --git a/installer/data/mysql/atomicupdate/Bug_35906_add-column-bookable-itemtype.pl b/installer/data/mysql/atomicupdate/Bug_35906_add-column-bookable-itemtype.pl
new file mode 100644
index 0000000000..642505fd2f
--- /dev/null
+++ b/installer/data/mysql/atomicupdate/Bug_35906_add-column-bookable-itemtype.pl
@@ -0,0 +1,21 @@
+use Modern::Perl;
+
+return {
+ bug_number => "35906",
+ description => "Add bookable column on itemtypes table",
+ up => sub {
+ my ($args) = @_;
+ my ( $dbh, $out ) = @$args{qw(dbh out)};
+
+ $dbh->do(q{
+ INSERT IGNORE INTO systempreferences (`variable`, `value`, `options`, `explanation`, `type`) VALUES ('item-level_booking', 1, '', 'enables item type level for future booking', 'YesNo');
+ });
+
+ $dbh->do(q{
+ ALTER TABLE itemtypes ADD IF NOT EXISTS bookable INT(1) DEFAULT 0
+ });
+
+ say $out "Added new system preference 'item-level_booking'";
+ say $out "Added column 'itemtypes.bookable'";
+ },
+};
diff --git a/installer/data/mysql/kohastructure.sql b/installer/data/mysql/kohastructure.sql
index 74c97bfa5d..78c526c46f 100644
--- a/installer/data/mysql/kohastructure.sql
+++ b/installer/data/mysql/kohastructure.sql
@@ -4143,6 +4143,7 @@ CREATE TABLE `itemtypes` (
`hideinopac` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'Hide the item type from the search options in OPAC',
`searchcategory` varchar(80) DEFAULT NULL COMMENT 'Group this item type with others with the same value on OPAC search options',
`automatic_checkin` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'If automatic checkin is enabled for items of this type',
+ `bookable` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'Activate bookable feature for items related to this item type',
PRIMARY KEY (`itemtype`),
UNIQUE KEY `itemtype` (`itemtype`),
KEY `itemtypes_ibfk_1` (`parent_type`),
diff --git a/installer/data/mysql/mandatory/sysprefs.sql b/installer/data/mysql/mandatory/sysprefs.sql
index ede74e6d3f..95997fbc4f 100644
--- a/installer/data/mysql/mandatory/sysprefs.sql
+++ b/installer/data/mysql/mandatory/sysprefs.sql
@@ -355,6 +355,7 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `
('IssueLostItem','alert','Defines what should be done when an attempt is made to issue an item that has been marked as lost.','alert|confirm|nothing','Choice'),
('IssuingInProcess','0',NULL,'If ON, disables fines if the patron is issuing item that accumulate debt','YesNo'),
('item-level_itypes','1','','If ON, enables Item-level Itemtype / Issuing Rules','YesNo'),
+('item-level_booking','1','','If ON, enables Item-level for future booking feature','YesNo'),
('itemBarcodeFallbackSearch','0',NULL,'If set, uses scanned item barcodes as a catalogue search if not found as barcodes','YesNo'),
('itemBarcodeInputFilter','','whitespace|T-prefix|cuecat|libsuite8|EAN13','If set, allows specification of a item barcode input filter','Choice'),
('itemcallnumber','',NULL,'The MARC field/subfield that is used to calculate the itemcallnumber (Dewey would be 082ab or 092ab; LOC would be 050ab or 090ab) could be 852hi from an item record','free'),
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/itemtypes.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/itemtypes.tt
index dfb27e10e9..df6772ceda 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/itemtypes.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/itemtypes.tt
@@ -258,6 +258,17 @@
[% END %]
If checked, items will be automatically checked in once they've reached their due date. This feature requires the misc/cronjobs/automatic_checkin.pl cronjob. Ask your system administrator to schedule it.
+ [% IF Koha.Preference('item-level_booking') == 0 %]
+