@@ -, +, @@
will see 'Booking' tab.
---
Koha/Biblio.pm | 2 +-
Koha/ItemType.pm | 1 +
Koha/Items.pm | 5 ++++-
Koha/REST/V1/Biblios.pm | 3 +++
Koha/Template/Plugin/Biblio.pm | 6 +++++-
admin/itemtypes.pl | 3 +++
.../Bug_35906_add-column-bookable-itemtype.pl | 21 +++++++++++++++++++
installer/data/mysql/kohastructure.sql | 1 +
installer/data/mysql/mandatory/sysprefs.sql | 1 +
.../prog/en/modules/admin/itemtypes.tt | 11 ++++++++++
.../admin/preferences/circulation.pref | 7 +++++++
.../prog/en/modules/catalogue/moredetail.tt | 8 ++++---
12 files changed, 63 insertions(+), 6 deletions(-)
create mode 100644 installer/data/mysql/atomicupdate/Bug_35906_add-column-bookable-itemtype.pl
--- a/Koha/Biblio.pm
+++ a/Koha/Biblio.pm
@@ -238,7 +238,7 @@ sub check_booking {
my $end_date = dt_from_string( $params->{end_date} );
my $booking_id = $params->{booking_id};
- my $bookable_items = $self->bookable_items;
+ my $bookable_items = $self->bookable_items;
my $total_bookable = $bookable_items->count;
my $dtf = Koha::Database->new->schema->storage->datetime_parser;
--- a/Koha/ItemType.pm
+++ a/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',
};
}
--- a/Koha/Items.pm
+++ a/Koha/Items.pm
@@ -169,7 +169,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);
}
--- a/Koha/REST/V1/Biblios.pm
+++ a/Koha/REST/V1/Biblios.pm
@@ -290,6 +290,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');
+
unless ($biblio) {
return $c->render(
status => 404,
--- a/Koha/Template/Plugin/Biblio.pm
+++ a/Koha/Template/Plugin/Biblio.pm
@@ -73,7 +73,11 @@ sub CanBook {
my $biblio = Koha::Biblios->find($biblionumber);
return 0 unless $biblio;
- return $biblio->bookable_items->count ? 1 : 0;
+ my $biblio_itemtype = Koha::ItemTypes->find($biblio->itemtype);
+ my $bookable_itemtype = $biblio_itemtype->bookable;
+
+ return 1 if ( $bookable_itemtype && $biblio->items->count == 1 && C4::Context->preference('item-level_booking') == 0 );
+ return $biblio->bookable_items->count && C4::Context->preference('item-level_booking') == 1 ? 1 : 0;
}
sub BookingsCount {
--- a/admin/itemtypes.pl
+++ a/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 {
--- a/installer/data/mysql/atomicupdate/Bug_35906_add-column-bookable-itemtype.pl
+++ a/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'";
+ },
+};
--- a/installer/data/mysql/kohastructure.sql
+++ a/installer/data/mysql/kohastructure.sql
@@ -4123,6 +4123,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`),
--- a/installer/data/mysql/mandatory/sysprefs.sql
+++ a/installer/data/mysql/mandatory/sysprefs.sql
@@ -345,6 +345,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'),
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/itemtypes.tt
+++ a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/itemtypes.tt
@@ -257,6 +257,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 %]
+
misc/cronjobs/automatic_checkin.pl
cronjob. Ask your system administrator to schedule it.'
+ -
+ - Use the type of the
+ - pref: item-level_booking
+ choices:
+ 1: item
+ 0: itemtype
+ - level to defined witch items can be bookable in future.
Patron restrictions:
-
- pref: PatronRestrictionTypes
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tt
+++ a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tt
@@ -347,14 +347,16 @@