@@ -, +, @@ to OPAC --- Koha/ProblemReport.pm | 46 ++++++ Koha/ProblemReports.pm | 55 +++++++ Koha/Schema/Result/Borrower.pm | 19 ++- Koha/Schema/Result/Branch.pm | 19 ++- Koha/Schema/Result/ProblemReport.pm | 178 +++++++++++++++++++++ .../bug-4461_add-problem-reports-table.sql | 15 ++ installer/data/mysql/kohastructure.sql | 20 +++ .../bootstrap/en/includes/opac-bottom.inc | 3 + .../bootstrap/en/modules/opac-reportproblem.tt | 129 +++++++++++++++ opac/opac-reportproblem.pl | 100 ++++++++++++ 10 files changed, 580 insertions(+), 4 deletions(-) create mode 100644 Koha/ProblemReport.pm create mode 100644 Koha/ProblemReports.pm create mode 100644 Koha/Schema/Result/ProblemReport.pm create mode 100644 installer/data/mysql/atomicupdate/bug-4461_add-problem-reports-table.sql create mode 100644 koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-reportproblem.tt create mode 100755 opac/opac-reportproblem.pl --- a/Koha/ProblemReport.pm +++ a/Koha/ProblemReport.pm @@ -0,0 +1,46 @@ +package Koha::ProblemReport; + +# This file is part of Koha. +# +# Copyright 2017 Aleisha Amohia +# +# 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, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +use Modern::Perl; + +use Carp; + +use Koha::Database; + +use base qw(Koha::Object); + +=head1 NAME + +Koha::ProblemReport - Koha Problem Report Object class + +=head1 API + +=head2 Class Methods + +=cut + +=head3 type + +=cut + +sub _type { + return 'ProblemReport'; +} + +1; --- a/Koha/ProblemReports.pm +++ a/Koha/ProblemReports.pm @@ -0,0 +1,55 @@ +package Koha::ProblemReports; + +# This file is part of Koha. +# +# Copyright 2017 Aleisha Amohia +# +# 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, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +use Modern::Perl; + +use Carp; + +use Koha::Database; +use Koha::ProblemReport; + +use base qw(Koha::Objects); + +=head1 NAME + +Koha::ProblemReports - Koha Problem Report Object set class + +=head1 API + +=head2 Class Methods + +=cut + +=head3 type + +=cut + +sub _type { + return 'ProblemReport'; +} + +=head3 object_class + +=cut + +sub object_class { + return 'Koha::ProblemReport'; +} + +1; --- a/Koha/Schema/Result/Borrower.pm +++ a/Koha/Schema/Result/Borrower.pm @@ -1123,6 +1123,21 @@ __PACKAGE__->might_have( { cascade_copy => 0, cascade_delete => 0 }, ); +=head2 problem_reports + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "problem_reports", + "Koha::Schema::Result::ProblemReport", + { "foreign.borrowernumber" => "self.borrowernumber" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + =head2 ratings Type: has_many @@ -1334,8 +1349,8 @@ Composing rels: L -> ordernumber __PACKAGE__->many_to_many("ordernumbers", "aqorder_users", "ordernumber"); -# Created by DBIx::Class::Schema::Loader v0.07042 @ 2016-10-31 10:39:35 -# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:Lc6GQ2E7d+tyzTk3v2sWjQ +# Created by DBIx::Class::Schema::Loader v0.07042 @ 2017-01-12 03:37:07 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:+NQSF0ArnOrdywq4aESwmA __PACKAGE__->belongs_to( "guarantor", --- a/Koha/Schema/Result/Branch.pm +++ a/Koha/Schema/Result/Branch.pm @@ -487,6 +487,21 @@ __PACKAGE__->has_many( { cascade_copy => 0, cascade_delete => 0 }, ); +=head2 problem_reports + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "problem_reports", + "Koha::Schema::Result::ProblemReport", + { "foreign.branchcode" => "self.branchcode" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + =head2 reserves Type: has_many @@ -543,8 +558,8 @@ Composing rels: L -> categorycode __PACKAGE__->many_to_many("categorycodes", "branchrelations", "categorycode"); -# Created by DBIx::Class::Schema::Loader v0.07042 @ 2016-10-24 13:56:21 -# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:/9YwsU+GXK+fzc6IX2Tj5g +# Created by DBIx::Class::Schema::Loader v0.07042 @ 2017-01-12 03:37:07 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:NbUmXDojsTcjNO5MLfgbHw # You can replace this text with custom code or comments, and it will be preserved on regeneration --- a/Koha/Schema/Result/ProblemReport.pm +++ a/Koha/Schema/Result/ProblemReport.pm @@ -0,0 +1,178 @@ +use utf8; +package Koha::Schema::Result::ProblemReport; + +# Created by DBIx::Class::Schema::Loader +# DO NOT MODIFY THE FIRST PART OF THIS FILE + +=head1 NAME + +Koha::Schema::Result::ProblemReport + +=cut + +use strict; +use warnings; + +use base 'DBIx::Class::Core'; + +=head1 TABLE: C + +=cut + +__PACKAGE__->table("problem_reports"); + +=head1 ACCESSORS + +=head2 id + + data_type: 'integer' + is_auto_increment: 1 + is_nullable: 0 + +=head2 title + + data_type: 'varchar' + default_value: (empty string) + is_nullable: 0 + size: 40 + +=head2 content + + data_type: 'varchar' + default_value: (empty string) + is_nullable: 0 + size: 255 + +=head2 borrowernumber + + data_type: 'integer' + is_foreign_key: 1 + is_nullable: 1 + +=head2 branchcode + + data_type: 'varchar' + default_value: (empty string) + is_foreign_key: 1 + is_nullable: 0 + size: 10 + +=head2 username + + data_type: 'varchar' + is_nullable: 1 + size: 75 + +=head2 problempage + + data_type: 'varchar' + is_nullable: 1 + size: 255 + +=head2 recipient + + data_type: 'enum' + default_value: 'library' + extra: {list => ["admin","library"]} + is_nullable: 0 + +=head2 reportdate + + data_type: 'datetime' + datetime_undef_if_invalid: 1 + is_nullable: 1 + +=cut + +__PACKAGE__->add_columns( + "id", + { data_type => "integer", is_auto_increment => 1, is_nullable => 0 }, + "title", + { data_type => "varchar", default_value => "", is_nullable => 0, size => 40 }, + "content", + { data_type => "varchar", default_value => "", is_nullable => 0, size => 255 }, + "borrowernumber", + { data_type => "integer", is_foreign_key => 1, is_nullable => 1 }, + "branchcode", + { + data_type => "varchar", + default_value => "", + is_foreign_key => 1, + is_nullable => 0, + size => 10, + }, + "username", + { data_type => "varchar", is_nullable => 1, size => 75 }, + "problempage", + { data_type => "varchar", is_nullable => 1, size => 255 }, + "recipient", + { + data_type => "enum", + default_value => "library", + extra => { list => ["admin", "library"] }, + is_nullable => 0, + }, + "reportdate", + { + data_type => "datetime", + datetime_undef_if_invalid => 1, + is_nullable => 1, + }, +); + +=head1 PRIMARY KEY + +=over 4 + +=item * L + +=back + +=cut + +__PACKAGE__->set_primary_key("id"); + +=head1 RELATIONS + +=head2 borrowernumber + +Type: belongs_to + +Related object: L + +=cut + +__PACKAGE__->belongs_to( + "borrowernumber", + "Koha::Schema::Result::Borrower", + { borrowernumber => "borrowernumber" }, + { + is_deferrable => 1, + join_type => "LEFT", + on_delete => "CASCADE", + on_update => "CASCADE", + }, +); + +=head2 branchcode + +Type: belongs_to + +Related object: L + +=cut + +__PACKAGE__->belongs_to( + "branchcode", + "Koha::Schema::Result::Branch", + { branchcode => "branchcode" }, + { is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" }, +); + + +# Created by DBIx::Class::Schema::Loader v0.07042 @ 2017-01-12 22:06:40 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:Gh48Q5QmR+oI4oI0c6Hizg + + +# You can replace this text with custom code or comments, and it will be preserved on regeneration +1; --- a/installer/data/mysql/atomicupdate/bug-4461_add-problem-reports-table.sql +++ a/installer/data/mysql/atomicupdate/bug-4461_add-problem-reports-table.sql @@ -0,0 +1,15 @@ +DROP TABLE IF EXISTS `problem_reports`; +CREATE TABLE `problem_reports` ( -- problems reported by users through OPAC + `id` int(11) NOT NULL auto_increment, -- unqiue identifier assigned by Koha + `title` varchar(40) NOT NULL default '', -- report subject line + `content` varchar(255) NOT NULL default '', -- report message content + `borrowernumber` int(11) default NULL, -- the user who created the problem report + `branchcode` varchar(10) NOT NULL default '', -- borrower's branch + `username` varchar(75) default NULL, -- OPAC username + `problempage` varchar(255) default NULL, -- page the user triggered the problem report form from + `recipient` enum('admin','library') NOT NULL default 'library', -- the 'to-address' of the problem report + `reportdate` datetime default NULL, -- date and time of report submission + PRIMARY KEY (`id`), + CONSTRAINT `problem_reports_ibfk1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `problem_reports_ibfk2` FOREIGN KEY (`branchcode`) REFERENCES `branches` (`branchcode`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; --- a/installer/data/mysql/kohastructure.sql +++ a/installer/data/mysql/kohastructure.sql @@ -1396,6 +1396,26 @@ CREATE TABLE `printers_profile` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- +-- Table structure for table `problem_reports` +-- + +DROP TABLE IF EXISTS `problem_reports`; +CREATE TABLE `problem_reports` ( -- problems reported by users through OPAC + `id` int(11) NOT NULL auto_increment, -- unqiue identifier assigned by Koha + `title` varchar(40) NOT NULL default '', -- report subject line + `content` varchar(255) NOT NULL default '', -- report message content + `borrowernumber` int(11) default NULL, -- the user who created the problem report + `branchcode` varchar(10) NOT NULL default '', -- borrower's branch + `username` varchar(75) default NULL, -- OPAC username + `problempage` varchar(255) default NULL, -- page the user triggered the problem report form from + `recipient` enum('admin','library') NOT NULL default 'library', -- the 'to-address' of the problem report + `reportdate` datetime default NULL, -- date and time of report submission + PRIMARY KEY (`id`), + CONSTRAINT `problem_reports_ibfk1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `problem_reports_ibfk2` FOREIGN KEY (`branchcode`) REFERENCES `branches` (`branchcode`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + +-- -- Table structure for table `repeatable_holidays` -- --- a/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-bottom.inc +++ a/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-bottom.inc @@ -16,6 +16,9 @@
+

Powered by [% IF template.name.match('opac-main.tt') %] --- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-reportproblem.tt +++ a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-reportproblem.tt @@ -0,0 +1,129 @@ +[% USE Koha %] +[% INCLUDE 'doc-head-open.inc' %] +[% IF ( LibraryNameTitle ) %][% LibraryNameTitle %][% ELSE %]Koha online[% END %] catalog › Report a Problem +[% INCLUDE 'doc-head-close.inc' %] +[% BLOCK cssinclude %][% END %] + +[% INCLUDE 'bodytag.inc' bodyid='opac-reportproblem' bodyclass='scrollto' %] +[% INCLUDE 'masthead.inc' %] + +

+ + +
+
+ [% IF ( OpacNav || OpacNavBottom ) %] +
+ +
+
+ [% ELSE %] +
+ [% END %] +

Report a problem

+ [% IF ( successfuladd ) %] +
Your problem report has been sent to the [% IF ( recipient == 'admin' ) %]Koha Administrator[% ELSE %] [% recipient %][% END %].
+ [% END %] + [% IF ( nolibemail ) %] +
Your library has not provided an email address.
+ [% END %] + [% IF ( noadminemail ) %] +
The Koha Administrator has not provided an email address.
+ [% END %] + [% IF ( nolibemail && noadminemail ) %] +
Unable to send problem reports.
+ [% END %] +
+ +
+
+ + +
+
    +
  1. + + + [% probpage | html %] +
  2. +
  3. + + + [% username | html %] +
  4. + + +
  5. +
  6. + + +
  7. +
+
+
+ [% IF ( nolibemail ) %] + + [% ELSE %] + + [% END %] +
+
+
+
+
+ + +
+
    +
  1. + + + [% probpage | html %] +
  2. +
  3. + + + [% username | html %] +
  4. + + +
  5. +
  6. + + +
  7. +
+
+
+ [% IF ( noadminemail ) %] + + [% ELSE %] + + [% END %] +
+
+
+
+
+
+
+
+ +[% INCLUDE 'opac-bottom.inc' %] +[% BLOCK jsinclude %] + + + +[% END %] --- a/opac/opac-reportproblem.pl +++ a/opac/opac-reportproblem.pl @@ -0,0 +1,100 @@ +#!/usr/bin/perl + +# This file is part of Koha. +# +# Copyright 2017 Aleisha Amohia +# +# 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 CGI qw ( -utf8 ); +use C4::Auth; # get_template_and_user +use C4::Output; +use C4::Members; +use C4::Letters; +use Koha::ProblemReport; +use Koha::DateUtils; +use Koha::Libraries; + +my $input = new CGI; + +my ( $template, $borrowernumber, $cookie ) = get_template_and_user( + { + template_name => "opac-reportproblem.tt", + type => "opac", + query => $input, + authnotrequired => 0, + } +); + +my $problempage = $ENV{HTTP_REFERER}; +my $member = GetMember( borrowernumber => $borrowernumber ); +my $username = $member->{'userid'}; +my $branchcode = $member->{'branchcode'}; +my $library = Koha::Libraries->find($branchcode); +if ( $library->branchemail eq undef || ! $library->branchemail ) { + $template->param( nolibemail => 1 ); +} +my $koha_admin = C4::Context->preference('KohaAdminEmailAddress'); +if ( ! $koha_admin ) { + $template->param( noadminemail => 1 ); +} +my $recipient = $input->param('recipient') || 'library'; +$template->param( + username => $username, + probpage => $problempage, +); + +my $op = $input->param('op') || ''; +if ( $op eq 'addreport' ) { + my $subject = $input->param('subject'); + my $message = $input->param('message'); + my $place = $input->param('place'); + my $problem = Koha::ProblemReport->new({ title => $subject, content => $message, borrowernumber => $borrowernumber, branchcode => $branchcode, username => $username, problempage => $place, recipient => $recipient, reportdate => dt_from_string() })->store; + $template->param( + recipient => $recipient, + successfuladd => 1, + probpage => $place, + ); + + my $problemreport = $problem->unblessed; + $problemreport->{code} = 'PROBLEM_REPORT'; + $problemreport->{content} .= "\nUsername: $username"; + $problemreport->{content} .= "\nProblem page: $place"; + my $transport = 'email'; + + my $from_address = $member->{email} || $member->{emailpro} || $member->{B_email} || $koha_admin; + + if ( $recipient eq 'admin' ) { + C4::Letters::EnqueueLetter({ + letter => $problemreport, + borrowernumber => $borrowernumber, + message_transport_type => $transport, + to_address => $koha_admin, + from_address => $from_address, + }); + } else { + my $to_address = $library->branchemail; + C4::Letters::EnqueueLetter({ + letter => $problemreport, + borrowernumber => $borrowernumber, + message_transport_type => $transport, + to_address => $to_address, + from_address => $from_address, + }); + } +} + +output_html_with_http_headers $input, $cookie, $template->output; --