From 7dac9eb7b5bc415163a40e057fb4a4ff87428d63 Mon Sep 17 00:00:00 2001 From: Aleisha Amohia Date: Tue, 7 Sep 2021 15:22:25 +1200 Subject: [PATCH] Bug 6796: Add library_hours table and set opening hours for library Sponsored-by: Catalyst IT Signed-off-by: Sam Lau Signed-off-by: Martin Renvoize Signed-off-by: Katrin Fischer --- Koha/Library/Hour.pm | 51 +++++++++++++ Koha/Library/Hours.pm | 56 ++++++++++++++ admin/branches.pl | 34 +++++++++ .../bug_6796_-_add_library_hours_table.pl | 35 +++++++++ installer/data/mysql/kohastructure.sql | 13 ++++ .../prog/en/modules/admin/branches.tt | 74 ++++++++++++++++++- 6 files changed, 262 insertions(+), 1 deletion(-) create mode 100644 Koha/Library/Hour.pm create mode 100644 Koha/Library/Hours.pm create mode 100755 installer/data/mysql/atomicupdate/bug_6796_-_add_library_hours_table.pl diff --git a/Koha/Library/Hour.pm b/Koha/Library/Hour.pm new file mode 100644 index 0000000000..bc8f4a0478 --- /dev/null +++ b/Koha/Library/Hour.pm @@ -0,0 +1,51 @@ +package Koha::Library::Hour; + +# Copyright 2021 Aleisha Amohia +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . + +use Modern::Perl; + +use Koha::Database; + +use base qw(Koha::Object); + +=head1 NAME + +Koha::Library::Hour - Koha Library Hour Object class + +=head1 SYNOPSIS + +use Koha::Library::Hour; + +=head1 DESCRIPTION + +Describes the open time and close time for a library on a given day of the week. + +=head1 FUNCTIONS + +=head2 Class Methods + +=head3 _type + +Return type of Object relating to Schema Resultset + +=cut + +sub _type { + return 'LibraryHour'; +} + +1; diff --git a/Koha/Library/Hours.pm b/Koha/Library/Hours.pm new file mode 100644 index 0000000000..42c0db5885 --- /dev/null +++ b/Koha/Library/Hours.pm @@ -0,0 +1,56 @@ +package Koha::Library::Hours; + +# Copyright 2021 Aleisha Amohia +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . + +use Modern::Perl; + +use Koha::Database; +use Koha::Library::Hour; + +use base qw(Koha::Objects); + +=head1 NAME + +Koha::Library::Hours - Koha Library Hours Object set class + +=head1 API + +=head2 Class Methods + +=cut + +=head3 _type + +Return type of object, relating to Schema Resultset + +=cut + +sub _type { + return 'LibraryHour'; +} + +=head3 object_class + +Return object class + +=cut + +sub object_class { + return 'Koha::Library::Hour'; +} + +1; diff --git a/admin/branches.pl b/admin/branches.pl index 7a6429b08f..21de53802f 100755 --- a/admin/branches.pl +++ b/admin/branches.pl @@ -33,6 +33,7 @@ use Koha::Patrons; use Koha::Items; use Koha::Libraries; use Koha::SMTP::Servers; +use Koha::Library::Hours; my $input = CGI->new; my $branchcode = $input->param('branchcode'); @@ -49,9 +50,12 @@ my ( $template, $borrowernumber, $cookie ) = get_template_and_user( ); if ( $op eq 'add_form' ) { + my @opening_hours = Koha::Library::Hours->search({ library_id => $branchcode }, { order_by => { -asc => 'day' } })->as_list; + $template->param( library => Koha::Libraries->find($branchcode), smtp_servers => Koha::SMTP::Servers->search, + opening_hours => \@opening_hours ); } elsif ( $branchcode && $op eq 'view' ) { my $library = Koha::Libraries->find($branchcode); @@ -116,6 +120,21 @@ if ( $op eq 'add_form' ) { } } + my @days = $input->multi_param("day"); + my @open_times = $input->multi_param("open_time"); + my @close_times = $input->multi_param("close_time"); + + foreach my $day ( @days ) { + if ( $open_times[$day] and $open_times[$day] eq '' ) { + $open_times[$day] = undef; + } + if ( $close_times[$day] and $close_times[$day] eq '' ) { + $close_times[$day] = undef; + } + + my $openday = Koha::Library::Hours->find({ library_id => $branchcode, day => $day })->update({ open_time => $open_times[$day], close_time => $close_times[$day] }); + } + push @messages, { type => 'message', code => 'success_on_update' }; } ); @@ -154,6 +173,21 @@ if ( $op eq 'add_form' ) { } } + my @days = $input->multi_param("day"); + my @open_times = $input->multi_param("open_time"); + my @close_times = $input->multi_param("close_time"); + + foreach my $day ( @days ) { + if ( $open_times[$day] and $open_times[$day] eq '' ) { + $open_times[$day] = undef; + } + if ( $close_times[$day] and $close_times[$day] eq '' ) { + $close_times[$day] = undef; + } + + my $openday = Koha::Library::Hour->new({ library_id => $branchcode, day => $day, open_time => $open_times[$day], close_time => $close_times[$day] })->store; + } + push @messages, { type => 'message', code => 'success_on_insert' }; } ); diff --git a/installer/data/mysql/atomicupdate/bug_6796_-_add_library_hours_table.pl b/installer/data/mysql/atomicupdate/bug_6796_-_add_library_hours_table.pl new file mode 100755 index 0000000000..f3a506c806 --- /dev/null +++ b/installer/data/mysql/atomicupdate/bug_6796_-_add_library_hours_table.pl @@ -0,0 +1,35 @@ +use Modern::Perl; + +return { + bug_number => "6796", + description => "Overnight checkouts taking into account opening and closing hours", + up => sub { + my ($args) = @_; + my ( $dbh, $out ) = @$args{qw(dbh out)}; + + unless ( TableExists('library_hours') ) { + $dbh->do( + q{ + CREATE TABLE library_hours ( + library_id varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL, + day enum('0','1','2','3','4','5','6') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0', + open_time time COLLATE utf8mb4_unicode_ci DEFAULT NULL, + close_time time COLLATE utf8mb4_unicode_ci DEFAULT NULL, + PRIMARY KEY (library_id, day), + CONSTRAINT library_hours FOREIGN KEY (library_id) REFERENCES branches (branchcode) ON DELETE CASCADE ON UPDATE CASCADE + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + } + ); + + my @indexes = ( 0 .. 6 ); + for my $i (@indexes) { + $dbh->do( + q{ INSERT INTO library_hours (library_id, day) SELECT branchcode, ? FROM branches }, undef, + $i + ); + } + + say $out "Added table `library_hours`"; + } + }, +}; diff --git a/installer/data/mysql/kohastructure.sql b/installer/data/mysql/kohastructure.sql index 3828776962..e463e8d2f4 100644 --- a/installer/data/mysql/kohastructure.sql +++ b/installer/data/mysql/kohastructure.sql @@ -4270,6 +4270,19 @@ CREATE TABLE `letter` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; /*!40101 SET character_set_client = @saved_cs_client */; +-- +-- Table structure for table `library_hours` +-- +DROP TABLE IF EXISTS library_hours; +CREATE TABLE library_hours ( + library_id varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL, + day enum('0','1','2','3','4','5','6') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0', + open_time time COLLATE utf8mb4_unicode_ci DEFAULT NULL, + close_time time COLLATE utf8mb4_unicode_ci DEFAULT NULL, + PRIMARY KEY (library_id, day), + CONSTRAINT library_hours_ibfk_1 FOREIGN KEY (library_id) REFERENCES branches (branchcode) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + -- -- Table structure for table `library_groups` -- diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/branches.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/branches.tt index bd965d0acd..46f822fb23 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/branches.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/branches.tt @@ -290,6 +290,61 @@
Set to 'yes' to show this library as a search option and on the libraries page in the OPAC.
+
  • + + + + + + + + + + + [% IF opening_hours # Existing library %] + [% daycount = 0 %] + [% FOREACH hr IN opening_hours %] + + + + + + [% daycount = daycount+1 %] + [% END %] + [% ELSE # New library %] + [% FOREACH daycount IN [0..6] %] + + + + + + [% END %] + [% END %] + +
    DayOpen timeClose time
    + [% PROCESS dayname day=daycount %] + + + [% IF hr.day == daycount && hr.open_time %] + + [% ELSE %] + + [% END %] + + [% IF hr.day == daycount && hr.close_time %] + + [% ELSE %] + + [% END %] +
    + [% PROCESS dayname day=daycount %] + + + + + +
    +
  • @@ -306,7 +361,6 @@
  • -
    @@ -316,6 +370,24 @@ [% END %] +[% BLOCK dayname %] + [% IF day == 0 %] + Monday + [% ELSIF day == 1 %] + Tuesday + [% ELSIF day == 2 %] + Wednesday + [% ELSIF day == 3 %] + Thursday + [% ELSIF day == 4 %] + Friday + [% ELSIF day == 5 %] + Saturday + [% ELSE %] + Sunday + [% END %] +[% END %] + [% IF op == 'delete_confirm' and not ( items_count or patrons_count )%]
    -- 2.39.5