@@ -, +, @@ --- Koha/Schema/Result/Issue.pm | 11 +- checkout_notes/checkout-notes.pl | 71 +++++++++ circ/circulation-home.pl | 3 + .../bug-17698_add-noteseen-column-to-issues.sql | 2 + ...-17698_add-permission-to-manage-issue-notes.sql | 1 + installer/data/mysql/kohastructure.sql | 1 + installer/data/mysql/userpermissions.sql | 1 + .../intranet-tmpl/prog/en/includes/permissions.inc | 1 + .../en/modules/checkout_notes/checkout-notes.tt | 165 +++++++++++++++++++++ .../prog/en/modules/circ/circulation-home.tt | 1 + .../intranet-tmpl/prog/en/modules/intranet-main.tt | 7 + mainpage.pl | 3 + opac/opac-issue-note.pl | 2 +- opac/svc/patron_notes | 2 +- svc/issue_notes | 62 ++++++++ 15 files changed, 329 insertions(+), 4 deletions(-) create mode 100755 checkout_notes/checkout-notes.pl create mode 100644 installer/data/mysql/atomicupdate/bug-17698_add-noteseen-column-to-issues.sql create mode 100644 installer/data/mysql/atomicupdate/bug-17698_add-permission-to-manage-issue-notes.sql create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/checkout_notes/checkout-notes.tt create mode 100755 svc/issue_notes --- a/Koha/Schema/Result/Issue.pm +++ a/Koha/Schema/Result/Issue.pm @@ -112,6 +112,11 @@ __PACKAGE__->table("issues"); datetime_undef_if_invalid: 1 is_nullable: 1 +=head2 noteseen + + data_type: 'integer' + is_nullable: 1 + =cut __PACKAGE__->add_columns( @@ -170,6 +175,8 @@ __PACKAGE__->add_columns( datetime_undef_if_invalid => 1, is_nullable => 1, }, + "noteseen", + { data_type => "integer", is_nullable => 1 }, ); =head1 PRIMARY KEY @@ -241,8 +248,8 @@ __PACKAGE__->belongs_to( ); -# Created by DBIx::Class::Schema::Loader v0.07042 @ 2016-12-01 02:20:55 -# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:a7FCuypwxtuE6oJjEnRJRg +# Created by DBIx::Class::Schema::Loader v0.07042 @ 2016-12-12 02:41:09 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:ZF/YAX9BT1WrgCLUsXSqXQ __PACKAGE__->belongs_to( "borrower", --- a/checkout_notes/checkout-notes.pl +++ a/checkout_notes/checkout-notes.pl @@ -0,0 +1,71 @@ +#!/usr/bin/perl + +# Copyright 2016 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 CGI qw ( -utf8 ); +use C4::Context; +use C4::Output; +use C4::Auth; +use Koha::Checkouts; + +my $query = new CGI; + +my ( $template, $loggedinuser, $cookie ) = get_template_and_user( + { + template_name => "checkout_notes/checkout-notes.tt", + query => $query, + type => "intranet", + authnotrequired => 0, + flagsrequired => { circulation => "manage_issue_notes" }, + } +); + +my $schema = Koha::Database->new()->schema(); +my @notes = $schema->resultset('Issue')->search({ 'me.note' => { '!=', undef } }, { prefetch => [ 'borrower', { item => 'biblionumber' } ] }); +$template->param( + notes => \@notes, +); + +my $action; +foreach (qw( seen notseen )) { + $action = $_ if ( $query->param("mark_selected-$_") ); +} +$action ||= 'none'; + +my @issue_ids = $query->multi_param('issue_ids'); + +if ( $action eq 'seen' ) { + foreach my $issue_id ( @issue_ids ) { + my $issue = Koha::Checkouts->find($issue_id); + $issue->set({ noteseen => 1 })->store; + } +} elsif ( $action eq 'notseen' ) { + foreach my $issue_id ( @issue_ids ) { + my $issue = Koha::Checkouts->find($issue_id); + $issue->set({ noteseen => 0 })->store; + } +} + +$template->param( + selected_count => scalar(@issue_ids), + action => $action, +); + +output_html_with_http_headers $query, $cookie, $template->output; --- a/circ/circulation-home.pl +++ a/circ/circulation-home.pl @@ -22,6 +22,7 @@ use C4::Auth; use C4::Output; use C4::Context; use Koha::BiblioFrameworks; +use Koha::Checkouts; my $query = new CGI; my ($template, $loggedinuser, $cookie, $flags) = get_template_and_user( @@ -41,5 +42,7 @@ $template->param( fast_cataloging => 1 ) if Koha::BiblioFrameworks->find( 'FA' ) $template->param( display_transfer => 1 ) if ( ($flags->{'superlibrarian'} == 1) || (C4::Context->preference("IndependentBranches") == 0) ); $template->{'VARS'}->{'AllowOfflineCirculation'} = C4::Context->preference('AllowOfflineCirculation'); +my $pendingissuenotes = Koha::Checkouts->search({ noteseen => 0 })->count; +$template->param( pendingissuenotes => $pendingissuenotes ); output_html_with_http_headers $query, $cookie, $template->output; --- a/installer/data/mysql/atomicupdate/bug-17698_add-noteseen-column-to-issues.sql +++ a/installer/data/mysql/atomicupdate/bug-17698_add-noteseen-column-to-issues.sql @@ -0,0 +1,2 @@ +ALTER IGNORE TABLE issues ADD `noteseen` int(1) default NULL; +ALTER IGNORE TABLE old_issues ADD `noteseen` int(1) default NULL; --- a/installer/data/mysql/atomicupdate/bug-17698_add-permission-to-manage-issue-notes.sql +++ a/installer/data/mysql/atomicupdate/bug-17698_add-permission-to-manage-issue-notes.sql @@ -0,0 +1, @@ +INSERT INTO permissions (module_bit, code, description) VALUES ( 1, 'manage_issue_notes', 'Mark issue notes as seen/not seen'); --- a/installer/data/mysql/kohastructure.sql +++ a/installer/data/mysql/kohastructure.sql @@ -1778,6 +1778,7 @@ CREATE TABLE `old_issues` ( -- lists items that were checked out and have been r `onsite_checkout` int(1) NOT NULL default 0, -- in house use flag `note` mediumtext default NULL, -- issue note text `notedate` datetime default NULL, -- datetime of issue note (yyyy-mm-dd hh:mm::ss) + `noteseen` int(1) default NULL, -- describes whether issue note has been seen 1, not been seen 0 or doesn't exist null PRIMARY KEY (`issue_id`), KEY `old_issuesborridx` (`borrowernumber`), KEY `old_issuesitemidx` (`itemnumber`), --- a/installer/data/mysql/userpermissions.sql +++ a/installer/data/mysql/userpermissions.sql @@ -5,6 +5,7 @@ INSERT INTO permissions (module_bit, code, description) VALUES ( 1, 'force_checkout', 'Force checkout if a limitation exists'), ( 1, 'manage_restrictions', 'Manage restrictions for accounts'), ( 1, 'self_checkout', 'Perform self checkout at the OPAC. It should be used for the patron matching the AutoSelfCheckID'), + ( 1, 'manage_issue_notes', 'Mark issue notes as seen/not seen'), ( 3, 'parameters_remaining_permissions', 'Remaining system parameters permissions'), ( 3, 'manage_circ_rules', 'Manage circulation rules'), ( 6, 'place_holds', 'Place holds for patrons'), --- a/koha-tmpl/intranet-tmpl/prog/en/includes/permissions.inc +++ a/koha-tmpl/intranet-tmpl/prog/en/includes/permissions.inc @@ -30,6 +30,7 @@ [%- CASE 'overdues_report' -%]Execute overdue items report [%- CASE 'override_renewals' -%]Override blocked renewals [%- CASE 'self_checkout' -%]Perform self checkout at the OPAC. It should be used for the patron matching the AutoSelfCheckID + [%- CASE 'manage_issue_notes' -%]Mark issue notes as seen/notseen [%- CASE 'manage_circ_rules' -%]manage circulation rules [%- CASE 'parameters_remaining_permissions' -%]Remaining system parameters permissions [%- CASE 'modify_holds_priority' -%]Modify holds priority --- a/koha-tmpl/intranet-tmpl/prog/en/modules/checkout_notes/checkout-notes.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/checkout_notes/checkout-notes.tt @@ -0,0 +1,165 @@ +[% USE Koha %] +[% USE KohaDates %] +[% USE Branches %] +[% INCLUDE 'doc-head-open.inc' %] +Home › Circulation › Issue Notes +[% INCLUDE 'doc-head-close.inc' %] + +[% INCLUDE 'datatables.inc' %] + +[% INCLUDE 'calendar.inc' %] + + +[% INCLUDE 'header.inc' %] +[% INCLUDE 'circ-search.inc' %] + + +
+
+
+ +

Checkout notes

+ +
+ + [% IF ( selected_count ) %] +
+ [% IF ( action == 'seen' ) %] + [% selected_count %] note(s) marked as seen. + [% ELSIF ( action == 'notseen' ) %] + [% selected_count %] note(s) marked as not seen. + [% ELSE %] + Failed to change the status of [% selected_count %] item(s). + [% END %] +
+ Back to issue notes + [% ELSE %] + + [% IF ( notes ) %] + +
+ Select all | Clear all +
+ +
+ + + + + + + + + + + + + + + [% FOREACH note IN notes %] + + + + + + + + + + [% END %] + +
 TitleNoteDateSet byStatusActions
[% note.item.biblionumber.title %] - [% note.item.biblionumber.author %] ([% note.item.barcode %])[% note.note %][% note.notedate | $KohaDates %][% note.borrower.firstname %] [% note.borrower.surname %] ([% note.borrower.cardnumber %])[% IF ( note.noteseen == 0 ) %] + Not seen + [% ELSIF ( note.noteseen == 1 ) %] + Seen + [% END %][% IF ( note.noteseen == 1 ) %] + + [% ELSIF ( note.noteseen == 0 ) %] + + [% END %]
+ +
+ + +
+ +
+ + [% END %] + + [% END %] + +
+
+
+ +[% INCLUDE 'intranet-bottom.inc' %] --- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation-home.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation-home.tt @@ -30,6 +30,7 @@
  • Fast cataloging
  • [% END %] [% END %] + [% IF ( Koha.Preference('AllowIssueNotes') && CAN_user_circulate_manage_issue_notes ) %]
  • Checkout notes [% IF ( pendingissuenotes ) %][% pendingissuenotes %][% END %]
  • [% END %] --- a/koha-tmpl/intranet-tmpl/prog/en/modules/intranet-main.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/intranet-main.tt @@ -162,6 +162,13 @@ [% END %] + [% IF Koha.Preference('AllowIssueNotes') && CAN_user_circulate_manage_issue_notes && pending_issue_notes %] +
    + Checkout notes pending: + [% pending_issue_notes %] +
    + [% END %] + [% END %] --- a/mainpage.pl +++ a/mainpage.pl @@ -31,6 +31,7 @@ use Koha::Patron::Modifications; use Koha::Patron::Discharge; use Koha::Reviews; use Koha::ArticleRequests; +use Koha::Checkouts; my $query = new CGI; @@ -74,6 +75,7 @@ my $pending_article_requests = Koha::ArticleRequests->count( $branch ? ( branchcode => $branch ) : (), } ); +my $pending_issue_notes = Koha::Checkouts->search({ noteseen => 0 })->count; $template->param( pendingcomments => $pendingcomments, @@ -82,6 +84,7 @@ $template->param( pending_borrower_modifications => $pending_borrower_modifications, pending_discharge_requests => $pending_discharge_requests, pending_article_requests => $pending_article_requests, + pending_issue_notes => $pending_issue_notes, ); # --- a/opac/opac-issue-note.pl +++ a/opac/opac-issue-note.pl @@ -67,7 +67,7 @@ if ( $action eq 'issuenote' && C4::Context->preference('AllowIssueNotes') ) { my $note = $query->param('note'); my $scrubber = C4::Scrubber->new(); my $clean_note = $scrubber->scrub($note); - if ( $issue->set({ notedate => dt_from_string(), note => $clean_note })->store ) { + if ( $issue->set({ notedate => dt_from_string(), note => $clean_note, noteseen => 0 })->store ) { if ($clean_note) { # only send email if note not empty my $branch = Koha::Libraries->find( $issue->branchcode ); my $letter = C4::Letters::GetPreparedLetter ( --- a/opac/svc/patron_notes +++ a/opac/svc/patron_notes @@ -79,7 +79,7 @@ if ($is_ajax) { $error = "Invalid issue id!"; } - if ( (not $error) && $issue->set({ notedate => dt_from_string(), note => $clean_note })->store ) { + if ( (not $error) && $issue->set({ notedate => dt_from_string(), note => $clean_note, noteseen => 0 })->store ) { if($clean_note) { # only send email if note not empty my $branch = Koha::Libraries->find( $issue->branchcode ); my $biblio = GetBiblioFromItemNumber($issue->itemnumber); --- a/svc/issue_notes +++ a/svc/issue_notes @@ -0,0 +1,62 @@ +#!/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; +use C4::Service; +use C4::Auth qw /check_cookie_auth/; +use C4::Output qw(:DEFAULT :ajax); +use Koha::Checkouts; + +=head1 NAME + +svc/issue_notes - Web service for managing patron notes set on issues + +=head1 DESCRIPTION + +=cut + +# AJAX requests +my $is_ajax = is_ajax(); +my $query = new CGI; +my ( $auth_status, $sessionID ) = check_cookie_auth( $query->cookie('CGISESSID'), {} ); +if ( $auth_status ne "ok" ) { + exit 0; +} +if ($is_ajax) { + my $issue_id = $query->param('issue_id'); + my $issue = Koha::Checkouts->find($issue_id); + my $action = $query->param('action'); + my $status = 'success'; + if ($action eq 'seen'){ + $issue->set({ noteseen => 1 })->store; + if ( $issue->noteseen != 1 ) { + $status = 'failure'; + } + } elsif ($action eq 'notseen'){ + $issue->set({ noteseen => 0 })->store; + if ( $issue->noteseen != 0 ) { + $status = 'failure'; + } + } + my $response = "{\"status\": \"$status\"}"; + output_with_http_headers $query, undef, $response, 'js'; + exit; +} --