From be9d6c375906298d8b0c39ca6cda68596ca3c9b5 Mon Sep 17 00:00:00 2001
From: Aleisha Amohia <aleishaamohia@hotmail.com>
Date: Tue, 7 Sep 2021 15:22:25 +1200
Subject: [PATCH] Bug 6796: Add branch_hours table and set opening hours for
 library

---
 Koha/Library/Hour.pm                               | 43 +++++++++++++
 Koha/Library/Hours.pm                              | 52 +++++++++++++++
 admin/branches.pl                                  | 45 ++++++++++++-
 .../bug_6796_-_add_branch_hours_table.perl         | 20 ++++++
 installer/data/mysql/kohastructure.sql             | 16 +++++
 .../prog/en/modules/admin/branches.tt              | 73 ++++++++++++++++++++++
 6 files changed, 247 insertions(+), 2 deletions(-)
 create mode 100644 Koha/Library/Hour.pm
 create mode 100644 Koha/Library/Hours.pm
 create mode 100644 installer/data/mysql/atomicupdate/bug_6796_-_add_branch_hours_table.perl

diff --git a/Koha/Library/Hour.pm b/Koha/Library/Hour.pm
new file mode 100644
index 00000000000..1b77de07246
--- /dev/null
+++ b/Koha/Library/Hour.pm
@@ -0,0 +1,43 @@
+package Koha::Library::Hour;
+
+# Copyright 2021 Aleisha Amohia <aleisha@catalyst.net.nz>
+#
+# 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 <http://www.gnu.org/licenses>.
+
+use Modern::Perl;
+
+use Koha::Database;
+
+use base qw(Koha::Object);
+
+=head1 NAME
+
+Koha::Library::Hour - Koha Library Hour Object class
+
+=head1 API
+
+=head2 Class Methods
+
+=cut
+
+=head3 _type
+
+=cut
+
+sub _type {
+    return 'BranchHour';
+}
+
+1;
diff --git a/Koha/Library/Hours.pm b/Koha/Library/Hours.pm
new file mode 100644
index 00000000000..22e709b8c62
--- /dev/null
+++ b/Koha/Library/Hours.pm
@@ -0,0 +1,52 @@
+package Koha::Library::Hours;
+
+# Copyright 2021 Aleisha Amohia <aleisha@catalyst.net.nz>
+#
+# 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 <http://www.gnu.org/licenses>.
+
+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
+
+=cut
+
+sub _type {
+    return 'BranchHour';
+}
+
+=head3 object_class
+
+=cut
+
+sub object_class {
+    return 'Koha::Library::Hour';
+}
+
+1;
diff --git a/admin/branches.pl b/admin/branches.pl
index 112ca421d35..a7215dd3989 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,19 @@ my ( $template, $borrowernumber, $cookie ) = get_template_and_user(
 );
 
 if ( $op eq 'add_form' ) {
+    my $library;
+    if ($branchcode) {
+        $library = Koha::Libraries->find($branchcode);
+        $template->param( selected_smtp_server => $library->smtp_server );
+    }
+
+    my @smtp_servers = Koha::SMTP::Servers->search;
+    my @opening_hours = Koha::Library::Hours->search({ branchcode => $branchcode }, { order_by => { -asc => 'day' } });
+
     $template->param(
-        library      => Koha::Libraries->find($branchcode),
-        smtp_servers => Koha::SMTP::Servers->search,
+        library      => $library,
+        smtp_servers => \@smtp_servers,
+        opening_hours => \@opening_hours
     );
 } elsif ( $branchcode && $op eq 'view' ) {
     my $library = Koha::Libraries->find($branchcode);
@@ -114,6 +125,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({ branchcode => $branchcode, day => $day })->update({ open_time => $open_times[$day], close_time => $close_times[$day] });
+                    }
+
                     push @messages, { type => 'message', code => 'success_on_update' };
                 }
             );
@@ -152,6 +178,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({ branchcode => $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_branch_hours_table.perl b/installer/data/mysql/atomicupdate/bug_6796_-_add_branch_hours_table.perl
new file mode 100644
index 00000000000..964da04c610
--- /dev/null
+++ b/installer/data/mysql/atomicupdate/bug_6796_-_add_branch_hours_table.perl
@@ -0,0 +1,20 @@
+$DBversion = 'XXX';
+if ( CheckVersion( $DBversion ) ) {
+    $dbh->do(q{ DROP TABLE IF EXISTS branch_hours });
+    $dbh->do(q{
+        CREATE TABLE branch_hours (
+            branchcode varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL,
+            day int(1) 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 (branchcode, day),
+            CONSTRAINT branch_hours_ibfk_1 FOREIGN KEY (branchcode) 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 branch_hours (branchcode, day) SELECT branchcode, ? FROM branches }, undef, $i);
+    }
+    NewVersion( $DBversion, 6796, "Add branch_hours table" );
+}
diff --git a/installer/data/mysql/kohastructure.sql b/installer/data/mysql/kohastructure.sql
index 59607073cac..6819cdae7e1 100644
--- a/installer/data/mysql/kohastructure.sql
+++ b/installer/data/mysql/kohastructure.sql
@@ -1543,6 +1543,22 @@ CREATE TABLE `branches` (
 /*!40101 SET character_set_client = @saved_cs_client */;
 
 --
+-- Table structure for table `branch_hours`
+--
+DROP TABLE IF EXISTS branch_hours;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE branch_hours (
+    branchcode varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL,
+    day int(1) 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 (branchcode, day),
+    CONSTRAINT branch_hours_ibfk_1 FOREIGN KEY (branchcode) REFERENCES branches (branchcode) ON DELETE CASCADE ON UPDATE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
 -- Table structure for table `branches_overdrive`
 --
 
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 881e3d92c92..95671b390e6 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/branches.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/branches.tt
@@ -288,6 +288,61 @@ Libraries &rsaquo; Administration &rsaquo; Koha
                     </select>
                     <div class="hint">Set to 'yes' to show this library as a search option and on the Libraries page in the OPAC.</div>
                 </li>
+                <li>
+                    <label for="opening_hours">Opening hours: </label>
+                    <table id="opening_hours_table">
+                        <thead>
+                            <tr>
+                                <th>Day</th>
+                                <th>Open time</th>
+                                <th>Close time</th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                            [% IF opening_hours # Existing library %]
+                                [% daycount = 0 %]
+                                [% FOREACH hr IN opening_hours %]
+                                <tr id="hours_[% daycount %]">
+                                    <td>
+                                        [% PROCESS dayname day=daycount %]
+                                        <input type="hidden" value="[% daycount %]" name="day">
+                                    </td>
+                                    <td>
+                                        [% IF hr.day == daycount && hr.open_time %]
+                                        <input type="time" value="[% hr.open_time %]" name="open_time">
+                                        [% ELSE %]
+                                        <input type="time" value="" name="open_time">
+                                        [% END %]
+                                    </td>
+                                    <td>
+                                        [% IF hr.day == daycount && hr.close_time %]
+                                        <input type="time" value="[% hr.close_time %]" name="close_time">
+                                        [% ELSE %]
+                                        <input type="time" value="" name="close_time">
+                                        [% END %]
+                                    </td>
+                                </tr>
+                                [% daycount = daycount+1 %]
+                                [% END %]
+                            [% ELSE # New library %]
+                                [% FOREACH daycount IN [0..6] %]
+                                <tr id="hours_[% day %]">
+                                    <td>
+                                        [% PROCESS dayname day=daycount %]
+                                        <input type="hidden" value="[% daycount %]" name="day">
+                                    </td>
+                                    <td>
+                                        <input type="time" value="" name="open_time">
+                                    </td>
+                                    <td>
+                                        <input type="time" value="" name="close_time">
+                                    </td>
+                                </tr>
+                                [% END %]
+                            [% END %]
+                        </tbody>
+                    </table>
+                </li>
             </ol>
         </fieldset>
         <fieldset class="action">
@@ -297,6 +352,24 @@ Libraries &rsaquo; Administration &rsaquo; Koha
     </form>
 [% 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 )%]
     <div class="dialog alert">
         <form action="/cgi-bin/koha/admin/branches.pl" method="post">
-- 
2.11.0