From eaa76fbad57b1db034f52f24a3ded3d96dd0b7b8 Mon Sep 17 00:00:00 2001 From: Thibaud Guillot Date: Thu, 25 Jan 2024 14:14:07 +0100 Subject: [PATCH] Bug 35906: Add bookable option on itemtype MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Actually new "booking" feature can be set on an item but no directly on an itemtype. This patch adds this possibility. Test plan: 1) Test this new feature on an item as it were currently working. 2) Apply this patch 3) Run updatedatabase.pl 4) Reload Schema by running update_dbix_class_files.pl 5) Change new syspref 'item-level_booking' to 'itemtype' 6) Edit an itemtype, there is a new checkbox to add 'bookable' option 7) Test it with item with this itemtype, if there is 1 item at least you will see 'Booking' tab. 8) You can change syspref to 'item' to see the current behavior Note: When item-level_booking is set on 'itemtype' you can change dropdown option to 'No' on item bookable option. Sponsored by: Association de Gestion des Ĺ’uvres Sociales d'Inria (AGOS) --- 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 diff --git a/Koha/Biblio.pm b/Koha/Biblio.pm index 7d0b244085..eb844ceec9 100644 --- a/Koha/Biblio.pm +++ b/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; 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 4089068b34..aa89d87d9a 100644 --- a/Koha/Items.pm +++ b/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); } diff --git a/Koha/REST/V1/Biblios.pm b/Koha/REST/V1/Biblios.pm index 846a0fb94d..ffc1ad553a 100644 --- a/Koha/REST/V1/Biblios.pm +++ b/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, diff --git a/Koha/Template/Plugin/Biblio.pm b/Koha/Template/Plugin/Biblio.pm index 79c7284292..35ae21fe77 100644 --- a/Koha/Template/Plugin/Biblio.pm +++ b/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 { diff --git a/admin/itemtypes.pl b/admin/itemtypes.pl index 44e9ad5445..ed13f33cab 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 16310f0f44..dd2a610700 100644 --- a/installer/data/mysql/kohastructure.sql +++ b/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`), diff --git a/installer/data/mysql/mandatory/sysprefs.sql b/installer/data/mysql/mandatory/sysprefs.sql index 669074aa50..9e96d47ba6 100644 --- a/installer/data/mysql/mandatory/sysprefs.sql +++ b/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'), 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 a4fe06ec16..39b3b5679f 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/itemtypes.tt +++ b/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 %] +
  • + + [% IF itemtype.bookable %] + + [% ELSE %] + + [% END %] + If checked, all items of this type will be enabled for future bookings. +
  • + [% END %]
  • diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref index 080e8fa494..68b312a415 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref @@ -1008,6 +1008,13 @@ Circulation: 0: "Don't allow" - holds to be automatically filled after being automatically checked in. - '
    NOTE: This system preference requires the 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 diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tt index 0f00e7b873..fb6ff3e917 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tt @@ -347,14 +347,16 @@
  • - Bookable: + + Bookable: + [% IF ( CAN_user_circulate ) %]
    - + [% IF ITEM_DAT.bookable == 1 || ITEM_DAT.effective_itemtype.bookable == 1 %] [% ELSE %] -- 2.30.2